@elqnt/admin 2.3.0 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -14
- package/SKILL.md +570 -0
- package/dist/{analytics-CZ0LmSlf.d.cts → admin-C1iVQe2d.d.cts} +6 -168
- package/dist/{analytics-CZ0LmSlf.d.ts → admin-C1iVQe2d.d.ts} +6 -168
- package/dist/api/index.cjs +29 -125
- package/dist/api/index.cjs.map +1 -1
- package/dist/api/index.d.cts +4 -50
- package/dist/api/index.d.ts +4 -50
- package/dist/api/index.js +28 -115
- package/dist/api/index.js.map +1 -1
- package/dist/hooks/index.cjs +85 -419
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.cts +66 -129
- package/dist/hooks/index.d.ts +66 -129
- package/dist/hooks/index.js +85 -415
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.cjs +32 -125
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +30 -115
- package/dist/index.js.map +1 -1
- package/dist/models/index.cjs +3 -0
- package/dist/models/index.cjs.map +1 -1
- package/dist/models/index.d.cts +2 -2
- package/dist/models/index.d.ts +2 -2
- package/dist/models/index.js +2 -0
- package/dist/models/index.js.map +1 -1
- package/dist/{orgs-BOVRgr8L.d.ts → orgs-BSHeYVe-.d.ts} +1 -1
- package/dist/{orgs-IvppiqI8.d.cts → orgs-Buu2Re0N.d.cts} +1 -1
- package/package.json +5 -4
package/dist/hooks/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../hooks/use-org-admin.ts","../../api/index.ts","../../api/orgs.ts","../../api/users.ts","../../api/invites.ts","../../api/analytics.ts","../../hooks/use-users-admin.ts","../../hooks/use-invites-admin.ts","../../hooks/use-org-settings.ts","../../hooks/use-product-analytics.ts"],"sourcesContent":["\"use client\";\n\n/**\n * Organization admin hooks for React applications\n *\n * Provides React hooks for organization CRUD operations with loading/error states.\n */\n\nimport { useState, useCallback } from \"react\";\nimport type { ApiClientOptions } from \"@elqnt/api-client\";\nimport type { Org, OrgInfo } from \"../models\";\nimport {\n listOrgsApi,\n createOrgApi,\n getOrgApi,\n updateOrgApi,\n deleteOrgApi,\n getOrgInfoApi,\n type ListOrgsFilter,\n} from \"../api\";\n\n// (createOrgWithSchemas hook removed — per-org schema provisioning is gone.\n// See docs/_db_v2/03_system_org_split.md.)\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type UseOrgAdminOptions = ApiClientOptions;\n\n// =============================================================================\n// USE ORG ADMIN HOOK\n// =============================================================================\n\n/**\n * Hook for organization CRUD operations\n *\n * @example\n * ```tsx\n * const { loading, error, listOrgs, createOrg, updateOrg } = useOrgAdmin({\n * baseUrl: apiGatewayUrl,\n * orgId: selectedOrgId,\n * userId: user?.id,\n * userEmail: user?.email,\n * });\n *\n * const orgs = await listOrgs();\n * const newOrg = await createOrg({ name: \"Acme Corp\" });\n * ```\n */\nexport function useOrgAdmin(options: UseOrgAdminOptions) {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const listOrgs = useCallback(async (filter?: ListOrgsFilter): Promise<Org[]> => {\n setLoading(true);\n setError(null);\n try {\n const response = await listOrgsApi(filter, options);\n if (response.error) {\n setError(response.error);\n return [];\n }\n return response.data?.orgs || [];\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to list organizations\";\n setError(message);\n return [];\n } finally {\n setLoading(false);\n }\n }, [options]);\n\n const getOrg = useCallback(\n async (orgId: string): Promise<Org | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getOrgApi(orgId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.org || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get organization\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const getOrgInfo = useCallback(\n async (orgId: string): Promise<OrgInfo | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getOrgInfoApi(orgId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.orgInfo || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get organization info\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const createOrg = useCallback(\n async (org: Partial<Org> & { product?: string }): Promise<Org | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await createOrgApi(org, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.org || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to create organization\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const updateOrg = useCallback(\n async (orgId: string, updates: Partial<Org>): Promise<Org | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await updateOrgApi(orgId, updates, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.org || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to update organization\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const deleteOrg = useCallback(\n async (orgId: string): Promise<boolean> => {\n setLoading(true);\n setError(null);\n try {\n const response = await deleteOrgApi(orgId, options);\n if (response.error) {\n setError(response.error);\n return false;\n }\n return response.data?.success || false;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to delete organization\";\n setError(message);\n return false;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n return {\n loading,\n error,\n listOrgs,\n getOrg,\n getOrgInfo,\n createOrg,\n updateOrg,\n deleteOrg,\n };\n}\n","/**\n * Admin API functions (internal)\n *\n * Low-level API functions that call browserApiRequest directly.\n * These are the building blocks for @elqnt/admin/hooks.\n *\n * **Apps should use hooks (`@elqnt/admin/hooks`) instead of these functions.**\n * Hooks provide loading/error state management on top of these API calls.\n * Only use these directly if you're building a new hook or need an operation\n * that no hook covers yet.\n */\n\nimport { browserApiRequest, clearGatewayTokenCache } from \"@elqnt/api-client/browser\";\nimport type { ApiResponse, ApiClientOptions } from \"@elqnt/api-client\";\n\n// Re-export utility function\nexport { clearGatewayTokenCache };\nimport type { ResponseMetadata } from \"@elqnt/types\";\nimport type {\n OnboardingState,\n OnboardingResponse,\n CreateOrgResponse,\n SendInvitesResponse,\n CreateKnowledgeResponse,\n CreateAgentResponse,\n CompleteOnboardingResponse,\n PaymentSessionResponse,\n OrgSettings,\n OrgSettingsResponse,\n PlansResponse,\n SubscriptionResponse,\n CreditsResponse,\n CreateCheckoutResponse,\n PortalSessionResponse,\n ProvisionAgentsResponse,\n ProvisionEntitiesResponse,\n ProvisionWorkflowsResponse,\n} from \"../models\";\n\n// =============================================================================\n// ONBOARDING API OPTIONS\n// =============================================================================\n\n/**\n * Onboarding API options - orgId is optional since user may not have org yet\n */\nexport interface OnboardingApiOptions {\n baseUrl: string;\n orgId?: string;\n userId?: string;\n userEmail?: string;\n headers?: Record<string, string>;\n}\n\n// =============================================================================\n// ONBOARDING API\n// =============================================================================\n\nexport async function getOnboardingStatusApi(\n options: OnboardingApiOptions\n): Promise<ApiResponse<OnboardingResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/status\", {\n method: \"GET\",\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function startOnboardingApi(\n options: OnboardingApiOptions\n): Promise<ApiResponse<OnboardingResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/start\", {\n method: \"POST\",\n body: {},\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function createPaymentSessionApi(\n params: { plan: string; billingCycle: string; seats: number; successUrl: string; cancelUrl: string },\n options: OnboardingApiOptions\n): Promise<ApiResponse<PaymentSessionResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/step/payment\", {\n method: \"POST\",\n body: params,\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function createOrganizationApi(\n org: { name: string; industry?: string; size?: string; stripeSessionId?: string },\n options: OnboardingApiOptions\n): Promise<ApiResponse<CreateOrgResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/step/organization\", {\n method: \"POST\",\n body: org,\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function sendOnboardingInvitesApi(\n invites: Array<{ email: string; role?: string }>,\n options: OnboardingApiOptions\n): Promise<ApiResponse<SendInvitesResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/step/invites\", {\n method: \"POST\",\n body: { invites },\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function createOnboardingKnowledgeApi(\n knowledge: { name: string; description?: string; websites?: string[] },\n options: OnboardingApiOptions\n): Promise<ApiResponse<CreateKnowledgeResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/step/knowledge\", {\n method: \"POST\",\n body: knowledge,\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function createOnboardingAgentApi(\n agent: { name: string; description?: string; goal?: string },\n options: OnboardingApiOptions\n): Promise<ApiResponse<CreateAgentResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/step/agent\", {\n method: \"POST\",\n body: agent,\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function createAgentWithSkillsApi(\n payload: { agent: Record<string, unknown>; skills: Record<string, unknown>[]; enabledSkillNames: string[] },\n options: OnboardingApiOptions\n): Promise<ApiResponse<CreateAgentResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/agent-with-skills\", {\n method: \"POST\",\n body: payload,\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function completeOnboardingApi(\n options: OnboardingApiOptions\n): Promise<ApiResponse<CompleteOnboardingResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/complete\", {\n method: \"POST\",\n body: {},\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function skipOnboardingStepApi(\n step: string,\n options: OnboardingApiOptions\n): Promise<ApiResponse<{ nextStep: string; metadata: ResponseMetadata }>> {\n return browserApiRequest(\"/api/v1/onboarding/skip-step\", {\n method: \"POST\",\n body: { step },\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport interface StartProvisioningResponse {\n orgId: string;\n status: string;\n metadata?: ResponseMetadata;\n}\n\n/**\n * Start provisioning for an onboarding org.\n * Returns the org ID so the frontend can connect to the SSE stream for progress.\n */\nexport async function startOnboardingProvisioningApi(\n options: OnboardingApiOptions\n): Promise<ApiResponse<StartProvisioningResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/provisioning/start\", {\n method: \"POST\",\n body: {},\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\n/**\n * Request body for unified onboarding provisioning\n */\nexport interface ProvisionAllRequest {\n plan: {\n plan: string;\n billingCycle: string;\n seats: number;\n stripeSessionId?: string;\n inviteCode?: string; // If present, this is a free trial (skipped payment)\n };\n org: {\n title: string;\n mainDomain: string;\n // (product field removed — product is implicit in the admin DB)\n industry?: string;\n size?: string;\n };\n invites?: Array<{\n email: string;\n role: string;\n }>;\n knowledge: {\n name: string;\n documents?: Array<{\n title: string;\n fileUrl: string;\n }>;\n };\n agent: {\n name: string;\n goal: string;\n personality: string;\n skills?: string[];\n };\n}\n\n/**\n * Response from unified onboarding provisioning\n */\nexport interface ProvisionAllResponse {\n orgId: string;\n userId: string;\n status: string;\n metadata: ResponseMetadata;\n}\n\n/**\n * Unified onboarding provisioning - collects all data then creates org and provisions everything.\n * This is the new flow where data is collected first, then provisioned via SSE.\n */\nexport async function provisionAllOnboardingApi(\n request: ProvisionAllRequest,\n options: OnboardingApiOptions\n): Promise<ApiResponse<ProvisionAllResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/provision-all\", {\n method: \"POST\",\n body: request,\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\n// =============================================================================\n// ORG SETTINGS API\n// =============================================================================\n\n/**\n * Org settings live on the canonical admin Org row (since v2.3) — the old\n * /api/v1/org/settings path against integrations is gone. These helpers keep\n * the legacy `OrgSettings` wire shape so consumers (org-settings form, the\n * OrganizationProvider hydration action, etc.) don't need to change. The\n * actual fetch/PUT happens against /admin/orgs/{orgId}.\n */\n\ninterface OrgRowSlice {\n id?: string;\n title?: string;\n description?: string;\n logoUrl?: string;\n defaultLang?: string;\n timezone?: string;\n settings?: { [key: string]: any };\n}\n\nfunction orgRowToSettings(\n orgId: string,\n row: OrgRowSlice | undefined,\n): OrgSettings {\n return {\n id: row?.id ?? \"\",\n org_id: orgId,\n title: row?.title ?? \"\",\n description: row?.description ?? \"\",\n logo_url: row?.logoUrl ?? \"\",\n default_lang: row?.defaultLang ?? \"en\",\n timezone: row?.timezone ?? \"UTC\",\n additional_settings: row?.settings ?? {},\n created_at: \"\",\n updated_at: \"\",\n created_by: \"\",\n updated_by: \"\",\n };\n}\n\nfunction settingsToOrgRow(settings: Partial<OrgSettings>): Partial<OrgRowSlice> {\n return {\n title: settings.title,\n description: settings.description,\n logoUrl: settings.logo_url,\n defaultLang: settings.default_lang,\n timezone: settings.timezone,\n settings: settings.additional_settings,\n };\n}\n\nexport async function getOrgSettingsApi(\n options: ApiClientOptions\n): Promise<ApiResponse<OrgSettingsResponse>> {\n const orgId = options.orgId ?? \"\";\n const response = await browserApiRequest<{ organization?: OrgRowSlice }>(\n `/api/v1/admin/orgs/${orgId}`,\n { method: \"GET\", ...options },\n );\n\n if (response.error) {\n return { error: response.error, status: response.status } as ApiResponse<OrgSettingsResponse>;\n }\n\n return {\n status: response.status,\n data: {\n success: true,\n settings: orgRowToSettings(orgId, response.data?.organization),\n } as OrgSettingsResponse,\n };\n}\n\n/**\n * @deprecated Org settings rows always exist on the admin Org. Kept as an\n * alias for backward compatibility — calls updateOrgSettingsApi.\n */\nexport async function createOrgSettingsApi(\n settings: Partial<OrgSettings>,\n options: ApiClientOptions\n): Promise<ApiResponse<OrgSettingsResponse & { id?: string }>> {\n return updateOrgSettingsApi(settings, options);\n}\n\nexport async function updateOrgSettingsApi(\n settings: Partial<OrgSettings>,\n options: ApiClientOptions\n): Promise<ApiResponse<OrgSettingsResponse>> {\n const orgId = options.orgId ?? \"\";\n const response = await browserApiRequest<{ message?: string }>(\n `/api/v1/admin/orgs/${orgId}`,\n {\n method: \"PUT\",\n body: settingsToOrgRow(settings),\n ...options,\n },\n );\n\n if (response.error) {\n return { error: response.error, status: response.status } as ApiResponse<OrgSettingsResponse>;\n }\n\n // Admin update returns { message: \"...\" }; round-trip a fresh GET so the\n // caller gets the full settings shape (with new updated_at, etc.).\n return getOrgSettingsApi(options);\n}\n\nexport async function updateOrgAgentsApi(\n agentIds: string[],\n options: ApiClientOptions\n): Promise<ApiResponse<ProvisionAgentsResponse>> {\n return browserApiRequest(\"/api/v1/org/agents\", {\n method: \"PUT\",\n body: { agentIds },\n ...options,\n });\n}\n\nexport async function updateEntityDefinitionsApi(\n entityNames: string[],\n options: ApiClientOptions\n): Promise<ApiResponse<ProvisionEntitiesResponse>> {\n return browserApiRequest(\"/api/v1/org/entities\", {\n method: \"PUT\",\n body: { entityNames },\n ...options,\n });\n}\n\nexport async function updateWorkflowDefinitionsApi(\n workflowIds: string[],\n options: ApiClientOptions\n): Promise<ApiResponse<ProvisionWorkflowsResponse>> {\n return browserApiRequest(\"/api/v1/org/workflows\", {\n method: \"PUT\",\n body: { workflowIds },\n ...options,\n });\n}\n\n// =============================================================================\n// BILLING API\n// =============================================================================\n\nexport async function getBillingPlansApi(\n options: ApiClientOptions\n): Promise<ApiResponse<PlansResponse>> {\n return browserApiRequest(\"/api/v1/billing/plans\", {\n method: \"GET\",\n ...options,\n });\n}\n\nexport async function getSubscriptionApi(\n options: ApiClientOptions\n): Promise<ApiResponse<SubscriptionResponse>> {\n return browserApiRequest(\"/api/v1/billing/subscription\", {\n method: \"GET\",\n ...options,\n });\n}\n\nexport async function getCreditsApi(\n options: ApiClientOptions\n): Promise<ApiResponse<CreditsResponse>> {\n return browserApiRequest(\"/api/v1/billing/credits\", {\n method: \"GET\",\n ...options,\n });\n}\n\nexport async function createCheckoutSessionApi(\n params: { priceId: string; seats?: number; successUrl?: string; cancelUrl?: string },\n options: ApiClientOptions\n): Promise<ApiResponse<CreateCheckoutResponse>> {\n return browserApiRequest(\"/api/v1/billing/checkout\", {\n method: \"POST\",\n body: params,\n ...options,\n });\n}\n\nexport async function createPortalSessionApi(\n params: { returnUrl: string },\n options: ApiClientOptions\n): Promise<ApiResponse<PortalSessionResponse>> {\n return browserApiRequest(\"/api/v1/billing/portal\", {\n method: \"POST\",\n body: params,\n ...options,\n });\n}\n\nexport async function cancelSubscriptionApi(\n options: ApiClientOptions\n): Promise<ApiResponse<{ success: boolean; metadata: ResponseMetadata }>> {\n return browserApiRequest(\"/api/v1/billing/subscription/cancel\", {\n method: \"POST\",\n body: {},\n ...options,\n });\n}\n\nexport async function purchaseCreditsApi(\n params: { packageId: string; successUrl?: string; cancelUrl?: string },\n options: ApiClientOptions\n): Promise<ApiResponse<CreateCheckoutResponse>> {\n return browserApiRequest(\"/api/v1/billing/credits/purchase\", {\n method: \"POST\",\n body: params,\n ...options,\n });\n}\n\n// =============================================================================\n// PROVISIONING API (DEPRECATED - use domain packages instead)\n// =============================================================================\n\n/**\n * @deprecated Use `provisionAgentsApi` from `@elqnt/agents/api` instead\n */\nexport async function provisionDefaultAgentsApi(\n definitions: unknown[],\n options: ApiClientOptions\n): Promise<ApiResponse<ProvisionAgentsResponse>> {\n return browserApiRequest(\"/api/v1/admin/provision/agents\", {\n method: \"POST\",\n body: { definitions },\n ...options,\n });\n}\n\n/**\n * @deprecated Use `provisionEntitiesApi` from `@elqnt/entity/api` instead\n */\nexport async function provisionEntitiesApi(\n definitions: unknown[],\n options: ApiClientOptions\n): Promise<ApiResponse<ProvisionEntitiesResponse>> {\n return browserApiRequest(\"/api/v1/admin/entities/update\", {\n method: \"POST\",\n body: { definitions },\n ...options,\n });\n}\n\n/**\n * @deprecated Use `provisionWorkflowsApi` from `@elqnt/workflow/api` instead (coming soon)\n */\nexport async function provisionWorkflowsApi(\n definitions: unknown[],\n options: ApiClientOptions\n): Promise<ApiResponse<ProvisionWorkflowsResponse>> {\n return browserApiRequest(\"/api/v1/admin/provision/workflows\", {\n method: \"POST\",\n body: { definitions },\n ...options,\n });\n}\n\n// =============================================================================\n// ADMIN CRUD APIs\n// =============================================================================\n\nexport * from \"./orgs\";\nexport * from \"./users\";\nexport * from \"./invites\";\nexport * from \"./analytics\";\n// (provisioning API removed — per-org artifact provisioning is gone.\n// See docs/_db_v2/03_system_org_split.md.)\n\n// =============================================================================\n// RE-EXPORTS\n// =============================================================================\n\nexport type {\n OnboardingState,\n OnboardingResponse,\n OrgSettings,\n OrgSettingsResponse,\n Plan,\n OrganizationBilling,\n UsageSummary,\n CreditBalance,\n PlansResponse,\n SubscriptionResponse,\n CreditsResponse,\n ProvisionAgentsResponse,\n ProvisionEntitiesResponse,\n ProvisionWorkflowsResponse,\n // Org types\n Org,\n OrgResponse,\n OrgInfoResponse,\n ListOrgsResponse,\n // User types\n User,\n UserResponse,\n ListUsersResponse,\n UserSettings,\n UserSettingsResponse,\n NotificationPreferences,\n // Invite types\n Invite,\n InviteResponse,\n ListInvitesResponse,\n InviteInput,\n InvitesResult,\n} from \"../models\";\n","/**\n * Organizations Admin API\n *\n * Browser-side API client for organization management.\n * Uses @elqnt/api-client for HTTP requests with automatic token management.\n */\n\nimport { browserApiRequest } from \"@elqnt/api-client/browser\";\nimport type { ApiResponse, ApiClientOptions } from \"@elqnt/api-client\";\nimport type {\n Org,\n OrgResponse,\n OrgInfoResponse,\n ListOrgsResponse,\n OrgStatusTS,\n OrgTypeTS,\n} from \"../models\";\n\n// =============================================================================\n// FILTER TYPES\n// =============================================================================\n\n/**\n * Filter options for listing organizations\n *\n * `product` is routing metadata: it selects which admin_<product> DB to read\n * from (empty → eloquent). It is not a stored column on the org.\n */\nexport interface ListOrgsFilter {\n status?: OrgStatusTS;\n type?: OrgTypeTS;\n product?: string;\n}\n\n// =============================================================================\n// ORGANIZATIONS CRUD\n// =============================================================================\n\n/**\n * List all organizations (admin scope required)\n * @param filter - Optional filter criteria\n * @param options - API client options\n */\nexport async function listOrgsApi(\n filter: ListOrgsFilter | undefined,\n options: ApiClientOptions\n): Promise<ApiResponse<ListOrgsResponse>> {\n const params = new URLSearchParams();\n if (filter?.status) params.set(\"status\", filter.status);\n if (filter?.type) params.set(\"type\", filter.type);\n if (filter?.product) params.set(\"product\", filter.product);\n\n const queryString = params.toString();\n const url = queryString ? `/api/v1/admin/orgs?${queryString}` : \"/api/v1/admin/orgs\";\n\n return browserApiRequest(url, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Create a new organization\n */\nexport async function createOrgApi(\n // `product` is transient routing metadata (which admin_<product> DB to write\n // to) sent alongside the org fields — it is not persisted on the org.\n org: Partial<Org> & { product?: string },\n options: ApiClientOptions\n): Promise<ApiResponse<OrgResponse>> {\n return browserApiRequest(\"/api/v1/admin/orgs\", {\n method: \"POST\",\n body: org,\n ...options,\n });\n}\n\n/**\n * Get an organization by ID\n */\nexport async function getOrgApi(\n orgId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<OrgResponse>> {\n return browserApiRequest(`/api/v1/admin/orgs/${orgId}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Update an organization\n */\nexport async function updateOrgApi(\n orgId: string,\n updates: Partial<Org>,\n options: ApiClientOptions\n): Promise<ApiResponse<OrgResponse>> {\n return browserApiRequest(`/api/v1/admin/orgs/${orgId}`, {\n method: \"PUT\",\n body: updates,\n ...options,\n });\n}\n\n/**\n * Delete an organization\n */\nexport async function deleteOrgApi(\n orgId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<{ success: boolean }>> {\n return browserApiRequest(`/api/v1/admin/orgs/${orgId}`, {\n method: \"DELETE\",\n ...options,\n });\n}\n\n/**\n * Get organization info (lightweight response)\n */\nexport async function getOrgInfoApi(\n orgId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<OrgInfoResponse>> {\n return browserApiRequest(`/api/v1/admin/orgs/${orgId}/info`, {\n method: \"GET\",\n ...options,\n });\n}\n\n// (createOrgWithSchemasApi removed — per-org schema provisioning is gone.\n// See docs/_db_v2/03_system_org_split.md.)\n","/**\n * Users Admin API\n *\n * Browser-side API client for user management.\n * Uses @elqnt/api-client for HTTP requests with automatic token management.\n */\n\nimport { browserApiRequest } from \"@elqnt/api-client/browser\";\nimport type { ApiResponse, ApiClientOptions } from \"@elqnt/api-client\";\nimport type {\n User,\n UserResponse,\n ListUsersResponse,\n UserSettings,\n UserSettingsResponse,\n NotificationPreferences,\n} from \"../models\";\n\n// =============================================================================\n// USERS CRUD\n// =============================================================================\n\n/**\n * List all users in the organization\n */\nexport async function listUsersApi(\n options: ApiClientOptions\n): Promise<ApiResponse<ListUsersResponse>> {\n return browserApiRequest(\"/api/v1/admin/users\", {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Create a new user\n */\nexport async function createUserApi(\n user: Partial<User>,\n options: ApiClientOptions\n): Promise<ApiResponse<UserResponse>> {\n return browserApiRequest(\"/api/v1/admin/users\", {\n method: \"POST\",\n body: user,\n ...options,\n });\n}\n\n/**\n * Get a user by ID\n */\nexport async function getUserApi(\n userId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<UserResponse>> {\n return browserApiRequest(`/api/v1/admin/users/${userId}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Get a user by email\n */\nexport async function getUserByEmailApi(\n email: string,\n options: ApiClientOptions\n): Promise<ApiResponse<UserResponse>> {\n return browserApiRequest(`/api/v1/admin/users/by-email?email=${encodeURIComponent(email)}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Get a user by phone number (stored in metadata.phoneNumber)\n */\nexport async function getUserByPhoneApi(\n phone: string,\n options: ApiClientOptions\n): Promise<ApiResponse<UserResponse>> {\n return browserApiRequest(`/api/v1/admin/users/by-phone?phone=${encodeURIComponent(phone)}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Update a user\n */\nexport async function updateUserApi(\n userId: string,\n updates: Partial<User>,\n options: ApiClientOptions\n): Promise<ApiResponse<UserResponse>> {\n return browserApiRequest(`/api/v1/admin/users/${userId}`, {\n method: \"PUT\",\n body: updates,\n ...options,\n });\n}\n\n/**\n * Delete a user\n */\nexport async function deleteUserApi(\n userId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<{ success: boolean }>> {\n return browserApiRequest(`/api/v1/admin/users/${userId}`, {\n method: \"DELETE\",\n ...options,\n });\n}\n\n// =============================================================================\n// USER SETTINGS\n// =============================================================================\n\n/**\n * Get user settings\n */\nexport async function getUserSettingsApi(\n userId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<UserSettingsResponse>> {\n return browserApiRequest(`/api/v1/admin/users/${userId}/settings`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Update user settings\n */\nexport async function updateUserSettingsApi(\n userId: string,\n settings: {\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n },\n options: ApiClientOptions\n): Promise<ApiResponse<UserSettingsResponse>> {\n return browserApiRequest(`/api/v1/admin/users/${userId}/settings`, {\n method: \"PUT\",\n body: settings,\n ...options,\n });\n}\n","/**\n * Invites Admin API\n *\n * Browser-side API client for invitation management.\n * Uses @elqnt/api-client for HTTP requests with automatic token management.\n */\n\nimport { browserApiRequest } from \"@elqnt/api-client/browser\";\nimport type { ApiResponse, ApiClientOptions } from \"@elqnt/api-client\";\nimport type {\n Invite,\n InviteResponse,\n ListInvitesResponse,\n InviteInput,\n InvitesResult,\n} from \"../models\";\n\n// =============================================================================\n// INVITES CRUD\n// =============================================================================\n\n/**\n * List all invites in the organization\n */\nexport async function listInvitesApi(\n options: ApiClientOptions\n): Promise<ApiResponse<ListInvitesResponse>> {\n return browserApiRequest(\"/api/v1/admin/invites\", {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Send invites to multiple users\n */\nexport async function sendInvitesApi(\n invites: InviteInput[],\n options: ApiClientOptions\n): Promise<ApiResponse<InvitesResult>> {\n return browserApiRequest(\"/api/v1/admin/invites\", {\n method: \"POST\",\n body: { invites },\n ...options,\n });\n}\n\n/**\n * Send a single invite\n */\nexport async function sendInviteApi(\n invite: InviteInput,\n options: ApiClientOptions\n): Promise<ApiResponse<InviteResponse>> {\n return browserApiRequest(\"/api/v1/admin/invites/single\", {\n method: \"POST\",\n body: invite,\n ...options,\n });\n}\n\n/**\n * Get an invite by ID\n */\nexport async function getInviteApi(\n inviteId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<InviteResponse>> {\n return browserApiRequest(`/api/v1/admin/invites/${inviteId}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Resend an invite\n */\nexport async function resendInviteApi(\n inviteId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<InviteResponse>> {\n return browserApiRequest(`/api/v1/admin/invites/${inviteId}/resend`, {\n method: \"POST\",\n ...options,\n });\n}\n\n/**\n * Revoke an invite\n */\nexport async function revokeInviteApi(\n inviteId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<{ success: boolean }>> {\n return browserApiRequest(`/api/v1/admin/invites/${inviteId}`, {\n method: \"DELETE\",\n ...options,\n });\n}\n\n/**\n * Accept an invite (used by invited users)\n */\nexport async function acceptInviteApi(\n inviteId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<InviteResponse>> {\n return browserApiRequest(`/api/v1/admin/invites/${inviteId}/accept`, {\n method: \"POST\",\n ...options,\n });\n}\n","/**\n * Product Analytics API\n *\n * Browser-side API client for product analytics.\n * Uses @elqnt/api-client for HTTP requests with automatic token management.\n */\n\nimport { browserApiRequest } from \"@elqnt/api-client/browser\";\nimport type { ApiResponse, ApiClientOptions } from \"@elqnt/api-client\";\nimport type {\n DateFilter,\n SummaryResponse,\n ChatsResponse,\n AgentsAnalyticsResponse,\n UsageResponse,\n DailyResponse,\n EventsResponse,\n AnalyticsEvent,\n GlobalSummaryResponse,\n OrgAnalyticsResponse,\n} from \"../models/analytics\";\n\n// =============================================================================\n// QUERY STRING HELPERS\n// =============================================================================\n\nfunction buildDateFilterParams(filter?: DateFilter): string {\n if (!filter) return \"\";\n const params = new URLSearchParams();\n if (filter.from) params.set(\"from\", filter.from);\n if (filter.to) params.set(\"to\", filter.to);\n const queryString = params.toString();\n return queryString ? `?${queryString}` : \"\";\n}\n\n// =============================================================================\n// ORG ANALYTICS (Per-Organization)\n// =============================================================================\n\n/**\n * Get analytics summary (total chats, messages, tokens, cost, users)\n */\nexport async function getAnalyticsSummaryApi(\n filter: DateFilter | undefined,\n options: ApiClientOptions\n): Promise<ApiResponse<SummaryResponse>> {\n const queryString = buildDateFilterParams(filter);\n return browserApiRequest(`/api/v1/analytics/summary${queryString}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Get chat analytics with filters\n */\nexport async function getChatsAnalyticsApi(\n filter: DateFilter | undefined,\n agentId: string | undefined,\n options: ApiClientOptions\n): Promise<ApiResponse<ChatsResponse>> {\n const params = new URLSearchParams();\n if (filter?.from) params.set(\"from\", filter.from);\n if (filter?.to) params.set(\"to\", filter.to);\n if (agentId) params.set(\"agent_id\", agentId);\n const queryString = params.toString();\n return browserApiRequest(`/api/v1/analytics/chats${queryString ? `?${queryString}` : \"\"}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Get per-agent analytics\n */\nexport async function getAgentsAnalyticsApi(\n filter: DateFilter | undefined,\n options: ApiClientOptions\n): Promise<ApiResponse<AgentsAnalyticsResponse>> {\n const queryString = buildDateFilterParams(filter);\n return browserApiRequest(`/api/v1/analytics/agents${queryString}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Get token/cost usage analytics by service and model\n */\nexport async function getUsageAnalyticsApi(\n filter: DateFilter | undefined,\n options: ApiClientOptions\n): Promise<ApiResponse<UsageResponse>> {\n const queryString = buildDateFilterParams(filter);\n return browserApiRequest(`/api/v1/analytics/usage${queryString}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Get daily analytics for charts\n */\nexport async function getDailyAnalyticsApi(\n filter: DateFilter | undefined,\n options: ApiClientOptions\n): Promise<ApiResponse<DailyResponse>> {\n const queryString = buildDateFilterParams(filter);\n return browserApiRequest(`/api/v1/analytics/daily${queryString}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Get analytics events log\n */\nexport async function getAnalyticsEventsApi(\n filter: DateFilter | undefined,\n options: ApiClientOptions\n): Promise<ApiResponse<EventsResponse>> {\n const queryString = buildDateFilterParams(filter);\n return browserApiRequest(`/api/v1/analytics/events${queryString}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Log an analytics event from frontend\n */\nexport async function logAnalyticsEventApi(\n event: AnalyticsEvent,\n options: ApiClientOptions\n): Promise<ApiResponse<{ success: boolean }>> {\n return browserApiRequest(\"/api/v1/analytics/events\", {\n method: \"POST\",\n body: event,\n ...options,\n });\n}\n\n// =============================================================================\n// GLOBAL ANALYTICS (Platform Admin)\n// =============================================================================\n\n/**\n * Get platform-wide analytics summary (admin only)\n */\nexport async function getGlobalSummaryApi(\n filter: DateFilter | undefined,\n options: ApiClientOptions\n): Promise<ApiResponse<GlobalSummaryResponse>> {\n const queryString = buildDateFilterParams(filter);\n return browserApiRequest(`/api/v1/analytics/global/summary${queryString}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Get per-org analytics comparison (admin only)\n */\nexport async function getGlobalOrgsAnalyticsApi(\n filter: DateFilter | undefined,\n options: ApiClientOptions\n): Promise<ApiResponse<OrgAnalyticsResponse>> {\n const queryString = buildDateFilterParams(filter);\n return browserApiRequest(`/api/v1/analytics/global/orgs${queryString}`, {\n method: \"GET\",\n ...options,\n });\n}\n","\"use client\";\n\n/**\n * Users admin hooks for React applications\n *\n * Provides React hooks for user CRUD operations with loading/error states.\n */\n\nimport { useState, useCallback } from \"react\";\nimport type { ApiClientOptions } from \"@elqnt/api-client\";\nimport type { User, UserSettings, UserSettingsResponse, NotificationPreferences } from \"../models\";\nimport {\n listUsersApi,\n createUserApi,\n getUserApi,\n getUserByEmailApi,\n getUserByPhoneApi,\n updateUserApi,\n deleteUserApi,\n getUserSettingsApi,\n updateUserSettingsApi,\n} from \"../api\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type UseUsersAdminOptions = ApiClientOptions;\n\n// =============================================================================\n// USE USERS ADMIN HOOK\n// =============================================================================\n\n/**\n * Hook for user CRUD operations\n *\n * @example\n * ```tsx\n * const { loading, error, listUsers, createUser, updateUser } = useUsersAdmin({\n * baseUrl: apiGatewayUrl,\n * orgId: selectedOrgId,\n * userId: user?.id,\n * userEmail: user?.email,\n * });\n *\n * const users = await listUsers();\n * const user = await getUserByEmail(\"user@example.com\");\n * ```\n */\nexport function useUsersAdmin(options: UseUsersAdminOptions) {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const listUsers = useCallback(async (): Promise<User[]> => {\n setLoading(true);\n setError(null);\n try {\n const response = await listUsersApi(options);\n if (response.error) {\n setError(response.error);\n return [];\n }\n return response.data?.users || [];\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to list users\";\n setError(message);\n return [];\n } finally {\n setLoading(false);\n }\n }, [options]);\n\n const getUser = useCallback(\n async (userId: string): Promise<User | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getUserApi(userId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.user || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get user\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const getUserByEmail = useCallback(\n async (email: string): Promise<User | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getUserByEmailApi(email, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.user || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get user by email\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const getUserByPhone = useCallback(\n async (phone: string): Promise<User | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getUserByPhoneApi(phone, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.user || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get user by phone\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const createUser = useCallback(\n async (user: Partial<User>): Promise<User | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await createUserApi(user, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.user || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to create user\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const updateUser = useCallback(\n async (userId: string, updates: Partial<User>): Promise<User | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await updateUserApi(userId, updates, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.user || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to update user\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const deleteUser = useCallback(\n async (userId: string): Promise<boolean> => {\n setLoading(true);\n setError(null);\n try {\n const response = await deleteUserApi(userId, options);\n if (response.error) {\n setError(response.error);\n return false;\n }\n return response.data?.success || false;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to delete user\";\n setError(message);\n return false;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const getUserSettings = useCallback(\n async (userId: string): Promise<UserSettingsResponse | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getUserSettingsApi(userId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get user settings\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const updateUserSettings = useCallback(\n async (\n userId: string,\n settings: {\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n }\n ): Promise<UserSettingsResponse | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await updateUserSettingsApi(userId, settings, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to update user settings\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n return {\n loading,\n error,\n listUsers,\n getUser,\n getUserByEmail,\n getUserByPhone,\n createUser,\n updateUser,\n deleteUser,\n getUserSettings,\n updateUserSettings,\n };\n}\n","\"use client\";\n\n/**\n * Invites admin hooks for React applications\n *\n * Provides React hooks for invitation CRUD operations with loading/error states.\n */\n\nimport { useState, useCallback } from \"react\";\nimport type { ApiClientOptions } from \"@elqnt/api-client\";\nimport type { Invite, InviteInput, InvitesResult } from \"../models\";\nimport {\n listInvitesApi,\n sendInvitesApi,\n sendInviteApi,\n getInviteApi,\n resendInviteApi,\n revokeInviteApi,\n acceptInviteApi,\n} from \"../api\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type UseInvitesAdminOptions = ApiClientOptions;\n\n// =============================================================================\n// USE INVITES ADMIN HOOK\n// =============================================================================\n\n/**\n * Hook for invitation CRUD operations\n *\n * @example\n * ```tsx\n * const { loading, error, listInvites, sendInvite, revokeInvite } = useInvitesAdmin({\n * baseUrl: apiGatewayUrl,\n * orgId: selectedOrgId,\n * userId: user?.id,\n * userEmail: user?.email,\n * });\n *\n * const invites = await listInvites();\n * await sendInvite({ email: \"user@example.com\", role: \"member\" });\n * ```\n */\nexport function useInvitesAdmin(options: UseInvitesAdminOptions) {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const listInvites = useCallback(async (): Promise<Invite[]> => {\n setLoading(true);\n setError(null);\n try {\n const response = await listInvitesApi(options);\n if (response.error) {\n setError(response.error);\n return [];\n }\n return response.data?.invites || [];\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to list invites\";\n setError(message);\n return [];\n } finally {\n setLoading(false);\n }\n }, [options]);\n\n const getInvite = useCallback(\n async (inviteId: string): Promise<Invite | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getInviteApi(inviteId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.invite || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get invite\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const sendInvite = useCallback(\n async (invite: InviteInput): Promise<Invite | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await sendInviteApi(invite, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.invite || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to send invite\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const sendInvites = useCallback(\n async (invites: InviteInput[]): Promise<InvitesResult | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await sendInvitesApi(invites, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to send invites\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const resendInvite = useCallback(\n async (inviteId: string): Promise<Invite | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await resendInviteApi(inviteId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.invite || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to resend invite\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const revokeInvite = useCallback(\n async (inviteId: string): Promise<boolean> => {\n setLoading(true);\n setError(null);\n try {\n const response = await revokeInviteApi(inviteId, options);\n if (response.error) {\n setError(response.error);\n return false;\n }\n return response.data?.success || false;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to revoke invite\";\n setError(message);\n return false;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const acceptInvite = useCallback(\n async (inviteId: string): Promise<Invite | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await acceptInviteApi(inviteId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.invite || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to accept invite\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n return {\n loading,\n error,\n listInvites,\n getInvite,\n sendInvite,\n sendInvites,\n resendInvite,\n revokeInvite,\n acceptInvite,\n };\n}\n","\"use client\";\n\n/**\n * Organization settings hooks for React applications\n *\n * Provides React hooks for organization settings CRUD operations with loading/error states.\n */\n\nimport { useState, useCallback } from \"react\";\nimport type { ApiClientOptions } from \"@elqnt/api-client\";\nimport type { OrgSettings } from \"../models\";\nimport {\n getOrgSettingsApi,\n createOrgSettingsApi,\n updateOrgSettingsApi,\n} from \"../api\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type UseOrgSettingsOptions = ApiClientOptions;\n\n// =============================================================================\n// USE ORG SETTINGS HOOK\n// =============================================================================\n\n/**\n * Hook for organization settings CRUD operations\n *\n * @example\n * ```tsx\n * const { loading, error, getSettings, createSettings, updateSettings } = useOrgSettings({\n * baseUrl: apiGatewayUrl,\n * orgId: selectedOrgId,\n * });\n *\n * const settings = await getSettings();\n * await updateSettings({ timezone: \"America/New_York\" });\n * ```\n */\nexport function useOrgSettings(options: UseOrgSettingsOptions) {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const getSettings = useCallback(async (): Promise<OrgSettings | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getOrgSettingsApi(options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.settings || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get organization settings\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n }, [options]);\n\n const createSettings = useCallback(\n async (settings: Partial<OrgSettings>): Promise<OrgSettings | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await createOrgSettingsApi(settings, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.settings || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to create organization settings\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const updateSettings = useCallback(\n async (settings: Partial<OrgSettings>): Promise<OrgSettings | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await updateOrgSettingsApi(settings, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.settings || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to update organization settings\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n return {\n loading,\n error,\n getSettings,\n createSettings,\n updateSettings,\n };\n}\n","\"use client\";\n\n/**\n * Product Analytics Hook\n *\n * Provides React hooks for product analytics with loading/error states.\n * Includes event tracking for frontend interactions.\n */\n\nimport { useState, useCallback, useRef, useEffect } from \"react\";\nimport type { ApiClientOptions } from \"@elqnt/api-client\";\nimport type {\n DateFilter,\n AnalyticsSummary,\n ChatAnalytics,\n AgentAnalytics,\n UsageAnalytics,\n DailyAnalytics,\n AnalyticsEvent,\n GlobalAnalyticsSummary,\n OrgAnalytics,\n} from \"../models/analytics\";\nimport {\n getAnalyticsSummaryApi,\n getChatsAnalyticsApi,\n getAgentsAnalyticsApi,\n getUsageAnalyticsApi,\n getDailyAnalyticsApi,\n getAnalyticsEventsApi,\n logAnalyticsEventApi,\n getGlobalSummaryApi,\n getGlobalOrgsAnalyticsApi,\n} from \"../api/analytics\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type UseProductAnalyticsOptions = ApiClientOptions;\n\nexport interface ProductAnalyticsState {\n summary: AnalyticsSummary | null;\n chats: ChatAnalytics[];\n agents: AgentAnalytics[];\n usage: UsageAnalytics[];\n daily: DailyAnalytics[];\n events: AnalyticsEvent[];\n loading: boolean;\n error: string | null;\n}\n\n// =============================================================================\n// USE PRODUCT ANALYTICS HOOK\n// =============================================================================\n\n/**\n * Hook for product analytics queries and event tracking\n *\n * @example\n * ```tsx\n * const {\n * loading,\n * error,\n * summary,\n * getSummary,\n * trackEvent,\n * } = useProductAnalytics({\n * baseUrl: apiGatewayUrl,\n * orgId: user?.orgId,\n * userId: user?.id,\n * userEmail: user?.email,\n * });\n *\n * // Fetch analytics\n * await getSummary({ from: \"2024-01-01\", to: \"2024-12-31\" });\n *\n * // Track events\n * trackEvent(\"button_click\", \"ui\", { buttonId: \"submit\" });\n * ```\n */\nexport function useProductAnalytics(options: UseProductAnalyticsOptions) {\n const [state, setState] = useState<ProductAnalyticsState>({\n summary: null,\n chats: [],\n agents: [],\n usage: [],\n daily: [],\n events: [],\n loading: false,\n error: null,\n });\n\n // Session ID for event tracking (persists across renders)\n const sessionIdRef = useRef<string>(\"\");\n\n // Generate session ID on mount\n useEffect(() => {\n if (typeof window !== \"undefined\") {\n // Try to get existing session ID from sessionStorage\n let sessionId = sessionStorage.getItem(\"analytics_session_id\");\n if (!sessionId) {\n sessionId = crypto.randomUUID();\n sessionStorage.setItem(\"analytics_session_id\", sessionId);\n }\n sessionIdRef.current = sessionId;\n }\n }, []);\n\n // ==========================================================================\n // QUERY FUNCTIONS\n // ==========================================================================\n\n const getSummary = useCallback(\n async (filter?: DateFilter): Promise<AnalyticsSummary | null> => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n try {\n const response = await getAnalyticsSummaryApi(filter, options);\n if (response.error) {\n setState((prev) => ({ ...prev, loading: false, error: response.error || null }));\n return null;\n }\n const summary = response.data?.data || null;\n setState((prev) => ({ ...prev, loading: false, summary }));\n return summary;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get analytics summary\";\n setState((prev) => ({ ...prev, loading: false, error: message }));\n return null;\n }\n },\n [options]\n );\n\n const getChats = useCallback(\n async (filter?: DateFilter, agentId?: string): Promise<ChatAnalytics[]> => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n try {\n const response = await getChatsAnalyticsApi(filter, agentId, options);\n if (response.error) {\n setState((prev) => ({ ...prev, loading: false, error: response.error || null }));\n return [];\n }\n const chats = response.data?.data || [];\n setState((prev) => ({ ...prev, loading: false, chats }));\n return chats;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get chat analytics\";\n setState((prev) => ({ ...prev, loading: false, error: message }));\n return [];\n }\n },\n [options]\n );\n\n const getAgents = useCallback(\n async (filter?: DateFilter): Promise<AgentAnalytics[]> => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n try {\n const response = await getAgentsAnalyticsApi(filter, options);\n if (response.error) {\n setState((prev) => ({ ...prev, loading: false, error: response.error || null }));\n return [];\n }\n const agents = response.data?.data || [];\n setState((prev) => ({ ...prev, loading: false, agents }));\n return agents;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get agent analytics\";\n setState((prev) => ({ ...prev, loading: false, error: message }));\n return [];\n }\n },\n [options]\n );\n\n const getUsage = useCallback(\n async (filter?: DateFilter): Promise<UsageAnalytics[]> => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n try {\n const response = await getUsageAnalyticsApi(filter, options);\n if (response.error) {\n setState((prev) => ({ ...prev, loading: false, error: response.error || null }));\n return [];\n }\n const usage = response.data?.data || [];\n setState((prev) => ({ ...prev, loading: false, usage }));\n return usage;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get usage analytics\";\n setState((prev) => ({ ...prev, loading: false, error: message }));\n return [];\n }\n },\n [options]\n );\n\n const getDaily = useCallback(\n async (filter?: DateFilter): Promise<DailyAnalytics[]> => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n try {\n const response = await getDailyAnalyticsApi(filter, options);\n if (response.error) {\n setState((prev) => ({ ...prev, loading: false, error: response.error || null }));\n return [];\n }\n const daily = response.data?.data || [];\n setState((prev) => ({ ...prev, loading: false, daily }));\n return daily;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get daily analytics\";\n setState((prev) => ({ ...prev, loading: false, error: message }));\n return [];\n }\n },\n [options]\n );\n\n const getEvents = useCallback(\n async (filter?: DateFilter): Promise<AnalyticsEvent[]> => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n try {\n const response = await getAnalyticsEventsApi(filter, options);\n if (response.error) {\n setState((prev) => ({ ...prev, loading: false, error: response.error || null }));\n return [];\n }\n const events = response.data?.data || [];\n setState((prev) => ({ ...prev, loading: false, events }));\n return events;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get analytics events\";\n setState((prev) => ({ ...prev, loading: false, error: message }));\n return [];\n }\n },\n [options]\n );\n\n // ==========================================================================\n // EVENT TRACKING\n // ==========================================================================\n\n /**\n * Track an analytics event\n *\n * @param eventType - Type of event (e.g., \"page_view\", \"button_click\", \"chat_start\")\n * @param eventCategory - Category (e.g., \"ui\", \"chat\", \"agent\")\n * @param properties - Additional event properties\n */\n const trackEvent = useCallback(\n async (\n eventType: string,\n eventCategory: string,\n properties?: Record<string, unknown>\n ): Promise<void> => {\n try {\n const event: AnalyticsEvent = {\n sessionId: sessionIdRef.current,\n userId: options.userId || \"\",\n eventType,\n eventCategory,\n pagePath: typeof window !== \"undefined\" ? window.location.pathname : undefined,\n properties,\n };\n await logAnalyticsEventApi(event, options);\n } catch {\n // Silently fail for tracking - don't disrupt user experience\n console.debug(\"Failed to track analytics event:\", eventType);\n }\n },\n [options]\n );\n\n /**\n * Track a page view\n */\n const trackPageView = useCallback(\n async (pageName?: string): Promise<void> => {\n await trackEvent(\"page_view\", \"navigation\", {\n pageName: pageName || (typeof window !== \"undefined\" ? document.title : \"\"),\n });\n },\n [trackEvent]\n );\n\n // ==========================================================================\n // GLOBAL ANALYTICS (Platform Admin)\n // ==========================================================================\n\n const getGlobalSummary = useCallback(\n async (filter?: DateFilter): Promise<GlobalAnalyticsSummary | null> => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n try {\n const response = await getGlobalSummaryApi(filter, options);\n if (response.error) {\n setState((prev) => ({ ...prev, loading: false, error: response.error || null }));\n return null;\n }\n setState((prev) => ({ ...prev, loading: false }));\n return response.data?.data || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get global summary\";\n setState((prev) => ({ ...prev, loading: false, error: message }));\n return null;\n }\n },\n [options]\n );\n\n const getGlobalOrgs = useCallback(\n async (filter?: DateFilter): Promise<OrgAnalytics[]> => {\n setState((prev) => ({ ...prev, loading: true, error: null }));\n try {\n const response = await getGlobalOrgsAnalyticsApi(filter, options);\n if (response.error) {\n setState((prev) => ({ ...prev, loading: false, error: response.error || null }));\n return [];\n }\n setState((prev) => ({ ...prev, loading: false }));\n return response.data?.data || [];\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get org analytics\";\n setState((prev) => ({ ...prev, loading: false, error: message }));\n return [];\n }\n },\n [options]\n );\n\n return {\n // State\n ...state,\n\n // Query functions\n getSummary,\n getChats,\n getAgents,\n getUsage,\n getDaily,\n getEvents,\n\n // Event tracking\n trackEvent,\n trackPageView,\n\n // Global analytics (admin)\n getGlobalSummary,\n getGlobalOrgs,\n };\n}\n\n// =============================================================================\n// ANALYTICS CONTEXT HOOK\n// =============================================================================\n\n/**\n * Hook to use analytics context (for event tracking throughout the app)\n *\n * This is an alias for useProductAnalytics that makes the intent clearer\n * when used primarily for event tracking.\n *\n * @example\n * ```tsx\n * const { trackEvent } = useAnalyticsContext(options);\n * trackEvent(\"form_submit\", \"ui\", { formId: \"contact\" });\n * ```\n */\nexport const useAnalyticsContext = useProductAnalytics;\n"],"mappings":"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","names":["browserApiRequest","browserApiRequest","browserApiRequest","browserApiRequest","browserApiRequest","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback","useState","useCallback"]}
|
|
1
|
+
{"version":3,"sources":["../../hooks/use-org-admin.ts","../../api/index.ts","../../api/orgs.ts","../../api/users.ts","../../api/invites.ts","../../hooks/use-users-admin.ts"],"sourcesContent":["\"use client\";\n\n/**\n * Organization admin hooks for React applications\n *\n * Provides React hooks for organization CRUD operations with loading/error states.\n * Org settings CRUD is merged into this hook (the former `useOrgSettings`).\n */\n\nimport { useState, useCallback } from \"react\";\nimport type { ApiClientOptions } from \"@elqnt/api-client\";\nimport type { Org, OrgInfo, OrgSettings } from \"../models\";\nimport {\n listOrgsApi,\n createOrgApi,\n getOrgApi,\n updateOrgApi,\n deleteOrgApi,\n getOrgInfoApi,\n getOrgSettingsApi,\n createOrgSettingsApi,\n updateOrgSettingsApi,\n type ListOrgsFilter,\n} from \"../api\";\n\n// (createOrgWithSchemas hook removed — per-org schema provisioning is gone.\n// See docs/_db_v2/03_system_org_split.md.)\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type UseOrgAdminOptions = ApiClientOptions;\n\n/**\n * The exact, stable return surface of `useOrgAdmin`.\n *\n * This is the agent/consumer **contract**: the only members that exist on the\n * org-admin hook (org CRUD + the settings methods folded in from the former\n * `useOrgSettings`). Every method is imperative and DOES NOT throw — on failure\n * it resolves to the documented default (`[]`, `null`, `false`) and sets\n * `error`. See `SKILL.md`.\n */\nexport interface UseOrgAdminReturn {\n /** True while any in-flight call runs. */\n loading: boolean;\n /** Last error message, else null. */\n error: string | null;\n\n /** GET /api/v1/admin/orgs (optional ?status&type&product) — default []. */\n listOrgs: (filter?: ListOrgsFilter) => Promise<Org[]>;\n /** GET /api/v1/admin/orgs/{orgId} — default null. */\n getOrg: (orgId: string) => Promise<Org | null>;\n /** GET /api/v1/admin/orgs/{orgId}/info (lightweight) — default null. */\n getOrgInfo: (orgId: string) => Promise<OrgInfo | null>;\n /** POST /api/v1/admin/orgs — created org, or null on error. `product` is transient routing metadata. */\n createOrg: (org: Partial<Org> & { product?: string }) => Promise<Org | null>;\n /** PUT /api/v1/admin/orgs/{orgId} — updated org, or null on error. */\n updateOrg: (orgId: string, updates: Partial<Org>) => Promise<Org | null>;\n /** DELETE /api/v1/admin/orgs/{orgId} — true on success. */\n deleteOrg: (orgId: string) => Promise<boolean>;\n\n // --- Org settings (merged from the former useOrgSettings) ---\n // Settings live on the canonical admin Org row; all three hit\n // /api/v1/admin/orgs/{orgId} under the hood, mapped to the legacy OrgSettings\n // wire shape. They scope to the hook's `options.orgId`.\n\n /** GET /api/v1/admin/orgs/{orgId} → OrgSettings — default null. */\n getSettings: () => Promise<OrgSettings | null>;\n /** Alias for updateSettings (settings rows always exist). PUT /api/v1/admin/orgs/{orgId}. */\n createSettings: (settings: Partial<OrgSettings>) => Promise<OrgSettings | null>;\n /** PUT /api/v1/admin/orgs/{orgId} then re-GET — updated OrgSettings, or null on error. */\n updateSettings: (settings: Partial<OrgSettings>) => Promise<OrgSettings | null>;\n}\n\n// =============================================================================\n// USE ORG ADMIN HOOK\n// =============================================================================\n\n/**\n * Hook for organization CRUD operations\n *\n * @example\n * ```tsx\n * const { loading, error, listOrgs, createOrg, updateOrg } = useOrgAdmin({\n * baseUrl: apiGatewayUrl,\n * orgId: selectedOrgId,\n * userId: user?.id,\n * userEmail: user?.email,\n * });\n *\n * const orgs = await listOrgs();\n * const newOrg = await createOrg({ name: \"Acme Corp\" });\n * ```\n */\nexport function useOrgAdmin(options: UseOrgAdminOptions): UseOrgAdminReturn {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const listOrgs = useCallback(async (filter?: ListOrgsFilter): Promise<Org[]> => {\n setLoading(true);\n setError(null);\n try {\n const response = await listOrgsApi(filter, options);\n if (response.error) {\n setError(response.error);\n return [];\n }\n return response.data?.orgs || [];\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to list organizations\";\n setError(message);\n return [];\n } finally {\n setLoading(false);\n }\n }, [options]);\n\n const getOrg = useCallback(\n async (orgId: string): Promise<Org | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getOrgApi(orgId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.org || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get organization\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const getOrgInfo = useCallback(\n async (orgId: string): Promise<OrgInfo | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getOrgInfoApi(orgId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.orgInfo || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get organization info\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const createOrg = useCallback(\n async (org: Partial<Org> & { product?: string }): Promise<Org | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await createOrgApi(org, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.org || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to create organization\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const updateOrg = useCallback(\n async (orgId: string, updates: Partial<Org>): Promise<Org | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await updateOrgApi(orgId, updates, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.org || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to update organization\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const deleteOrg = useCallback(\n async (orgId: string): Promise<boolean> => {\n setLoading(true);\n setError(null);\n try {\n const response = await deleteOrgApi(orgId, options);\n if (response.error) {\n setError(response.error);\n return false;\n }\n return response.data?.success || false;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to delete organization\";\n setError(message);\n return false;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n // ==========================================================================\n // ORG SETTINGS (merged from the former useOrgSettings)\n // ==========================================================================\n\n const getSettings = useCallback(async (): Promise<OrgSettings | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getOrgSettingsApi(options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.settings || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get organization settings\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n }, [options]);\n\n const createSettings = useCallback(\n async (settings: Partial<OrgSettings>): Promise<OrgSettings | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await createOrgSettingsApi(settings, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.settings || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to create organization settings\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const updateSettings = useCallback(\n async (settings: Partial<OrgSettings>): Promise<OrgSettings | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await updateOrgSettingsApi(settings, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.settings || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to update organization settings\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n return {\n loading,\n error,\n listOrgs,\n getOrg,\n getOrgInfo,\n createOrg,\n updateOrg,\n deleteOrg,\n // Org settings\n getSettings,\n createSettings,\n updateSettings,\n };\n}\n","/**\n * Admin API functions (internal)\n *\n * Low-level API functions that call browserApiRequest directly.\n * These are the building blocks for @elqnt/admin/hooks.\n *\n * **Apps should use hooks (`@elqnt/admin/hooks`) instead of these functions.**\n * Hooks provide loading/error state management on top of these API calls.\n * Only use these directly if you're building a new hook or need an operation\n * that no hook covers yet.\n */\n\nimport { browserApiRequest, clearGatewayTokenCache } from \"@elqnt/api-client/browser\";\nimport type { ApiResponse, ApiClientOptions } from \"@elqnt/api-client\";\n\n// Re-export utility function\nexport { clearGatewayTokenCache };\nimport type { ResponseMetadata } from \"@elqnt/types\";\nimport type {\n OnboardingState,\n OnboardingResponse,\n CreateOrgResponse,\n SendInvitesResponse,\n CreateKnowledgeResponse,\n CreateAgentResponse,\n CompleteOnboardingResponse,\n PaymentSessionResponse,\n OrgSettings,\n OrgSettingsResponse,\n PlansResponse,\n SubscriptionResponse,\n CreditsResponse,\n CreateCheckoutResponse,\n PortalSessionResponse,\n ProvisionAgentsResponse,\n ProvisionEntitiesResponse,\n ProvisionWorkflowsResponse,\n} from \"../models\";\n\n// =============================================================================\n// ONBOARDING API OPTIONS\n// =============================================================================\n\n/**\n * Onboarding API options - orgId is optional since user may not have org yet\n */\nexport interface OnboardingApiOptions {\n baseUrl: string;\n orgId?: string;\n userId?: string;\n userEmail?: string;\n headers?: Record<string, string>;\n}\n\n// =============================================================================\n// ONBOARDING API\n// =============================================================================\n\nexport async function getOnboardingStatusApi(\n options: OnboardingApiOptions\n): Promise<ApiResponse<OnboardingResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/status\", {\n method: \"GET\",\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function startOnboardingApi(\n options: OnboardingApiOptions\n): Promise<ApiResponse<OnboardingResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/start\", {\n method: \"POST\",\n body: {},\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function createPaymentSessionApi(\n params: { plan: string; billingCycle: string; seats: number; successUrl: string; cancelUrl: string },\n options: OnboardingApiOptions\n): Promise<ApiResponse<PaymentSessionResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/step/payment\", {\n method: \"POST\",\n body: params,\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function createOrganizationApi(\n org: { name: string; industry?: string; size?: string; stripeSessionId?: string },\n options: OnboardingApiOptions\n): Promise<ApiResponse<CreateOrgResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/step/organization\", {\n method: \"POST\",\n body: org,\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function sendOnboardingInvitesApi(\n invites: Array<{ email: string; role?: string }>,\n options: OnboardingApiOptions\n): Promise<ApiResponse<SendInvitesResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/step/invites\", {\n method: \"POST\",\n body: { invites },\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function createOnboardingKnowledgeApi(\n knowledge: { name: string; description?: string; websites?: string[] },\n options: OnboardingApiOptions\n): Promise<ApiResponse<CreateKnowledgeResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/step/knowledge\", {\n method: \"POST\",\n body: knowledge,\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function createOnboardingAgentApi(\n agent: { name: string; description?: string; goal?: string },\n options: OnboardingApiOptions\n): Promise<ApiResponse<CreateAgentResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/step/agent\", {\n method: \"POST\",\n body: agent,\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function createAgentWithSkillsApi(\n payload: { agent: Record<string, unknown>; skills: Record<string, unknown>[]; enabledSkillNames: string[] },\n options: OnboardingApiOptions\n): Promise<ApiResponse<CreateAgentResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/agent-with-skills\", {\n method: \"POST\",\n body: payload,\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function completeOnboardingApi(\n options: OnboardingApiOptions\n): Promise<ApiResponse<CompleteOnboardingResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/complete\", {\n method: \"POST\",\n body: {},\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport async function skipOnboardingStepApi(\n step: string,\n options: OnboardingApiOptions\n): Promise<ApiResponse<{ nextStep: string; metadata: ResponseMetadata }>> {\n return browserApiRequest(\"/api/v1/onboarding/skip-step\", {\n method: \"POST\",\n body: { step },\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\nexport interface StartProvisioningResponse {\n orgId: string;\n status: string;\n metadata?: ResponseMetadata;\n}\n\n/**\n * Start provisioning for an onboarding org.\n * Returns the org ID so the frontend can connect to the SSE stream for progress.\n */\nexport async function startOnboardingProvisioningApi(\n options: OnboardingApiOptions\n): Promise<ApiResponse<StartProvisioningResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/provisioning/start\", {\n method: \"POST\",\n body: {},\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\n/**\n * Request body for unified onboarding provisioning\n */\nexport interface ProvisionAllRequest {\n plan: {\n plan: string;\n billingCycle: string;\n seats: number;\n stripeSessionId?: string;\n inviteCode?: string; // If present, this is a free trial (skipped payment)\n };\n org: {\n title: string;\n mainDomain: string;\n // (product field removed — product is implicit in the admin DB)\n industry?: string;\n size?: string;\n };\n invites?: Array<{\n email: string;\n role: string;\n }>;\n knowledge: {\n name: string;\n documents?: Array<{\n title: string;\n fileUrl: string;\n }>;\n };\n agent: {\n name: string;\n goal: string;\n personality: string;\n skills?: string[];\n };\n}\n\n/**\n * Response from unified onboarding provisioning\n */\nexport interface ProvisionAllResponse {\n orgId: string;\n userId: string;\n status: string;\n metadata: ResponseMetadata;\n}\n\n/**\n * Unified onboarding provisioning - collects all data then creates org and provisions everything.\n * This is the new flow where data is collected first, then provisioned via SSE.\n */\nexport async function provisionAllOnboardingApi(\n request: ProvisionAllRequest,\n options: OnboardingApiOptions\n): Promise<ApiResponse<ProvisionAllResponse>> {\n return browserApiRequest(\"/api/v1/onboarding/provision-all\", {\n method: \"POST\",\n body: request,\n ...options,\n orgId: options.orgId || \"\",\n });\n}\n\n// =============================================================================\n// ORG SETTINGS API\n// =============================================================================\n\n/**\n * Org settings live on the canonical admin Org row (since v2.3) — the old\n * /api/v1/org/settings path against integrations is gone. These helpers keep\n * the legacy `OrgSettings` wire shape so consumers (org-settings form, the\n * OrganizationProvider hydration action, etc.) don't need to change. The\n * actual fetch/PUT happens against /admin/orgs/{orgId}.\n */\n\ninterface OrgRowSlice {\n id?: string;\n title?: string;\n description?: string;\n logoUrl?: string;\n defaultLang?: string;\n timezone?: string;\n settings?: { [key: string]: any };\n}\n\nfunction orgRowToSettings(\n orgId: string,\n row: OrgRowSlice | undefined,\n): OrgSettings {\n return {\n id: row?.id ?? \"\",\n org_id: orgId,\n title: row?.title ?? \"\",\n description: row?.description ?? \"\",\n logo_url: row?.logoUrl ?? \"\",\n default_lang: row?.defaultLang ?? \"en\",\n timezone: row?.timezone ?? \"UTC\",\n additional_settings: row?.settings ?? {},\n created_at: \"\",\n updated_at: \"\",\n created_by: \"\",\n updated_by: \"\",\n };\n}\n\nfunction settingsToOrgRow(settings: Partial<OrgSettings>): Partial<OrgRowSlice> {\n return {\n title: settings.title,\n description: settings.description,\n logoUrl: settings.logo_url,\n defaultLang: settings.default_lang,\n timezone: settings.timezone,\n settings: settings.additional_settings,\n };\n}\n\nexport async function getOrgSettingsApi(\n options: ApiClientOptions\n): Promise<ApiResponse<OrgSettingsResponse>> {\n const orgId = options.orgId ?? \"\";\n const response = await browserApiRequest<{ organization?: OrgRowSlice }>(\n `/api/v1/admin/orgs/${orgId}`,\n { method: \"GET\", ...options },\n );\n\n if (response.error) {\n return { error: response.error, status: response.status } as ApiResponse<OrgSettingsResponse>;\n }\n\n return {\n status: response.status,\n data: {\n success: true,\n settings: orgRowToSettings(orgId, response.data?.organization),\n } as OrgSettingsResponse,\n };\n}\n\n/**\n * @deprecated Org settings rows always exist on the admin Org. Kept as an\n * alias for backward compatibility — calls updateOrgSettingsApi.\n */\nexport async function createOrgSettingsApi(\n settings: Partial<OrgSettings>,\n options: ApiClientOptions\n): Promise<ApiResponse<OrgSettingsResponse & { id?: string }>> {\n return updateOrgSettingsApi(settings, options);\n}\n\nexport async function updateOrgSettingsApi(\n settings: Partial<OrgSettings>,\n options: ApiClientOptions\n): Promise<ApiResponse<OrgSettingsResponse>> {\n const orgId = options.orgId ?? \"\";\n const response = await browserApiRequest<{ message?: string }>(\n `/api/v1/admin/orgs/${orgId}`,\n {\n method: \"PUT\",\n body: settingsToOrgRow(settings),\n ...options,\n },\n );\n\n if (response.error) {\n return { error: response.error, status: response.status } as ApiResponse<OrgSettingsResponse>;\n }\n\n // Admin update returns { message: \"...\" }; round-trip a fresh GET so the\n // caller gets the full settings shape (with new updated_at, etc.).\n return getOrgSettingsApi(options);\n}\n\nexport async function updateOrgAgentsApi(\n agentIds: string[],\n options: ApiClientOptions\n): Promise<ApiResponse<ProvisionAgentsResponse>> {\n return browserApiRequest(\"/api/v1/org/agents\", {\n method: \"PUT\",\n body: { agentIds },\n ...options,\n });\n}\n\nexport async function updateEntityDefinitionsApi(\n entityNames: string[],\n options: ApiClientOptions\n): Promise<ApiResponse<ProvisionEntitiesResponse>> {\n return browserApiRequest(\"/api/v1/org/entities\", {\n method: \"PUT\",\n body: { entityNames },\n ...options,\n });\n}\n\nexport async function updateWorkflowDefinitionsApi(\n workflowIds: string[],\n options: ApiClientOptions\n): Promise<ApiResponse<ProvisionWorkflowsResponse>> {\n return browserApiRequest(\"/api/v1/org/workflows\", {\n method: \"PUT\",\n body: { workflowIds },\n ...options,\n });\n}\n\n// =============================================================================\n// BILLING API\n// =============================================================================\n\nexport async function getBillingPlansApi(\n options: ApiClientOptions\n): Promise<ApiResponse<PlansResponse>> {\n return browserApiRequest(\"/api/v1/billing/plans\", {\n method: \"GET\",\n ...options,\n });\n}\n\nexport async function getSubscriptionApi(\n options: ApiClientOptions\n): Promise<ApiResponse<SubscriptionResponse>> {\n return browserApiRequest(\"/api/v1/billing/subscription\", {\n method: \"GET\",\n ...options,\n });\n}\n\nexport async function getCreditsApi(\n options: ApiClientOptions\n): Promise<ApiResponse<CreditsResponse>> {\n return browserApiRequest(\"/api/v1/billing/credits\", {\n method: \"GET\",\n ...options,\n });\n}\n\nexport async function createCheckoutSessionApi(\n params: { priceId: string; seats?: number; successUrl?: string; cancelUrl?: string },\n options: ApiClientOptions\n): Promise<ApiResponse<CreateCheckoutResponse>> {\n return browserApiRequest(\"/api/v1/billing/checkout\", {\n method: \"POST\",\n body: params,\n ...options,\n });\n}\n\nexport async function createPortalSessionApi(\n params: { returnUrl: string },\n options: ApiClientOptions\n): Promise<ApiResponse<PortalSessionResponse>> {\n return browserApiRequest(\"/api/v1/billing/portal\", {\n method: \"POST\",\n body: params,\n ...options,\n });\n}\n\nexport async function cancelSubscriptionApi(\n options: ApiClientOptions\n): Promise<ApiResponse<{ success: boolean; metadata: ResponseMetadata }>> {\n return browserApiRequest(\"/api/v1/billing/subscription/cancel\", {\n method: \"POST\",\n body: {},\n ...options,\n });\n}\n\nexport async function purchaseCreditsApi(\n params: { packageId: string; successUrl?: string; cancelUrl?: string },\n options: ApiClientOptions\n): Promise<ApiResponse<CreateCheckoutResponse>> {\n return browserApiRequest(\"/api/v1/billing/credits/purchase\", {\n method: \"POST\",\n body: params,\n ...options,\n });\n}\n\n// =============================================================================\n// PROVISIONING API (DEPRECATED - use domain packages instead)\n// =============================================================================\n\n/**\n * @deprecated Use `provisionAgentsApi` from `@elqnt/agents/api` instead\n */\nexport async function provisionDefaultAgentsApi(\n definitions: unknown[],\n options: ApiClientOptions\n): Promise<ApiResponse<ProvisionAgentsResponse>> {\n return browserApiRequest(\"/api/v1/admin/provision/agents\", {\n method: \"POST\",\n body: { definitions },\n ...options,\n });\n}\n\n/**\n * @deprecated Use `provisionEntitiesApi` from `@elqnt/entity/api` instead\n */\nexport async function provisionEntitiesApi(\n definitions: unknown[],\n options: ApiClientOptions\n): Promise<ApiResponse<ProvisionEntitiesResponse>> {\n return browserApiRequest(\"/api/v1/admin/entities/update\", {\n method: \"POST\",\n body: { definitions },\n ...options,\n });\n}\n\n/**\n * @deprecated Use `provisionWorkflowsApi` from `@elqnt/workflow/api` instead (coming soon)\n */\nexport async function provisionWorkflowsApi(\n definitions: unknown[],\n options: ApiClientOptions\n): Promise<ApiResponse<ProvisionWorkflowsResponse>> {\n return browserApiRequest(\"/api/v1/admin/provision/workflows\", {\n method: \"POST\",\n body: { definitions },\n ...options,\n });\n}\n\n// =============================================================================\n// ADMIN CRUD APIs\n// =============================================================================\n\nexport * from \"./orgs\";\nexport * from \"./users\";\nexport * from \"./invites\";\n// (analytics API moved to @elqnt/analytics/api.\n// provisioning API removed — per-org artifact provisioning is gone.\n// See docs/_db_v2/03_system_org_split.md.)\n\n// =============================================================================\n// RE-EXPORTS\n// =============================================================================\n\nexport type {\n OnboardingState,\n OnboardingResponse,\n OrgSettings,\n OrgSettingsResponse,\n Plan,\n OrganizationBilling,\n UsageSummary,\n CreditBalance,\n PlansResponse,\n SubscriptionResponse,\n CreditsResponse,\n ProvisionAgentsResponse,\n ProvisionEntitiesResponse,\n ProvisionWorkflowsResponse,\n // Org types\n Org,\n OrgResponse,\n OrgInfoResponse,\n ListOrgsResponse,\n // User types\n User,\n UserResponse,\n ListUsersResponse,\n UserSettings,\n UserSettingsResponse,\n NotificationPreferences,\n // Invite types\n Invite,\n InviteResponse,\n ListInvitesResponse,\n InviteInput,\n InvitesResult,\n} from \"../models\";\n","/**\n * Organizations Admin API\n *\n * Browser-side API client for organization management.\n * Uses @elqnt/api-client for HTTP requests with automatic token management.\n */\n\nimport { browserApiRequest } from \"@elqnt/api-client/browser\";\nimport type { ApiResponse, ApiClientOptions } from \"@elqnt/api-client\";\nimport type {\n Org,\n OrgResponse,\n OrgInfoResponse,\n ListOrgsResponse,\n OrgStatusTS,\n OrgTypeTS,\n} from \"../models\";\n\n// =============================================================================\n// FILTER TYPES\n// =============================================================================\n\n/**\n * Filter options for listing organizations\n *\n * `product` is routing metadata: it selects which admin_<product> DB to read\n * from (empty → eloquent). It is not a stored column on the org.\n */\nexport interface ListOrgsFilter {\n status?: OrgStatusTS;\n type?: OrgTypeTS;\n product?: string;\n}\n\n// =============================================================================\n// ORGANIZATIONS CRUD\n// =============================================================================\n\n/**\n * List all organizations (admin scope required)\n * @param filter - Optional filter criteria\n * @param options - API client options\n */\nexport async function listOrgsApi(\n filter: ListOrgsFilter | undefined,\n options: ApiClientOptions\n): Promise<ApiResponse<ListOrgsResponse>> {\n const params = new URLSearchParams();\n if (filter?.status) params.set(\"status\", filter.status);\n if (filter?.type) params.set(\"type\", filter.type);\n if (filter?.product) params.set(\"product\", filter.product);\n\n const queryString = params.toString();\n const url = queryString ? `/api/v1/admin/orgs?${queryString}` : \"/api/v1/admin/orgs\";\n\n return browserApiRequest(url, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Create a new organization\n */\nexport async function createOrgApi(\n // `product` is transient routing metadata (which admin_<product> DB to write\n // to) sent alongside the org fields — it is not persisted on the org.\n org: Partial<Org> & { product?: string },\n options: ApiClientOptions\n): Promise<ApiResponse<OrgResponse>> {\n return browserApiRequest(\"/api/v1/admin/orgs\", {\n method: \"POST\",\n body: org,\n ...options,\n });\n}\n\n/**\n * Get an organization by ID\n */\nexport async function getOrgApi(\n orgId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<OrgResponse>> {\n return browserApiRequest(`/api/v1/admin/orgs/${orgId}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Update an organization\n */\nexport async function updateOrgApi(\n orgId: string,\n updates: Partial<Org>,\n options: ApiClientOptions\n): Promise<ApiResponse<OrgResponse>> {\n return browserApiRequest(`/api/v1/admin/orgs/${orgId}`, {\n method: \"PUT\",\n body: updates,\n ...options,\n });\n}\n\n/**\n * Delete an organization\n */\nexport async function deleteOrgApi(\n orgId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<{ success: boolean }>> {\n return browserApiRequest(`/api/v1/admin/orgs/${orgId}`, {\n method: \"DELETE\",\n ...options,\n });\n}\n\n/**\n * Get organization info (lightweight response)\n */\nexport async function getOrgInfoApi(\n orgId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<OrgInfoResponse>> {\n return browserApiRequest(`/api/v1/admin/orgs/${orgId}/info`, {\n method: \"GET\",\n ...options,\n });\n}\n\n// (createOrgWithSchemasApi removed — per-org schema provisioning is gone.\n// See docs/_db_v2/03_system_org_split.md.)\n","/**\n * Users Admin API\n *\n * Browser-side API client for user management.\n * Uses @elqnt/api-client for HTTP requests with automatic token management.\n */\n\nimport { browserApiRequest } from \"@elqnt/api-client/browser\";\nimport type { ApiResponse, ApiClientOptions } from \"@elqnt/api-client\";\nimport type {\n User,\n UserResponse,\n ListUsersResponse,\n UserSettings,\n UserSettingsResponse,\n NotificationPreferences,\n} from \"../models\";\n\n// =============================================================================\n// USERS CRUD\n// =============================================================================\n\n/**\n * List all users in the organization\n */\nexport async function listUsersApi(\n options: ApiClientOptions\n): Promise<ApiResponse<ListUsersResponse>> {\n return browserApiRequest(\"/api/v1/admin/users\", {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Create a new user\n */\nexport async function createUserApi(\n user: Partial<User>,\n options: ApiClientOptions\n): Promise<ApiResponse<UserResponse>> {\n return browserApiRequest(\"/api/v1/admin/users\", {\n method: \"POST\",\n body: user,\n ...options,\n });\n}\n\n/**\n * Get a user by ID\n */\nexport async function getUserApi(\n userId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<UserResponse>> {\n return browserApiRequest(`/api/v1/admin/users/${userId}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Get a user by email\n */\nexport async function getUserByEmailApi(\n email: string,\n options: ApiClientOptions\n): Promise<ApiResponse<UserResponse>> {\n return browserApiRequest(`/api/v1/admin/users/by-email?email=${encodeURIComponent(email)}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Get a user by phone number (stored in metadata.phoneNumber)\n */\nexport async function getUserByPhoneApi(\n phone: string,\n options: ApiClientOptions\n): Promise<ApiResponse<UserResponse>> {\n return browserApiRequest(`/api/v1/admin/users/by-phone?phone=${encodeURIComponent(phone)}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Update a user\n */\nexport async function updateUserApi(\n userId: string,\n updates: Partial<User>,\n options: ApiClientOptions\n): Promise<ApiResponse<UserResponse>> {\n return browserApiRequest(`/api/v1/admin/users/${userId}`, {\n method: \"PUT\",\n body: updates,\n ...options,\n });\n}\n\n/**\n * Delete a user\n */\nexport async function deleteUserApi(\n userId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<{ success: boolean }>> {\n return browserApiRequest(`/api/v1/admin/users/${userId}`, {\n method: \"DELETE\",\n ...options,\n });\n}\n\n// =============================================================================\n// USER SETTINGS\n// =============================================================================\n\n/**\n * Get user settings\n */\nexport async function getUserSettingsApi(\n userId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<UserSettingsResponse>> {\n return browserApiRequest(`/api/v1/admin/users/${userId}/settings`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Update user settings\n */\nexport async function updateUserSettingsApi(\n userId: string,\n settings: {\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n },\n options: ApiClientOptions\n): Promise<ApiResponse<UserSettingsResponse>> {\n return browserApiRequest(`/api/v1/admin/users/${userId}/settings`, {\n method: \"PUT\",\n body: settings,\n ...options,\n });\n}\n","/**\n * Invites Admin API\n *\n * Browser-side API client for invitation management.\n * Uses @elqnt/api-client for HTTP requests with automatic token management.\n */\n\nimport { browserApiRequest } from \"@elqnt/api-client/browser\";\nimport type { ApiResponse, ApiClientOptions } from \"@elqnt/api-client\";\nimport type {\n Invite,\n InviteResponse,\n ListInvitesResponse,\n InviteInput,\n InvitesResult,\n} from \"../models\";\n\n// =============================================================================\n// INVITES CRUD\n// =============================================================================\n\n/**\n * List all invites in the organization\n */\nexport async function listInvitesApi(\n options: ApiClientOptions\n): Promise<ApiResponse<ListInvitesResponse>> {\n return browserApiRequest(\"/api/v1/admin/invites\", {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Send invites to multiple users\n */\nexport async function sendInvitesApi(\n invites: InviteInput[],\n options: ApiClientOptions\n): Promise<ApiResponse<InvitesResult>> {\n return browserApiRequest(\"/api/v1/admin/invites\", {\n method: \"POST\",\n body: { invites },\n ...options,\n });\n}\n\n/**\n * Send a single invite\n */\nexport async function sendInviteApi(\n invite: InviteInput,\n options: ApiClientOptions\n): Promise<ApiResponse<InviteResponse>> {\n return browserApiRequest(\"/api/v1/admin/invites/single\", {\n method: \"POST\",\n body: invite,\n ...options,\n });\n}\n\n/**\n * Get an invite by ID\n */\nexport async function getInviteApi(\n inviteId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<InviteResponse>> {\n return browserApiRequest(`/api/v1/admin/invites/${inviteId}`, {\n method: \"GET\",\n ...options,\n });\n}\n\n/**\n * Resend an invite\n */\nexport async function resendInviteApi(\n inviteId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<InviteResponse>> {\n return browserApiRequest(`/api/v1/admin/invites/${inviteId}/resend`, {\n method: \"POST\",\n ...options,\n });\n}\n\n/**\n * Revoke an invite\n */\nexport async function revokeInviteApi(\n inviteId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<{ success: boolean }>> {\n return browserApiRequest(`/api/v1/admin/invites/${inviteId}`, {\n method: \"DELETE\",\n ...options,\n });\n}\n\n/**\n * Accept an invite (used by invited users)\n */\nexport async function acceptInviteApi(\n inviteId: string,\n options: ApiClientOptions\n): Promise<ApiResponse<InviteResponse>> {\n return browserApiRequest(`/api/v1/admin/invites/${inviteId}/accept`, {\n method: \"POST\",\n ...options,\n });\n}\n","\"use client\";\n\n/**\n * Users admin hooks for React applications\n *\n * Provides React hooks for user CRUD operations with loading/error states.\n * Invitation CRUD is merged into this hook (the former `useInvitesAdmin`).\n */\n\nimport { useState, useCallback } from \"react\";\nimport type { ApiClientOptions } from \"@elqnt/api-client\";\nimport type {\n User,\n UserSettings,\n UserSettingsResponse,\n NotificationPreferences,\n Invite,\n InviteInput,\n InvitesResult,\n} from \"../models\";\nimport {\n listUsersApi,\n createUserApi,\n getUserApi,\n getUserByEmailApi,\n getUserByPhoneApi,\n updateUserApi,\n deleteUserApi,\n getUserSettingsApi,\n updateUserSettingsApi,\n listInvitesApi,\n sendInvitesApi,\n sendInviteApi,\n getInviteApi,\n resendInviteApi,\n revokeInviteApi,\n acceptInviteApi,\n} from \"../api\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport type UseUsersAdminOptions = ApiClientOptions;\n\n/**\n * The exact, stable return surface of `useUsersAdmin`.\n *\n * Agent/consumer **contract**: the only members on the users-admin hook (user\n * CRUD + the invitation methods folded in from the former `useInvitesAdmin`).\n * Every method is imperative and DOES NOT throw — on failure it resolves to its\n * default (`[]`, `null`, `false`) and sets `error`. See `SKILL.md`.\n */\nexport interface UseUsersAdminReturn {\n /** True while any in-flight call runs. */\n loading: boolean;\n /** Last error message, else null. */\n error: string | null;\n\n /** GET /api/v1/admin/users — default []. */\n listUsers: () => Promise<User[]>;\n /** GET /api/v1/admin/users/{userId} — default null. */\n getUser: (userId: string) => Promise<User | null>;\n /** GET /api/v1/admin/users/by-email?email= — default null. */\n getUserByEmail: (email: string) => Promise<User | null>;\n /** GET /api/v1/admin/users/by-phone?phone= — default null. */\n getUserByPhone: (phone: string) => Promise<User | null>;\n /** POST /api/v1/admin/users — created user, or null on error. */\n createUser: (user: Partial<User>) => Promise<User | null>;\n /** PUT /api/v1/admin/users/{userId} — updated user, or null on error. */\n updateUser: (userId: string, updates: Partial<User>) => Promise<User | null>;\n /** DELETE /api/v1/admin/users/{userId} — true on success. */\n deleteUser: (userId: string) => Promise<boolean>;\n /** GET /api/v1/admin/users/{userId}/settings — default null. */\n getUserSettings: (userId: string) => Promise<UserSettingsResponse | null>;\n /** PUT /api/v1/admin/users/{userId}/settings — updated settings, or null on error. */\n updateUserSettings: (\n userId: string,\n settings: {\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n },\n ) => Promise<UserSettingsResponse | null>;\n\n // --- Invitations (merged from the former useInvitesAdmin) ---\n\n /** GET /api/v1/admin/invites — default []. */\n listInvites: () => Promise<Invite[]>;\n /** GET /api/v1/admin/invites/{inviteId} — default null. */\n getInvite: (inviteId: string) => Promise<Invite | null>;\n /** POST /api/v1/admin/invites/single — created invite, or null on error. */\n sendInvite: (invite: InviteInput) => Promise<Invite | null>;\n /** POST /api/v1/admin/invites, body { invites } — batch result, or null on error. */\n sendInvites: (invites: InviteInput[]) => Promise<InvitesResult | null>;\n /** POST /api/v1/admin/invites/{inviteId}/resend — invite, or null on error. */\n resendInvite: (inviteId: string) => Promise<Invite | null>;\n /** DELETE /api/v1/admin/invites/{inviteId} — true on success. */\n revokeInvite: (inviteId: string) => Promise<boolean>;\n /** POST /api/v1/admin/invites/{inviteId}/accept — invite, or null on error. */\n acceptInvite: (inviteId: string) => Promise<Invite | null>;\n}\n\n// =============================================================================\n// USE USERS ADMIN HOOK\n// =============================================================================\n\n/**\n * Hook for user + invitation CRUD operations\n *\n * @example\n * ```tsx\n * const { loading, error, listUsers, createUser, updateUser, listInvites, sendInvite } = useUsersAdmin({\n * baseUrl: apiGatewayUrl,\n * orgId: selectedOrgId,\n * userId: user?.id,\n * userEmail: user?.email,\n * });\n *\n * const users = await listUsers();\n * const user = await getUserByEmail(\"user@example.com\");\n * await sendInvite({ email: \"user@example.com\", role: \"member\" });\n * ```\n */\nexport function useUsersAdmin(options: UseUsersAdminOptions): UseUsersAdminReturn {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const listUsers = useCallback(async (): Promise<User[]> => {\n setLoading(true);\n setError(null);\n try {\n const response = await listUsersApi(options);\n if (response.error) {\n setError(response.error);\n return [];\n }\n return response.data?.users || [];\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to list users\";\n setError(message);\n return [];\n } finally {\n setLoading(false);\n }\n }, [options]);\n\n const getUser = useCallback(\n async (userId: string): Promise<User | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getUserApi(userId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.user || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get user\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const getUserByEmail = useCallback(\n async (email: string): Promise<User | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getUserByEmailApi(email, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.user || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get user by email\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const getUserByPhone = useCallback(\n async (phone: string): Promise<User | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getUserByPhoneApi(phone, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.user || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get user by phone\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const createUser = useCallback(\n async (user: Partial<User>): Promise<User | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await createUserApi(user, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.user || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to create user\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const updateUser = useCallback(\n async (userId: string, updates: Partial<User>): Promise<User | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await updateUserApi(userId, updates, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.user || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to update user\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const deleteUser = useCallback(\n async (userId: string): Promise<boolean> => {\n setLoading(true);\n setError(null);\n try {\n const response = await deleteUserApi(userId, options);\n if (response.error) {\n setError(response.error);\n return false;\n }\n return response.data?.success || false;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to delete user\";\n setError(message);\n return false;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const getUserSettings = useCallback(\n async (userId: string): Promise<UserSettingsResponse | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getUserSettingsApi(userId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get user settings\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const updateUserSettings = useCallback(\n async (\n userId: string,\n settings: {\n settings?: UserSettings;\n notificationPreferences?: NotificationPreferences;\n }\n ): Promise<UserSettingsResponse | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await updateUserSettingsApi(userId, settings, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to update user settings\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n // ==========================================================================\n // INVITATIONS (merged from the former useInvitesAdmin)\n // ==========================================================================\n\n const listInvites = useCallback(async (): Promise<Invite[]> => {\n setLoading(true);\n setError(null);\n try {\n const response = await listInvitesApi(options);\n if (response.error) {\n setError(response.error);\n return [];\n }\n return response.data?.invites || [];\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to list invites\";\n setError(message);\n return [];\n } finally {\n setLoading(false);\n }\n }, [options]);\n\n const getInvite = useCallback(\n async (inviteId: string): Promise<Invite | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await getInviteApi(inviteId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.invite || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to get invite\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const sendInvite = useCallback(\n async (invite: InviteInput): Promise<Invite | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await sendInviteApi(invite, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.invite || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to send invite\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const sendInvites = useCallback(\n async (invites: InviteInput[]): Promise<InvitesResult | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await sendInvitesApi(invites, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to send invites\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const resendInvite = useCallback(\n async (inviteId: string): Promise<Invite | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await resendInviteApi(inviteId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.invite || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to resend invite\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const revokeInvite = useCallback(\n async (inviteId: string): Promise<boolean> => {\n setLoading(true);\n setError(null);\n try {\n const response = await revokeInviteApi(inviteId, options);\n if (response.error) {\n setError(response.error);\n return false;\n }\n return response.data?.success || false;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to revoke invite\";\n setError(message);\n return false;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n const acceptInvite = useCallback(\n async (inviteId: string): Promise<Invite | null> => {\n setLoading(true);\n setError(null);\n try {\n const response = await acceptInviteApi(inviteId, options);\n if (response.error) {\n setError(response.error);\n return null;\n }\n return response.data?.invite || null;\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Failed to accept invite\";\n setError(message);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [options]\n );\n\n return {\n loading,\n error,\n listUsers,\n getUser,\n getUserByEmail,\n getUserByPhone,\n createUser,\n updateUser,\n deleteUser,\n getUserSettings,\n updateUserSettings,\n // Invitations\n listInvites,\n getInvite,\n sendInvite,\n sendInvites,\n resendInvite,\n revokeInvite,\n acceptInvite,\n };\n}\n"],"mappings":"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","names":["browserApiRequest","browserApiRequest","browserApiRequest","browserApiRequest","useState","useCallback","useState","useCallback"]}
|