@graph8/sdk 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core.ts","../src/forms.ts","../src/utils.ts","../src/visitors.ts","../src/copilot.ts","../src/chat.ts","../src/calendar.ts","../src/enrich.ts","../src/sequences.ts","../src/campaigns.ts","../src/integrations.ts","../src/signals.ts","../src/analytics.ts","../src/voice.ts","../src/pages.ts","../src/webhooks.ts","../src/contacts.ts","../src/companies.ts","../src/lists.ts"],"sourcesContent":["export { g8 } from \"./core\";\n\n// Core types\nexport type { G8Config, G8PrivacyConfig, TrackProperties, IdentifyProperties, EnrichLookupResult } from \"./types\";\n\n// Module types\nexport type { VisitorCompany, VisitorScore } from \"./visitors\";\nexport type { CopilotConfig } from \"./copilot\";\nexport type { ChatConfig } from \"./chat\";\nexport type { CalendarConfig, TimeSlot, Booking, BookingRequest } from \"./calendar\";\nexport type { PersonEnrichment, CompanyEnrichment, EmailVerification, SearchFilter, SearchResults } from \"./enrich\";\nexport type { Sequence, AddToSequenceConfig } from \"./sequences\";\nexport type { Campaign, CampaignCreateConfig, CampaignStats } from \"./campaigns\";\nexport type { Integration } from \"./integrations\";\nexport type { IntentSignals } from \"./signals\";\nexport type { AnalyticsOverview } from \"./analytics\";\nexport type { VoiceSession, CallAnalysis } from \"./voice\";\nexport type { LandingPage } from \"./pages\";\nexport type { WebhookEvent } from \"./webhooks\";\nexport type { Contact, ContactListParams, ContactCreateParams, ContactUpdateParams } from \"./contacts\";\nexport type { Company, CompanyListParams, CompanyUpdateParams, CompanyContact } from \"./companies\";\nexport type { ContactList, ListContact } from \"./lists\";\n","import { jitsuAnalytics } from \"@jitsu/js\";\nimport type { AnalyticsInterface } from \"@jitsu/js\";\nimport type { G8Config, TrackProperties, IdentifyProperties } from \"./types\";\nimport { createFormsClient } from \"./forms\";\nimport { createVisitorsClient } from \"./visitors\";\nimport { createCopilotClient } from \"./copilot\";\nimport { createChatClient } from \"./chat\";\nimport { createCalendarClient } from \"./calendar\";\nimport { createEnrichClient } from \"./enrich\";\nimport { createSequencesClient } from \"./sequences\";\nimport { createCampaignsClient } from \"./campaigns\";\nimport { createIntegrationsClient } from \"./integrations\";\nimport { createSignalsClient } from \"./signals\";\nimport { createAnalyticsClient } from \"./analytics\";\nimport { createVoiceClient } from \"./voice\";\nimport { createPagesClient } from \"./pages\";\nimport { createWebhooksClient } from \"./webhooks\";\nimport { createContactsClient } from \"./contacts\";\nimport { createCompaniesClient } from \"./companies\";\nimport { createListsClient } from \"./lists\";\nimport { isServer } from \"./utils\";\n\nconst DEFAULT_HOST = \"https://t.graph8.com\";\nconst DEFAULT_API = \"https://be.graph8.com\";\n\n/**\n * graph8 SDK client.\n *\n * Handles event tracking, identity, and progressive forms.\n *\n * Usage:\n * import { g8 } from '@graph8/js';\n * g8.init({ writeKey: 'your_write_key' });\n * g8.track('page_view', { page: '/pricing' });\n * g8.identify('user@acme.com', { name: 'John', company: 'Acme' });\n */\nclass G8 {\n /** @internal */ client: AnalyticsInterface | null = null;\n /** @internal */ config: G8Config | null = null;\n /** @internal */ _forms: ReturnType<typeof createFormsClient> | null = null;\n /** @internal */ _visitors: ReturnType<typeof createVisitorsClient> | null = null;\n /** @internal */ _copilot: ReturnType<typeof createCopilotClient> | null = null;\n /** @internal */ _chat: ReturnType<typeof createChatClient> | null = null;\n /** @internal */ _calendar: ReturnType<typeof createCalendarClient> | null = null;\n /** @internal */ _enrich: ReturnType<typeof createEnrichClient> | null = null;\n /** @internal */ _sequences: ReturnType<typeof createSequencesClient> | null = null;\n /** @internal */ _campaigns: ReturnType<typeof createCampaignsClient> | null = null;\n /** @internal */ _integrations: ReturnType<typeof createIntegrationsClient> | null = null;\n /** @internal */ _signals: ReturnType<typeof createSignalsClient> | null = null;\n /** @internal */ _analytics: ReturnType<typeof createAnalyticsClient> | null = null;\n /** @internal */ _voice: ReturnType<typeof createVoiceClient> | null = null;\n /** @internal */ _pages: ReturnType<typeof createPagesClient> | null = null;\n /** @internal */ _webhooks: ReturnType<typeof createWebhooksClient> | null = null;\n /** @internal */ _contacts: ReturnType<typeof createContactsClient> | null = null;\n /** @internal */ _companies: ReturnType<typeof createCompaniesClient> | null = null;\n /** @internal */ _lists: ReturnType<typeof createListsClient> | null = null;\n\n /**\n * Initialize the graph8 SDK. Must be called before any other method.\n * Safe to call on the server (SSR) - becomes a no-op for tracking.\n */\n init(config: G8Config): void {\n this.config = config;\n\n if (!isServer) {\n this.client = jitsuAnalytics({\n host: config.host || DEFAULT_HOST,\n writeKey: config.writeKey || \"\",\n debug: config.debug,\n });\n }\n\n const apiUrl = config.apiUrl || DEFAULT_API;\n const writeKey = config.writeKey || \"\";\n const apiKey = config.apiKey || \"\";\n\n // Public (write key) clients\n if (writeKey) {\n this._forms = createFormsClient(writeKey, apiUrl);\n this._visitors = createVisitorsClient(writeKey, apiUrl);\n this._copilot = createCopilotClient(writeKey, apiUrl);\n this._chat = createChatClient(writeKey, apiUrl);\n this._calendar = createCalendarClient(apiUrl);\n this._signals = createSignalsClient(writeKey, false, apiUrl);\n }\n\n // Private (API key) clients\n if (apiKey) {\n this._enrich = createEnrichClient(apiKey, apiUrl);\n this._sequences = createSequencesClient(apiKey, apiUrl);\n this._campaigns = createCampaignsClient(apiKey, apiUrl);\n this._integrations = createIntegrationsClient(apiKey, apiUrl);\n this._analytics = createAnalyticsClient(apiKey, apiUrl);\n this._voice = createVoiceClient(apiKey, apiUrl);\n this._pages = createPagesClient(apiKey, apiUrl);\n this._webhooks = createWebhooksClient(apiKey, apiUrl);\n this._contacts = createContactsClient(apiKey, apiUrl);\n this._companies = createCompaniesClient(apiKey, apiUrl);\n this._lists = createListsClient(apiKey, apiUrl);\n // Override signals with API key version for full access\n this._signals = createSignalsClient(apiKey, true, apiUrl);\n }\n }\n\n // -- Core tracking (via Jitsu) --\n\n /** Track a custom event. */\n track(event: string, properties?: TrackProperties): void { this.client?.track(event, properties); }\n\n /** Identify a user with properties. */\n identify(userId: string, properties?: IdentifyProperties): void { this.client?.identify(userId, properties); }\n\n /** Track a page view. */\n page(properties?: TrackProperties): void { this.client?.page(properties); }\n\n /** Clear user identity (on logout). */\n reset(): void { this.client?.reset(); }\n\n // -- Module accessors --\n\n /** Progressive form helpers. */\n get forms() { this._assertInit(); return this._forms!; }\n\n /** Visitor intelligence - IP to company, engagement scoring. */\n get visitors() { this._assertInit(); return this._visitors!; }\n\n /** AI copilot widget. */\n get copilot() { this._assertInit(); return this._copilot!; }\n\n /** Webchat widget. */\n get chat() { this._assertInit(); return this._chat!; }\n\n /** Calendar and booking. */\n get calendar() { this._assertInit(); return this._calendar!; }\n\n /** Enrichment API (requires API key). */\n get enrich() { this._assertKey(\"enrich\"); return this._enrich!; }\n\n /** Sequences (requires API key). */\n get sequences() { this._assertKey(\"sequences\"); return this._sequences!; }\n\n /** Campaigns (requires API key). */\n get campaigns() { this._assertKey(\"campaigns\"); return this._campaigns!; }\n\n /** CRM integrations (requires API key). */\n get integrations() { this._assertKey(\"integrations\"); return this._integrations!; }\n\n /** Intent signals. */\n get signals() { this._assertInit(); return this._signals!; }\n\n /** Analytics (requires API key). */\n get analytics() { this._assertKey(\"analytics\"); return this._analytics!; }\n\n /** Voice AI (requires API key). */\n get voice() { this._assertKey(\"voice\"); return this._voice!; }\n\n /** Landing pages (requires API key). */\n get pages() { this._assertKey(\"pages\"); return this._pages!; }\n\n /** Webhook event listeners (requires API key). */\n get webhooks() { this._assertKey(\"webhooks\"); return this._webhooks!; }\n\n /** Contacts CRUD (requires API key). */\n get contacts() { this._assertKey(\"contacts\"); return this._contacts!; }\n\n /** Companies CRUD (requires API key). */\n get companies() { this._assertKey(\"companies\"); return this._companies!; }\n\n /** Lists management (requires API key). */\n get lists() { this._assertKey(\"lists\"); return this._lists!; }\n\n /** Whether the SDK has been initialized. */\n get initialized(): boolean { return this.config !== null; }\n\n /** @internal */\n _assertInit(): void {\n if (!this.config) throw new Error(\"g8.init() must be called first\");\n }\n\n /** @internal */\n _assertKey(module: string): void {\n this._assertInit();\n if (!this.config!.apiKey) throw new Error(`g8.${module} requires an API key. Use g8.init({ apiKey: '...' })`);\n }\n}\n\n/** Singleton g8 client instance. */\nexport const g8 = new G8();\n","import type { EnrichLookupResult } from \"./types\";\n\nconst DEFAULT_API = \"https://be.graph8.com\";\n\n/**\n * Progressive form enrichment - checks what fields graph8 already knows\n * about a contact so your form can skip those fields.\n *\n * Calls POST /api/v1/public/enrich/lookup (authenticated via write key).\n */\nexport const createFormsClient = (writeKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n\n return {\n /**\n * Look up known fields for an email address.\n *\n * Use this in progressive forms: after the user enters their email,\n * check what graph8 already knows and only show missing fields.\n */\n async lookup(email: string): Promise<EnrichLookupResult> {\n const resp = await fetch(`${baseUrl}/api/v1/public/enrich/lookup`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Write-Key\": writeKey,\n },\n body: JSON.stringify({ email }),\n });\n\n if (!resp.ok) {\n return { found: false, known_fields: {}, missing_fields: [] };\n }\n\n const data = await resp.json();\n return data.data || data;\n },\n };\n};\n","/** Check if running on the server (SSR). */\nexport const isServer = typeof window === \"undefined\";\n\n/** Safely get the window object (returns undefined on server). */\nexport const getWindow = (): Window | undefined =>\n isServer ? undefined : window;\n","import type { G8Config } from \"./types\";\nimport { isServer } from \"./utils\";\n\nconst DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface VisitorCompany {\n company_name: string | null;\n company_domain: string | null;\n industry: string | null;\n employee_count: string | null;\n city: string | null;\n country: string | null;\n confidence: number;\n}\n\nexport interface VisitorScore {\n engagement: number;\n intent: \"low\" | \"medium\" | \"high\";\n signals: string[];\n}\n\ntype IntentCallback = (visitor: VisitorCompany & VisitorScore) => void;\n\n/**\n * Visitor intelligence - identify anonymous visitors by IP → company.\n *\n * Requires write key auth. Works client-side only.\n */\nexport const createVisitorsClient = (writeKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n let intentInterval: ReturnType<typeof setInterval> | null = null;\n\n const headers = () => ({\n \"Content-Type\": \"application/json\",\n \"X-Write-Key\": writeKey,\n });\n\n return {\n /** Identify the current visitor's company from their IP address. */\n async identify(): Promise<VisitorCompany> {\n if (isServer) return { company_name: null, company_domain: null, industry: null, employee_count: null, city: null, country: null, confidence: 0 };\n\n const resp = await fetch(`${baseUrl}/api/v1/public/visitors/company`, { headers: headers() });\n if (!resp.ok) return { company_name: null, company_domain: null, industry: null, employee_count: null, city: null, country: null, confidence: 0 };\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Get engagement score for the current visitor. */\n async score(): Promise<VisitorScore> {\n if (isServer) return { engagement: 0, intent: \"low\", signals: [] };\n\n const resp = await fetch(`${baseUrl}/api/v1/public/visitors/score`, { headers: headers() });\n if (!resp.ok) return { engagement: 0, intent: \"low\", signals: [] };\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Listen for visitors matching an intent level. Polls every 30 seconds. */\n onIntent(level: \"low\" | \"medium\" | \"high\", callback: IntentCallback): () => void {\n if (isServer) return () => {};\n\n const check = async () => {\n try {\n const [company, scoreData] = await Promise.all([\n this.identify(),\n this.score(),\n ]);\n if (scoreData.intent === level || (level === \"medium\" && scoreData.intent === \"high\")) {\n callback({ ...company, ...scoreData });\n }\n } catch { /* silent */ }\n };\n\n check();\n intentInterval = setInterval(check, 30_000);\n\n return () => {\n if (intentInterval) clearInterval(intentInterval);\n };\n },\n };\n};\n","import { isServer } from \"./utils\";\n\nconst DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface CopilotConfig {\n /** Initial greeting message */\n greeting?: string;\n /** Context passed to the AI */\n context?: Record<string, unknown>;\n /** Widget position */\n position?: \"bottom-right\" | \"bottom-left\";\n /** Widget theme */\n theme?: \"light\" | \"dark\" | \"auto\";\n}\n\ntype CopilotEvent = \"message\" | \"tool_used\" | \"open\" | \"close\" | \"error\";\ntype CopilotCallback = (data: Record<string, unknown>) => void;\ntype ActionHandler = (params: Record<string, unknown>) => void | Promise<void>;\n\n/**\n * Copilot - embeddable AI assistant with org knowledge base access.\n *\n * Client-side (write key) for the widget embed.\n */\nexport const createCopilotClient = (writeKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const listeners: Map<CopilotEvent, CopilotCallback[]> = new Map();\n const actions: Map<string, ActionHandler> = new Map();\n let widgetEl: HTMLElement | null = null;\n\n const emit = (event: CopilotEvent, data: Record<string, unknown> = {}) => {\n listeners.get(event)?.forEach((cb) => cb(data));\n };\n\n return {\n /** Open the copilot widget. */\n open(config?: CopilotConfig): void {\n if (isServer) return;\n\n // Remove existing widget if any\n if (widgetEl) widgetEl.remove();\n\n const position = config?.position || \"bottom-right\";\n const posStyle = position === \"bottom-left\" ? \"left:16px;\" : \"right:16px;\";\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = `${baseUrl}/copilot/embed?write_key=${writeKey}&theme=${config?.theme || \"auto\"}`;\n iframe.style.cssText = `position:fixed;bottom:16px;${posStyle}width:400px;height:600px;border:none;border-radius:12px;box-shadow:0 8px 32px rgba(0,0,0,0.15);z-index:99998;`;\n iframe.id = \"g8-copilot-widget\";\n\n document.body.appendChild(iframe);\n widgetEl = iframe;\n emit(\"open\");\n },\n\n /** Send a message to the copilot programmatically. */\n async ask(message: string): Promise<string> {\n const resp = await fetch(`${baseUrl}/api/v1/public/copilot/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Write-Key\": writeKey },\n body: JSON.stringify({ message }),\n });\n if (!resp.ok) return \"Sorry, I could not process that request.\";\n const data = await resp.json();\n return data.response || data.data?.response || \"\";\n },\n\n /** Register a custom action the copilot can trigger. */\n registerAction(name: string, handler: ActionHandler): void {\n actions.set(name, handler);\n },\n\n /** Listen for copilot events. */\n on(event: CopilotEvent, callback: CopilotCallback): void {\n if (!listeners.has(event)) listeners.set(event, []);\n listeners.get(event)!.push(callback);\n },\n\n /** Close the copilot widget. */\n close(): void {\n if (widgetEl) {\n widgetEl.remove();\n widgetEl = null;\n emit(\"close\");\n }\n },\n };\n};\n","import { isServer } from \"./utils\";\n\nconst DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface ChatConfig {\n /** Agent ID to connect to */\n agentId?: string;\n /** Pre-filled first message */\n message?: string;\n /** Widget position */\n position?: \"bottom-right\" | \"bottom-left\";\n /** Widget theme */\n theme?: \"light\" | \"dark\" | \"auto\";\n /** Custom greeting */\n greeting?: string;\n /** Custom avatar URL */\n avatar?: string;\n}\n\ntype ChatEvent = \"message\" | \"human_transfer\" | \"open\" | \"close\" | \"error\";\ntype ChatCallback = (data: Record<string, unknown>) => void;\n\n/**\n * Webchat - live chat + AI chat embedded in any app.\n *\n * Uses WebSocket connection to the voice/chat agent backend.\n * Public - no API key needed (org/agent IDs are in the config).\n */\nexport const createChatClient = (writeKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const listeners: Map<ChatEvent, ChatCallback[]> = new Map();\n let widgetEl: HTMLElement | null = null;\n let ws: WebSocket | null = null;\n\n const emit = (event: ChatEvent, data: Record<string, unknown> = {}) => {\n listeners.get(event)?.forEach((cb) => cb(data));\n };\n\n return {\n /** Open the chat widget. */\n open(config?: ChatConfig): void {\n if (isServer) return;\n\n if (widgetEl) widgetEl.remove();\n\n const position = config?.position || \"bottom-right\";\n const posStyle = position === \"bottom-left\" ? \"left:16px;\" : \"right:16px;\";\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = `${baseUrl}/webchat/embed?write_key=${writeKey}&theme=${config?.theme || \"auto\"}`;\n iframe.style.cssText = `position:fixed;bottom:16px;${posStyle}width:380px;height:560px;border:none;border-radius:12px;box-shadow:0 8px 32px rgba(0,0,0,0.15);z-index:99997;`;\n iframe.id = \"g8-chat-widget\";\n\n document.body.appendChild(iframe);\n widgetEl = iframe;\n emit(\"open\");\n },\n\n /** Send a message. */\n send(message: string): void {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: \"message\", content: message }));\n }\n },\n\n /** Listen for chat events. */\n on(event: ChatEvent, callback: ChatCallback): void {\n if (!listeners.has(event)) listeners.set(event, []);\n listeners.get(event)!.push(callback);\n },\n\n /** Configure the chat appearance. */\n configure(config: Partial<ChatConfig>): void {\n // Send config to iframe via postMessage\n if (widgetEl && widgetEl instanceof HTMLIFrameElement) {\n widgetEl.contentWindow?.postMessage({ type: \"g8_chat_config\", config }, \"*\");\n }\n },\n\n /** Close the chat widget. */\n close(): void {\n if (ws) { ws.close(); ws = null; }\n if (widgetEl) { widgetEl.remove(); widgetEl = null; }\n emit(\"close\");\n },\n };\n};\n","import { isServer } from \"./utils\";\n\nconst DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface CalendarConfig {\n /** Event type slug (e.g. \"demo-30min\") */\n eventType: string;\n /** Username of the host */\n username: string;\n /** Pre-fill attendee info */\n prefill?: { name?: string; email?: string; notes?: string };\n}\n\nexport interface TimeSlot {\n start: string;\n end: string;\n available: boolean;\n}\n\nexport interface Booking {\n uid: string;\n confirmation_url: string;\n start_time: string;\n end_time: string;\n}\n\nexport interface BookingRequest {\n event_type_id: number;\n slot: string;\n attendee: { name: string; email: string; notes?: string };\n}\n\ntype CalendarEvent = \"booked\" | \"cancelled\" | \"slot_selected\";\ntype CalendarCallback = (data: Record<string, unknown>) => void;\n\n/**\n * Calendar and booking - show scheduling widgets, get slots, book meetings.\n *\n * Public endpoints - no API key needed.\n */\nexport const createCalendarClient = (apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const listeners: Map<CalendarEvent, CalendarCallback[]> = new Map();\n\n return {\n /** Show a booking modal overlay. */\n show(config: CalendarConfig): void {\n if (isServer) return;\n\n const url = `${baseUrl}/appointments/${config.username}/${config.eventType}`;\n const params = new URLSearchParams();\n if (config.prefill?.name) params.set(\"name\", config.prefill.name);\n if (config.prefill?.email) params.set(\"email\", config.prefill.email);\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = `${url}?${params.toString()}`;\n iframe.style.cssText = \"position:fixed;top:0;left:0;width:100%;height:100%;border:none;z-index:99999;background:rgba(0,0,0,0.5);\";\n iframe.id = \"g8-calendar-modal\";\n document.body.appendChild(iframe);\n\n // Close on escape\n const onKey = (e: KeyboardEvent) => { if (e.key === \"Escape\") { iframe.remove(); document.removeEventListener(\"keydown\", onKey); } };\n document.addEventListener(\"keydown\", onKey);\n },\n\n /** Embed booking widget inline in a container element. */\n embed(selector: string, config: CalendarConfig): void {\n if (isServer) return;\n\n const container = document.querySelector(selector);\n if (!container) return;\n\n const url = `${baseUrl}/appointments/${config.username}/${config.eventType}`;\n const iframe = document.createElement(\"iframe\");\n iframe.src = url;\n iframe.style.cssText = \"width:100%;min-height:600px;border:none;border-radius:8px;\";\n container.appendChild(iframe);\n },\n\n /** Get available time slots for an event type. */\n async slots(username: string, eventSlug: string, range: { start: string; end: string }): Promise<TimeSlot[]> {\n const params = new URLSearchParams({\n start_date: range.start,\n end_date: range.end,\n });\n const resp = await fetch(`${baseUrl}/appointments/public/slots?username=${username}&event_slug=${eventSlug}&${params.toString()}`);\n if (!resp.ok) return [];\n const data = await resp.json();\n return data.slots || data.data || [];\n },\n\n /** Book a meeting programmatically. */\n async book(request: BookingRequest): Promise<Booking | null> {\n const resp = await fetch(`${baseUrl}/appointments/public/bookings`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(request),\n });\n if (!resp.ok) return null;\n const data = await resp.json();\n const emit = listeners.get(\"booked\");\n if (emit) emit.forEach((cb) => cb(data));\n return data;\n },\n\n /** Listen for calendar events. */\n on(event: CalendarEvent, callback: CalendarCallback): void {\n if (!listeners.has(event)) listeners.set(event, []);\n listeners.get(event)!.push(callback);\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface PersonEnrichment {\n found: boolean;\n confidence: number;\n data: Record<string, unknown>;\n}\n\nexport interface CompanyEnrichment {\n found: boolean;\n confidence: number;\n data: Record<string, unknown>;\n}\n\nexport interface EmailVerification {\n email: string;\n valid: boolean;\n deliverable: boolean;\n catch_all: boolean;\n}\n\nexport interface SearchFilter {\n field: string;\n operator: \"any_of\" | \"contains\" | \"all_of\" | \"none_of\" | \"is_empty\" | \"is_not_empty\" | \"between\" | \"exists\";\n value: unknown;\n}\n\nexport interface SearchResults {\n contacts: Record<string, unknown>[];\n total: number;\n page: number;\n}\n\n/**\n * Enrichment API - person/company lookup, email verification, prospecting search.\n *\n * Requires API key (server-side only). Credits charged per call.\n */\nexport const createEnrichClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n\n const headers = () => ({\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n });\n\n return {\n /** Look up a person by email, LinkedIn, or name + company. Costs 1 credit. */\n async person(params: {\n email?: string;\n linkedin_url?: string;\n first_name?: string;\n last_name?: string;\n company_domain?: string;\n }): Promise<PersonEnrichment> {\n const resp = await fetch(`${baseUrl}/api/v1/enrichment/lookup/person`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(params),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Look up a company by domain or name. Costs 1 credit. */\n async company(params: { domain?: string; name?: string }): Promise<CompanyEnrichment> {\n const resp = await fetch(`${baseUrl}/api/v1/enrichment/lookup/company`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(params),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Verify an email address. Costs 1 credit. */\n async verifyEmail(email: string): Promise<EmailVerification> {\n const resp = await fetch(`${baseUrl}/api/v1/enrichment/verify-email`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ email }),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Search 300M+ contacts with filters. Credits charged per result. */\n async search(filters: SearchFilter[], page = 1, limit = 25): Promise<SearchResults> {\n const resp = await fetch(`${baseUrl}/api/v1/search/contacts`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ filters, page, limit }),\n });\n const data = await resp.json();\n return data.data || data;\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface Sequence {\n id: string;\n name: string;\n status: string;\n step_count: number | null;\n contact_count: number | null;\n}\n\nexport interface AddToSequenceConfig {\n sequenceId: string;\n contactIds: number[];\n listId: number;\n}\n\n/**\n * Sequences - manage outbound sequences. Requires API key (server-side).\n */\nexport const createSequencesClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n return {\n async list(page = 1, limit = 50): Promise<Sequence[]> {\n const resp = await fetch(`${baseUrl}/api/v1/sequences?page=${page}&limit=${limit}`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n async add(config: AddToSequenceConfig): Promise<void> {\n await fetch(`${baseUrl}/api/v1/sequences/${config.sequenceId}/contacts`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ contact_ids: config.contactIds, list_id: config.listId }),\n });\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface Campaign {\n id: string;\n name: string;\n slug: string;\n status: string;\n category: string | null;\n goal: string | null;\n target_persona: string | null;\n}\n\nexport interface CampaignCreateConfig {\n name: string;\n category?: string;\n brief?: string;\n core_concept?: string;\n primary_hook?: string;\n target_persona?: string;\n goal?: string;\n}\n\nexport interface CampaignStats {\n sent: number;\n opened: number;\n replied: number;\n meetings: number;\n}\n\n/**\n * Campaigns - create, manage, launch campaigns. Requires API key (server-side).\n */\nexport const createCampaignsClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n return {\n async list(page = 1, limit = 50): Promise<Campaign[]> {\n const resp = await fetch(`${baseUrl}/api/v1/campaigns?page=${page}&limit=${limit}`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n async get(campaignId: string): Promise<Campaign> {\n const resp = await fetch(`${baseUrl}/api/v1/campaigns/${campaignId}`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n async create(config: CampaignCreateConfig): Promise<Campaign> {\n const resp = await fetch(`${baseUrl}/api/v1/campaigns`, {\n method: \"POST\", headers: headers(),\n body: JSON.stringify(config),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n async launch(campaignId: string): Promise<void> {\n await fetch(`${baseUrl}/api/v1/campaigns/${campaignId}/launch`, {\n method: \"POST\", headers: headers(),\n });\n },\n\n async stats(campaignId: string): Promise<CampaignStats> {\n const resp = await fetch(`${baseUrl}/api/v1/campaigns/${campaignId}/stats`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface Integration {\n id: string;\n provider: string;\n status: string;\n connected_at: string | null;\n}\n\n/**\n * Integrations - connect CRM platforms, trigger syncs. Requires API key (server-side).\n */\nexport const createIntegrationsClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n return {\n async list(): Promise<Integration[]> {\n const resp = await fetch(`${baseUrl}/api/v1/integrations`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n async connect(provider: string, config?: Record<string, unknown>): Promise<void> {\n await fetch(`${baseUrl}/api/v1/integrations/connect`, {\n method: \"POST\", headers: headers(),\n body: JSON.stringify({ provider, ...config }),\n });\n },\n\n async sync(provider: string, config?: { direction?: \"inbound\" | \"outbound\" | \"bidirectional\" }): Promise<void> {\n await fetch(`${baseUrl}/api/v1/integrations/sync`, {\n method: \"POST\", headers: headers(),\n body: JSON.stringify({ provider, ...config }),\n });\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface IntentSignals {\n domain: string;\n score: number;\n intent: \"low\" | \"medium\" | \"high\";\n signals: string[];\n last_seen: string | null;\n}\n\n/**\n * Intent signals - company-level buying signals. Write key for public, API key for full access.\n */\nexport const createSignalsClient = (key: string, isApiKey: boolean, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n\n const headers = (): Record<string, string> => isApiKey\n ? { \"Content-Type\": \"application/json\", \"Authorization\": `Bearer ${key}` }\n : { \"Content-Type\": \"application/json\", \"X-Write-Key\": key };\n\n const endpoint = isApiKey ? \"/api/v1/signals/company\" : \"/api/v1/public/signals/company\";\n\n return {\n /** Get intent signals for a specific company domain. */\n async company(domain: string): Promise<IntentSignals> {\n const resp = await fetch(`${baseUrl}${endpoint}?domain=${encodeURIComponent(domain)}`, { headers: headers() });\n if (!resp.ok) return { domain, score: 0, intent: \"low\", signals: [], last_seen: null };\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Stream intent signals - calls callback every 30s with latest data. */\n stream(domains: string[], callback: (signals: IntentSignals[]) => void): () => void {\n const check = async () => {\n try {\n const results = await Promise.all(domains.map((d) => this.company(d)));\n callback(results);\n } catch { /* silent */ }\n };\n\n check();\n const interval = setInterval(check, 30_000);\n return () => clearInterval(interval);\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface AnalyticsOverview {\n visitors: number;\n contacts_created: number;\n emails_sent: number;\n emails_opened: number;\n replies: number;\n meetings_booked: number;\n period: string;\n}\n\n/**\n * Analytics - dashboard data and metrics. Requires API key (server-side).\n */\nexport const createAnalyticsClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n return {\n async overview(config?: { period?: string; metrics?: string[] }): Promise<AnalyticsOverview> {\n const params = new URLSearchParams();\n if (config?.period) params.set(\"period\", config.period);\n const resp = await fetch(`${baseUrl}/api/v1/analytics/overview?${params.toString()}`, { headers: headers() });\n if (!resp.ok) return { visitors: 0, contacts_created: 0, emails_sent: 0, emails_opened: 0, replies: 0, meetings_booked: 0, period: config?.period || \"30d\" };\n const data = await resp.json();\n return data.data || data;\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface VoiceSession {\n id: string;\n status: string;\n agent: string;\n started_at: string;\n}\n\nexport interface CallAnalysis {\n duration_seconds: number;\n sentiment: \"positive\" | \"neutral\" | \"negative\";\n summary: string;\n next_steps: string[];\n objections: string[];\n transcript: Array<{ speaker: string; text: string; timestamp: number }>;\n}\n\ntype VoiceEvent = \"connected\" | \"transcription\" | \"ended\" | \"error\";\ntype VoiceCallback = (data: Record<string, unknown>) => void;\n\n/**\n * Voice AI - start AI voice calls, get transcriptions and analysis. Requires API key.\n */\nexport const createVoiceClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n const listeners: Map<VoiceEvent, VoiceCallback[]> = new Map();\n\n return {\n /** Start an AI voice session. */\n async start(config: { agent?: string; contactId?: number; context?: Record<string, unknown> }): Promise<VoiceSession> {\n const resp = await fetch(`${baseUrl}/api/v1/voice/sessions`, {\n method: \"POST\", headers: headers(),\n body: JSON.stringify(config),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Get call analysis for a completed session. */\n async analysis(sessionId: string): Promise<CallAnalysis> {\n const resp = await fetch(`${baseUrl}/api/v1/voice/sessions/${sessionId}/analysis`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Listen for voice events. */\n on(event: VoiceEvent, callback: VoiceCallback): void {\n if (!listeners.has(event)) listeners.set(event, []);\n listeners.get(event)!.push(callback);\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface LandingPage {\n id: string;\n title: string;\n slug: string;\n status: string;\n published_url: string | null;\n}\n\n/**\n * Landing pages - clone, create, publish. Requires API key (server-side).\n */\nexport const createPagesClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n return {\n /** Clone a landing page from any URL. */\n async clone(url: string): Promise<LandingPage> {\n const resp = await fetch(`${baseUrl}/api/v1/landing-pages/clone-url`, {\n method: \"POST\", headers: headers(),\n body: JSON.stringify({ url }),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Create a landing page from a template. */\n async create(config: { template?: string; title?: string; content?: Record<string, unknown> }): Promise<LandingPage> {\n const resp = await fetch(`${baseUrl}/api/v1/landing-pages`, {\n method: \"POST\", headers: headers(),\n body: JSON.stringify(config),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Publish a landing page to CDN. */\n async publish(pageId: string): Promise<{ url: string }> {\n const resp = await fetch(`${baseUrl}/api/v1/landing-pages/${pageId}/publish`, {\n method: \"POST\", headers: headers(),\n });\n const data = await resp.json();\n return { url: data.published_url || data.data?.published_url || \"\" };\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport type WebhookEvent =\n | \"reply_received\"\n | \"meeting_booked\"\n | \"contact_enriched\"\n | \"contact_created\"\n | \"sequence_completed\"\n | \"sequence_replied\"\n | \"campaign_launched\"\n | \"form_submitted\"\n | \"visitor_identified\";\n\ntype WebhookCallback = (data: Record<string, unknown>) => void;\n\n/**\n * Webhooks - listen for graph8 events. Requires API key (server-side).\n *\n * For client-side real-time events, use g8.visitors.onIntent() or g8.chat.on() instead.\n */\nexport const createWebhooksClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n const listeners: Map<WebhookEvent, WebhookCallback[]> = new Map();\n let polling = false;\n let pollInterval: ReturnType<typeof setInterval> | null = null;\n\n return {\n /** Register a listener for a webhook event. Starts polling automatically. */\n on(event: WebhookEvent, callback: WebhookCallback): void {\n if (!listeners.has(event)) listeners.set(event, []);\n listeners.get(event)!.push(callback);\n\n // Start polling if not already\n if (!polling) {\n polling = true;\n pollInterval = setInterval(async () => {\n try {\n const resp = await fetch(`${baseUrl}/api/v1/webhooks/events?since=30s`, { headers: headers() });\n if (!resp.ok) return;\n const data = await resp.json();\n const events = data.data || data || [];\n for (const evt of events) {\n const cbs = listeners.get(evt.type as WebhookEvent);\n if (cbs) cbs.forEach((cb) => cb(evt));\n }\n } catch { /* silent */ }\n }, 30_000);\n }\n },\n\n /** Stop all webhook polling. */\n stop(): void {\n if (pollInterval) clearInterval(pollInterval);\n polling = false;\n listeners.clear();\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface Contact {\n id: number;\n first_name: string | null;\n last_name: string | null;\n work_email: string | null;\n job_title: string | null;\n seniority_level: string | null;\n company_name: string | null;\n company_domain: string | null;\n linkedin_url: string | null;\n direct_phone: string | null;\n mobile_phone: string | null;\n city: string | null;\n state: string | null;\n country: string | null;\n}\n\nexport interface ContactListParams {\n page?: number;\n limit?: number;\n email?: string;\n name?: string;\n job_title?: string;\n seniority_level?: string;\n company_name?: string;\n country?: string;\n list_id?: number;\n}\n\nexport interface ContactCreateParams {\n work_email: string;\n first_name?: string;\n last_name?: string;\n job_title?: string;\n company_domain?: string;\n linkedin_url?: string;\n direct_phone?: string;\n mobile_phone?: string;\n city?: string;\n state?: string;\n country?: string;\n list_id?: number;\n}\n\nexport interface ContactUpdateParams {\n first_name?: string;\n last_name?: string;\n work_email?: string;\n job_title?: string;\n company_domain?: string;\n linkedin_url?: string;\n direct_phone?: string;\n mobile_phone?: string;\n city?: string;\n state?: string;\n country?: string;\n}\n\n/**\n * Contacts API - full CRUD for CRM contacts. Requires API key (server-side).\n */\nexport const createContactsClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n const toQuery = (params: object) => {\n const qs = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v != null) qs.set(k, String(v));\n }\n const s = qs.toString();\n return s ? `?${s}` : \"\";\n };\n\n return {\n /** List contacts with optional filters. */\n async list(params: ContactListParams = {}): Promise<{ data: Contact[]; total: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts${toQuery(params)}`, { headers: headers() });\n return resp.json();\n },\n\n /** Get a single contact by ID. */\n async get(contactId: number): Promise<Contact> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts/${contactId}`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Create a new contact. */\n async create(contact: ContactCreateParams): Promise<Contact> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(contact),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Update a contact (partial). */\n async update(contactId: number, fields: ContactUpdateParams): Promise<{ updated: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts/${contactId}`, {\n method: \"PATCH\",\n headers: headers(),\n body: JSON.stringify(fields),\n });\n return resp.json();\n },\n\n /** Delete a contact (soft-delete). */\n async delete(contactId: number): Promise<{ deleted: boolean }> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts/${contactId}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n return resp.json();\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface Company {\n id: number;\n name: string | null;\n domain: string | null;\n industry: string | null;\n employee_count: number | null;\n revenue: number | null;\n founded_year: number | null;\n description: string | null;\n linkedin_url: string | null;\n country: string | null;\n state: string | null;\n city: string | null;\n}\n\nexport interface CompanyListParams {\n page?: number;\n limit?: number;\n domain?: string;\n industry?: string;\n name?: string;\n country?: string;\n}\n\nexport interface CompanyUpdateParams {\n name?: string;\n domain?: string;\n industry?: string;\n description?: string;\n linkedin_url?: string;\n country?: string;\n state?: string;\n city?: string;\n}\n\nexport interface CompanyContact {\n id: number;\n first_name: string | null;\n last_name: string | null;\n work_email: string | null;\n job_title: string | null;\n}\n\n/**\n * Companies API - search and manage CRM companies. Requires API key (server-side).\n */\nexport const createCompaniesClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n const toQuery = (params: object) => {\n const qs = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v != null) qs.set(k, String(v));\n }\n const s = qs.toString();\n return s ? `?${s}` : \"\";\n };\n\n return {\n /** List companies with optional filters. */\n async list(params: CompanyListParams = {}): Promise<{ data: Company[]; total: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/companies${toQuery(params)}`, { headers: headers() });\n return resp.json();\n },\n\n /** Get a single company by ID. */\n async get(companyId: number): Promise<Company> {\n const resp = await fetch(`${baseUrl}/api/v1/companies/${companyId}`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Get contacts belonging to a company. */\n async contacts(companyId: number, limit = 50, offset = 0): Promise<{ data: CompanyContact[]; total: number }> {\n const resp = await fetch(\n `${baseUrl}/api/v1/companies/${companyId}/contacts?limit=${limit}&offset=${offset}`,\n { headers: headers() },\n );\n return resp.json();\n },\n\n /** Update a company (partial). */\n async update(companyId: number, fields: CompanyUpdateParams): Promise<{ updated: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/companies/${companyId}`, {\n method: \"PATCH\",\n headers: headers(),\n body: JSON.stringify(fields),\n });\n return resp.json();\n },\n\n /** Delete a company (soft-delete). */\n async delete(companyId: number): Promise<{ deleted: boolean }> {\n const resp = await fetch(`${baseUrl}/api/v1/companies/${companyId}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n return resp.json();\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface ContactList {\n id: number;\n title: string;\n type: \"contacts\" | \"companies\";\n contact_count: number | null;\n created_at: string | null;\n}\n\nexport interface ListContact {\n id: number;\n first_name: string | null;\n last_name: string | null;\n work_email: string | null;\n job_title: string | null;\n company_name: string | null;\n}\n\n/**\n * Lists API - manage contact and company lists. Requires API key (server-side).\n */\nexport const createListsClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n return {\n /** List all lists. */\n async list(page = 1, limit = 50): Promise<{ data: ContactList[]; total: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/lists?page=${page}&limit=${limit}`, { headers: headers() });\n return resp.json();\n },\n\n /** Create a new list. */\n async create(title: string, type: \"contacts\" | \"companies\" = \"contacts\"): Promise<ContactList> {\n const resp = await fetch(`${baseUrl}/api/v1/lists`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ title, type }),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Delete a list (soft-delete). */\n async delete(listId: number): Promise<{ deleted: boolean }> {\n const resp = await fetch(`${baseUrl}/api/v1/lists/${listId}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n return resp.json();\n },\n\n /** Get contacts in a list. */\n async contacts(listId: number, page = 1, limit = 50): Promise<{ data: ListContact[]; total: number }> {\n const resp = await fetch(\n `${baseUrl}/api/v1/lists/${listId}/contacts?page=${page}&limit=${limit}`,\n { headers: headers() },\n );\n return resp.json();\n },\n\n /** Add contacts to a list. */\n async addContacts(listId: number, contactIds: number[]): Promise<{ added: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/lists/${listId}/contacts`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ contact_ids: contactIds }),\n });\n return resp.json();\n },\n\n /** Remove contacts from a list. */\n async removeContacts(listId: number, contactIds: number[]): Promise<{ removed: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/lists/${listId}/contacts`, {\n method: \"DELETE\",\n headers: headers(),\n body: JSON.stringify({ contact_ids: contactIds }),\n });\n return resp.json();\n },\n };\n};\n"],"mappings":"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","names":["DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","module"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core.ts","../src/forms.ts","../src/utils.ts","../src/visitors.ts","../src/copilot.ts","../src/chat.ts","../src/calendar.ts","../src/enrich.ts","../src/sequences.ts","../src/campaigns.ts","../src/integrations.ts","../src/signals.ts","../src/analytics.ts","../src/voice.ts","../src/pages.ts","../src/webhooks.ts","../src/contacts.ts","../src/companies.ts","../src/lists.ts","../src/notes.ts","../src/tasks.ts","../src/fields.ts","../src/deals.ts"],"sourcesContent":["export { g8 } from \"./core\";\n\n// Core types\nexport type { G8Config, G8PrivacyConfig, TrackProperties, IdentifyProperties, EnrichLookupResult } from \"./types\";\n\n// Module types\nexport type { VisitorCompany, VisitorScore } from \"./visitors\";\nexport type { CopilotConfig } from \"./copilot\";\nexport type { ChatConfig } from \"./chat\";\nexport type { CalendarConfig, TimeSlot, Booking, BookingRequest } from \"./calendar\";\nexport type { PersonEnrichment, CompanyEnrichment, EmailVerification, SearchFilter, SearchResults } from \"./enrich\";\nexport type { Sequence, AddToSequenceConfig } from \"./sequences\";\nexport type { Campaign, CampaignCreateConfig, CampaignStats } from \"./campaigns\";\nexport type { Integration } from \"./integrations\";\nexport type { IntentSignals } from \"./signals\";\nexport type { AnalyticsOverview } from \"./analytics\";\nexport type { VoiceSession, CallAnalysis } from \"./voice\";\nexport type { LandingPage } from \"./pages\";\nexport type { WebhookEvent } from \"./webhooks\";\nexport type {\n Contact,\n ContactListParams,\n ContactCreateParams,\n ContactUpdateParams,\n ContactColumn,\n ContactColumnCreateParams,\n} from \"./contacts\";\nexport type {\n Company,\n CompanyListParams,\n CompanyUpdateParams,\n CompanyContact,\n CompanyColumn,\n CompanyColumnCreateParams,\n} from \"./companies\";\nexport type { ContactList, ListContact } from \"./lists\";\nexport type { Note } from \"./notes\";\nexport type { Task, TaskCreateParams, TaskUpdateParams, TaskListParams } from \"./tasks\";\nexport type {\n Field,\n CreatedField,\n FieldCreateParams,\n FieldDeleteParams,\n SetFieldValueParams,\n} from \"./fields\";\nexport type {\n Deal,\n DealCreateParams,\n DealUpdateParams,\n DealListParams,\n Pipeline,\n PipelineStage,\n ContactDeal,\n PaginationMeta,\n} from \"./deals\";\n","import { jitsuAnalytics } from \"@jitsu/js\";\nimport type { AnalyticsInterface } from \"@jitsu/js\";\nimport type { G8Config, TrackProperties, IdentifyProperties } from \"./types\";\nimport { createFormsClient } from \"./forms\";\nimport { createVisitorsClient } from \"./visitors\";\nimport { createCopilotClient } from \"./copilot\";\nimport { createChatClient } from \"./chat\";\nimport { createCalendarClient } from \"./calendar\";\nimport { createEnrichClient } from \"./enrich\";\nimport { createSequencesClient } from \"./sequences\";\nimport { createCampaignsClient } from \"./campaigns\";\nimport { createIntegrationsClient } from \"./integrations\";\nimport { createSignalsClient } from \"./signals\";\nimport { createAnalyticsClient } from \"./analytics\";\nimport { createVoiceClient } from \"./voice\";\nimport { createPagesClient } from \"./pages\";\nimport { createWebhooksClient } from \"./webhooks\";\nimport { createContactsClient } from \"./contacts\";\nimport { createCompaniesClient } from \"./companies\";\nimport { createListsClient } from \"./lists\";\nimport { createNotesClient } from \"./notes\";\nimport { createTasksClient } from \"./tasks\";\nimport { createFieldsClient } from \"./fields\";\nimport { createDealsClient } from \"./deals\";\nimport { isServer } from \"./utils\";\n\nconst DEFAULT_HOST = \"https://t.graph8.com\";\nconst DEFAULT_API = \"https://be.graph8.com\";\n\n/**\n * graph8 SDK client.\n *\n * Handles event tracking, identity, and progressive forms.\n *\n * Usage:\n * import { g8 } from '@graph8/js';\n * g8.init({ writeKey: 'your_write_key' });\n * g8.track('page_view', { page: '/pricing' });\n * g8.identify('user@acme.com', { name: 'John', company: 'Acme' });\n */\nclass G8 {\n /** @internal */ client: AnalyticsInterface | null = null;\n /** @internal */ config: G8Config | null = null;\n /** @internal */ _forms: ReturnType<typeof createFormsClient> | null = null;\n /** @internal */ _visitors: ReturnType<typeof createVisitorsClient> | null = null;\n /** @internal */ _copilot: ReturnType<typeof createCopilotClient> | null = null;\n /** @internal */ _chat: ReturnType<typeof createChatClient> | null = null;\n /** @internal */ _calendar: ReturnType<typeof createCalendarClient> | null = null;\n /** @internal */ _enrich: ReturnType<typeof createEnrichClient> | null = null;\n /** @internal */ _sequences: ReturnType<typeof createSequencesClient> | null = null;\n /** @internal */ _campaigns: ReturnType<typeof createCampaignsClient> | null = null;\n /** @internal */ _integrations: ReturnType<typeof createIntegrationsClient> | null = null;\n /** @internal */ _signals: ReturnType<typeof createSignalsClient> | null = null;\n /** @internal */ _analytics: ReturnType<typeof createAnalyticsClient> | null = null;\n /** @internal */ _voice: ReturnType<typeof createVoiceClient> | null = null;\n /** @internal */ _pages: ReturnType<typeof createPagesClient> | null = null;\n /** @internal */ _webhooks: ReturnType<typeof createWebhooksClient> | null = null;\n /** @internal */ _contacts: ReturnType<typeof createContactsClient> | null = null;\n /** @internal */ _companies: ReturnType<typeof createCompaniesClient> | null = null;\n /** @internal */ _lists: ReturnType<typeof createListsClient> | null = null;\n /** @internal */ _notes: ReturnType<typeof createNotesClient> | null = null;\n /** @internal */ _tasks: ReturnType<typeof createTasksClient> | null = null;\n /** @internal */ _fields: ReturnType<typeof createFieldsClient> | null = null;\n /** @internal */ _deals: ReturnType<typeof createDealsClient> | null = null;\n\n /**\n * Initialize the graph8 SDK. Must be called before any other method.\n * Safe to call on the server (SSR) - becomes a no-op for tracking.\n */\n init(config: G8Config): void {\n this.config = config;\n\n if (!isServer) {\n this.client = jitsuAnalytics({\n host: config.host || DEFAULT_HOST,\n writeKey: config.writeKey || \"\",\n debug: config.debug,\n });\n }\n\n const apiUrl = config.apiUrl || DEFAULT_API;\n const writeKey = config.writeKey || \"\";\n const apiKey = config.apiKey || \"\";\n\n // Public (write key) clients\n if (writeKey) {\n this._forms = createFormsClient(writeKey, apiUrl);\n this._visitors = createVisitorsClient(writeKey, apiUrl);\n this._copilot = createCopilotClient(writeKey, apiUrl);\n this._chat = createChatClient(writeKey, apiUrl);\n this._calendar = createCalendarClient(apiUrl);\n this._signals = createSignalsClient(writeKey, false, apiUrl);\n }\n\n // Private (API key) clients\n if (apiKey) {\n this._enrich = createEnrichClient(apiKey, apiUrl);\n this._sequences = createSequencesClient(apiKey, apiUrl);\n this._campaigns = createCampaignsClient(apiKey, apiUrl);\n this._integrations = createIntegrationsClient(apiKey, apiUrl);\n this._analytics = createAnalyticsClient(apiKey, apiUrl);\n this._voice = createVoiceClient(apiKey, apiUrl);\n this._pages = createPagesClient(apiKey, apiUrl);\n this._webhooks = createWebhooksClient(apiKey, apiUrl);\n this._contacts = createContactsClient(apiKey, apiUrl);\n this._companies = createCompaniesClient(apiKey, apiUrl);\n this._lists = createListsClient(apiKey, apiUrl);\n this._notes = createNotesClient(apiKey, apiUrl);\n this._tasks = createTasksClient(apiKey, apiUrl);\n this._fields = createFieldsClient(apiKey, apiUrl);\n this._deals = createDealsClient(apiKey, apiUrl);\n // Override signals with API key version for full access\n this._signals = createSignalsClient(apiKey, true, apiUrl);\n }\n }\n\n // -- Core tracking (via Jitsu) --\n\n /** Track a custom event. */\n track(event: string, properties?: TrackProperties): void { this.client?.track(event, properties); }\n\n /** Identify a user with properties. */\n identify(userId: string, properties?: IdentifyProperties): void { this.client?.identify(userId, properties); }\n\n /** Track a page view. */\n page(properties?: TrackProperties): void { this.client?.page(properties); }\n\n /** Clear user identity (on logout). */\n reset(): void { this.client?.reset(); }\n\n // -- Module accessors --\n\n /** Progressive form helpers. */\n get forms() { this._assertInit(); return this._forms!; }\n\n /** Visitor intelligence - IP to company, engagement scoring. */\n get visitors() { this._assertInit(); return this._visitors!; }\n\n /** AI copilot widget. */\n get copilot() { this._assertInit(); return this._copilot!; }\n\n /** Webchat widget. */\n get chat() { this._assertInit(); return this._chat!; }\n\n /** Calendar and booking. */\n get calendar() { this._assertInit(); return this._calendar!; }\n\n /** Enrichment API (requires API key). */\n get enrich() { this._assertKey(\"enrich\"); return this._enrich!; }\n\n /** Sequences (requires API key). */\n get sequences() { this._assertKey(\"sequences\"); return this._sequences!; }\n\n /** Campaigns (requires API key). */\n get campaigns() { this._assertKey(\"campaigns\"); return this._campaigns!; }\n\n /** CRM integrations (requires API key). */\n get integrations() { this._assertKey(\"integrations\"); return this._integrations!; }\n\n /** Intent signals. */\n get signals() { this._assertInit(); return this._signals!; }\n\n /** Analytics (requires API key). */\n get analytics() { this._assertKey(\"analytics\"); return this._analytics!; }\n\n /** Voice AI (requires API key). */\n get voice() { this._assertKey(\"voice\"); return this._voice!; }\n\n /** Landing pages (requires API key). */\n get pages() { this._assertKey(\"pages\"); return this._pages!; }\n\n /** Webhook event listeners (requires API key). */\n get webhooks() { this._assertKey(\"webhooks\"); return this._webhooks!; }\n\n /** Contacts CRUD (requires API key). */\n get contacts() { this._assertKey(\"contacts\"); return this._contacts!; }\n\n /** Companies CRUD (requires API key). */\n get companies() { this._assertKey(\"companies\"); return this._companies!; }\n\n /** Lists management (requires API key). */\n get lists() { this._assertKey(\"lists\"); return this._lists!; }\n\n /** Notes on contacts (requires API key). */\n get notes() { this._assertKey(\"notes\"); return this._notes!; }\n\n /** Tasks on contacts (requires API key). */\n get tasks() { this._assertKey(\"tasks\"); return this._tasks!; }\n\n /** Custom fields management (requires API key). */\n get fields() { this._assertKey(\"fields\"); return this._fields!; }\n\n /** Deals and pipelines (requires API key). */\n get deals() { this._assertKey(\"deals\"); return this._deals!; }\n\n /** Whether the SDK has been initialized. */\n get initialized(): boolean { return this.config !== null; }\n\n /** @internal */\n _assertInit(): void {\n if (!this.config) throw new Error(\"g8.init() must be called first\");\n }\n\n /** @internal */\n _assertKey(module: string): void {\n this._assertInit();\n if (!this.config!.apiKey) throw new Error(`g8.${module} requires an API key. Use g8.init({ apiKey: '...' })`);\n }\n}\n\n/** Singleton g8 client instance. */\nexport const g8 = new G8();\n","import type { EnrichLookupResult } from \"./types\";\n\nconst DEFAULT_API = \"https://be.graph8.com\";\n\n/**\n * Progressive form enrichment - checks what fields graph8 already knows\n * about a contact so your form can skip those fields.\n *\n * Calls POST /api/v1/public/enrich/lookup (authenticated via write key).\n */\nexport const createFormsClient = (writeKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n\n return {\n /**\n * Look up known fields for an email address.\n *\n * Use this in progressive forms: after the user enters their email,\n * check what graph8 already knows and only show missing fields.\n */\n async lookup(email: string): Promise<EnrichLookupResult> {\n const resp = await fetch(`${baseUrl}/api/v1/public/enrich/lookup`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Write-Key\": writeKey,\n },\n body: JSON.stringify({ email }),\n });\n\n if (!resp.ok) {\n return { found: false, known_fields: {}, missing_fields: [] };\n }\n\n const data = await resp.json();\n return data.data || data;\n },\n };\n};\n","/** Check if running on the server (SSR). */\nexport const isServer = typeof window === \"undefined\";\n\n/** Safely get the window object (returns undefined on server). */\nexport const getWindow = (): Window | undefined =>\n isServer ? undefined : window;\n","import type { G8Config } from \"./types\";\nimport { isServer } from \"./utils\";\n\nconst DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface VisitorCompany {\n company_name: string | null;\n company_domain: string | null;\n industry: string | null;\n employee_count: string | null;\n city: string | null;\n country: string | null;\n confidence: number;\n}\n\nexport interface VisitorScore {\n engagement: number;\n intent: \"low\" | \"medium\" | \"high\";\n signals: string[];\n}\n\ntype IntentCallback = (visitor: VisitorCompany & VisitorScore) => void;\n\n/**\n * Visitor intelligence - identify anonymous visitors by IP → company.\n *\n * Requires write key auth. Works client-side only.\n */\nexport const createVisitorsClient = (writeKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n let intentInterval: ReturnType<typeof setInterval> | null = null;\n\n const headers = () => ({\n \"Content-Type\": \"application/json\",\n \"X-Write-Key\": writeKey,\n });\n\n return {\n /** Identify the current visitor's company from their IP address. */\n async identify(): Promise<VisitorCompany> {\n if (isServer) return { company_name: null, company_domain: null, industry: null, employee_count: null, city: null, country: null, confidence: 0 };\n\n const resp = await fetch(`${baseUrl}/api/v1/public/visitors/company`, { headers: headers() });\n if (!resp.ok) return { company_name: null, company_domain: null, industry: null, employee_count: null, city: null, country: null, confidence: 0 };\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Get engagement score for the current visitor. */\n async score(): Promise<VisitorScore> {\n if (isServer) return { engagement: 0, intent: \"low\", signals: [] };\n\n const resp = await fetch(`${baseUrl}/api/v1/public/visitors/score`, { headers: headers() });\n if (!resp.ok) return { engagement: 0, intent: \"low\", signals: [] };\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Listen for visitors matching an intent level. Polls every 30 seconds. */\n onIntent(level: \"low\" | \"medium\" | \"high\", callback: IntentCallback): () => void {\n if (isServer) return () => {};\n\n const check = async () => {\n try {\n const [company, scoreData] = await Promise.all([\n this.identify(),\n this.score(),\n ]);\n if (scoreData.intent === level || (level === \"medium\" && scoreData.intent === \"high\")) {\n callback({ ...company, ...scoreData });\n }\n } catch { /* silent */ }\n };\n\n check();\n intentInterval = setInterval(check, 30_000);\n\n return () => {\n if (intentInterval) clearInterval(intentInterval);\n };\n },\n };\n};\n","import { isServer } from \"./utils\";\n\nconst DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface CopilotConfig {\n /** Initial greeting message */\n greeting?: string;\n /** Context passed to the AI */\n context?: Record<string, unknown>;\n /** Widget position */\n position?: \"bottom-right\" | \"bottom-left\";\n /** Widget theme */\n theme?: \"light\" | \"dark\" | \"auto\";\n}\n\ntype CopilotEvent = \"message\" | \"tool_used\" | \"open\" | \"close\" | \"error\";\ntype CopilotCallback = (data: Record<string, unknown>) => void;\ntype ActionHandler = (params: Record<string, unknown>) => void | Promise<void>;\n\n/**\n * Copilot - embeddable AI assistant with org knowledge base access.\n *\n * Client-side (write key) for the widget embed.\n */\nexport const createCopilotClient = (writeKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const listeners: Map<CopilotEvent, CopilotCallback[]> = new Map();\n const actions: Map<string, ActionHandler> = new Map();\n let widgetEl: HTMLElement | null = null;\n\n const emit = (event: CopilotEvent, data: Record<string, unknown> = {}) => {\n listeners.get(event)?.forEach((cb) => cb(data));\n };\n\n return {\n /** Open the copilot widget. */\n open(config?: CopilotConfig): void {\n if (isServer) return;\n\n // Remove existing widget if any\n if (widgetEl) widgetEl.remove();\n\n const position = config?.position || \"bottom-right\";\n const posStyle = position === \"bottom-left\" ? \"left:16px;\" : \"right:16px;\";\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = `${baseUrl}/copilot/embed?write_key=${writeKey}&theme=${config?.theme || \"auto\"}`;\n iframe.style.cssText = `position:fixed;bottom:16px;${posStyle}width:400px;height:600px;border:none;border-radius:12px;box-shadow:0 8px 32px rgba(0,0,0,0.15);z-index:99998;`;\n iframe.id = \"g8-copilot-widget\";\n\n document.body.appendChild(iframe);\n widgetEl = iframe;\n emit(\"open\");\n },\n\n /** Send a message to the copilot programmatically. */\n async ask(message: string): Promise<string> {\n const resp = await fetch(`${baseUrl}/api/v1/public/copilot/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"X-Write-Key\": writeKey },\n body: JSON.stringify({ message }),\n });\n if (!resp.ok) return \"Sorry, I could not process that request.\";\n const data = await resp.json();\n return data.response || data.data?.response || \"\";\n },\n\n /** Register a custom action the copilot can trigger. */\n registerAction(name: string, handler: ActionHandler): void {\n actions.set(name, handler);\n },\n\n /** Listen for copilot events. */\n on(event: CopilotEvent, callback: CopilotCallback): void {\n if (!listeners.has(event)) listeners.set(event, []);\n listeners.get(event)!.push(callback);\n },\n\n /** Close the copilot widget. */\n close(): void {\n if (widgetEl) {\n widgetEl.remove();\n widgetEl = null;\n emit(\"close\");\n }\n },\n };\n};\n","import { isServer } from \"./utils\";\n\nconst DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface ChatConfig {\n /** Agent ID to connect to */\n agentId?: string;\n /** Pre-filled first message */\n message?: string;\n /** Widget position */\n position?: \"bottom-right\" | \"bottom-left\";\n /** Widget theme */\n theme?: \"light\" | \"dark\" | \"auto\";\n /** Custom greeting */\n greeting?: string;\n /** Custom avatar URL */\n avatar?: string;\n}\n\ntype ChatEvent = \"message\" | \"human_transfer\" | \"open\" | \"close\" | \"error\";\ntype ChatCallback = (data: Record<string, unknown>) => void;\n\n/**\n * Webchat - live chat + AI chat embedded in any app.\n *\n * Uses WebSocket connection to the voice/chat agent backend.\n * Public - no API key needed (org/agent IDs are in the config).\n */\nexport const createChatClient = (writeKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const listeners: Map<ChatEvent, ChatCallback[]> = new Map();\n let widgetEl: HTMLElement | null = null;\n let ws: WebSocket | null = null;\n\n const emit = (event: ChatEvent, data: Record<string, unknown> = {}) => {\n listeners.get(event)?.forEach((cb) => cb(data));\n };\n\n return {\n /** Open the chat widget. */\n open(config?: ChatConfig): void {\n if (isServer) return;\n\n if (widgetEl) widgetEl.remove();\n\n const position = config?.position || \"bottom-right\";\n const posStyle = position === \"bottom-left\" ? \"left:16px;\" : \"right:16px;\";\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = `${baseUrl}/webchat/embed?write_key=${writeKey}&theme=${config?.theme || \"auto\"}`;\n iframe.style.cssText = `position:fixed;bottom:16px;${posStyle}width:380px;height:560px;border:none;border-radius:12px;box-shadow:0 8px 32px rgba(0,0,0,0.15);z-index:99997;`;\n iframe.id = \"g8-chat-widget\";\n\n document.body.appendChild(iframe);\n widgetEl = iframe;\n emit(\"open\");\n },\n\n /** Send a message. */\n send(message: string): void {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: \"message\", content: message }));\n }\n },\n\n /** Listen for chat events. */\n on(event: ChatEvent, callback: ChatCallback): void {\n if (!listeners.has(event)) listeners.set(event, []);\n listeners.get(event)!.push(callback);\n },\n\n /** Configure the chat appearance. */\n configure(config: Partial<ChatConfig>): void {\n // Send config to iframe via postMessage\n if (widgetEl && widgetEl instanceof HTMLIFrameElement) {\n widgetEl.contentWindow?.postMessage({ type: \"g8_chat_config\", config }, \"*\");\n }\n },\n\n /** Close the chat widget. */\n close(): void {\n if (ws) { ws.close(); ws = null; }\n if (widgetEl) { widgetEl.remove(); widgetEl = null; }\n emit(\"close\");\n },\n };\n};\n","import { isServer } from \"./utils\";\n\nconst DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface CalendarConfig {\n /** Event type slug (e.g. \"demo-30min\") */\n eventType: string;\n /** Username of the host */\n username: string;\n /** Pre-fill attendee info */\n prefill?: { name?: string; email?: string; notes?: string };\n}\n\nexport interface TimeSlot {\n start: string;\n end: string;\n available: boolean;\n}\n\nexport interface Booking {\n uid: string;\n confirmation_url: string;\n start_time: string;\n end_time: string;\n}\n\nexport interface BookingRequest {\n event_type_id: number;\n slot: string;\n attendee: { name: string; email: string; notes?: string };\n}\n\ntype CalendarEvent = \"booked\" | \"cancelled\" | \"slot_selected\";\ntype CalendarCallback = (data: Record<string, unknown>) => void;\n\n/**\n * Calendar and booking - show scheduling widgets, get slots, book meetings.\n *\n * Public endpoints - no API key needed.\n */\nexport const createCalendarClient = (apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const listeners: Map<CalendarEvent, CalendarCallback[]> = new Map();\n\n return {\n /** Show a booking modal overlay. */\n show(config: CalendarConfig): void {\n if (isServer) return;\n\n const url = `${baseUrl}/appointments/${config.username}/${config.eventType}`;\n const params = new URLSearchParams();\n if (config.prefill?.name) params.set(\"name\", config.prefill.name);\n if (config.prefill?.email) params.set(\"email\", config.prefill.email);\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = `${url}?${params.toString()}`;\n iframe.style.cssText = \"position:fixed;top:0;left:0;width:100%;height:100%;border:none;z-index:99999;background:rgba(0,0,0,0.5);\";\n iframe.id = \"g8-calendar-modal\";\n document.body.appendChild(iframe);\n\n // Close on escape\n const onKey = (e: KeyboardEvent) => { if (e.key === \"Escape\") { iframe.remove(); document.removeEventListener(\"keydown\", onKey); } };\n document.addEventListener(\"keydown\", onKey);\n },\n\n /** Embed booking widget inline in a container element. */\n embed(selector: string, config: CalendarConfig): void {\n if (isServer) return;\n\n const container = document.querySelector(selector);\n if (!container) return;\n\n const url = `${baseUrl}/appointments/${config.username}/${config.eventType}`;\n const iframe = document.createElement(\"iframe\");\n iframe.src = url;\n iframe.style.cssText = \"width:100%;min-height:600px;border:none;border-radius:8px;\";\n container.appendChild(iframe);\n },\n\n /** Get available time slots for an event type. */\n async slots(username: string, eventSlug: string, range: { start: string; end: string }): Promise<TimeSlot[]> {\n const params = new URLSearchParams({\n start_date: range.start,\n end_date: range.end,\n });\n const resp = await fetch(`${baseUrl}/appointments/public/slots?username=${username}&event_slug=${eventSlug}&${params.toString()}`);\n if (!resp.ok) return [];\n const data = await resp.json();\n return data.slots || data.data || [];\n },\n\n /** Book a meeting programmatically. */\n async book(request: BookingRequest): Promise<Booking | null> {\n const resp = await fetch(`${baseUrl}/appointments/public/bookings`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(request),\n });\n if (!resp.ok) return null;\n const data = await resp.json();\n const emit = listeners.get(\"booked\");\n if (emit) emit.forEach((cb) => cb(data));\n return data;\n },\n\n /** Listen for calendar events. */\n on(event: CalendarEvent, callback: CalendarCallback): void {\n if (!listeners.has(event)) listeners.set(event, []);\n listeners.get(event)!.push(callback);\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface PersonEnrichment {\n found: boolean;\n confidence: number;\n data: Record<string, unknown>;\n}\n\nexport interface CompanyEnrichment {\n found: boolean;\n confidence: number;\n data: Record<string, unknown>;\n}\n\nexport interface EmailVerification {\n email: string;\n valid: boolean;\n deliverable: boolean;\n catch_all: boolean;\n}\n\nexport interface SearchFilter {\n field: string;\n operator: \"any_of\" | \"contains\" | \"all_of\" | \"none_of\" | \"is_empty\" | \"is_not_empty\" | \"between\" | \"exists\";\n value: unknown;\n}\n\nexport interface SearchResults {\n contacts: Record<string, unknown>[];\n total: number;\n page: number;\n}\n\n/**\n * Enrichment API - person/company lookup, email verification, prospecting search.\n *\n * Requires API key (server-side only). Credits charged per call.\n */\nexport const createEnrichClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n\n const headers = () => ({\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n });\n\n return {\n /** Look up a person by email, LinkedIn, or name + company. Costs 1 credit. */\n async person(params: {\n email?: string;\n linkedin_url?: string;\n first_name?: string;\n last_name?: string;\n company_domain?: string;\n }): Promise<PersonEnrichment> {\n const resp = await fetch(`${baseUrl}/api/v1/enrichment/lookup/person`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(params),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Look up a company by domain or name. Costs 1 credit. */\n async company(params: { domain?: string; name?: string }): Promise<CompanyEnrichment> {\n const resp = await fetch(`${baseUrl}/api/v1/enrichment/lookup/company`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(params),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Verify an email address. Costs 1 credit. */\n async verifyEmail(email: string): Promise<EmailVerification> {\n const resp = await fetch(`${baseUrl}/api/v1/enrichment/verify-email`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ email }),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Search 300M+ contacts with filters. Credits charged per result. */\n async search(filters: SearchFilter[], page = 1, limit = 25): Promise<SearchResults> {\n const resp = await fetch(`${baseUrl}/api/v1/search/contacts`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ filters, page, limit }),\n });\n const data = await resp.json();\n return data.data || data;\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface Sequence {\n id: string;\n name: string;\n status: string;\n step_count: number | null;\n contact_count: number | null;\n}\n\nexport interface AddToSequenceConfig {\n sequenceId: string;\n contactIds: number[];\n listId: number;\n}\n\n/**\n * Sequences - manage outbound sequences. Requires API key (server-side).\n */\nexport const createSequencesClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n return {\n async list(page = 1, limit = 50): Promise<Sequence[]> {\n const resp = await fetch(`${baseUrl}/api/v1/sequences?page=${page}&limit=${limit}`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n async add(config: AddToSequenceConfig): Promise<void> {\n await fetch(`${baseUrl}/api/v1/sequences/${config.sequenceId}/contacts`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ contact_ids: config.contactIds, list_id: config.listId }),\n });\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface Campaign {\n id: string;\n name: string;\n slug: string;\n status: string;\n category: string | null;\n goal: string | null;\n target_persona: string | null;\n}\n\nexport interface CampaignCreateConfig {\n name: string;\n category?: string;\n brief?: string;\n core_concept?: string;\n primary_hook?: string;\n target_persona?: string;\n goal?: string;\n}\n\nexport interface CampaignStats {\n sent: number;\n opened: number;\n replied: number;\n meetings: number;\n}\n\n/**\n * Campaigns - create, manage, launch campaigns. Requires API key (server-side).\n */\nexport const createCampaignsClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n return {\n async list(page = 1, limit = 50): Promise<Campaign[]> {\n const resp = await fetch(`${baseUrl}/api/v1/campaigns?page=${page}&limit=${limit}`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n async get(campaignId: string): Promise<Campaign> {\n const resp = await fetch(`${baseUrl}/api/v1/campaigns/${campaignId}`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n async create(config: CampaignCreateConfig): Promise<Campaign> {\n const resp = await fetch(`${baseUrl}/api/v1/campaigns`, {\n method: \"POST\", headers: headers(),\n body: JSON.stringify(config),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n async launch(campaignId: string): Promise<void> {\n await fetch(`${baseUrl}/api/v1/campaigns/${campaignId}/launch`, {\n method: \"POST\", headers: headers(),\n });\n },\n\n async stats(campaignId: string): Promise<CampaignStats> {\n const resp = await fetch(`${baseUrl}/api/v1/campaigns/${campaignId}/stats`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface Integration {\n id: string;\n provider: string;\n status: string;\n connected_at: string | null;\n}\n\n/**\n * Integrations - connect CRM platforms, trigger syncs. Requires API key (server-side).\n */\nexport const createIntegrationsClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n return {\n async list(): Promise<Integration[]> {\n const resp = await fetch(`${baseUrl}/api/v1/integrations`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n async connect(provider: string, config?: Record<string, unknown>): Promise<void> {\n await fetch(`${baseUrl}/api/v1/integrations/connect`, {\n method: \"POST\", headers: headers(),\n body: JSON.stringify({ provider, ...config }),\n });\n },\n\n async sync(provider: string, config?: { direction?: \"inbound\" | \"outbound\" | \"bidirectional\" }): Promise<void> {\n await fetch(`${baseUrl}/api/v1/integrations/sync`, {\n method: \"POST\", headers: headers(),\n body: JSON.stringify({ provider, ...config }),\n });\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface IntentSignals {\n domain: string;\n score: number;\n intent: \"low\" | \"medium\" | \"high\";\n signals: string[];\n last_seen: string | null;\n}\n\n/**\n * Intent signals - company-level buying signals. Write key for public, API key for full access.\n */\nexport const createSignalsClient = (key: string, isApiKey: boolean, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n\n const headers = (): Record<string, string> => isApiKey\n ? { \"Content-Type\": \"application/json\", \"Authorization\": `Bearer ${key}` }\n : { \"Content-Type\": \"application/json\", \"X-Write-Key\": key };\n\n const endpoint = isApiKey ? \"/api/v1/signals/company\" : \"/api/v1/public/signals/company\";\n\n return {\n /** Get intent signals for a specific company domain. */\n async company(domain: string): Promise<IntentSignals> {\n const resp = await fetch(`${baseUrl}${endpoint}?domain=${encodeURIComponent(domain)}`, { headers: headers() });\n if (!resp.ok) return { domain, score: 0, intent: \"low\", signals: [], last_seen: null };\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Stream intent signals - calls callback every 30s with latest data. */\n stream(domains: string[], callback: (signals: IntentSignals[]) => void): () => void {\n const check = async () => {\n try {\n const results = await Promise.all(domains.map((d) => this.company(d)));\n callback(results);\n } catch { /* silent */ }\n };\n\n check();\n const interval = setInterval(check, 30_000);\n return () => clearInterval(interval);\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface AnalyticsOverview {\n visitors: number;\n contacts_created: number;\n emails_sent: number;\n emails_opened: number;\n replies: number;\n meetings_booked: number;\n period: string;\n}\n\n/**\n * Analytics - dashboard data and metrics. Requires API key (server-side).\n */\nexport const createAnalyticsClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n return {\n async overview(config?: { period?: string; metrics?: string[] }): Promise<AnalyticsOverview> {\n const params = new URLSearchParams();\n if (config?.period) params.set(\"period\", config.period);\n const resp = await fetch(`${baseUrl}/api/v1/analytics/overview?${params.toString()}`, { headers: headers() });\n if (!resp.ok) return { visitors: 0, contacts_created: 0, emails_sent: 0, emails_opened: 0, replies: 0, meetings_booked: 0, period: config?.period || \"30d\" };\n const data = await resp.json();\n return data.data || data;\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface VoiceSession {\n id: string;\n status: string;\n agent: string;\n started_at: string;\n}\n\nexport interface CallAnalysis {\n duration_seconds: number;\n sentiment: \"positive\" | \"neutral\" | \"negative\";\n summary: string;\n next_steps: string[];\n objections: string[];\n transcript: Array<{ speaker: string; text: string; timestamp: number }>;\n}\n\ntype VoiceEvent = \"connected\" | \"transcription\" | \"ended\" | \"error\";\ntype VoiceCallback = (data: Record<string, unknown>) => void;\n\n/**\n * Voice AI - start AI voice calls, get transcriptions and analysis. Requires API key.\n */\nexport const createVoiceClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n const listeners: Map<VoiceEvent, VoiceCallback[]> = new Map();\n\n return {\n /** Start an AI voice session. */\n async start(config: { agent?: string; contactId?: number; context?: Record<string, unknown> }): Promise<VoiceSession> {\n const resp = await fetch(`${baseUrl}/api/v1/voice/sessions`, {\n method: \"POST\", headers: headers(),\n body: JSON.stringify(config),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Get call analysis for a completed session. */\n async analysis(sessionId: string): Promise<CallAnalysis> {\n const resp = await fetch(`${baseUrl}/api/v1/voice/sessions/${sessionId}/analysis`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Listen for voice events. */\n on(event: VoiceEvent, callback: VoiceCallback): void {\n if (!listeners.has(event)) listeners.set(event, []);\n listeners.get(event)!.push(callback);\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface LandingPage {\n id: string;\n title: string;\n slug: string;\n status: string;\n published_url: string | null;\n}\n\n/**\n * Landing pages - clone, create, publish. Requires API key (server-side).\n */\nexport const createPagesClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n return {\n /** Clone a landing page from any URL. */\n async clone(url: string): Promise<LandingPage> {\n const resp = await fetch(`${baseUrl}/api/v1/landing-pages/clone-url`, {\n method: \"POST\", headers: headers(),\n body: JSON.stringify({ url }),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Create a landing page from a template. */\n async create(config: { template?: string; title?: string; content?: Record<string, unknown> }): Promise<LandingPage> {\n const resp = await fetch(`${baseUrl}/api/v1/landing-pages`, {\n method: \"POST\", headers: headers(),\n body: JSON.stringify(config),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Publish a landing page to CDN. */\n async publish(pageId: string): Promise<{ url: string }> {\n const resp = await fetch(`${baseUrl}/api/v1/landing-pages/${pageId}/publish`, {\n method: \"POST\", headers: headers(),\n });\n const data = await resp.json();\n return { url: data.published_url || data.data?.published_url || \"\" };\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport type WebhookEvent =\n | \"reply_received\"\n | \"meeting_booked\"\n | \"contact_enriched\"\n | \"contact_created\"\n | \"sequence_completed\"\n | \"sequence_replied\"\n | \"campaign_launched\"\n | \"form_submitted\"\n | \"visitor_identified\";\n\ntype WebhookCallback = (data: Record<string, unknown>) => void;\n\n/**\n * Webhooks - listen for graph8 events. Requires API key (server-side).\n *\n * For client-side real-time events, use g8.visitors.onIntent() or g8.chat.on() instead.\n */\nexport const createWebhooksClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n const listeners: Map<WebhookEvent, WebhookCallback[]> = new Map();\n let polling = false;\n let pollInterval: ReturnType<typeof setInterval> | null = null;\n\n return {\n /** Register a listener for a webhook event. Starts polling automatically. */\n on(event: WebhookEvent, callback: WebhookCallback): void {\n if (!listeners.has(event)) listeners.set(event, []);\n listeners.get(event)!.push(callback);\n\n // Start polling if not already\n if (!polling) {\n polling = true;\n pollInterval = setInterval(async () => {\n try {\n const resp = await fetch(`${baseUrl}/api/v1/webhooks/events?since=30s`, { headers: headers() });\n if (!resp.ok) return;\n const data = await resp.json();\n const events = data.data || data || [];\n for (const evt of events) {\n const cbs = listeners.get(evt.type as WebhookEvent);\n if (cbs) cbs.forEach((cb) => cb(evt));\n }\n } catch { /* silent */ }\n }, 30_000);\n }\n },\n\n /** Stop all webhook polling. */\n stop(): void {\n if (pollInterval) clearInterval(pollInterval);\n polling = false;\n listeners.clear();\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface Contact {\n id: number;\n first_name: string | null;\n last_name: string | null;\n work_email: string | null;\n job_title: string | null;\n seniority_level: string | null;\n company_name: string | null;\n company_domain: string | null;\n linkedin_url: string | null;\n direct_phone: string | null;\n mobile_phone: string | null;\n city: string | null;\n state: string | null;\n country: string | null;\n}\n\nexport interface ContactListParams {\n page?: number;\n limit?: number;\n email?: string;\n name?: string;\n job_title?: string;\n seniority_level?: string;\n company_name?: string;\n country?: string;\n list_id?: number;\n}\n\nexport interface ContactCreateParams {\n work_email: string;\n first_name?: string;\n last_name?: string;\n job_title?: string;\n company_domain?: string;\n linkedin_url?: string;\n direct_phone?: string;\n mobile_phone?: string;\n city?: string;\n state?: string;\n country?: string;\n list_id?: number;\n}\n\nexport interface ContactUpdateParams {\n first_name?: string;\n last_name?: string;\n work_email?: string;\n job_title?: string;\n company_domain?: string;\n linkedin_url?: string;\n direct_phone?: string;\n mobile_phone?: string;\n city?: string;\n state?: string;\n country?: string;\n}\n\n/** A column definition on contacts (base or custom). */\nexport interface ContactColumn {\n id: number | null;\n title: string;\n data_type: string;\n name: string | null;\n /** Stringified list_id when list-scoped, otherwise null/empty for global. */\n object_id: string | null;\n is_global: boolean;\n}\n\nexport interface ContactColumnCreateParams {\n title: string;\n /** Email of the user creating the column. Required by the backend (audit). */\n created_by: string;\n /** \"text\" (default) — additional types may be added later. */\n data_type?: string;\n /** If set, the column is list-specific. Omit for org-wide global column. */\n list_id?: number;\n}\n\n/**\n * Contacts API - full CRUD for CRM contacts. Requires API key (server-side).\n */\nexport const createContactsClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n const toQuery = (params: object) => {\n const qs = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v != null) qs.set(k, String(v));\n }\n const s = qs.toString();\n return s ? `?${s}` : \"\";\n };\n\n return {\n /** List contacts with optional filters. */\n async list(params: ContactListParams = {}): Promise<{ data: Contact[]; total: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts${toQuery(params)}`, { headers: headers() });\n return resp.json();\n },\n\n /** Get a single contact by ID. */\n async get(contactId: number): Promise<Contact> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts/${contactId}`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Create a new contact. */\n async create(contact: ContactCreateParams): Promise<Contact> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(contact),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Update a contact (partial). */\n async update(contactId: number, fields: ContactUpdateParams): Promise<{ updated: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts/${contactId}`, {\n method: \"PATCH\",\n headers: headers(),\n body: JSON.stringify(fields),\n });\n return resp.json();\n },\n\n /** Delete a contact (soft-delete). */\n async delete(contactId: number): Promise<{ deleted: boolean }> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts/${contactId}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n return resp.json();\n },\n\n /** List custom contact columns. Pass listId to include list-specific columns. */\n async listColumns(listId?: number): Promise<{ data: ContactColumn[] }> {\n const qs = listId != null ? `?list_id=${listId}` : \"\";\n const resp = await fetch(`${baseUrl}/api/v1/contacts/columns${qs}`, { headers: headers() });\n return resp.json();\n },\n\n /** Create a custom contact column. Global if list_id is omitted, list-scoped otherwise. */\n async createColumn(params: ContactColumnCreateParams): Promise<ContactColumn> {\n const body = {\n title: params.title,\n data_type: params.data_type || \"text\",\n list_id: params.list_id ?? null,\n created_by: params.created_by,\n };\n const resp = await fetch(`${baseUrl}/api/v1/contacts/columns/create`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(body),\n });\n const data = await resp.json();\n return data.data || data;\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface Company {\n id: number;\n name: string | null;\n domain: string | null;\n industry: string | null;\n employee_count: number | null;\n revenue: number | null;\n founded_year: number | null;\n description: string | null;\n linkedin_url: string | null;\n country: string | null;\n state: string | null;\n city: string | null;\n}\n\nexport interface CompanyListParams {\n page?: number;\n limit?: number;\n domain?: string;\n industry?: string;\n name?: string;\n country?: string;\n}\n\nexport interface CompanyUpdateParams {\n name?: string;\n domain?: string;\n industry?: string;\n description?: string;\n linkedin_url?: string;\n country?: string;\n state?: string;\n city?: string;\n}\n\nexport interface CompanyContact {\n id: number;\n first_name: string | null;\n last_name: string | null;\n work_email: string | null;\n job_title: string | null;\n}\n\n/** A column definition on companies (base or custom). */\nexport interface CompanyColumn {\n id: number | null;\n title: string;\n data_type: string;\n name: string | null;\n /** Stringified list_id when list-scoped, otherwise null/empty for global. */\n object_id: string | null;\n is_global: boolean;\n}\n\nexport interface CompanyColumnCreateParams {\n title: string;\n /** Email of the user creating the column. Required by the backend (audit). */\n created_by: string;\n /** \"text\" (default) — additional types may be added later. */\n data_type?: string;\n /** If set, the column is list-specific. Omit for org-wide global column. */\n list_id?: number;\n}\n\n/**\n * Companies API - search and manage CRM companies. Requires API key (server-side).\n */\nexport const createCompaniesClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n const toQuery = (params: object) => {\n const qs = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v != null) qs.set(k, String(v));\n }\n const s = qs.toString();\n return s ? `?${s}` : \"\";\n };\n\n return {\n /** List companies with optional filters. */\n async list(params: CompanyListParams = {}): Promise<{ data: Company[]; total: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/companies${toQuery(params)}`, { headers: headers() });\n return resp.json();\n },\n\n /** Get a single company by ID. */\n async get(companyId: number): Promise<Company> {\n const resp = await fetch(`${baseUrl}/api/v1/companies/${companyId}`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Get contacts belonging to a company. */\n async contacts(companyId: number, limit = 50, offset = 0): Promise<{ data: CompanyContact[]; total: number }> {\n const resp = await fetch(\n `${baseUrl}/api/v1/companies/${companyId}/contacts?limit=${limit}&offset=${offset}`,\n { headers: headers() },\n );\n return resp.json();\n },\n\n /** Update a company (partial). */\n async update(companyId: number, fields: CompanyUpdateParams): Promise<{ updated: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/companies/${companyId}`, {\n method: \"PATCH\",\n headers: headers(),\n body: JSON.stringify(fields),\n });\n return resp.json();\n },\n\n /** Delete a company (soft-delete). */\n async delete(companyId: number): Promise<{ deleted: boolean }> {\n const resp = await fetch(`${baseUrl}/api/v1/companies/${companyId}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n return resp.json();\n },\n\n /** List custom company columns. Pass listId to include list-specific columns. */\n async listColumns(listId?: number): Promise<{ data: CompanyColumn[] }> {\n const qs = listId != null ? `?list_id=${listId}` : \"\";\n const resp = await fetch(`${baseUrl}/api/v1/companies/columns${qs}`, { headers: headers() });\n return resp.json();\n },\n\n /** Create a custom company column. Global if list_id is omitted, list-scoped otherwise. */\n async createColumn(params: CompanyColumnCreateParams): Promise<CompanyColumn> {\n const body = {\n title: params.title,\n data_type: params.data_type || \"text\",\n list_id: params.list_id ?? null,\n created_by: params.created_by,\n };\n const resp = await fetch(`${baseUrl}/api/v1/companies/columns/create`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(body),\n });\n const data = await resp.json();\n return data.data || data;\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface ContactList {\n id: number;\n title: string;\n type: \"contacts\" | \"companies\";\n contact_count: number | null;\n created_at: string | null;\n}\n\nexport interface ListContact {\n id: number;\n first_name: string | null;\n last_name: string | null;\n work_email: string | null;\n job_title: string | null;\n company_name: string | null;\n}\n\n/**\n * Lists API - manage contact and company lists. Requires API key (server-side).\n */\nexport const createListsClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n return {\n /** List all lists. */\n async list(page = 1, limit = 50): Promise<{ data: ContactList[]; total: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/lists?page=${page}&limit=${limit}`, { headers: headers() });\n return resp.json();\n },\n\n /** Create a new list. */\n async create(title: string, type: \"contacts\" | \"companies\" = \"contacts\"): Promise<ContactList> {\n const resp = await fetch(`${baseUrl}/api/v1/lists`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ title, type }),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Delete a list (soft-delete). */\n async delete(listId: number): Promise<{ deleted: boolean }> {\n const resp = await fetch(`${baseUrl}/api/v1/lists/${listId}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n return resp.json();\n },\n\n /** Get contacts in a list. */\n async contacts(listId: number, page = 1, limit = 50): Promise<{ data: ListContact[]; total: number }> {\n const resp = await fetch(\n `${baseUrl}/api/v1/lists/${listId}/contacts?page=${page}&limit=${limit}`,\n { headers: headers() },\n );\n return resp.json();\n },\n\n /** Add contacts to a list. */\n async addContacts(listId: number, contactIds: number[]): Promise<{ added: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/lists/${listId}/contacts`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ contact_ids: contactIds }),\n });\n return resp.json();\n },\n\n /** Remove contacts from a list. */\n async removeContacts(listId: number, contactIds: number[]): Promise<{ removed: number }> {\n const resp = await fetch(`${baseUrl}/api/v1/lists/${listId}/contacts`, {\n method: \"DELETE\",\n headers: headers(),\n body: JSON.stringify({ contact_ids: contactIds }),\n });\n return resp.json();\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface Note {\n id: string;\n entity_type: string;\n entity_id: string;\n content: string;\n created_by: string | null;\n created_by_name: string | null;\n created_at: string | null;\n updated_at: string | null;\n}\n\n/**\n * Notes API - CRUD for notes attached to contacts. Requires API key (server-side).\n *\n * Backed by:\n * GET /api/v1/contacts/{contact_id}/notes\n * POST /api/v1/contacts/{contact_id}/notes\n * PATCH /api/v1/notes/{note_id}\n * DELETE /api/v1/notes/{note_id}\n */\nexport const createNotesClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n return {\n /** List all notes on a contact. */\n async list(contactId: number): Promise<{ data: Note[] }> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts/${contactId}/notes`, { headers: headers() });\n return resp.json();\n },\n\n /** Create a note on a contact. */\n async create(contactId: number, content: string): Promise<Note> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts/${contactId}/notes`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify({ content }),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Update a note's content. */\n async update(noteId: string, content: string): Promise<Note> {\n const resp = await fetch(`${baseUrl}/api/v1/notes/${noteId}`, {\n method: \"PATCH\",\n headers: headers(),\n body: JSON.stringify({ content }),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Delete a note. */\n async delete(noteId: string): Promise<{ data: { deleted: boolean } }> {\n const resp = await fetch(`${baseUrl}/api/v1/notes/${noteId}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n return resp.json();\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface Task {\n id: string;\n entity_type: string | null;\n entity_id: string | null;\n title: string;\n description: string | null;\n due_date: string | null;\n assignee_id: string | null;\n assignee_name: string | null;\n /** \"open\" | \"completed\" (other values may appear if the backend adds states later) */\n status: string | null;\n /** 0=none, 1=urgent, 2=high, 3=normal, 4=low */\n priority: number | null;\n task_type: string | null;\n created_by: string | null;\n created_at: string | null;\n updated_at: string | null;\n}\n\nexport interface TaskCreateParams {\n title: string;\n description?: string;\n /** ISO 8601 date string. */\n due_date?: string;\n assignee_id?: string;\n /** 0=none, 1=urgent, 2=high, 3=normal, 4=low */\n priority?: number;\n}\n\nexport interface TaskUpdateParams {\n title?: string;\n description?: string;\n due_date?: string;\n assignee_id?: string;\n /** \"open\" | \"completed\" */\n status?: string;\n priority?: number;\n}\n\nexport interface TaskListParams {\n /** \"open\" | \"completed\" */\n status?: string;\n /** 0-4 */\n priority?: number;\n assignee_id?: string;\n /** Substring search on title. */\n search?: string;\n}\n\n/**\n * Tasks API - CRUD for tasks attached to contacts. Requires API key (server-side).\n *\n * Backed by:\n * GET /api/v1/contacts/{contact_id}/tasks\n * GET /api/v1/tasks\n * POST /api/v1/contacts/{contact_id}/tasks\n * PATCH /api/v1/tasks/{task_id}\n * DELETE /api/v1/tasks/{task_id}\n */\nexport const createTasksClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n const toQuery = (params: object) => {\n const qs = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v != null) qs.set(k, String(v));\n }\n const s = qs.toString();\n return s ? `?${s}` : \"\";\n };\n\n return {\n /** List tasks on a single contact. Optional status filter (\"open\" | \"completed\"). */\n async listForContact(contactId: number, status?: string): Promise<{ data: Task[] }> {\n const qs = status ? `?status=${encodeURIComponent(status)}` : \"\";\n const resp = await fetch(`${baseUrl}/api/v1/contacts/${contactId}/tasks${qs}`, { headers: headers() });\n return resp.json();\n },\n\n /** List all tasks org-wide with optional filters. */\n async list(params: TaskListParams = {}): Promise<{ data: Task[] }> {\n const resp = await fetch(`${baseUrl}/api/v1/tasks${toQuery(params)}`, { headers: headers() });\n return resp.json();\n },\n\n /** Create a task on a contact. */\n async create(contactId: number, task: TaskCreateParams): Promise<Task> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts/${contactId}/tasks`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(task),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Update a task (partial). */\n async update(taskId: string, fields: TaskUpdateParams): Promise<Task> {\n const resp = await fetch(`${baseUrl}/api/v1/tasks/${taskId}`, {\n method: \"PATCH\",\n headers: headers(),\n body: JSON.stringify(fields),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Delete a task. */\n async delete(taskId: string): Promise<{ data: { deleted: boolean } }> {\n const resp = await fetch(`${baseUrl}/api/v1/tasks/${taskId}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n return resp.json();\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\n/** A field (column) definition on contacts or companies — base or custom. */\nexport interface Field {\n id: number | null;\n title: string;\n /** Internal column name (slug). */\n name: string | null;\n /** Currently only \"text\" is supported; other types may be added later. */\n data_type: string;\n /** True if available org-wide, false if list-specific. */\n is_global: boolean;\n}\n\n/** Created custom field (column). */\nexport interface CreatedField {\n id: number;\n title: string;\n data_type: string;\n name: string;\n list_id: number | null;\n is_global: boolean;\n}\n\nexport interface FieldCreateParams {\n title: string;\n /** \"contacts\" or \"companies\". Defaults to \"contacts\" on the backend. */\n entity?: \"contacts\" | \"companies\";\n /** \"text\" (default) — additional types may be added later. */\n data_type?: string;\n /** If set, the field is list-specific. Omit for org-wide global field. */\n list_id?: number;\n}\n\nexport interface FieldDeleteParams {\n entity?: \"contacts\" | \"companies\";\n /**\n * Optional list scope guard. If provided, the column must belong to this\n * list or the request returns 404. Use this to prevent accidentally\n * deleting a column on a different list in the same org.\n */\n list_id?: number;\n}\n\nexport interface SetFieldValueParams {\n /** Contact ID (entity='contacts') or company ID (entity='companies'). */\n record_id: number;\n /** Value to write. Pass null/undefined to clear the field. */\n value?: string | null;\n entity?: \"contacts\" | \"companies\";\n}\n\n/**\n * Fields API - manage custom fields (columns) on contacts and companies.\n * Requires API key (server-side).\n *\n * Backed by:\n * GET /api/v1/fields — list contact fields\n * GET /api/v1/fields/companies — list company fields\n * POST /api/v1/fields — create a custom field\n * DELETE /api/v1/fields/{column_id} — delete a custom field\n * PATCH /api/v1/fields/{column_id}/values — set value on a single record\n */\nexport const createFieldsClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n const toQuery = (params: object) => {\n const qs = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v != null) qs.set(k, String(v));\n }\n const s = qs.toString();\n return s ? `?${s}` : \"\";\n };\n\n return {\n /** List contact fields (base + custom). Pass listId to include list-specific custom fields. */\n async listContactFields(listId?: number): Promise<{ data: Field[] }> {\n const qs = listId != null ? `?list_id=${listId}` : \"\";\n const resp = await fetch(`${baseUrl}/api/v1/fields${qs}`, { headers: headers() });\n return resp.json();\n },\n\n /** List company fields (base + custom). Pass listId to include list-specific custom fields. */\n async listCompanyFields(listId?: number): Promise<{ data: Field[] }> {\n const qs = listId != null ? `?list_id=${listId}` : \"\";\n const resp = await fetch(`${baseUrl}/api/v1/fields/companies${qs}`, { headers: headers() });\n return resp.json();\n },\n\n /** Create a custom field on contacts (default) or companies. */\n async create(params: FieldCreateParams): Promise<CreatedField> {\n const body = {\n title: params.title,\n data_type: params.data_type || \"text\",\n list_id: params.list_id ?? null,\n entity: params.entity || \"contacts\",\n };\n const resp = await fetch(`${baseUrl}/api/v1/fields`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(body),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Delete a custom field (soft-delete). Pass list_id to scope-guard against cross-list deletion. */\n async delete(columnId: number, params: FieldDeleteParams = {}): Promise<{ data: { column_id: number; deleted: boolean } }> {\n const queryParams: Record<string, string | number> = { entity: params.entity || \"contacts\" };\n if (params.list_id != null) queryParams.list_id = params.list_id;\n const resp = await fetch(`${baseUrl}/api/v1/fields/${columnId}${toQuery(queryParams)}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n return resp.json();\n },\n\n /** Set a custom field value on a single contact or company row. Pass value=null to clear. */\n async setValue(\n columnId: number,\n params: SetFieldValueParams,\n ): Promise<{ data: { column_id: number; record_id: number; updated: boolean } }> {\n const body = {\n record_id: params.record_id,\n value: params.value ?? null,\n entity: params.entity || \"contacts\",\n };\n const resp = await fetch(`${baseUrl}/api/v1/fields/${columnId}/values`, {\n method: \"PATCH\",\n headers: headers(),\n body: JSON.stringify(body),\n });\n return resp.json();\n },\n };\n};\n","const DEFAULT_API = \"https://be.graph8.com\";\n\nexport interface Deal {\n id: string | null;\n name: string | null;\n description: string | null;\n amount: number | null;\n currency: string | null;\n stage_id: string | null;\n stage_name: string | null;\n pipeline_id: string | null;\n /** Linked company ID (mashup_company_id), if any. */\n company_id: number | string | null;\n owner_id: string | null;\n /** ISO 8601 date. */\n close_date: string | null;\n created_at: string | null;\n updated_at: string | null;\n}\n\nexport interface DealCreateParams {\n name: string;\n /** Linked company ID. */\n company_id?: number;\n description?: string;\n amount?: number;\n /** Default: \"USD\". */\n currency?: string;\n /** Stage ID from the org's pipelines. Defaults to first stage of default pipeline if omitted. */\n stage_id?: string;\n /** Pipeline ID. Defaults to org's default pipeline if omitted. */\n pipeline_id?: string;\n /** ISO 8601 close date. */\n close_date?: string;\n}\n\nexport interface DealUpdateParams {\n name?: string;\n description?: string;\n amount?: number;\n currency?: string;\n stage_id?: string;\n /** ISO 8601 close date. */\n close_date?: string;\n}\n\nexport interface DealListParams {\n page?: number;\n limit?: number;\n stage_id?: string;\n pipeline_id?: string;\n /** Substring search on deal name. */\n search?: string;\n}\n\nexport interface PipelineStage {\n id: string;\n name: string;\n probability: number | null;\n position: number | null;\n stage_type: string | null;\n color: string | null;\n required_elements: string[];\n recommended_elements: string[];\n channel_scripts: Record<string, string>;\n}\n\nexport interface Pipeline {\n id: string;\n name: string;\n is_default: boolean;\n stages: PipelineStage[];\n}\n\n/** Trimmed deal shape returned by /contacts/{id}/deals and /companies/{id}/deals. */\nexport interface ContactDeal {\n deal_id: string | null;\n name: string | null;\n stage: string | null;\n value: number | null;\n currency: string | null;\n role: string | null;\n pipeline_id: string | null;\n close_date: string | null;\n owner_id: string | null;\n created_at: string | null;\n}\n\nexport interface PaginationMeta {\n page: number;\n limit: number;\n total: number;\n has_next: boolean;\n}\n\n/**\n * Deals API - CRUD for deals + pipelines. Requires API key (server-side).\n *\n * Backed by:\n * GET /api/v1/deals/pipelines\n * GET /api/v1/deals\n * POST /api/v1/deals\n * GET /api/v1/deals/{deal_id}\n * PATCH /api/v1/deals/{deal_id}\n * DELETE /api/v1/deals/{deal_id}\n * GET /api/v1/contacts/{contact_id}/deals\n * GET /api/v1/companies/{company_id}/deals\n */\nexport const createDealsClient = (apiKey: string, apiUrl?: string) => {\n const baseUrl = apiUrl || DEFAULT_API;\n const headers = () => ({ \"Content-Type\": \"application/json\", Authorization: `Bearer ${apiKey}` });\n\n const toQuery = (params: object) => {\n const qs = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v != null) qs.set(k, String(v));\n }\n const s = qs.toString();\n return s ? `?${s}` : \"\";\n };\n\n return {\n /** List all deal pipelines and their stages. */\n async pipelines(): Promise<{ data: Pipeline[] }> {\n const resp = await fetch(`${baseUrl}/api/v1/deals/pipelines`, { headers: headers() });\n return resp.json();\n },\n\n /** List deals org-wide with optional filters and pagination. */\n async list(params: DealListParams = {}): Promise<{ data: Deal[]; pagination?: PaginationMeta }> {\n const resp = await fetch(`${baseUrl}/api/v1/deals${toQuery(params)}`, { headers: headers() });\n return resp.json();\n },\n\n /** Create a new deal. */\n async create(deal: DealCreateParams): Promise<Deal> {\n const resp = await fetch(`${baseUrl}/api/v1/deals`, {\n method: \"POST\",\n headers: headers(),\n body: JSON.stringify(deal),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Get a single deal by ID. */\n async get(dealId: string): Promise<Deal> {\n const resp = await fetch(`${baseUrl}/api/v1/deals/${dealId}`, { headers: headers() });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Update a deal (partial). */\n async update(dealId: string, fields: DealUpdateParams): Promise<Deal> {\n const resp = await fetch(`${baseUrl}/api/v1/deals/${dealId}`, {\n method: \"PATCH\",\n headers: headers(),\n body: JSON.stringify(fields),\n });\n const data = await resp.json();\n return data.data || data;\n },\n\n /** Delete a deal. */\n async delete(dealId: string): Promise<{ data: { deleted: boolean } }> {\n const resp = await fetch(`${baseUrl}/api/v1/deals/${dealId}`, {\n method: \"DELETE\",\n headers: headers(),\n });\n return resp.json();\n },\n\n /** Get all deals associated with a contact. */\n async forContact(contactId: number): Promise<{ data: ContactDeal[] }> {\n const resp = await fetch(`${baseUrl}/api/v1/contacts/${contactId}/deals`, { headers: headers() });\n return resp.json();\n },\n\n /** Get all deals associated with a company. */\n async forCompany(companyId: number): Promise<{ data: ContactDeal[] }> {\n const resp = await fetch(`${baseUrl}/api/v1/companies/${companyId}/deals`, { headers: headers() });\n return resp.json();\n },\n };\n};\n"],"mappings":"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","names":["DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","DEFAULT_API","module"]}