@startsimpli/api 0.2.2 → 0.2.4
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/package.json +6 -12
- package/dist/index.d.mts +0 -2235
- package/dist/index.d.ts +0 -2235
- package/dist/index.js +0 -2092
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -2010
- package/dist/index.mjs.map +0 -1
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/url-builder.ts","../src/utils/query-params.ts","../src/utils/validate-response.ts","../src/utils/entity-query-builder.ts","../src/utils/drf-transforms.ts","../src/lib/error-handler.ts","../src/lib/fetch-wrapper.ts","../src/lib/api-client.ts","../src/constants/endpoints.ts","../src/lib/contacts-api.ts","../src/lib/organizations-api.ts","../src/lib/entities-api.ts","../src/lib/workflows-api.ts","../src/lib/messages-api.ts","../src/lib/funnels-api.ts","../src/lib/errors.ts","../src/lib/sanitize.ts","../src/lib/llm-sanitize.ts","../src/lib/cors.ts","../src/types/response.ts","../src/types/error.ts","../src/lib/rate-limit.ts","../src/lib/cache-store.ts","../src/lib/cache-manager.ts","../src/constants/options.ts","../src/hooks/use-server-list.ts","../src/hooks/use-server-detail.ts","../src/lib/env.ts","../src/index.ts"],"names":["AppErrorCode","ErrorCodes","ErrorCode","DEFAULT_CONFIG","useState","useCallback","useEffect"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * URL construction utilities for Django REST API\n */\n\nexport interface UrlBuilderOptions {\n baseUrl: string;\n endpoint: string;\n params?: Record<string, unknown>;\n id?: string | number;\n}\n\n/**\n * Build API URL with query parameters\n */\nexport function buildUrl({ baseUrl, endpoint, params, id }: UrlBuilderOptions): string {\n // Remove trailing slash from baseUrl, leading slash from endpoint\n const cleanBase = baseUrl.replace(/\\/$/, '');\n const cleanEndpoint = endpoint.replace(/^\\//, '');\n\n // Build path with optional ID\n let path = `${cleanBase}/${cleanEndpoint}`;\n if (id !== undefined) {\n path += `/${id}`;\n }\n\n // Add trailing slash (Django convention)\n if (!path.endsWith('/')) {\n path += '/';\n }\n\n // Add query parameters\n if (params && Object.keys(params).length > 0) {\n const queryString = buildQueryString(params);\n if (queryString) {\n path += `?${queryString}`;\n }\n }\n\n return path;\n}\n\n/**\n * Build query string from params object\n */\nexport function buildQueryString(params: Record<string, unknown>): string {\n const searchParams = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n\n if (Array.isArray(value)) {\n // Django handles arrays with comma-separated values\n value.forEach((item) => {\n searchParams.append(key, String(item));\n });\n } else if (typeof value === 'object') {\n // Serialize objects as JSON\n searchParams.append(key, JSON.stringify(value));\n } else {\n searchParams.append(key, String(value));\n }\n });\n\n return searchParams.toString();\n}\n\n/**\n * Resolve a full or partial API path to a final URL.\n *\n * Handles four cases:\n * - Absolute input URL → returned unchanged\n * - Absolute baseUrl → joined via URL constructor\n * - Relative baseUrl → string concatenation\n * - Empty / undefined baseUrl → path returned as-is (suits Next.js proxy pattern)\n */\nexport function resolveApiUrl(path: string, baseUrl: string = ''): string {\n // Already a full URL — pass through unchanged\n if (/^https?:\\/\\//i.test(path)) return path;\n\n const normalized = path.startsWith('/') ? path : `/${path}`;\n\n if (!baseUrl) return normalized;\n\n // Absolute base: use URL constructor for correct joining\n if (/^https?:\\/\\//i.test(baseUrl)) {\n return new URL(normalized, baseUrl).toString();\n }\n\n // Relative base: strip trailing slash, prepend\n const cleanBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n return `${cleanBase}${normalized}`;\n}\n\n/**\n * Extract ID from URL or return as-is\n */\nexport function normalizeId(id: string | number): string | number {\n if (typeof id === 'string' && id.includes('/')) {\n const parts = id.split('/').filter(Boolean);\n return parts[parts.length - 1];\n }\n return id;\n}\n","/**\n * Django query parameter helpers\n */\n\nimport type { PaginationParams, SortParams } from '../types';\n\nexport interface DjangoFilterParams extends PaginationParams, SortParams {\n search?: string;\n [key: string]: unknown;\n}\n\n/**\n * Build Django filter params from filters object\n */\nexport function buildFilterParams<T extends Record<string, unknown>>(\n filters: T\n): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n Object.entries(filters).forEach(([key, value]) => {\n if (value === undefined || value === null) {\n return;\n }\n\n // Handle boolean filters (e.g., has_email=true)\n if (typeof value === 'boolean') {\n params[key] = value;\n return;\n }\n\n // Handle array filters (e.g., tier__in=[1,2,3])\n if (Array.isArray(value)) {\n if (value.length > 0) {\n params[`${key}__in`] = value.join(',');\n }\n return; // Skip empty arrays\n }\n\n // Handle range filters (e.g., check_size_min__gte=100000)\n if (key.endsWith('_gte') || key.endsWith('_lte') || key.endsWith('_gt') || key.endsWith('_lt')) {\n params[key] = value;\n return;\n }\n\n // Default: exact match\n params[key] = value;\n });\n\n return params;\n}\n\n/**\n * Build Django ordering param from sort config\n */\nexport function buildOrderingParam(\n field?: string,\n direction: 'asc' | 'desc' = 'asc'\n): string | undefined {\n if (!field) {\n return undefined;\n }\n\n return direction === 'desc' ? `-${field}` : field;\n}\n\n/**\n * Merge pagination, sorting, and filter params\n */\nexport function mergeQueryParams(\n pagination?: PaginationParams,\n sorting?: SortParams,\n filters?: Record<string, unknown>\n): Record<string, unknown> {\n return {\n ...filters,\n ...pagination,\n ...sorting,\n };\n}\n","/**\n * Runtime API response validation\n *\n * Validates responses against Zod schemas but NEVER throws.\n * On mismatch: logs a warning, returns original data cast to expected type.\n * Schema drift should not crash the app.\n */\n\nimport { z } from 'zod';\n\n/**\n * Validate an API response against a Zod schema.\n *\n * - On success: returns parsed (cleaned) data\n * - On failure: logs a warning with `context` label, returns the raw data\n * cast as T. **The return value is NOT guaranteed to satisfy T on\n * validation failure** — callers must tolerate schema drift at runtime.\n *\n * This is intentional — schema drift should degrade gracefully,\n * not crash the app. Pass a unique `context` string so mismatches\n * can be traced in logs (e.g. `\"contacts.list\"`, `\"campaigns.get\"`).\n */\nexport function validateApiResponse<T>(\n data: unknown,\n schema: z.ZodSchema<T>,\n context?: string\n): T {\n const result = schema.safeParse(data);\n if (!result.success) {\n const label = context ? `[${context}]` : '[API validation]';\n // BEAD: fund-your-startup-kadw - returns unvalidated data cast to T on failure; callers get wrong type silently\n console.warn(\n `${label} Schema mismatch — returning raw data.`,\n result.error.flatten().fieldErrors\n );\n return data as T;\n }\n return result.data;\n}\n","/**\n * Generic Entity Query Builder\n *\n * Builds server-side query parameters for entity filtering.\n * Supports tags, metrics, profiles, attributes, pagination, search, sorting, and date ranges.\n *\n * Usage:\n * const params = new EntityQueryBuilder()\n * .withTags('quality:tier_1', 'status:prospect')\n * .withMetrics('financial:aum__gte:100000000')\n * .paginate(1, 25)\n * .search('acme')\n * .sort('name', 'asc')\n * .build()\n */\n\nexport class EntityQueryBuilder {\n private params: Map<string, string> = new Map();\n\n /**\n * Filter by entity type\n */\n entityType(type: 'CONTACT' | 'ORGANIZATION'): this {\n this.params.set('entity_type', type);\n return this;\n }\n\n /**\n * Add tag filters (compact format: \"category:name\")\n *\n * @example\n * .withTags('quality:tier_1', 'status:prospect')\n * // produces: tags=quality:tier_1,status:prospect\n */\n withTags(...tags: string[]): this {\n if (tags.length > 0) {\n const existing = this.params.get('tags');\n const combined = existing ? `${existing},${tags.join(',')}` : tags.join(',');\n this.params.set('tags', combined);\n }\n return this;\n }\n\n /**\n * Add metric filters (compact format: \"type:subtype__operator:value\")\n *\n * @example\n * .withMetrics('financial:aum__gte:100000000', 'check_size:min__gte:1000000')\n */\n withMetrics(...metrics: string[]): this {\n if (metrics.length > 0) {\n const existing = this.params.get('metrics');\n const combined = existing ? `${existing},${metrics.join(',')}` : metrics.join(',');\n this.params.set('metrics', combined);\n }\n return this;\n }\n\n /**\n * Add profile filters (compact format: \"type:subtype\")\n *\n * @example\n * .withProfiles('professional:linkedin', 'social:twitter')\n */\n withProfiles(...profiles: string[]): this {\n if (profiles.length > 0) {\n const existing = this.params.get('profiles');\n const combined = existing ? `${existing},${profiles.join(',')}` : profiles.join(',');\n this.params.set('profiles', combined);\n }\n return this;\n }\n\n /**\n * Add attribute filters (compact format: \"type:subtype:value\")\n *\n * @example\n * .withAttributes('demographic:location:san_francisco')\n */\n withAttributes(...attrs: string[]): this {\n if (attrs.length > 0) {\n const existing = this.params.get('attributes');\n const combined = existing ? `${existing},${attrs.join(',')}` : attrs.join(',');\n this.params.set('attributes', combined);\n }\n return this;\n }\n\n /**\n * Set pagination parameters\n */\n paginate(page: number, pageSize: number): this {\n this.params.set('page', String(page));\n this.params.set('page_size', String(pageSize));\n return this;\n }\n\n /**\n * Set search query\n */\n search(query: string): this {\n const trimmed = query.trim();\n if (trimmed) {\n this.params.set('search', trimmed);\n }\n return this;\n }\n\n /**\n * Set sort field and direction (maps to Django's `ordering` param)\n */\n sort(field: string, direction: 'asc' | 'desc' = 'asc'): this {\n const prefix = direction === 'desc' ? '-' : '';\n this.params.set('ordering', `${prefix}${field}`);\n return this;\n }\n\n /**\n * Add a date range filter on a given field\n *\n * @example\n * .withDateRange('created', new Date('2024-01-01'), new Date('2024-12-31'))\n * // produces: created_after=2024-01-01&created_before=2024-12-31\n */\n withDateRange(field: string, from?: Date, to?: Date): this {\n if (from) {\n this.params.set(`${field}_after`, from.toISOString().split('T')[0]);\n }\n if (to) {\n this.params.set(`${field}_before`, to.toISOString().split('T')[0]);\n }\n return this;\n }\n\n /**\n * Set an arbitrary query parameter\n */\n param(key: string, value: string): this {\n this.params.set(key, value);\n return this;\n }\n\n /**\n * Build as a plain object (suitable for URLSearchParams or fetch helpers)\n */\n build(): Record<string, string> {\n const result: Record<string, string> = {};\n this.params.forEach((value, key) => {\n result[key] = value;\n });\n return result;\n }\n\n /**\n * Build as a query string (includes leading `?`)\n * Returns empty string if no params.\n */\n toQueryString(): string {\n if (this.params.size === 0) return '';\n const searchParams = new URLSearchParams();\n this.params.forEach((value, key) => {\n searchParams.set(key, value);\n });\n return `?${searchParams.toString()}`;\n }\n\n /**\n * Reset all parameters\n */\n clear(): this {\n this.params.clear();\n return this;\n }\n}\n","/**\n * Django REST Framework response transformations\n *\n * Normalizes DRF paginated responses into a frontend-friendly shape.\n */\n\n/**\n * Raw DRF paginated response shape\n */\nexport interface DRFPaginatedResponse<T> {\n count: number;\n next: string | null;\n previous: string | null;\n results: T[];\n}\n\n/**\n * Normalized paginated response for frontend consumption\n */\nexport interface NormalizedPaginatedResponse<T> {\n items: T[];\n total: number;\n page: number;\n pageSize: number;\n hasNext: boolean;\n hasPrev: boolean;\n}\n\n/**\n * Normalize a DRF paginated response into a frontend-friendly format.\n *\n * @param response - Raw DRF paginated response\n * @param page - Current page number (1-based)\n * @param pageSize - Items per page\n */\nexport function normalizePaginated<T>(\n response: DRFPaginatedResponse<T>,\n page: number,\n pageSize: number\n): NormalizedPaginatedResponse<T> {\n const total = response.count || 0;\n return {\n items: response.results || [],\n total,\n page,\n pageSize,\n hasNext: response.next !== null,\n hasPrev: response.previous !== null,\n };\n}\n\n/**\n * Check if a response is a DRF paginated response\n */\nexport function isDRFPaginatedResponse<T = unknown>(\n response: unknown\n): response is DRFPaginatedResponse<T> {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'results' in response &&\n 'count' in response\n );\n}\n","/**\n * API error handling and normalization\n */\n\nimport type { DRFApiError } from '../types';\n\nexport class ApiException extends Error {\n public status?: number;\n public statusText?: string;\n public errors?: Record<string, string[]>;\n public detail?: string;\n\n constructor(message: string, options?: Partial<DRFApiError>) {\n super(message);\n this.name = 'ApiException';\n this.status = options?.status;\n this.statusText = options?.statusText;\n this.errors = options?.errors;\n this.detail = options?.detail;\n }\n\n toJSON(): DRFApiError {\n return {\n message: this.message,\n detail: this.detail,\n status: this.status,\n statusText: this.statusText,\n errors: this.errors,\n };\n }\n}\n\n/**\n * Parse Django REST Framework error response\n */\nexport async function parseErrorResponse(response: Response): Promise<DRFApiError> {\n const contentType = response.headers?.get('content-type');\n\n // Try to parse JSON error\n if (contentType?.includes('application/json')) {\n try {\n const data = await response.json();\n\n // Django REST Framework error format\n if (data.detail) {\n return {\n detail: data.detail,\n message: data.detail,\n status: response.status,\n statusText: response.statusText,\n };\n }\n\n // Validation errors format\n if (typeof data === 'object') {\n return {\n errors: data,\n message: 'Validation error',\n status: response.status,\n statusText: response.statusText,\n };\n }\n\n return {\n message: JSON.stringify(data),\n status: response.status,\n statusText: response.statusText,\n };\n } catch {\n // JSON parse failed, fall through to text handling\n }\n }\n\n // Fallback to text error\n const text = await response.text().catch(() => response.statusText);\n\n return {\n message: text || response.statusText || 'Unknown error',\n status: response.status,\n statusText: response.statusText,\n };\n}\n\n/**\n * Handle fetch errors\n */\nexport function handleFetchError(error: unknown): never {\n if (error instanceof ApiException) {\n throw error;\n }\n\n if (error instanceof TypeError && error.message.includes('fetch')) {\n throw new ApiException('Network error - please check your connection', {\n status: 0,\n statusText: 'Network Error',\n });\n }\n\n if (error instanceof Error) {\n throw new ApiException(error.message, {\n status: 0,\n statusText: 'Client Error',\n });\n }\n\n throw new ApiException('Unknown error occurred', {\n status: 0,\n statusText: 'Unknown Error',\n });\n}\n\n/**\n * Check if error is an API exception\n */\nexport function isApiException(error: unknown): error is ApiException {\n return error instanceof ApiException;\n}\n\n/**\n * Check if error is a validation error\n */\nexport function isValidationError(error: unknown): error is ApiException {\n return isApiException(error) && error.status === 400 && !!error.errors;\n}\n\n/**\n * Check if error is an auth error\n */\nexport function isAuthError(error: unknown): error is ApiException {\n return isApiException(error) && (error.status === 401 || error.status === 403);\n}\n\n/**\n * Check if error is a not found error\n */\nexport function isNotFoundError(error: unknown): error is ApiException {\n return isApiException(error) && error.status === 404;\n}\n","/**\n * Type-safe fetch wrapper for Django REST API\n */\n\nimport type { FetchOptions, HttpMethod } from '../types';\nimport { buildUrl, buildQueryString } from '../utils';\nimport { ApiException, parseErrorResponse, handleFetchError } from './error-handler';\n\nexport interface FetchWrapperConfig {\n baseUrl?: string;\n getToken?: () => Promise<string | null> | string | null;\n onUnauthorized?: () => void;\n onTokenRefresh?: () => Promise<string | null>;\n defaultHeaders?: HeadersInit;\n}\n\nexport class FetchWrapper {\n private config: FetchWrapperConfig;\n private isRefreshing = false;\n private refreshPromise: Promise<string | null> | null = null;\n\n constructor(config: FetchWrapperConfig) {\n this.config = config;\n }\n\n /**\n * Build headers with auth token\n */\n private async buildHeaders(customHeaders?: HeadersInit): Promise<Headers> {\n const headers = new Headers(this.config.defaultHeaders);\n\n // Add custom headers\n if (customHeaders) {\n const customHeadersObj = new Headers(customHeaders);\n customHeadersObj.forEach((value, key) => {\n headers.set(key, value);\n });\n }\n\n // Add auth token if available\n if (this.config.getToken) {\n const token = await this.config.getToken();\n if (token) {\n headers.set('Authorization', `Bearer ${token}`);\n }\n }\n\n // Always set content-type for JSON\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n\n return headers;\n }\n\n /**\n * Execute fetch request\n */\n private async execute<T>(\n method: HttpMethod,\n endpoint: string,\n options?: FetchOptions\n ): Promise<T> {\n try {\n const { params, headers: customHeaders, ...fetchOptions } = options || {};\n\n // Build URL\n const url = buildUrl({\n baseUrl: this.config.baseUrl ?? '',\n endpoint,\n params,\n });\n\n // Build headers\n const headers = await this.buildHeaders(customHeaders);\n\n // Execute request\n let response = await fetch(url, {\n method,\n headers,\n credentials: 'include',\n ...fetchOptions,\n });\n\n // Handle 401 Unauthorized - attempt token refresh\n if (response.status === 401) {\n if (this.config.onTokenRefresh) {\n // Prevent multiple simultaneous refresh attempts\n if (!this.isRefreshing) {\n this.isRefreshing = true;\n this.refreshPromise = this.config.onTokenRefresh().finally(() => {\n this.isRefreshing = false;\n this.refreshPromise = null;\n });\n }\n\n const newToken = await this.refreshPromise;\n\n if (newToken) {\n // Retry original request with new token\n const retryHeaders = new Headers(headers);\n retryHeaders.set('Authorization', `Bearer ${newToken}`);\n\n response = await fetch(url, {\n method,\n headers: retryHeaders,\n credentials: 'include',\n ...fetchOptions,\n });\n } else if (this.config.onUnauthorized) {\n // Refresh failed - call unauthorized callback\n this.config.onUnauthorized();\n }\n } else if (this.config.onUnauthorized) {\n // No refresh callback - call unauthorized directly\n this.config.onUnauthorized();\n }\n }\n\n // Handle error responses\n if (!response.ok) {\n const error = await parseErrorResponse(response);\n throw new ApiException(error.message || 'Request failed', error);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n\n // Parse JSON response\n return await response.json();\n } catch (error) {\n handleFetchError(error);\n }\n }\n\n /**\n * Return a new FetchWrapper with selected config fields overridden.\n */\n reconfigure(partial: Partial<FetchWrapperConfig>): FetchWrapper {\n return new FetchWrapper({ ...this.config, ...partial });\n }\n\n /**\n * GET request\n */\n async get<T>(endpoint: string, options?: FetchOptions): Promise<T> {\n return this.execute<T>('GET', endpoint, options);\n }\n\n /**\n * POST request\n */\n async post<T, D = unknown>(\n endpoint: string,\n data?: D,\n options?: FetchOptions\n ): Promise<T> {\n return this.execute<T>('POST', endpoint, {\n ...options,\n body: data ? JSON.stringify(data) : undefined,\n });\n }\n\n /**\n * PUT request\n */\n async put<T, D = unknown>(\n endpoint: string,\n data?: D,\n options?: FetchOptions\n ): Promise<T> {\n return this.execute<T>('PUT', endpoint, {\n ...options,\n body: data ? JSON.stringify(data) : undefined,\n });\n }\n\n /**\n * PATCH request\n */\n async patch<T, D = unknown>(\n endpoint: string,\n data?: D,\n options?: FetchOptions\n ): Promise<T> {\n return this.execute<T>('PATCH', endpoint, {\n ...options,\n body: data ? JSON.stringify(data) : undefined,\n });\n }\n\n /**\n * DELETE request\n */\n async delete<T>(endpoint: string, options?: FetchOptions): Promise<T> {\n return this.execute<T>('DELETE', endpoint, options);\n }\n}\n","/**\n * Main API client for Django REST API\n */\n\nimport { FetchWrapper } from './fetch-wrapper';\nimport type { FetchOptions } from '../types';\n\nexport interface ApiClientConfig {\n baseUrl?: string;\n getToken?: () => Promise<string | null> | string | null;\n onUnauthorized?: () => void;\n onTokenRefresh?: () => Promise<string | null>;\n}\n\nexport class ApiClient {\n private fetcher: FetchWrapper;\n public readonly baseUrl: string;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl ?? '';\n\n this.fetcher = new FetchWrapper({\n baseUrl: config.baseUrl,\n getToken: config.getToken,\n onUnauthorized: config.onUnauthorized,\n onTokenRefresh: config.onTokenRefresh,\n defaultHeaders: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n });\n }\n\n /**\n * Get the fetch wrapper instance for direct access\n */\n get fetch(): FetchWrapper {\n return this.fetcher;\n }\n\n /**\n * Update auth token getter\n */\n setTokenGetter(getToken: () => Promise<string | null> | string | null): void {\n this.fetcher = this.fetcher.reconfigure({ getToken });\n }\n\n /**\n * Update unauthorized handler\n */\n setUnauthorizedHandler(onUnauthorized: () => void): void {\n this.fetcher = this.fetcher.reconfigure({ onUnauthorized });\n }\n\n /**\n * Convenience HTTP methods that delegate to FetchWrapper\n */\n async get<T>(endpoint: string, options?: FetchOptions): Promise<T> {\n return this.fetcher.get<T>(endpoint, options);\n }\n\n async post<T, D = unknown>(endpoint: string, data?: D, options?: FetchOptions): Promise<T> {\n return this.fetcher.post<T, D>(endpoint, data, options);\n }\n\n async patch<T, D = unknown>(endpoint: string, data?: D, options?: FetchOptions): Promise<T> {\n return this.fetcher.patch<T, D>(endpoint, data, options);\n }\n\n async delete<T>(endpoint: string, options?: FetchOptions): Promise<T> {\n return this.fetcher.delete<T>(endpoint, options);\n }\n}\n\n/**\n * Create API client instance\n */\nexport function createApiClient(config: ApiClientConfig): ApiClient {\n return new ApiClient(config);\n}\n","/**\n * Django REST API endpoint constants\n */\n\nexport const ENDPOINTS = {\n // Contacts\n CONTACTS: 'contacts',\n CONTACTS_BULK: 'contacts/bulk',\n CONTACT: (id: string) => `contacts/${id}`,\n\n // Organizations\n ORGANIZATIONS: 'organizations',\n ORGANIZATIONS_BULK: 'organizations/bulk',\n ORGANIZATION: (id: string) => `organizations/${id}`,\n\n // Core entities\n TAGS: 'core/tags',\n TAG: (id: string) => `core/tags/${id}`,\n ENTITY_TAGS: 'core/entity-tags',\n ENTITY_TAG: (id: string) => `core/entity-tags/${id}`,\n METRICS: 'core/metrics',\n METRIC: (id: string) => `core/metrics/${id}`,\n PROFILES: 'core/profiles',\n PROFILE: (id: string) => `core/profiles/${id}`,\n ATTRIBUTES: 'core/attributes',\n ATTRIBUTE: (id: string) => `core/attributes/${id}`,\n RELATIONSHIPS: 'core/relationships',\n RELATIONSHIP: (id: string) => `core/relationships/${id}`,\n\n // Workflows\n WORKFLOWS: 'workflows',\n WORKFLOW: (id: string) => `workflows/${id}`,\n WORKFLOW_EXECUTE: (id: string) => `workflows/${id}/execute`,\n\n // Messages\n MESSAGES: 'messages',\n MESSAGE: (id: string) => `messages/${id}`,\n MESSAGE_SEND: (id: string) => `messages/${id}/send`,\n\n // Funnels\n FUNNELS: 'funnels',\n FUNNEL: (id: string) => `funnels/${id}`,\n FUNNEL_RUN: (id: string) => `funnels/${id}/run`,\n FUNNEL_RUNS: (id: string) => `funnels/${id}/runs`,\n FUNNEL_RUN_ITEM: (funnelId: string, runId: string) => `funnels/${funnelId}/runs/${runId}`,\n FUNNEL_PREVIEW: (id: string) => `funnels/${id}/preview`,\n FUNNEL_RESULTS: (id: string) => `funnels/${id}/results`,\n FUNNEL_TEMPLATES: 'funnels/templates',\n FUNNEL_RUN_BY_ID: (runId: string) => `funnel-runs/${runId}`,\n FUNNEL_RUN_CANCEL: (runId: string) => `funnel-runs/${runId}/cancel`,\n FUNNEL_RUNS_GLOBAL: 'funnel-runs',\n} as const;\n","/**\n * Contacts API wrapper for /api/v1/contacts/\n */\n\nimport type {\n Contact,\n CreateContactRequest,\n UpdateContactRequest,\n ContactFilters,\n PaginatedResponse,\n PaginationParams,\n SortParams,\n} from '../types';\nimport { buildFilterParams, mergeQueryParams } from '../utils';\nimport { ENDPOINTS } from '../constants/endpoints';\nimport type { ApiClient } from './api-client';\n\nexport class ContactsApi {\n constructor(private client: ApiClient) {}\n\n /**\n * List contacts with pagination and filters\n */\n async list(\n filters?: ContactFilters,\n pagination?: PaginationParams,\n sorting?: SortParams\n ): Promise<PaginatedResponse<Contact>> {\n const params = mergeQueryParams(\n pagination,\n sorting,\n filters ? buildFilterParams(filters) : undefined\n );\n\n return this.client.fetch.get<PaginatedResponse<Contact>>(ENDPOINTS.CONTACTS, { params });\n }\n\n /**\n * Get contact by ID\n */\n async get(id: string): Promise<Contact> {\n return this.client.fetch.get<Contact>(ENDPOINTS.CONTACT(id));\n }\n\n /**\n * Create new contact\n */\n async create(data: CreateContactRequest): Promise<Contact> {\n return this.client.fetch.post<Contact>(ENDPOINTS.CONTACTS, data);\n }\n\n /**\n * Update contact\n */\n async update(id: string, data: UpdateContactRequest): Promise<Contact> {\n return this.client.fetch.patch<Contact>(ENDPOINTS.CONTACT(id), data);\n }\n\n /**\n * Delete contact\n */\n async delete(id: string): Promise<void> {\n return this.client.fetch.delete<void>(ENDPOINTS.CONTACT(id));\n }\n\n /**\n * Bulk create contacts\n */\n async bulkCreate(data: CreateContactRequest[]): Promise<Contact[]> {\n return this.client.fetch.post<Contact[]>(ENDPOINTS.CONTACTS_BULK, data);\n }\n\n /**\n * Search contacts by name, email, or company\n */\n async search(\n query: string,\n pagination?: PaginationParams\n ): Promise<PaginatedResponse<Contact>> {\n return this.list({ search: query }, pagination);\n }\n\n /**\n * Get contacts by tier\n */\n async getByTier(\n tier: number,\n pagination?: PaginationParams\n ): Promise<PaginatedResponse<Contact>> {\n return this.list({ tier }, pagination);\n }\n\n /**\n * Get contacts by firm\n */\n async getByFirm(\n firmId: string,\n pagination?: PaginationParams\n ): Promise<PaginatedResponse<Contact>> {\n return this.list({ firmId }, pagination);\n }\n\n /**\n * Get contacts with LinkedIn profiles\n */\n async getWithLinkedIn(\n pagination?: PaginationParams\n ): Promise<PaginatedResponse<Contact>> {\n return this.list({ hasLinkedin: true }, pagination);\n }\n}\n","/**\n * Organizations API wrapper for /api/v1/organizations/\n */\n\nimport type {\n Organization,\n CreateOrganizationRequest,\n UpdateOrganizationRequest,\n OrganizationFilters,\n PaginatedResponse,\n PaginationParams,\n SortParams,\n} from '../types';\nimport { buildFilterParams, mergeQueryParams } from '../utils';\nimport { ENDPOINTS } from '../constants/endpoints';\nimport type { ApiClient } from './api-client';\n\nexport class OrganizationsApi {\n constructor(private client: ApiClient) {}\n\n /**\n * List organizations with pagination and filters\n */\n async list(\n filters?: OrganizationFilters,\n pagination?: PaginationParams,\n sorting?: SortParams\n ): Promise<PaginatedResponse<Organization>> {\n const params = mergeQueryParams(\n pagination,\n sorting,\n filters ? buildFilterParams(filters) : undefined\n );\n\n return this.client.fetch.get<PaginatedResponse<Organization>>(ENDPOINTS.ORGANIZATIONS, {\n params,\n });\n }\n\n /**\n * Get organization by ID\n */\n async get(id: string): Promise<Organization> {\n return this.client.fetch.get<Organization>(ENDPOINTS.ORGANIZATION(id));\n }\n\n /**\n * Create new organization\n */\n async create(data: CreateOrganizationRequest): Promise<Organization> {\n return this.client.fetch.post<Organization>(ENDPOINTS.ORGANIZATIONS, data);\n }\n\n /**\n * Update organization\n */\n async update(id: string, data: UpdateOrganizationRequest): Promise<Organization> {\n return this.client.fetch.patch<Organization>(ENDPOINTS.ORGANIZATION(id), data);\n }\n\n /**\n * Delete organization\n */\n async delete(id: string): Promise<void> {\n return this.client.fetch.delete<void>(ENDPOINTS.ORGANIZATION(id));\n }\n\n /**\n * Bulk create organizations\n */\n async bulkCreate(data: CreateOrganizationRequest[]): Promise<Organization[]> {\n return this.client.fetch.post<Organization[]>(ENDPOINTS.ORGANIZATIONS_BULK, data);\n }\n\n /**\n * Search organizations by name, domain, or location\n */\n async search(\n query: string,\n pagination?: PaginationParams\n ): Promise<PaginatedResponse<Organization>> {\n return this.list({ search: query }, pagination);\n }\n\n /**\n * Get organizations by tier\n */\n async getByTier(\n tier: number,\n pagination?: PaginationParams\n ): Promise<PaginatedResponse<Organization>> {\n return this.list({ tier }, pagination);\n }\n\n /**\n * Get organizations by stage\n */\n async getByStage(\n stage: string,\n pagination?: PaginationParams\n ): Promise<PaginatedResponse<Organization>> {\n return this.list({ stage }, pagination);\n }\n\n /**\n * Get organizations by focus area\n */\n async getByFocusArea(\n focusArea: string,\n pagination?: PaginationParams\n ): Promise<PaginatedResponse<Organization>> {\n return this.list({ focusArea }, pagination);\n }\n\n /**\n * Get organizations by check size range\n */\n async getByCheckSizeRange(\n min?: number,\n max?: number,\n pagination?: PaginationParams\n ): Promise<PaginatedResponse<Organization>> {\n const filters: OrganizationFilters = {};\n if (min !== undefined) {\n filters.checkSizeMinGte = min;\n }\n if (max !== undefined) {\n filters.checkSizeMaxLte = max;\n }\n return this.list(filters, pagination);\n }\n}\n","/**\n * Core entities API wrapper for /api/v1/core/\n */\n\nimport type {\n Tag,\n EntityTag,\n Metric,\n Profile,\n Attribute,\n Relationship,\n PaginatedResponse,\n PaginationParams,\n} from '../types';\nimport { mergeQueryParams } from '../utils';\nimport { ENDPOINTS } from '../constants/endpoints';\nimport type { ApiClient } from './api-client';\n\nexport class EntitiesApi {\n constructor(private client: ApiClient) {}\n\n /**\n * Tags\n */\n async listTags(pagination?: PaginationParams): Promise<PaginatedResponse<Tag>> {\n const params = mergeQueryParams(pagination);\n return this.client.fetch.get<PaginatedResponse<Tag>>(ENDPOINTS.TAGS, { params });\n }\n\n async getTag(id: number): Promise<Tag> {\n return this.client.fetch.get<Tag>(ENDPOINTS.TAG(String(id)));\n }\n\n async createTag(data: Partial<Tag>): Promise<Tag> {\n return this.client.fetch.post<Tag>(ENDPOINTS.TAGS, data);\n }\n\n /**\n * Entity Tags\n */\n async listEntityTags(\n pagination?: PaginationParams,\n filters?: { entityId?: string; tagId?: number; category?: string }\n ): Promise<PaginatedResponse<EntityTag>> {\n const params = mergeQueryParams(pagination, undefined, filters);\n return this.client.fetch.get<PaginatedResponse<EntityTag>>(ENDPOINTS.ENTITY_TAGS, {\n params,\n });\n }\n\n async getEntityTag(id: number): Promise<EntityTag> {\n return this.client.fetch.get<EntityTag>(ENDPOINTS.ENTITY_TAG(String(id)));\n }\n\n /**\n * Metrics\n */\n async listMetrics(\n pagination?: PaginationParams,\n filters?: { entityId?: string; type?: string; subtype?: string }\n ): Promise<PaginatedResponse<Metric>> {\n const params = mergeQueryParams(pagination, undefined, filters);\n return this.client.fetch.get<PaginatedResponse<Metric>>(ENDPOINTS.METRICS, { params });\n }\n\n async getMetric(id: number): Promise<Metric> {\n return this.client.fetch.get<Metric>(ENDPOINTS.METRIC(String(id)));\n }\n\n /**\n * Profiles\n */\n async listProfiles(\n pagination?: PaginationParams,\n filters?: { entityId?: string; type?: string; subtype?: string }\n ): Promise<PaginatedResponse<Profile>> {\n const params = mergeQueryParams(pagination, undefined, filters);\n return this.client.fetch.get<PaginatedResponse<Profile>>(ENDPOINTS.PROFILES, { params });\n }\n\n async getProfile(id: number): Promise<Profile> {\n return this.client.fetch.get<Profile>(ENDPOINTS.PROFILE(String(id)));\n }\n\n /**\n * Attributes\n */\n async listAttributes(\n pagination?: PaginationParams,\n filters?: { entityId?: string; type?: string; subtype?: string; isCurrent?: boolean }\n ): Promise<PaginatedResponse<Attribute>> {\n const params = mergeQueryParams(pagination, undefined, filters);\n return this.client.fetch.get<PaginatedResponse<Attribute>>(ENDPOINTS.ATTRIBUTES, {\n params,\n });\n }\n\n async getAttribute(id: number): Promise<Attribute> {\n return this.client.fetch.get<Attribute>(ENDPOINTS.ATTRIBUTE(String(id)));\n }\n\n /**\n * Relationships\n */\n async listRelationships(\n pagination?: PaginationParams,\n filters?: {\n fromEntityId?: string;\n toEntityId?: string;\n type?: string;\n isCurrent?: boolean;\n }\n ): Promise<PaginatedResponse<Relationship>> {\n const params = mergeQueryParams(pagination, undefined, filters);\n return this.client.fetch.get<PaginatedResponse<Relationship>>(ENDPOINTS.RELATIONSHIPS, {\n params,\n });\n }\n\n async getRelationship(id: number): Promise<Relationship> {\n return this.client.fetch.get<Relationship>(ENDPOINTS.RELATIONSHIP(String(id)));\n }\n}\n","/**\n * Workflows API wrapper\n *\n * Provides type-safe access to Django Workflows API\n */\n\nimport type { ApiClient } from './api-client';\n\nexport type WorkflowStatus = 'draft' | 'active' | 'paused';\n\nexport interface Workflow {\n id: string;\n name: string;\n description: string;\n team: string;\n createdBy: string | null;\n nodes: any[];\n connections: Record<string, any>;\n settings: Record<string, any>;\n staticData: Record<string, any>;\n isActive: boolean;\n version: number;\n isTemplate: boolean;\n templateSource: string | null;\n executionsCount: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface WorkflowExecution {\n id: string;\n workflow: string;\n workflowVersion: number;\n triggeredBy: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'paused';\n mode: 'manual' | 'trigger' | 'webhook';\n contextData: Record<string, any>;\n state: Record<string, any>;\n startedAt: string | null;\n completedAt: string | null;\n waitUntil: string | null;\n errorMessage: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface WorkflowFilters {\n team?: string;\n isActive?: boolean;\n isTemplate?: boolean;\n page?: number;\n pageSize?: number;\n ordering?: string;\n}\n\nexport interface ExecuteWorkflowInput {\n contextData?: Record<string, any>;\n mode?: 'manual' | 'trigger' | 'webhook';\n}\n\nexport interface CreateWorkflowInput {\n name: string;\n description?: string;\n team: string;\n nodes?: any[];\n connections?: Record<string, any>;\n settings?: Record<string, any>;\n isActive?: boolean;\n}\n\nexport class WorkflowsApi {\n constructor(private client: ApiClient) {}\n\n /**\n * List workflows with optional filters\n */\n async list(filters?: WorkflowFilters) {\n const params = new URLSearchParams();\n\n if (filters?.team) params.append('team', filters.team);\n if (filters?.isActive !== undefined) params.append('isActive', String(filters.isActive));\n if (filters?.isTemplate !== undefined) params.append('isTemplate', String(filters.isTemplate));\n if (filters?.page) params.append('page', String(filters.page));\n if (filters?.pageSize) params.append('pageSize', String(filters.pageSize));\n if (filters?.ordering) params.append('ordering', filters.ordering);\n\n return this.client.get<{ results: Workflow[]; count: number; next: string | null; previous: string | null }>(\n `/api/v1/workflows/?${params.toString()}`\n );\n }\n\n /**\n * Get workflow by ID\n */\n async get(id: string) {\n return this.client.get<Workflow>(`/api/v1/workflows/${id}/`);\n }\n\n /**\n * Create a new workflow\n */\n async create(data: CreateWorkflowInput) {\n return this.client.post<Workflow>('/api/v1/workflows/', data);\n }\n\n /**\n * Update workflow\n */\n async update(id: string, data: Partial<CreateWorkflowInput>) {\n return this.client.patch<Workflow>(`/api/v1/workflows/${id}/`, data);\n }\n\n /**\n * Delete workflow\n */\n async delete(id: string) {\n return this.client.delete(`/api/v1/workflows/${id}/`);\n }\n\n /**\n * Execute workflow\n */\n async execute(id: string, input?: ExecuteWorkflowInput) {\n return this.client.post<WorkflowExecution>(\n `/api/v1/workflows/${id}/execute/`,\n input || {}\n );\n }\n\n /**\n * Get workflow templates\n */\n async templates() {\n return this.client.get<Workflow[]>('/api/v1/workflows/templates/');\n }\n\n /**\n * List workflow executions\n */\n async listExecutions(filters?: { workflow?: string; status?: string; page?: number; pageSize?: number }) {\n const params = new URLSearchParams();\n\n if (filters?.workflow) params.append('workflow', filters.workflow);\n if (filters?.status) params.append('status', filters.status);\n if (filters?.page) params.append('page', String(filters.page));\n if (filters?.pageSize) params.append('pageSize', String(filters.pageSize));\n\n return this.client.get<{ results: WorkflowExecution[]; count: number }>(\n `/api/v1/workflow-executions/?${params.toString()}`\n );\n }\n\n /**\n * Get workflow execution details\n */\n async getExecution(id: string) {\n return this.client.get<WorkflowExecution>(`/api/v1/workflow-executions/${id}/`);\n }\n}\n","/**\n * Messages API wrapper\n *\n * Provides type-safe access to Django Messages API\n */\n\nimport type { ApiClient } from './api-client';\n\nexport type MessageStatus = 'draft' | 'scheduled' | 'sending' | 'sent' | 'failed';\nexport type MessageContentType = 'text/plain' | 'text/markdown' | 'text/html';\nexport type RecipientStatus = 'pending' | 'sent' | 'delivered' | 'bounced' | 'opened' | 'clicked';\n\nexport interface Message {\n id: string;\n team: string;\n channel: string;\n channelDetails?: {\n key: string;\n name: string;\n description: string;\n icon: string;\n };\n subject: string;\n body: string;\n contentType: MessageContentType;\n fromName: string | null;\n fromEmail: string | null;\n replyTo: string | null;\n status: MessageStatus;\n scheduledAt: string | null;\n sentAt: string | null;\n metadata: Record<string, any>;\n totalRecipients: number;\n recipientsSent: number;\n recipientsDelivered: number;\n recipientsOpened: number;\n recipientsClicked: number;\n recipientsBounced: number;\n recipientsUnsubscribed: number;\n openRate: number;\n clickRate: number;\n bounceRate: number;\n errorMessage: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface MessageRecipient {\n id: string;\n recipientType: string;\n recipientId: string | null;\n recipientEmail: string;\n recipientName: string | null;\n channelIdentifier: string | null;\n channelProfiles: Record<string, any>;\n status: RecipientStatus;\n sentAt: string | null;\n deliveredAt: string | null;\n bouncedAt: string | null;\n firstOpenedAt: string | null;\n lastOpenedAt: string | null;\n firstClickedAt: string | null;\n lastClickedAt: string | null;\n openCount: number;\n clickCount: number;\n isUnsubscribed: boolean;\n unsubscribedAt: string | null;\n errorMessage: string | null;\n createdAt: string;\n}\n\nexport interface MessagingChannel {\n id: string;\n key: string;\n name: string;\n description: string;\n icon: string;\n capabilities: {\n maxContentLength: number;\n supportsHtml: boolean;\n supportsMarkdown: boolean;\n supportsAttachments: boolean;\n maxAttachments: number;\n maxAttachmentSize: number;\n };\n requirements: {\n requiresConnection: boolean;\n requiresOptIn: boolean;\n authRequirements: Record<string, any>;\n };\n rateLimit: {\n messages: number;\n seconds: number;\n scope: string;\n description: string;\n };\n metadata: Record<string, any>;\n}\n\nexport interface MessageFilters {\n status?: MessageStatus;\n contentType?: MessageContentType;\n scheduledAfter?: string;\n scheduledBefore?: string;\n sentAfter?: string;\n sentBefore?: string;\n search?: string;\n page?: number;\n pageSize?: number;\n ordering?: string;\n}\n\nexport interface CreateMessageInput {\n channel: string;\n subject: string;\n body: string;\n contentType?: MessageContentType;\n fromName?: string;\n fromEmail?: string;\n replyTo?: string;\n scheduledAt?: string;\n metadata?: Record<string, any>;\n recipients?: Array<{\n recipientType: string;\n recipientEmail: string;\n recipientName?: string;\n channelIdentifier?: string;\n }>;\n}\n\nexport interface ScheduleMessageInput {\n scheduledAt: string;\n}\n\nexport interface SendTestInput {\n testEmail?: string;\n}\n\nexport class MessagesApi {\n constructor(private client: ApiClient) {}\n\n /**\n * List messages with optional filters\n */\n async list(filters?: MessageFilters) {\n const params = new URLSearchParams();\n\n if (filters?.status) params.append('status', filters.status);\n if (filters?.contentType) params.append('contentType', filters.contentType);\n if (filters?.scheduledAfter) params.append('scheduledAfter', filters.scheduledAfter);\n if (filters?.scheduledBefore) params.append('scheduledBefore', filters.scheduledBefore);\n if (filters?.sentAfter) params.append('sentAfter', filters.sentAfter);\n if (filters?.sentBefore) params.append('sentBefore', filters.sentBefore);\n if (filters?.search) params.append('search', filters.search);\n if (filters?.page) params.append('page', String(filters.page));\n if (filters?.pageSize) params.append('pageSize', String(filters.pageSize));\n if (filters?.ordering) params.append('ordering', filters.ordering);\n\n return this.client.get<{ results: Message[]; count: number; next: string | null; previous: string | null }>(\n `/api/v1/messages/?${params.toString()}`\n );\n }\n\n /**\n * Get message by ID\n */\n async get(id: string) {\n return this.client.get<Message>(`/api/v1/messages/${id}/`);\n }\n\n /**\n * Create a new message\n */\n async create(data: CreateMessageInput) {\n return this.client.post<Message>('/api/v1/messages/', data);\n }\n\n /**\n * Update message (draft only)\n */\n async update(id: string, data: Partial<CreateMessageInput>) {\n return this.client.patch<Message>(`/api/v1/messages/${id}/`, data);\n }\n\n /**\n * Delete message (draft only)\n */\n async delete(id: string) {\n return this.client.delete(`/api/v1/messages/${id}/`);\n }\n\n /**\n * Schedule message for future sending\n */\n async schedule(id: string, input: ScheduleMessageInput) {\n return this.client.post<{ id: string; status: MessageStatus; scheduledAt: string; message: string }>(\n `/api/v1/messages/${id}/schedule/`,\n input\n );\n }\n\n /**\n * Send message immediately\n */\n async sendNow(id: string) {\n return this.client.post<{ id: string; status: MessageStatus; message: string }>(\n `/api/v1/messages/${id}/send_now/`,\n {}\n );\n }\n\n /**\n * Send test message\n */\n async sendTest(id: string, input?: SendTestInput) {\n return this.client.post<{ id: string; testEmail: string; message: string }>(\n `/api/v1/messages/${id}/send_test/`,\n input || {}\n );\n }\n\n /**\n * Preview message rendering\n */\n async preview(id: string) {\n return this.client.get<{\n subject: string;\n body: string;\n previewHtml: string;\n fromName: string;\n fromEmail: string;\n }>(`/api/v1/messages/${id}/preview/`);\n }\n\n /**\n * List recipients for a message\n */\n async getRecipients(id: string, page?: number, pageSize?: number) {\n const params = new URLSearchParams();\n if (page) params.append('page', String(page));\n if (pageSize) params.append('pageSize', String(pageSize));\n\n return this.client.get<{ results: MessageRecipient[]; count: number }>(\n `/api/v1/messages/${id}/recipients/?${params.toString()}`\n );\n }\n\n /**\n * Add recipients to a message\n */\n async addRecipients(\n id: string,\n recipients: Array<{\n recipientType: string;\n recipientEmail: string;\n recipientName?: string;\n channelIdentifier?: string;\n }>\n ) {\n return this.client.post<{\n message: string;\n totalRecipients: number;\n recipients: MessageRecipient[];\n }>(`/api/v1/messages/${id}/add_recipients/`, { recipients });\n }\n\n /**\n * Get available messaging channels\n */\n async getChannels() {\n return this.client.get<{ channels: MessagingChannel[]; count: number }>('/api/v1/messages/channels/');\n }\n}\n","/**\n * Funnels API wrapper for /api/v1/funnels/\n */\n\nimport type {\n Funnel,\n FunnelFilters,\n FunnelRun,\n FunnelResult,\n CreateFunnelInput,\n UpdateFunnelInput,\n ExecuteFunnelInput,\n PaginatedResponse,\n PaginationParams,\n} from '../types';\nimport { ENDPOINTS } from '../constants/endpoints';\nimport type { ApiClient } from './api-client';\nimport { isApiException } from './error-handler';\n\n/**\n * Returns true when the error is a 409 Conflict from trying to run a funnel that's already running.\n */\nexport function isFunnelRunConflict(error: unknown): boolean {\n return isApiException(error) && error.status === 409;\n}\n\n/**\n * Returns true when the error is a 400 with validation errors (bad stage rules, missing entityType, etc.)\n */\nexport function isFunnelValidationError(error: unknown): boolean {\n return isApiException(error) && error.status === 400 && !!error.errors;\n}\n\nexport interface FunnelPreviewResult {\n total: number;\n matched: number;\n stages: Array<{\n stageId: string;\n stageName: string;\n inputCount: number;\n outputCount: number;\n excluded: number;\n }>;\n}\n\nexport interface FunnelRunFilters {\n page?: number;\n pageSize?: number;\n status?: FunnelRun['status'];\n ordering?: string;\n funnel?: string;\n startedAfter?: string;\n startedBefore?: string;\n}\n\nexport interface FunnelTemplate {\n id: string;\n slug: string;\n name: string;\n description: string;\n category: string;\n icon: string;\n isFeatured: boolean;\n stageCount: number;\n usageCount: number;\n}\n\nexport class FunnelsApi {\n constructor(private client: ApiClient) {}\n\n /**\n * List funnels with optional filters.\n * Tags are passed as repeated query params: ?tags=campaign:abc&tags=product:market-simpli\n */\n async list(filters?: FunnelFilters): Promise<PaginatedResponse<Funnel>> {\n const params = new URLSearchParams();\n\n if (filters?.status) params.append('status', filters.status);\n if (filters?.entityType) params.append('entityType', filters.entityType);\n if (filters?.search) params.append('search', filters.search);\n if (filters?.createdBy) params.append('createdBy', filters.createdBy);\n if (filters?.page) params.append('page', String(filters.page));\n if (filters?.pageSize) params.append('pageSize', String(filters.pageSize));\n if (filters?.ordering) params.append('ordering', filters.ordering);\n\n // tags is a multi-value param\n if (filters?.tags?.length) {\n for (const tag of filters.tags) {\n params.append('tags', tag);\n }\n }\n\n const query = params.toString();\n const endpoint = query ? `${ENDPOINTS.FUNNELS}?${query}` : ENDPOINTS.FUNNELS;\n return this.client.get<PaginatedResponse<Funnel>>(endpoint);\n }\n\n /**\n * Get funnel by ID\n */\n async get(id: string): Promise<Funnel> {\n return this.client.get<Funnel>(ENDPOINTS.FUNNEL(id));\n }\n\n /**\n * Create a new funnel\n */\n async create(data: CreateFunnelInput): Promise<Funnel> {\n return this.client.post<Funnel>(ENDPOINTS.FUNNELS, data);\n }\n\n /**\n * Update funnel (partial)\n */\n async update(id: string, data: UpdateFunnelInput): Promise<Funnel> {\n return this.client.patch<Funnel>(ENDPOINTS.FUNNEL(id), data);\n }\n\n /**\n * Delete funnel\n */\n async delete(id: string): Promise<void> {\n return this.client.delete<void>(ENDPOINTS.FUNNEL(id));\n }\n\n /**\n * Execute a funnel run\n */\n async run(id: string, input?: ExecuteFunnelInput): Promise<FunnelRun> {\n return this.client.post<FunnelRun>(ENDPOINTS.FUNNEL_RUN(id), input ?? {});\n }\n\n /**\n * List run history for a funnel\n */\n async getRuns(\n funnelId: string,\n filters?: FunnelRunFilters\n ): Promise<PaginatedResponse<FunnelRun>> {\n const params = new URLSearchParams();\n if (filters?.page) params.append('page', String(filters.page));\n if (filters?.pageSize) params.append('pageSize', String(filters.pageSize));\n if (filters?.status) params.append('status', filters.status);\n if (filters?.ordering) params.append('ordering', filters.ordering);\n\n const query = params.toString();\n const endpoint = query\n ? `${ENDPOINTS.FUNNEL_RUNS(funnelId)}?${query}`\n : ENDPOINTS.FUNNEL_RUNS(funnelId);\n return this.client.get<PaginatedResponse<FunnelRun>>(endpoint);\n }\n\n /**\n * Get a specific run by ID. funnelId param is ignored (runs are accessed globally).\n */\n async getRun(_funnelId: string, runId: string): Promise<FunnelRun> {\n return this.client.get<FunnelRun>(ENDPOINTS.FUNNEL_RUN_BY_ID(runId));\n }\n\n // BEAD: fund-your-startup-rgi4 - funnels/{id}/results endpoint missing from Django FunnelViewSet\n async getResults(\n _funnelId: string,\n _pagination?: PaginationParams\n ): Promise<PaginatedResponse<FunnelResult>> {\n throw new Error('Not implemented - BEAD: fund-your-startup-rgi4. funnels/{id}/results action does not exist in Django.');\n // const params = new URLSearchParams();\n // if (_pagination?.page) params.append('page', String(_pagination.page));\n // if (_pagination?.pageSize) params.append('pageSize', String(_pagination.pageSize));\n // const query = params.toString();\n // const endpoint = query ? `${ENDPOINTS.FUNNEL_RESULTS(_funnelId)}?${query}` : ENDPOINTS.FUNNEL_RESULTS(_funnelId);\n // return this.client.get<PaginatedResponse<FunnelResult>>(endpoint);\n }\n\n // BEAD: fund-your-startup-rgi4 - funnels/{id}/preview endpoint missing. Django has /funnels/preview-icp/ (different signature).\n async preview(_funnelId: string, _stages?: Funnel['stages']): Promise<FunnelPreviewResult> {\n throw new Error('Not implemented - BEAD: fund-your-startup-rgi4. funnels/{id}/preview action does not exist in Django.');\n // return this.client.post<FunnelPreviewResult>(ENDPOINTS.FUNNEL_PREVIEW(_funnelId), { stages: _stages });\n }\n\n /**\n * List all funnel runs globally (across all funnels, scoped to current user)\n */\n async listRunsGlobal(filters?: FunnelRunFilters): Promise<PaginatedResponse<FunnelRun>> {\n const params = new URLSearchParams();\n if (filters?.funnel) params.append('funnel', filters.funnel);\n if (filters?.status) params.append('status', filters.status);\n if (filters?.page) params.append('page', String(filters.page));\n if (filters?.pageSize) params.append('pageSize', String(filters.pageSize));\n if (filters?.startedAfter) params.append('startedAfter', filters.startedAfter);\n if (filters?.startedBefore) params.append('startedBefore', filters.startedBefore);\n\n const query = params.toString();\n const endpoint = query\n ? `${ENDPOINTS.FUNNEL_RUNS_GLOBAL}?${query}`\n : ENDPOINTS.FUNNEL_RUNS_GLOBAL;\n return this.client.get<PaginatedResponse<FunnelRun>>(endpoint);\n }\n\n /**\n * Cancel a running funnel run.\n */\n async cancelRun(runId: string): Promise<FunnelRun> {\n return this.client.post<FunnelRun>(ENDPOINTS.FUNNEL_RUN_CANCEL(runId), {});\n }\n\n /**\n * List available funnel templates\n */\n async listTemplates(filters?: { category?: string; page?: number; pageSize?: number }): Promise<PaginatedResponse<FunnelTemplate>> {\n const params = new URLSearchParams();\n if (filters?.category) params.append('category', filters.category);\n if (filters?.page) params.append('page', String(filters.page));\n if (filters?.pageSize) params.append('pageSize', String(filters.pageSize));\n\n const query = params.toString();\n const endpoint = query\n ? `${ENDPOINTS.FUNNEL_TEMPLATES}?${query}`\n : ENDPOINTS.FUNNEL_TEMPLATES;\n return this.client.get<PaginatedResponse<FunnelTemplate>>(endpoint);\n }\n}\n","/**\n * AppError hierarchy for StartSimpli apps\n *\n * Provides a standardized error hierarchy with:\n * - Consistent error codes and messages\n * - HTTP status code mapping\n * - Serialization for API responses\n *\n * These are server-side application errors (not API client fetch errors).\n * For API client errors see ./error-handler.ts (ApiException).\n */\n\n/**\n * Standard error codes used across the application\n */\nexport enum AppErrorCode {\n // Client errors (4xx)\n VALIDATION_ERROR = 'VALIDATION_ERROR',\n AUTHENTICATION_REQUIRED = 'AUTHENTICATION_REQUIRED',\n INVALID_CREDENTIALS = 'INVALID_CREDENTIALS',\n SESSION_EXPIRED = 'SESSION_EXPIRED',\n FORBIDDEN = 'FORBIDDEN',\n INSUFFICIENT_PERMISSIONS = 'INSUFFICIENT_PERMISSIONS',\n NOT_FOUND = 'NOT_FOUND',\n RESOURCE_NOT_FOUND = 'RESOURCE_NOT_FOUND',\n CONFLICT = 'CONFLICT',\n DUPLICATE_RESOURCE = 'DUPLICATE_RESOURCE',\n RATE_LIMITED = 'RATE_LIMITED',\n BAD_REQUEST = 'BAD_REQUEST',\n\n // Server errors (5xx)\n INTERNAL_ERROR = 'INTERNAL_ERROR',\n DATABASE_ERROR = 'DATABASE_ERROR',\n EXTERNAL_SERVICE_ERROR = 'EXTERNAL_SERVICE_ERROR',\n SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE',\n}\n\n/**\n * Shape of the error envelope returned from AppError.toResponse()\n */\nexport interface AppErrorResponse {\n error: {\n code: AppErrorCode;\n message: string;\n details?: Record<string, unknown>;\n };\n}\n\n/**\n * Base application error class.\n * All custom errors should extend this class.\n */\nexport class AppError extends Error {\n public readonly code: AppErrorCode;\n public readonly statusCode: number;\n public readonly details?: Record<string, unknown>;\n public readonly isOperational: boolean;\n\n constructor(\n message: string,\n code: AppErrorCode = AppErrorCode.INTERNAL_ERROR,\n statusCode: number = 500,\n details?: Record<string, unknown>,\n isOperational: boolean = true\n ) {\n super(message);\n this.name = 'AppError';\n this.code = code;\n this.statusCode = statusCode;\n this.details = details;\n this.isOperational = isOperational;\n\n // Maintains proper stack trace for where our error was thrown\n Error.captureStackTrace(this, this.constructor);\n }\n\n /**\n * Serialize error for API response\n */\n toResponse(): AppErrorResponse {\n return {\n error: {\n code: this.code,\n message: this.message,\n ...(this.details && { details: this.details }),\n },\n };\n }\n\n /**\n * Check if an error is an operational error (expected) vs programming error\n */\n static isOperationalError(error: unknown): error is AppError {\n return error instanceof AppError && error.isOperational;\n }\n}\n\n/**\n * Validation error for invalid request data\n * HTTP 400 Bad Request\n */\nexport class ValidationError extends AppError {\n public readonly fieldErrors: Record<string, string[]>;\n\n constructor(\n message: string = 'Validation failed',\n fieldErrors: Record<string, string[]> = {}\n ) {\n super(\n message,\n AppErrorCode.VALIDATION_ERROR,\n 400,\n { fields: fieldErrors }\n );\n this.name = 'ValidationError';\n this.fieldErrors = fieldErrors;\n }\n\n /**\n * Create from Zod error\n */\n static fromZodError(zodError: { errors: Array<{ path: (string | number)[]; message: string }> }): ValidationError {\n const fieldErrors: Record<string, string[]> = {};\n\n for (const error of zodError.errors) {\n const path = error.path.join('.');\n if (!fieldErrors[path]) {\n fieldErrors[path] = [];\n }\n fieldErrors[path].push(error.message);\n }\n\n const message = Object.entries(fieldErrors)\n .map(([field, errors]) => `${field}: ${errors.join(', ')}`)\n .join('; ');\n\n return new ValidationError(`Validation failed: ${message}`, fieldErrors);\n }\n}\n\n/**\n * Authentication error for unauthenticated requests\n * HTTP 401 Unauthorized\n */\nexport class AuthenticationError extends AppError {\n constructor(\n message: string = 'Authentication required',\n code: AppErrorCode = AppErrorCode.AUTHENTICATION_REQUIRED\n ) {\n super(message, code, 401);\n this.name = 'AuthenticationError';\n }\n\n /**\n * Create for invalid credentials\n */\n static invalidCredentials(): AuthenticationError {\n return new AuthenticationError('Invalid credentials', AppErrorCode.INVALID_CREDENTIALS);\n }\n\n /**\n * Create for expired session\n */\n static sessionExpired(): AuthenticationError {\n return new AuthenticationError('Session has expired', AppErrorCode.SESSION_EXPIRED);\n }\n}\n\n/**\n * Authorization error for forbidden access\n * HTTP 403 Forbidden\n */\nexport class AuthorizationError extends AppError {\n constructor(\n message: string = 'Access denied',\n code: AppErrorCode = AppErrorCode.FORBIDDEN\n ) {\n super(message, code, 403);\n this.name = 'AuthorizationError';\n }\n\n /**\n * Create for insufficient permissions\n */\n static insufficientPermissions(requiredPermission?: string): AuthorizationError {\n const message = requiredPermission\n ? `Insufficient permissions. Required: ${requiredPermission}`\n : 'Insufficient permissions';\n return new AuthorizationError(message, AppErrorCode.INSUFFICIENT_PERMISSIONS);\n }\n}\n\n/**\n * Not found error for missing resources\n * HTTP 404 Not Found\n */\nexport class NotFoundError extends AppError {\n public readonly resourceType?: string;\n public readonly resourceId?: string;\n\n constructor(\n message: string = 'Resource not found',\n resourceType?: string,\n resourceId?: string\n ) {\n super(\n message,\n AppErrorCode.NOT_FOUND,\n 404,\n resourceType || resourceId\n ? { resourceType, resourceId }\n : undefined\n );\n this.name = 'NotFoundError';\n this.resourceType = resourceType;\n this.resourceId = resourceId;\n }\n\n /**\n * Create for a specific resource\n */\n static forResource(resourceType: string, resourceId?: string): NotFoundError {\n const message = resourceId\n ? `${resourceType} with ID '${resourceId}' not found`\n : `${resourceType} not found`;\n return new NotFoundError(message, resourceType, resourceId);\n }\n}\n\n/**\n * Conflict error for duplicate or conflicting resources\n * HTTP 409 Conflict\n */\nexport class ConflictError extends AppError {\n public readonly conflictingField?: string;\n\n constructor(\n message: string = 'Resource conflict',\n conflictingField?: string\n ) {\n super(\n message,\n AppErrorCode.CONFLICT,\n 409,\n conflictingField ? { field: conflictingField } : undefined\n );\n this.name = 'ConflictError';\n this.conflictingField = conflictingField;\n }\n\n /**\n * Create for duplicate resource\n */\n static duplicate(resourceType: string, field?: string): ConflictError {\n const message = field\n ? `A ${resourceType} with this ${field} already exists`\n : `A ${resourceType} with these values already exists`;\n return new ConflictError(message, field);\n }\n}\n\n/**\n * Rate limit error for too many requests\n * HTTP 429 Too Many Requests\n */\nexport class RateLimitError extends AppError {\n public readonly retryAfter?: number;\n\n constructor(\n message: string = 'Too many requests',\n retryAfter?: number\n ) {\n super(\n message,\n AppErrorCode.RATE_LIMITED,\n 429,\n retryAfter ? { retryAfter } : undefined\n );\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * Database error for database-related failures\n * HTTP 500 Internal Server Error\n */\nexport class DatabaseError extends AppError {\n constructor(\n message: string = 'Database operation failed',\n details?: Record<string, unknown>\n ) {\n // Don't expose internal database details in production\n const safeDetails = process.env.NODE_ENV === 'development' ? details : undefined;\n super(message, AppErrorCode.DATABASE_ERROR, 500, safeDetails);\n this.name = 'DatabaseError';\n }\n\n /**\n * Create from Prisma error\n */\n static fromPrismaError(error: { code?: string; meta?: Record<string, unknown> }): DatabaseError {\n const code = error.code;\n\n // Map common Prisma error codes to user-friendly messages\n switch (code) {\n case 'P2002':\n throw ConflictError.duplicate('record', (error.meta?.target as string[])?.[0]);\n case 'P2025':\n throw new NotFoundError('Record not found');\n case 'P2003':\n throw new ConflictError('Cannot perform operation due to related records');\n default:\n return new DatabaseError('Database operation failed', { code });\n }\n }\n}\n\n/**\n * External service error for third-party API failures\n * HTTP 502 Bad Gateway\n */\nexport class ExternalServiceError extends AppError {\n public readonly serviceName: string;\n\n constructor(\n serviceName: string,\n message: string = 'External service error',\n details?: Record<string, unknown>\n ) {\n super(\n message,\n AppErrorCode.EXTERNAL_SERVICE_ERROR,\n 502,\n { service: serviceName, ...details }\n );\n this.name = 'ExternalServiceError';\n this.serviceName = serviceName;\n }\n}\n\n/**\n * Type guard to check if an error has a code property (like Prisma errors)\n */\nexport function isPrismaError(error: unknown): error is { code: string; meta?: Record<string, unknown> } {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n typeof (error as { code: unknown }).code === 'string'\n );\n}\n\n/**\n * Convert any error to an AppError.\n * Useful for catch blocks to ensure consistent error handling.\n */\nexport function toAppError(error: unknown): AppError {\n if (error instanceof AppError) {\n return error;\n }\n\n if (isPrismaError(error)) {\n return DatabaseError.fromPrismaError(error);\n }\n\n if (error instanceof Error) {\n return new AppError(\n error.message,\n AppErrorCode.INTERNAL_ERROR,\n 500,\n process.env.NODE_ENV === 'development' ? { stack: error.stack } : undefined\n );\n }\n\n return new AppError(\n 'An unexpected error occurred',\n AppErrorCode.INTERNAL_ERROR,\n 500\n );\n}\n","import DOMPurify from 'isomorphic-dompurify';\n\n/**\n * XSS Protection - sanitize HTML content\n *\n * Strips all tags except a safe allowlist and removes dangerous attributes.\n */\nexport function sanitizeHtml(input: string): string {\n return DOMPurify.sanitize(input, {\n ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'a', 'p', 'br'],\n ALLOWED_ATTR: ['href'],\n ALLOW_DATA_ATTR: false,\n });\n}\n\n/**\n * Validate and sanitize a search query string.\n *\n * Trims whitespace, escapes regex special characters, and limits length to 100 chars.\n */\nexport function sanitizeSearchQuery(query: string): string {\n if (!query || typeof query !== 'string') {\n return '';\n }\n\n return query\n .trim()\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex special chars\n .substring(0, 100); // Limit length\n}\n\n/**\n * Validate that a string is a safe SQL/API identifier.\n *\n * Only allows alphanumeric characters, underscores, and hyphens.\n */\nexport function validateIdentifier(input: string): boolean {\n return /^[a-zA-Z0-9_-]+$/.test(input);\n}\n","/**\n * Input Sanitization for LLM Prompts\n *\n * Provides protection against prompt injection attacks by sanitizing\n * user input before including it in LLM prompts.\n */\n\n/**\n * Maximum allowed length for user prompts (characters)\n */\nexport const MAX_PROMPT_LENGTH = 2000;\n\n/**\n * Maximum allowed length for chat messages (characters)\n */\nexport const MAX_CHAT_MESSAGE_LENGTH = 1000;\n\n/**\n * Patterns that could be used for prompt injection\n */\nconst INJECTION_PATTERNS = [\n // System/role injection attempts\n /\\bSYSTEM\\s*:/gi,\n /\\bASSISTANT\\s*:/gi,\n /\\bUSER\\s*:/gi,\n /\\bHUMAN\\s*:/gi,\n /\\bAI\\s*:/gi,\n // Instruction override attempts\n /\\bignore\\s+(previous|above|all)\\s+instructions?\\b/gi,\n /\\bdisregard\\s+(previous|above|all)\\s+instructions?\\b/gi,\n /\\bforget\\s+(previous|above|all)\\s+instructions?\\b/gi,\n /\\bnew\\s+instructions?\\s*:/gi,\n /\\boverride\\s*:/gi,\n // Role-playing attempts\n /\\byou\\s+are\\s+now\\b/gi,\n /\\bact\\s+as\\s+(if|a|an|the)\\b/gi,\n /\\bpretend\\s+(to\\s+be|you\\s+are)\\b/gi,\n // JSON/schema manipulation\n /\\b(output|respond|return)\\s+only\\s*:/gi,\n /\\bformat\\s*:\\s*json\\b/gi,\n];\n\n/**\n * Markdown/formatting sequences that could interfere with prompt structure\n */\nconst FORMATTING_MARKERS = [\n '```', // Code blocks\n '---', // Horizontal rules (when at line start)\n '***', // Alternative horizontal rules\n '##', // Headers (when at line start)\n '>>', // Potential quote injection\n];\n\n/**\n * Control characters to remove (except standard whitespace)\n */\nconst CONTROL_CHAR_REGEX = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g;\n\n/**\n * Sanitize user input for inclusion in LLM prompts\n *\n * @param input - Raw user input\n * @param maxLength - Maximum allowed length (defaults to MAX_PROMPT_LENGTH)\n * @returns Sanitized input safe for prompt inclusion\n */\nexport function sanitizeUserInput(\n input: string,\n maxLength: number = MAX_PROMPT_LENGTH\n): string {\n if (!input || typeof input !== 'string') {\n return '';\n }\n\n let sanitized = input;\n\n // 1. Remove control characters (keep newlines, tabs, spaces)\n sanitized = sanitized.replace(CONTROL_CHAR_REGEX, '');\n\n // 2. Normalize whitespace (collapse multiple spaces/newlines)\n sanitized = sanitized\n .replace(/\\r\\n/g, '\\n') // Normalize line endings\n .replace(/\\r/g, '\\n')\n .replace(/\\n{3,}/g, '\\n\\n') // Max 2 consecutive newlines\n .replace(/[ \\t]{3,}/g, ' ') // Max 2 consecutive spaces/tabs\n .trim();\n\n // 3. Strip or escape injection patterns\n for (const pattern of INJECTION_PATTERNS) {\n sanitized = sanitized.replace(pattern, (match) => {\n // Replace with bracketed version to neutralize while preserving intent\n return `[${match.replace(/:/g, '')}]`;\n });\n }\n\n // 4. Escape formatting markers that could break prompt structure\n for (const marker of FORMATTING_MARKERS) {\n // Only escape when these appear at start of line or standalone\n const escapeRegex = new RegExp(`(^|\\\\n)(${escapeRegexChars(marker)})`, 'g');\n sanitized = sanitized.replace(escapeRegex, (_, prefix, match) => {\n return `${prefix}[${match}]`;\n });\n }\n\n // 5. Truncate to max length (at word boundary if possible)\n if (sanitized.length > maxLength) {\n sanitized = truncateAtWordBoundary(sanitized, maxLength);\n }\n\n return sanitized;\n}\n\n/**\n * Sanitize chat message input (shorter limit, same rules)\n */\nexport function sanitizeChatMessage(input: string): string {\n return sanitizeUserInput(input, MAX_CHAT_MESSAGE_LENGTH);\n}\n\n/**\n * Truncate string at a word boundary\n */\nfunction truncateAtWordBoundary(text: string, maxLength: number): string {\n if (text.length <= maxLength) {\n return text;\n }\n\n // Find the last space before maxLength\n const truncated = text.slice(0, maxLength);\n const lastSpace = truncated.lastIndexOf(' ');\n\n // If we found a space in the last 20% of the string, truncate there\n if (lastSpace > maxLength * 0.8) {\n return truncated.slice(0, lastSpace).trim();\n }\n\n // Otherwise just hard truncate\n return truncated.trim();\n}\n\n/**\n * Escape special regex characters in a string\n */\nfunction escapeRegexChars(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","/**\n * CORS utilities for Next.js API routes\n *\n * Framework-agnostic header generation with an optional Next.js\n * middleware wrapper for apps that need it.\n */\n\nexport interface CorsOptions {\n /** Allowed origins. Use '*' for wildcard. */\n origins: string[] | '*';\n /** Allowed HTTP methods. Defaults to common REST methods. */\n methods?: string[];\n /** Allowed request headers. Defaults to common headers. */\n headers?: string[];\n /** Whether to allow credentials. Defaults to true when origins is a list. */\n credentials?: boolean;\n /** Preflight cache duration in seconds. Defaults to 86400 (24h). */\n maxAge?: number;\n}\n\nconst DEFAULT_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'];\nconst DEFAULT_HEADERS = ['Content-Type', 'Authorization', 'X-Requested-With', 'Accept', 'X-CSRF-Token'];\n\n/**\n * Determine whether an incoming origin is permitted under the given options.\n */\nfunction isAllowed(origin: string | null | undefined, options: CorsOptions): boolean {\n if (!origin) return false;\n if (options.origins === '*') return true;\n return options.origins.includes(origin);\n}\n\n/**\n * Build the CORS headers for a given request origin.\n *\n * Returns an empty object when the origin is not permitted so callers\n * can decide whether to reject or silently omit the headers.\n */\nexport function getCorsHeaders(\n origin: string | null | undefined,\n options: CorsOptions\n): Record<string, string> {\n if (!isAllowed(origin, options)) {\n return {};\n }\n\n const methods = options.methods ?? DEFAULT_METHODS;\n const headers = options.headers ?? DEFAULT_HEADERS;\n // credentials only make sense with an explicit origin list\n const credentials = options.credentials ?? options.origins !== '*';\n const maxAge = options.maxAge ?? 86400;\n\n const result: Record<string, string> = {\n 'Access-Control-Allow-Origin': options.origins === '*' ? '*' : (origin as string),\n 'Access-Control-Allow-Methods': methods.join(', '),\n 'Access-Control-Allow-Headers': headers.join(', '),\n 'Access-Control-Max-Age': String(maxAge),\n };\n\n if (credentials && options.origins !== '*') {\n result['Access-Control-Allow-Credentials'] = 'true';\n }\n\n return result;\n}\n\n/**\n * Apply CORS headers to an existing Headers object in-place.\n */\nexport function applyCorsHeaders(\n responseHeaders: Headers,\n origin: string | null | undefined,\n options: CorsOptions\n): void {\n const corsHeaders = getCorsHeaders(origin, options);\n for (const [key, value] of Object.entries(corsHeaders)) {\n responseHeaders.set(key, value);\n }\n}\n\n/**\n * Create a CORS middleware function for use in Next.js middleware.ts files.\n *\n * Returns a function that accepts a Request and returns a Response (for\n * preflight OPTIONS) or null (for all other requests, letting the chain\n * continue after headers are applied via getCorsHeaders).\n *\n * Usage in middleware.ts:\n *\n * ```ts\n * import { createCorsMiddleware } from '@startsimpli/api';\n * import { NextResponse } from 'next/server';\n *\n * const corsMiddleware = createCorsMiddleware({\n * origins: [process.env.NEXT_PUBLIC_BASE_URL ?? 'http://localhost:3000'],\n * });\n *\n * export function middleware(request: Request) {\n * const preflightResponse = corsMiddleware(request);\n * if (preflightResponse) return preflightResponse;\n *\n * const response = NextResponse.next();\n * const origin = request.headers.get('origin');\n * applyCorsHeaders(response.headers, origin, corsOptions);\n * return response;\n * }\n * ```\n */\nexport function createCorsMiddleware(options: CorsOptions) {\n return function corsMiddleware(request: Request): Response | null {\n const origin = request.headers.get('origin');\n\n // Preflight: respond immediately with CORS headers and 204\n if (request.method === 'OPTIONS') {\n const corsHeaders = getCorsHeaders(origin, options);\n return new Response(null, { status: 204, headers: corsHeaders });\n }\n\n // Non-preflight: caller is responsible for attaching headers via getCorsHeaders\n return null;\n };\n}\n","// Canonical API response envelope used by all StartSimpli apps\nexport interface ApiError {\n code: string;\n message: string;\n details?: unknown;\n}\n\nexport interface ApiResponse<T = unknown> {\n success: boolean;\n data?: T;\n error?: ApiError;\n}\n\n// Standard error codes (apps may define additional domain-specific codes)\nexport enum ErrorCodes {\n UNAUTHORIZED = 'UNAUTHORIZED',\n FORBIDDEN = 'FORBIDDEN',\n NOT_FOUND = 'NOT_FOUND',\n VALIDATION_ERROR = 'VALIDATION_ERROR',\n CONFLICT = 'CONFLICT',\n INTERNAL_ERROR = 'INTERNAL_ERROR',\n SERVICE_UNAVAILABLE = 'SERVICE_UNAVAILABLE',\n RATE_LIMITED = 'RATE_LIMITED',\n}\n\nexport interface PaginationParams {\n page?: number;\n pageSize?: number;\n}\n\nexport interface PaginatedResponse<T> {\n results: T[];\n count: number;\n next: string | null;\n previous: string | null;\n}\n\n// Async state pattern for React components\nexport type AsyncStatus = 'idle' | 'loading' | 'success' | 'error';\nexport interface AsyncState<T> {\n status: AsyncStatus;\n data: T | null;\n error: string | null;\n}\n","/**\n * Standardized API error response types\n *\n * Provides consistent error handling across frontend and backend\n */\n\nimport { z } from 'zod';\n\n/**\n * Field-level validation error\n */\nexport interface FieldError {\n field: string;\n messages: string[];\n code?: string;\n}\n\n/**\n * Standardized API error response\n */\nexport interface StandardErrorResponse {\n /** Main error message (user-friendly) */\n error: string;\n\n /** Error type/code for programmatic handling */\n code: string;\n\n /** HTTP status code */\n statusCode: number;\n\n /** Field-level validation errors */\n fieldErrors?: FieldError[];\n\n /** Additional error details */\n details?: Record<string, unknown>;\n\n /** Request ID for debugging */\n requestId?: string;\n\n /** Timestamp of error */\n timestamp?: string;\n}\n\n/**\n * Zod schema for runtime validation\n */\nexport const FieldErrorSchema = z.object({\n field: z.string(),\n messages: z.array(z.string()),\n code: z.string().optional(),\n});\n\nexport const StandardErrorResponseSchema = z.object({\n error: z.string(),\n code: z.string(),\n statusCode: z.number().int().min(400).max(599),\n fieldErrors: z.array(FieldErrorSchema).optional(),\n details: z.record(z.unknown()).optional(),\n requestId: z.string().optional(),\n timestamp: z.string().datetime().optional(),\n});\n\n/**\n * Common error codes\n */\nexport enum ErrorCode {\n // Client errors (4xx)\n BAD_REQUEST = 'bad_request',\n UNAUTHORIZED = 'unauthorized',\n FORBIDDEN = 'forbidden',\n NOT_FOUND = 'not_found',\n METHOD_NOT_ALLOWED = 'method_not_allowed',\n VALIDATION_ERROR = 'validation_error',\n CONFLICT = 'conflict',\n RATE_LIMITED = 'rate_limited',\n\n // Server errors (5xx)\n INTERNAL_ERROR = 'internal_error',\n SERVICE_UNAVAILABLE = 'service_unavailable',\n GATEWAY_TIMEOUT = 'gateway_timeout',\n\n // Network errors\n NETWORK_ERROR = 'network_error',\n TIMEOUT = 'timeout',\n\n // Unknown\n UNKNOWN = 'unknown',\n}\n\n/**\n * Map HTTP status codes to error codes\n */\nexport function getErrorCodeFromStatus(status: number): ErrorCode {\n const codeMap: Record<number, ErrorCode> = {\n 400: ErrorCode.BAD_REQUEST,\n 401: ErrorCode.UNAUTHORIZED,\n 403: ErrorCode.FORBIDDEN,\n 404: ErrorCode.NOT_FOUND,\n 405: ErrorCode.METHOD_NOT_ALLOWED,\n 409: ErrorCode.CONFLICT,\n 422: ErrorCode.VALIDATION_ERROR,\n 429: ErrorCode.RATE_LIMITED,\n 500: ErrorCode.INTERNAL_ERROR,\n 503: ErrorCode.SERVICE_UNAVAILABLE,\n 504: ErrorCode.GATEWAY_TIMEOUT,\n };\n\n return codeMap[status] || ErrorCode.UNKNOWN;\n}\n\n/**\n * User-friendly error messages\n */\nexport const ErrorMessages: Record<ErrorCode, string> = {\n [ErrorCode.BAD_REQUEST]: 'The request was invalid. Please check your input.',\n [ErrorCode.UNAUTHORIZED]: 'You need to log in to access this resource.',\n [ErrorCode.FORBIDDEN]: \"You don't have permission to access this resource.\",\n [ErrorCode.NOT_FOUND]: 'The requested resource was not found.',\n [ErrorCode.METHOD_NOT_ALLOWED]: 'This operation is not allowed.',\n [ErrorCode.VALIDATION_ERROR]: 'Please fix the errors in your form.',\n [ErrorCode.CONFLICT]: 'This operation conflicts with existing data.',\n [ErrorCode.RATE_LIMITED]: 'Too many requests. Please slow down.',\n [ErrorCode.INTERNAL_ERROR]: 'An unexpected error occurred. Please try again.',\n [ErrorCode.SERVICE_UNAVAILABLE]: 'The service is temporarily unavailable.',\n [ErrorCode.GATEWAY_TIMEOUT]: 'The request took too long. Please try again.',\n [ErrorCode.NETWORK_ERROR]: 'Network error. Please check your connection.',\n [ErrorCode.TIMEOUT]: 'The request timed out. Please try again.',\n [ErrorCode.UNKNOWN]: 'An unknown error occurred.',\n};\n","/**\n * In-memory rate limiter for Next.js API routes.\n *\n * Fixed-window counter with periodic cleanup.\n * Resets on server restart and does not share state across multiple instances.\n * For multi-instance production use, back the store with Redis/Upstash instead.\n */\n\nexport interface RateLimitOptions {\n /** Duration of the rate limit window in milliseconds */\n windowMs: number;\n /** Maximum number of requests allowed per window */\n maxRequests: number;\n /** Optional prefix for keys (useful when sharing a single limiter across routes) */\n keyPrefix?: string;\n}\n\nexport interface RateLimitResult {\n /** Whether the request is within the allowed limit */\n success: boolean;\n /** Requests remaining in the current window */\n remaining: number;\n /** Timestamp (ms since epoch) when the current window resets */\n resetAt: number;\n /** Seconds to wait before retrying, present only when success is false */\n retryAfter?: number;\n}\n\ninterface RateLimitEntry {\n count: number;\n resetAt: number;\n}\n\nconst CLEANUP_INTERVAL_MS = 10 * 60 * 1000; // 10 minutes\n\n/**\n * Factory that returns a rate-check function backed by an isolated in-memory store.\n *\n * @example\n * const check = createRateLimiter({ windowMs: 60_000, maxRequests: 10 });\n * const result = check('user:123');\n * if (!result.success) { // respond 429 }\n */\nexport function createRateLimiter(options: RateLimitOptions): (key: string) => RateLimitResult {\n const { windowMs, maxRequests, keyPrefix = '' } = options;\n const store = new Map<string, RateLimitEntry>();\n let lastCleanup = Date.now();\n\n function cleanup(): void {\n const now = Date.now();\n if (now - lastCleanup < CLEANUP_INTERVAL_MS) return;\n lastCleanup = now;\n for (const [key, entry] of store.entries()) {\n if (now > entry.resetAt) store.delete(key);\n }\n }\n\n return function check(key: string): RateLimitResult {\n cleanup();\n\n const storeKey = keyPrefix ? `${keyPrefix}:${key}` : key;\n const now = Date.now();\n const entry = store.get(storeKey);\n\n if (!entry || now > entry.resetAt) {\n const resetAt = now + windowMs;\n store.set(storeKey, { count: 1, resetAt });\n return { success: true, remaining: maxRequests - 1, resetAt };\n }\n\n if (entry.count >= maxRequests) {\n const retryAfter = Math.ceil((entry.resetAt - now) / 1000);\n return { success: false, remaining: 0, resetAt: entry.resetAt, retryAfter };\n }\n\n entry.count++;\n return { success: true, remaining: maxRequests - entry.count, resetAt: entry.resetAt };\n };\n}\n\n/**\n * Extract the client IP address from a Web API Request or NextRequest.\n * Respects x-forwarded-for and x-real-ip proxy headers.\n */\nexport function getClientIP(request: Request): string {\n const forwarded = request.headers.get('x-forwarded-for');\n if (forwarded) return forwarded.split(',')[0].trim();\n const real = request.headers.get('x-real-ip');\n if (real) return real;\n return 'unknown';\n}\n","/**\n * In-memory LRU cache store with TTL expiry.\n *\n * A minimal, zero-dependency cache for server-side caching in Next.js apps.\n * State is in-memory and resets on server restart — not suitable for\n * multi-instance production deployments without a shared backend (e.g. Redis).\n */\n\ninterface CacheEntry<T> {\n value: T\n expiresAt: number\n accessOrder: number\n}\n\nexport interface CacheStoreConfig {\n /** Maximum number of entries before LRU eviction (default: 1000) */\n maxSize: number\n /** Default TTL in milliseconds (default: 60 seconds) */\n defaultTTL: number\n}\n\nconst DEFAULT_CONFIG: CacheStoreConfig = {\n maxSize: 1000,\n defaultTTL: 60 * 1000,\n}\n\nexport class CacheStore<T = unknown> {\n private cache = new Map<string, CacheEntry<T>>()\n private config: CacheStoreConfig\n private hits = 0\n private misses = 0\n private accessCounter = 0\n\n constructor(config: Partial<CacheStoreConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config }\n }\n\n get(key: string): T | undefined {\n const entry = this.cache.get(key)\n if (!entry) { this.misses++; return undefined }\n if (Date.now() > entry.expiresAt) { this.cache.delete(key); this.misses++; return undefined }\n entry.accessOrder = ++this.accessCounter\n this.hits++\n return entry.value\n }\n\n set(key: string, value: T, ttl?: number): void {\n if (this.cache.size >= this.config.maxSize) this.evictLRU()\n this.cache.set(key, {\n value,\n expiresAt: Date.now() + (ttl ?? this.config.defaultTTL),\n accessOrder: ++this.accessCounter,\n })\n }\n\n has(key: string): boolean {\n const entry = this.cache.get(key)\n if (!entry) return false\n if (Date.now() > entry.expiresAt) { this.cache.delete(key); return false }\n return true\n }\n\n delete(key: string): boolean {\n return this.cache.delete(key)\n }\n\n /** Delete all keys matching a string prefix or RegExp pattern */\n deletePattern(pattern: string | RegExp): number {\n const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern\n let deleted = 0\n for (const key of this.cache.keys()) {\n if (regex.test(key)) { this.cache.delete(key); deleted++ }\n }\n return deleted\n }\n\n clear(): void {\n this.cache.clear()\n this.hits = 0\n this.misses = 0\n this.accessCounter = 0\n }\n\n /** Remove expired entries and return count removed */\n cleanup(): number {\n const now = Date.now()\n let removed = 0\n for (const [key, entry] of this.cache.entries()) {\n if (now > entry.expiresAt) { this.cache.delete(key); removed++ }\n }\n return removed\n }\n\n getStats(): { size: number; maxSize: number; hits: number; misses: number; hitRate: number } {\n const total = this.hits + this.misses\n return {\n size: this.cache.size,\n maxSize: this.config.maxSize,\n hits: this.hits,\n misses: this.misses,\n hitRate: total > 0 ? this.hits / total : 0,\n }\n }\n\n private evictLRU(): void {\n let oldestKey: string | null = null\n let oldestOrder = Infinity\n for (const [key, entry] of this.cache.entries()) {\n if (entry.accessOrder < oldestOrder) { oldestOrder = entry.accessOrder; oldestKey = key }\n }\n if (oldestKey) this.cache.delete(oldestKey)\n }\n}\n","/**\n * Cache manager built on top of CacheStore.\n *\n * Provides a cache-aside pattern (getOrSet), pattern-based invalidation,\n * and separate entity/query stores — ready for use in Next.js API routes\n * and server-side data fetching.\n */\n\nimport { CacheStore } from './cache-store'\nimport type { CacheStoreConfig } from './cache-store'\n\nexport interface CacheManagerConfig {\n entity?: Partial<CacheStoreConfig>\n query?: Partial<CacheStoreConfig>\n}\n\nconst DEFAULT_CONFIG: CacheManagerConfig = {\n entity: { maxSize: 500, defaultTTL: 5 * 60 * 1000 },\n query: { maxSize: 200, defaultTTL: 60 * 1000 },\n}\n\nexport class CacheManager {\n readonly entity: CacheStore\n readonly query: CacheStore\n private enabled: boolean\n\n constructor(enabled = true, config: CacheManagerConfig = {}) {\n this.entity = new CacheStore({ ...DEFAULT_CONFIG.entity, ...config.entity })\n this.query = new CacheStore({ ...DEFAULT_CONFIG.query, ...config.query })\n this.enabled = enabled\n }\n\n /**\n * Cache-aside: return the cached value if present, otherwise call fetchFn,\n * store the result, and return it.\n */\n async getOrSet<T>(key: string, ttlMs: number, fetchFn: () => Promise<T>): Promise<T> {\n if (this.enabled) {\n const cached = this.query.get(key) as T | undefined\n if (cached !== undefined) return cached\n }\n const value = await fetchFn()\n if (this.enabled) this.query.set(key, value, ttlMs)\n return value\n }\n\n /** Invalidate a specific key in the query cache */\n invalidateKey(key: string): void {\n this.query.delete(key)\n }\n\n /** Invalidate all query cache keys matching a string prefix or RegExp */\n invalidatePattern(pattern: string | RegExp): void {\n this.query.deletePattern(pattern)\n }\n\n /** Invalidate all entity and query cache entries for the given prefix */\n invalidateAll(prefix: string): void {\n this.entity.deletePattern(prefix)\n this.query.deletePattern(prefix)\n }\n\n setEnabled(enabled: boolean): void {\n this.enabled = enabled\n }\n\n isEnabled(): boolean {\n return this.enabled\n }\n\n /** Remove expired entries from both stores */\n maintenance(): { entityRemoved: number; queryRemoved: number } {\n return {\n entityRemoved: this.entity.cleanup(),\n queryRemoved: this.query.cleanup(),\n }\n }\n\n clear(): void {\n this.entity.clear()\n this.query.clear()\n }\n\n getStats(): {\n entity: ReturnType<CacheStore['getStats']>\n query: ReturnType<CacheStore['getStats']>\n } {\n return { entity: this.entity.getStats(), query: this.query.getStats() }\n }\n}\n\n// Singleton factory\nlet _cacheManager: CacheManager | null = null\n\nexport function getCacheManager(config?: CacheManagerConfig): CacheManager {\n if (!_cacheManager) _cacheManager = new CacheManager(true, config)\n return _cacheManager\n}\n\nexport function resetCacheManager(): void {\n _cacheManager?.clear()\n _cacheManager = null\n}\n","/**\n * Shared CRM option constants for dropdown fields.\n *\n * Used across market-simpli and raise-simpli for company/contact field dropdowns.\n */\n\nexport interface SelectOption<T extends string = string> {\n value: T\n label: string\n}\n\nexport const COMPANY_SIZE_OPTIONS = [\n { value: 'startup', label: 'Startup (1-10)' },\n { value: 'small', label: 'Small (11-50)' },\n { value: 'smb', label: 'SMB (51-200)' },\n { value: 'mid_market', label: 'Mid-Market (201-1000)' },\n { value: 'enterprise', label: 'Enterprise (1000+)' },\n] as const satisfies SelectOption[]\n\nexport const LIFECYCLE_STAGE_OPTIONS = [\n { value: 'subscriber', label: 'Subscriber' },\n { value: 'lead', label: 'Lead' },\n { value: 'mql', label: 'MQL' },\n { value: 'sql', label: 'SQL' },\n { value: 'opportunity', label: 'Opportunity' },\n { value: 'customer', label: 'Customer' },\n { value: 'evangelist', label: 'Evangelist' },\n] as const satisfies SelectOption[]\n\nexport const REVENUE_RANGE_OPTIONS = [\n { value: 'pre_revenue', label: 'Pre-revenue' },\n { value: '0_1m', label: '$0-$1M' },\n { value: '1m_10m', label: '$1M-$10M' },\n { value: '10m_50m', label: '$10M-$50M' },\n { value: '50m_plus', label: '$50M+' },\n] as const satisfies SelectOption[]\n\nexport const ACTIVITY_TYPE_OPTIONS = [\n { value: 'call', label: 'Call' },\n { value: 'email', label: 'Email' },\n { value: 'meeting', label: 'Meeting' },\n { value: 'demo', label: 'Demo' },\n { value: 'note', label: 'Note' },\n { value: 'task', label: 'Task' },\n] as const satisfies SelectOption[]\n\nexport const ACTIVITY_OUTCOME_OPTIONS = [\n { value: 'scheduled_demo', label: 'Scheduled Demo' },\n { value: 'scheduled_meeting', label: 'Scheduled Meeting' },\n { value: 'callback_later', label: 'Callback Later' },\n { value: 'left_voicemail', label: 'Left Voicemail' },\n { value: 'no_answer', label: 'No Answer' },\n { value: 'not_interested', label: 'Not Interested' },\n { value: 'successful', label: 'Successful' },\n { value: 'unsuccessful', label: 'Unsuccessful' },\n] as const satisfies SelectOption[]\n\nexport const LOSS_REASON_OPTIONS = [\n { value: 'price', label: 'Price / Budget' },\n { value: 'timing', label: 'Bad Timing' },\n { value: 'competitor', label: 'Chose Competitor' },\n { value: 'no_need', label: 'No Need' },\n { value: 'no_response', label: 'No Response' },\n { value: 'other', label: 'Other' },\n] as const satisfies SelectOption[]\n\nexport const DEAL_STAGE_OPTIONS = [\n { value: 'qualification', label: 'Qualification' },\n { value: 'discovery', label: 'Discovery' },\n { value: 'demo', label: 'Demo' },\n { value: 'proposal', label: 'Proposal' },\n { value: 'negotiation', label: 'Negotiation' },\n { value: 'closed_won', label: 'Closed Won' },\n { value: 'closed_lost', label: 'Closed Lost' },\n] as const satisfies SelectOption[]\n\nexport type CompanySize = (typeof COMPANY_SIZE_OPTIONS)[number]['value']\nexport type LifecycleStage = (typeof LIFECYCLE_STAGE_OPTIONS)[number]['value']\nexport type RevenueRange = (typeof REVENUE_RANGE_OPTIONS)[number]['value']\nexport type ActivityType = (typeof ACTIVITY_TYPE_OPTIONS)[number]['value']\nexport type ActivityOutcome = (typeof ACTIVITY_OUTCOME_OPTIONS)[number]['value']\nexport type LossReason = (typeof LOSS_REASON_OPTIONS)[number]['value']\nexport type DealStage = (typeof DEAL_STAGE_OPTIONS)[number]['value']\n","'use client'\n\nimport { useState, useEffect, useCallback, useRef } from 'react'\n\nexport interface ServerListOptions {\n pageSize?: number\n initialPage?: number\n initialSearch?: string\n initialSortField?: string\n initialSortDir?: 'asc' | 'desc'\n /** Extra static query params to append on every request */\n params?: Record<string, string | number | boolean>\n /** Disable auto-fetch on mount */\n disabled?: boolean\n /** Custom fetch function (defaults to global fetch). Use authFetch from @startsimpli/auth for authenticated calls. */\n fetcher?: typeof fetch\n}\n\nexport interface ServerListResult<T> {\n data: T[]\n total: number\n loading: boolean\n error: string | null\n page: number\n pageSize: number\n search: string\n sortField: string\n sortDir: 'asc' | 'desc'\n setPage: (page: number) => void\n setPageSize: (size: number) => void\n setSearch: (search: string) => void\n setSort: (field: string, dir?: 'asc' | 'desc') => void\n refresh: () => void\n}\n\n/**\n * Hook for server-side paginated list fetching.\n * Sends ?page=N&pageSize=Y&sortField=Z&sortDirection=asc|desc&search=Q\n * to the provided endpoint.\n *\n * @example\n * import { useServerList } from '@startsimpli/api'\n * import { authFetch } from '@startsimpli/auth'\n *\n * const { data, total, loading, page, setPage, setSearch } = useServerList<Email>(\n * '/api/v1/emails/',\n * { fetcher: authFetch, pageSize: 25 }\n * )\n */\nexport function useServerList<T>(\n endpoint: string,\n options: ServerListOptions = {}\n): ServerListResult<T> {\n const {\n pageSize: initialPageSize = 25,\n initialPage = 1,\n initialSearch = '',\n initialSortField = '',\n initialSortDir = 'asc',\n params: extraParams = {},\n disabled = false,\n fetcher = fetch,\n } = options\n\n const [page, setPage] = useState(initialPage)\n const [pageSize, setPageSize] = useState(initialPageSize)\n const [search, setSearchState] = useState(initialSearch)\n const [sortField, setSortField] = useState(initialSortField)\n const [sortDir, setSortDir] = useState<'asc' | 'desc'>(initialSortDir)\n const [data, setData] = useState<T[]>([])\n const [total, setTotal] = useState(0)\n const [loading, setLoading] = useState(!disabled)\n const [error, setError] = useState<string | null>(null)\n const refreshCountRef = useRef(0)\n\n const fetchData = useCallback(async () => {\n if (disabled) return\n\n setLoading(true)\n setError(null)\n\n const searchParams = new URLSearchParams()\n searchParams.set('page', String(page))\n searchParams.set('pageSize', String(pageSize))\n if (sortField) {\n searchParams.set('sortField', sortField)\n searchParams.set('sortDirection', sortDir)\n }\n if (search) searchParams.set('search', search)\n for (const [k, v] of Object.entries(extraParams)) {\n searchParams.set(k, String(v))\n }\n\n const sep = endpoint.includes('?') ? '&' : '?'\n const url = `${endpoint}${sep}${searchParams.toString()}`\n\n try {\n const response = await fetcher(url)\n if (!response.ok) {\n throw new Error(`Request failed: ${response.status} ${response.statusText}`)\n }\n const json = await response.json()\n // Support { results: T[], count: N } (DRF default), { data: T[], total: N }, or plain array\n if (Array.isArray(json)) {\n setData(json)\n setTotal(json.length)\n } else if (json.results !== undefined) {\n setData(json.results)\n setTotal(json.count ?? json.results.length)\n } else if (json.data !== undefined) {\n setData(json.data)\n setTotal(json.total ?? json.data.length)\n } else {\n setData([])\n setTotal(0)\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load data')\n setData([])\n } finally {\n setLoading(false)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [endpoint, page, pageSize, search, sortField, sortDir, disabled, fetcher, refreshCountRef.current])\n\n useEffect(() => {\n fetchData()\n }, [fetchData])\n\n const setSearch = useCallback((value: string) => {\n setPage(1)\n setSearchState(value)\n }, [])\n\n const setSort = useCallback(\n (field: string, dir?: 'asc' | 'desc') => {\n if (field === sortField && !dir) {\n setSortDir((prev) => (prev === 'asc' ? 'desc' : 'asc'))\n } else {\n setSortField(field)\n setSortDir(dir ?? 'asc')\n }\n setPage(1)\n },\n [sortField]\n )\n\n const refresh = useCallback(() => {\n refreshCountRef.current += 1\n fetchData()\n }, [fetchData])\n\n return {\n data,\n total,\n loading,\n error,\n page,\n pageSize,\n search,\n sortField,\n sortDir,\n setPage,\n setPageSize,\n setSearch,\n setSort,\n refresh,\n }\n}\n","'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\n\nexport interface ServerDetailOptions {\n /** Custom fetch function. Use authFetch from @startsimpli/auth for authenticated calls. */\n fetcher?: typeof fetch\n /** Pass null to skip fetching (e.g., when ID is not yet known) */\n disabled?: boolean\n}\n\nexport interface ServerDetailResult<T> {\n data: T | null\n loading: boolean\n error: string | null\n refresh: () => void\n}\n\n/**\n * Hook for fetching a single resource.\n *\n * @example\n * import { useServerDetail } from '@startsimpli/api'\n * import { authFetch } from '@startsimpli/auth'\n *\n * const { data, loading, error } = useServerDetail<User>(\n * '/api/v1/users/',\n * userId,\n * { fetcher: authFetch }\n * )\n */\nexport function useServerDetail<T>(\n endpoint: string,\n id?: string | number | null,\n options: ServerDetailOptions = {}\n): ServerDetailResult<T> {\n const { fetcher = fetch, disabled = false } = options\n\n const [data, setData] = useState<T | null>(null)\n const [loading, setLoading] = useState(!disabled && id !== null && id !== undefined)\n const [error, setError] = useState<string | null>(null)\n\n const fetchData = useCallback(async () => {\n if (disabled || id === null) return\n\n const url =\n id !== undefined\n ? `${endpoint}${endpoint.endsWith('/') ? '' : '/'}${id}/`\n : endpoint\n\n setLoading(true)\n setError(null)\n try {\n const response = await fetcher(url)\n if (!response.ok) {\n throw new Error(`Request failed: ${response.status} ${response.statusText}`)\n }\n setData(await response.json())\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load data')\n } finally {\n setLoading(false)\n }\n }, [endpoint, id, disabled, fetcher])\n\n useEffect(() => {\n fetchData()\n }, [fetchData])\n\n return { data, loading, error, refresh: fetchData }\n}\n","/**\n * Environment variable utilities for server-side use.\n *\n * These are generic helpers for accessing process.env safely.\n * App-specific schema validation (via zod) lives in each app's src/lib/env.ts.\n */\n\n/**\n * Returns the value of an environment variable, throwing if it is missing or empty.\n */\nexport function getRequiredEnv(key: string): string {\n const value = process.env[key];\n if (!value) {\n throw new Error(`Missing required environment variable: ${key}`);\n }\n return value;\n}\n\n/**\n * Returns the value of an environment variable, or a default if it is missing.\n */\nexport function getOptionalEnv(key: string, defaultValue?: string): string | undefined {\n return process.env[key] ?? defaultValue;\n}\n\n/**\n * Asserts that all listed environment variable keys are present and non-empty.\n * Throws a single error listing every missing variable instead of failing on the first one.\n */\nexport function validateEnvVars(required: string[]): void {\n const missing = required.filter((key) => !process.env[key]);\n if (missing.length > 0) {\n throw new Error(`Missing required environment variables: ${missing.join(', ')}`);\n }\n}\n","/**\n * @startsimpli/api - Type-safe Django REST API client\n *\n * This package provides type-safe access to the Django backend API.\n * NO Prisma, NO database code - all data lives in Django.\n */\n\n// Core client\nexport { ApiClient, createApiClient } from './lib/api-client';\nexport type { ApiClientConfig } from './lib/api-client';\n\n// API wrappers\nexport { ContactsApi } from './lib/contacts-api';\nexport { OrganizationsApi } from './lib/organizations-api';\nexport { EntitiesApi } from './lib/entities-api';\nexport { WorkflowsApi } from './lib/workflows-api';\nexport { MessagesApi } from './lib/messages-api';\nexport type { Message, MessageStatus as MessageApiStatus, MessageRecipient, MessagingChannel as MessagingChannelType } from './lib/messages-api';\nexport { FunnelsApi, isFunnelRunConflict, isFunnelValidationError } from './lib/funnels-api';\nexport type { FunnelPreviewResult, FunnelRunFilters, FunnelTemplate } from './lib/funnels-api';\n\n// Fetch wrapper\nexport { FetchWrapper } from './lib/fetch-wrapper';\nexport type { FetchWrapperConfig } from './lib/fetch-wrapper';\n\n// Error handling (API client errors — fetch/HTTP layer)\nexport {\n ApiException,\n parseErrorResponse,\n handleFetchError,\n isApiException,\n isValidationError,\n isAuthError,\n isNotFoundError,\n} from './lib/error-handler';\n\n// Application error hierarchy (server-side domain errors)\nexport {\n AppErrorCode,\n AppError,\n ValidationError,\n AuthenticationError,\n AuthorizationError,\n NotFoundError,\n ConflictError,\n RateLimitError,\n DatabaseError,\n ExternalServiceError,\n isPrismaError,\n toAppError,\n} from './lib/errors';\nexport type { AppErrorResponse } from './lib/errors';\n\n// Sanitization utilities\nexport { sanitizeHtml, sanitizeSearchQuery, validateIdentifier } from './lib/sanitize';\n\n// LLM prompt sanitization\nexport {\n sanitizeUserInput,\n sanitizeChatMessage,\n MAX_PROMPT_LENGTH,\n MAX_CHAT_MESSAGE_LENGTH,\n} from './lib/llm-sanitize';\n\n// CORS utilities (framework-agnostic, safe to import anywhere)\nexport { getCorsHeaders, applyCorsHeaders, createCorsMiddleware } from './lib/cors';\nexport type { CorsOptions } from './lib/cors';\n\n// NOTE: Middleware is NOT exported from main entry to avoid Next.js server dependencies in tests\n// Import middleware explicitly via '@startsimpli/api/middleware'\n\n// Types\nexport * from './types';\n\n// Rate limiting\nexport { createRateLimiter, getClientIP } from './lib/rate-limit';\nexport type { RateLimitOptions, RateLimitResult } from './lib/rate-limit';\n\n// In-memory cache (server-side only)\nexport { CacheStore } from './lib/cache-store';\nexport type { CacheStoreConfig } from './lib/cache-store';\nexport { CacheManager, getCacheManager, resetCacheManager } from './lib/cache-manager';\nexport type { CacheManagerConfig } from './lib/cache-manager';\n\n// Utils\nexport * from './utils';\n\n// Constants\nexport { ENDPOINTS } from './constants/endpoints';\nexport {\n COMPANY_SIZE_OPTIONS,\n LIFECYCLE_STAGE_OPTIONS,\n REVENUE_RANGE_OPTIONS,\n ACTIVITY_TYPE_OPTIONS,\n ACTIVITY_OUTCOME_OPTIONS,\n LOSS_REASON_OPTIONS,\n DEAL_STAGE_OPTIONS,\n} from './constants/options';\nexport type {\n SelectOption,\n CompanySize,\n LifecycleStage,\n RevenueRange,\n ActivityType,\n ActivityOutcome,\n LossReason,\n DealStage,\n} from './constants/options';\n\n// React hooks for server-side data fetching\nexport { useServerList, useServerDetail } from './hooks';\nexport type { ServerListOptions, ServerListResult, ServerDetailResult } from './hooks';\n\n// Environment variable utilities\nexport { getRequiredEnv, getOptionalEnv, validateEnvVars } from './lib/env';\n\nimport { createApiClient } from './lib/api-client';\nimport { ContactsApi } from './lib/contacts-api';\nimport { OrganizationsApi } from './lib/organizations-api';\nimport { EntitiesApi } from './lib/entities-api';\nimport { WorkflowsApi } from './lib/workflows-api';\nimport { MessagesApi } from './lib/messages-api';\nimport { FunnelsApi } from './lib/funnels-api';\n\nimport type { ApiClientConfig } from './lib/api-client';\n\n/**\n * Create a complete API client with all endpoints.\n * All config fields are optional — baseUrl defaults to '' (relative URLs via Next.js proxy).\n */\nexport function createStartSimpliApi(config: ApiClientConfig = {}) {\n const client = createApiClient(config);\n\n return {\n client,\n contacts: new ContactsApi(client),\n organizations: new OrganizationsApi(client),\n entities: new EntitiesApi(client),\n workflows: new WorkflowsApi(client),\n messages: new MessagesApi(client),\n funnels: new FunnelsApi(client),\n };\n}\n"]}
|