geodedo 0.1.1 → 0.1.2

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.cjs CHANGED
@@ -846,12 +846,11 @@ var Documents = class {
846
846
  * Upload a document.
847
847
  */
848
848
  async upload(params, options) {
849
- const raw = await this.client.post(
849
+ return this.client.post(
850
850
  "/api/v1/documents",
851
851
  params,
852
852
  options
853
853
  );
854
- return raw.document;
855
854
  }
856
855
  /**
857
856
  * List all documents. Paginated.
@@ -887,19 +886,19 @@ var Recommendations = class {
887
886
  * Get an ICP analysis recommendation.
888
887
  */
889
888
  async icpAnalysis(options) {
890
- return this.client.get("/api/v1/recommendations/icp", options);
889
+ return this.client.post("/api/v1/recommendations/icp-analysis", void 0, options);
891
890
  }
892
891
  /**
893
892
  * Get a channel recommendation.
894
893
  */
895
894
  async channel(options) {
896
- return this.client.get("/api/v1/recommendations/channel", options);
895
+ return this.client.post("/api/v1/recommendations/channel", void 0, options);
897
896
  }
898
897
  /**
899
898
  * Get a sequence strategy recommendation.
900
899
  */
901
900
  async sequenceStrategy(options) {
902
- return this.client.get("/api/v1/recommendations/sequence-strategy", options);
901
+ return this.client.post("/api/v1/recommendations/sequence-strategy", void 0, options);
903
902
  }
904
903
  };
905
904
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/core/errors.ts","../src/core/api-client.ts","../src/core/pagination.ts","../src/resources/contacts.ts","../src/resources/sequences.ts","../src/resources/drafts.ts","../src/resources/messages.ts","../src/resources/chat.ts","../src/resources/channels.ts","../src/resources/documents.ts","../src/resources/recommendations.ts","../src/resources/billing.ts","../src/resources/users.ts","../src/client.ts"],"sourcesContent":["// ── Main client ───────────────────────────────────────────────────────\nexport { GeoDedo } from './client.js';\n\n// ── Core ──────────────────────────────────────────────────────────────\nexport { APIClient } from './core/api-client.js';\nexport type { APIClientOptions } from './core/api-client.js';\nexport { Page } from './core/pagination.js';\nexport type { PageRequestOptions } from './core/pagination.js';\n\n// ── Errors ────────────────────────────────────────────────────────────\nexport {\n GeoDedoError,\n APIError,\n AuthenticationError,\n InsufficientCreditsError,\n PermissionDeniedError,\n NotFoundError,\n ValidationError,\n RateLimitError,\n InternalServerError,\n APIConnectionError,\n APITimeoutError,\n} from './core/errors.js';\n\n// ── Shared types ──────────────────────────────────────────────────────\nexport type {\n RequestOptions,\n ClientOptions,\n PaginationParams,\n PageResponse,\n} from './types/shared.js';\n\n// ── Resource types ────────────────────────────────────────────────────\nexport type {\n ContactSearchParams,\n ContactEnrichParams,\n ContactImportEntry,\n ContactImportParams,\n Contact,\n StoredContact,\n ImportResult,\n CsvList,\n} from './types/contacts.js';\n\nexport type {\n SequenceCreateParams,\n Sequence,\n SequenceStats,\n SequenceWithStats,\n} from './types/sequences.js';\n\nexport type {\n DraftContact,\n DraftGenerateParams,\n DraftListParams,\n DraftUpdateParams,\n DraftApproveParams,\n DraftSendParams,\n Draft,\n DraftBatchResult,\n DraftApproveResult,\n DraftSendError,\n DraftSendResult,\n} from './types/drafts.js';\n\nexport type {\n EmailSendParams,\n LinkedInSendParams,\n InstagramSendParams,\n SmsSendParams,\n EmailResult,\n LinkedInResult,\n InstagramResult,\n SmsResult,\n InboxChannel,\n} from './types/messages.js';\n\nexport type {\n ChatCreateParams,\n ChatResponse,\n Conversation,\n ConversationMessage,\n} from './types/chat.js';\n\nexport type {\n ChannelName,\n ChannelStatus,\n GmailConnectResult,\n LinkedInConnectParams,\n InstagramConnectParams,\n CheckpointParams,\n ConnectionResult,\n AgentMailCreateParams,\n AgentMailCreateResult,\n SmsVerifyParams,\n SmsConfirmParams,\n SmsVerifyResult,\n} from './types/channels.js';\n\nexport type {\n DocumentUploadParams,\n Document,\n} from './types/documents.js';\n\nexport type {\n ICPAnalysis,\n ChannelRecommendation,\n SequenceStrategy,\n} from './types/recommendations.js';\n\nexport type {\n CreditBalance,\n UsageEntry,\n UsageSummary,\n UsageSummaryEntry,\n UsageListParams,\n} from './types/billing.js';\n\nexport type {\n UserRegisterParams,\n UserUpdateParams,\n User,\n} from './types/users.js';\n\n// ── Resource classes (for advanced usage / type narrowing) ────────────\nexport { Contacts } from './resources/contacts.js';\nexport { Sequences } from './resources/sequences.js';\nexport { Drafts } from './resources/drafts.js';\nexport { Messages } from './resources/messages.js';\nexport { Chat, ConversationsResource } from './resources/chat.js';\nexport {\n Channels,\n GmailChannel,\n LinkedInChannel,\n InstagramChannel,\n AgentMailChannel,\n SmsChannel,\n} from './resources/channels.js';\nexport { Documents } from './resources/documents.js';\nexport { Recommendations } from './resources/recommendations.js';\nexport { Billing } from './resources/billing.js';\nexport { Users } from './resources/users.js';\n","/**\n * Base error class for all GeoDedo SDK errors.\n */\nexport class GeoDedoError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GeoDedoError';\n // Restore prototype chain (required when extending builtins in TS)\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error returned when the API responds with a non-2xx status code.\n */\nexport class APIError extends GeoDedoError {\n /** HTTP status code. */\n readonly status: number;\n /** Machine-readable error code from the response body, if present. */\n readonly code: string | undefined;\n /** Request ID from the X-Request-Id response header, if present. */\n readonly requestId: string | undefined;\n /** Raw response body. */\n readonly body: unknown;\n\n constructor(\n status: number,\n body: unknown,\n message: string,\n code?: string,\n requestId?: string,\n ) {\n super(message);\n this.name = 'APIError';\n this.status = status;\n this.code = code;\n this.requestId = requestId;\n this.body = body;\n }\n\n /**\n * Factory that maps an HTTP status code to the appropriate error subclass.\n */\n static fromResponse(\n status: number,\n body: unknown,\n headers?: Headers | Record<string, string>,\n ): APIError {\n const parsed = typeof body === 'object' && body !== null ? (body as Record<string, unknown>) : {};\n const message = typeof parsed.error === 'string' ? parsed.error : `Request failed with status ${status}`;\n const code = typeof parsed.code === 'string' ? parsed.code : undefined;\n\n // Extract request ID from headers\n let requestId: string | undefined;\n if (headers) {\n if (typeof (headers as Headers).get === 'function') {\n requestId = (headers as Headers).get('x-request-id') ?? undefined;\n } else {\n requestId = (headers as Record<string, string>)['x-request-id'];\n }\n }\n\n switch (status) {\n case 401:\n return new AuthenticationError(body, message, code, requestId);\n case 402:\n return new InsufficientCreditsError(\n body,\n message,\n code,\n requestId,\n typeof parsed.credits_needed === 'number' ? parsed.credits_needed : undefined,\n typeof parsed.credits_remaining === 'number' ? parsed.credits_remaining : undefined,\n );\n case 403:\n return new PermissionDeniedError(body, message, code, requestId);\n case 404:\n return new NotFoundError(body, message, code, requestId);\n case 422:\n return new ValidationError(body, message, code, requestId);\n case 429: {\n let retryAfter: number | undefined;\n if (headers) {\n const raw = typeof (headers as Headers).get === 'function'\n ? (headers as Headers).get('retry-after')\n : (headers as Record<string, string>)['retry-after'];\n if (raw) {\n const parsed = Number(raw);\n if (!Number.isNaN(parsed)) retryAfter = parsed;\n }\n }\n return new RateLimitError(body, message, code, requestId, retryAfter);\n }\n default:\n if (status >= 500) {\n return new InternalServerError(status, body, message, code, requestId);\n }\n return new APIError(status, body, message, code, requestId);\n }\n }\n}\n\n/**\n * 401 — Invalid or missing API key.\n */\nexport class AuthenticationError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(401, body, message, code, requestId);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * 402 — Not enough credits to complete the request.\n */\nexport class InsufficientCreditsError extends APIError {\n /** Number of credits required for the operation. */\n readonly creditsRequired: number | undefined;\n /** Current credit balance. */\n readonly creditsRemaining: number | undefined;\n\n constructor(\n body: unknown,\n message: string,\n code?: string,\n requestId?: string,\n creditsRequired?: number,\n creditsRemaining?: number,\n ) {\n super(402, body, message, code, requestId);\n this.name = 'InsufficientCreditsError';\n this.creditsRequired = creditsRequired;\n this.creditsRemaining = creditsRemaining;\n }\n}\n\n/**\n * 403 — Authenticated but not authorized for this operation.\n */\nexport class PermissionDeniedError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(403, body, message, code, requestId);\n this.name = 'PermissionDeniedError';\n }\n}\n\n/**\n * 404 — The requested resource was not found.\n */\nexport class NotFoundError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(404, body, message, code, requestId);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * 422 — Validation error in the request body or parameters.\n */\nexport class ValidationError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(422, body, message, code, requestId);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * 429 — Rate limit exceeded.\n */\nexport class RateLimitError extends APIError {\n /** Seconds to wait before retrying, from the Retry-After header. */\n readonly retryAfter: number | undefined;\n\n constructor(\n body: unknown,\n message: string,\n code?: string,\n requestId?: string,\n retryAfter?: number,\n ) {\n super(429, body, message, code, requestId);\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * 5xx — Internal server error.\n */\nexport class InternalServerError extends APIError {\n constructor(status: number, body: unknown, message: string, code?: string, requestId?: string) {\n super(status, body, message, code, requestId);\n this.name = 'InternalServerError';\n }\n}\n\n/**\n * Network-level failure (DNS, socket, TLS, etc.).\n */\nexport class APIConnectionError extends GeoDedoError {\n /** The underlying error that caused the connection failure. */\n readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'APIConnectionError';\n this.cause = cause;\n }\n}\n\n/**\n * Request timed out before receiving a response.\n */\nexport class APITimeoutError extends APIConnectionError {\n constructor(message: string = 'Request timed out') {\n super(message);\n this.name = 'APITimeoutError';\n }\n}\n","import type { RequestOptions } from '../types/shared.js';\nimport {\n APIError,\n APIConnectionError,\n APITimeoutError,\n} from './errors.js';\n\nconst VERSION = '0.1.0';\nconst DEFAULT_BASE_URL = 'https://geodedo-api.vercel.app';\nconst DEFAULT_TIMEOUT = 60_000; // 60 seconds\nconst DEFAULT_MAX_RETRIES = 2;\nconst MIN_RETRY_DELAY = 500; // 0.5s\nconst MAX_RETRY_DELAY = 5_000; // 5s\n\n/** HTTP methods supported by the client. */\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\n/** Status codes that are eligible for retry. */\nconst RETRYABLE_STATUS_CODES = new Set([429, 409, 500, 502, 503, 504]);\n\nexport interface APIClientOptions {\n apiKey: string;\n userId?: string;\n baseURL?: string;\n maxRetries?: number;\n timeout?: number;\n}\n\n/**\n * Low-level HTTP client that handles auth, retries, timeouts, and error mapping.\n * Uses the built-in `fetch` API (available in Node 18+).\n */\nexport class APIClient {\n readonly apiKey: string;\n readonly userId: string | undefined;\n readonly baseURL: string;\n readonly maxRetries: number;\n readonly timeout: number;\n\n constructor(options: APIClientOptions) {\n this.apiKey = options.apiKey;\n this.userId = options.userId;\n this.baseURL = (options.baseURL ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n /**\n * Core request method. All convenience methods delegate here.\n */\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const url = `${this.baseURL}${path}`;\n\n const apiKey = options?.apiKey ?? this.apiKey;\n const userId = options?.userId ?? this.userId;\n const timeout = options?.timeout ?? this.timeout;\n\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `geodedo-node/${VERSION}`,\n ...options?.headers,\n };\n\n if (userId) {\n headers['X-User-Id'] = userId;\n }\n\n const maxRetries = this.maxRetries;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n // Create a fresh AbortController per attempt for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n // If the caller provided a signal, forward its abort\n const externalSignal = options?.signal;\n let onExternalAbort: (() => void) | undefined;\n if (externalSignal) {\n if (externalSignal.aborted) {\n clearTimeout(timeoutId);\n throw new APITimeoutError('Request aborted');\n }\n onExternalAbort = () => controller.abort();\n externalSignal.addEventListener('abort', onExternalAbort, { once: true });\n }\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers,\n signal: controller.signal,\n };\n\n if (body !== undefined && method !== 'GET') {\n fetchOptions.body = JSON.stringify(body);\n }\n\n let response: Response;\n try {\n response = await fetch(url, fetchOptions);\n } catch (err: unknown) {\n // Distinguish timeout from other network errors\n if (controller.signal.aborted) {\n throw new APITimeoutError();\n }\n throw new APIConnectionError(\n `Connection error: ${err instanceof Error ? err.message : String(err)}`,\n err,\n );\n } finally {\n clearTimeout(timeoutId);\n if (externalSignal && onExternalAbort) {\n externalSignal.removeEventListener('abort', onExternalAbort);\n }\n }\n\n // Success: parse response\n if (response.ok) {\n // 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n return (await response.json()) as T;\n }\n\n // Parse error body\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n errorBody = { error: response.statusText };\n }\n\n const apiError = APIError.fromResponse(response.status, errorBody, response.headers);\n\n // Retry on retryable status codes (but not on last attempt)\n if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < maxRetries) {\n lastError = apiError;\n await this.sleep(this.retryDelay(attempt));\n continue;\n }\n\n throw apiError;\n } catch (err) {\n // If it's a connection/timeout error and we have retries left, retry\n if (\n (err instanceof APIConnectionError || err instanceof APITimeoutError) &&\n attempt < maxRetries\n ) {\n lastError = err;\n await this.sleep(this.retryDelay(attempt));\n continue;\n }\n\n // If it's already one of our error types, just throw it\n if (err instanceof APIError || err instanceof APIConnectionError) {\n throw err;\n }\n\n // Unexpected error — wrap it\n throw new APIConnectionError(\n `Unexpected error: ${err instanceof Error ? err.message : String(err)}`,\n err,\n );\n }\n }\n\n // Should not reach here, but if we do, throw the last error\n throw lastError;\n }\n\n /** Calculate retry delay with exponential backoff and jitter. */\n private retryDelay(attempt: number): number {\n // Exponential backoff: 0.5s, 1s, 2s, 4s, ...\n const base = MIN_RETRY_DELAY * Math.pow(2, attempt);\n const capped = Math.min(base, MAX_RETRY_DELAY);\n // Add jitter: random value between 0 and capped\n const jitter = Math.random() * capped;\n return Math.min(capped + jitter, MAX_RETRY_DELAY);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n // ── Convenience methods ─────────────────────────────────────────────\n\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, undefined, options);\n }\n\n async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, body, options);\n }\n\n async put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, body, options);\n }\n\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, undefined, options);\n }\n}\n","import type { APIClient } from './api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\n\n/**\n * Options needed to fetch the next page of a paginated result.\n */\nexport interface PageRequestOptions {\n /** The API client to use for fetching. */\n client: APIClient;\n /** HTTP method (GET or POST). */\n method: 'GET' | 'POST';\n /** API path. */\n path: string;\n /** Request body (for POST-based pagination like contact search). */\n body?: Record<string, unknown>;\n /** Query parameters appended to the URL. */\n query?: Record<string, string | number>;\n /** The key in the response that contains the array of items. */\n responseKey: string;\n /** Per-request options (auth overrides, etc.). */\n options?: RequestOptions;\n}\n\n/**\n * A single page of results from a paginated API endpoint.\n *\n * Supports:\n * - `data` / `total` / `page` accessors\n * - `hasNextPage()` / `getNextPage()` for manual iteration\n * - `Symbol.asyncIterator` for `for await...of` across all pages\n */\nexport class Page<T> {\n /** The items on this page. */\n readonly data: T[];\n /** Total number of items across all pages. */\n readonly total: number;\n /** Current page number (1-indexed). */\n readonly page: number;\n /** Number of items per page (inferred from the current page size). */\n readonly perPage: number;\n\n private readonly _requestOptions: PageRequestOptions;\n\n constructor(\n data: T[],\n total: number,\n page: number,\n perPage: number,\n requestOptions: PageRequestOptions,\n ) {\n this.data = data;\n this.total = total;\n this.page = page;\n this.perPage = perPage;\n this._requestOptions = requestOptions;\n }\n\n /**\n * Whether there is a next page available.\n */\n hasNextPage(): boolean {\n return this.page * this.perPage < this.total;\n }\n\n /**\n * Fetch the next page. Throws if there is no next page.\n */\n async getNextPage(): Promise<Page<T>> {\n if (!this.hasNextPage()) {\n throw new Error('No more pages available');\n }\n return fetchPage<T>({\n ...this._requestOptions,\n query: {\n ...this._requestOptions.query,\n page: this.page + 1,\n },\n body: this._requestOptions.body\n ? { ...this._requestOptions.body, page: this.page + 1 }\n : undefined,\n });\n }\n\n /**\n * Async iterator that yields every item across all pages,\n * automatically fetching subsequent pages as needed.\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page: Page<T> = this;\n while (true) {\n for (const item of page.data) {\n yield item;\n }\n if (!page.hasNextPage()) break;\n page = await page.getNextPage();\n }\n }\n}\n\n/**\n * Fetch a single page from the API and return a `Page<T>`.\n */\nexport async function fetchPage<T>(\n opts: PageRequestOptions,\n): Promise<Page<T>> {\n const { client, method, path, body, query, responseKey, options } = opts;\n\n // Build the path with query params\n let fullPath = path;\n if (query && Object.keys(query).length > 0) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n fullPath += (fullPath.includes('?') ? '&' : '?') + qs;\n }\n }\n\n let raw: Record<string, unknown>;\n if (method === 'POST') {\n raw = await client.post<Record<string, unknown>>(fullPath, body, options);\n } else {\n raw = await client.get<Record<string, unknown>>(fullPath, options);\n }\n\n const data = (raw[responseKey] as T[]) ?? [];\n const total = (typeof raw.total === 'number' ? raw.total : data.length);\n const page = (typeof raw.page === 'number' ? raw.page : 1);\n // perPage: use pageSize if provided, otherwise infer from result length or default to 25\n const perPage = (typeof raw.pageSize === 'number'\n ? raw.pageSize\n : typeof raw.perPage === 'number'\n ? raw.perPage\n : data.length > 0\n ? data.length\n : 25);\n\n return new Page<T>(data, total, page, perPage, opts);\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ContactSearchParams,\n ContactEnrichParams,\n ContactImportParams,\n Contact,\n StoredContact,\n ImportResult,\n CsvList,\n} from '../types/contacts.js';\n\n/**\n * Resource for contact search, enrichment, import, and listing.\n */\nexport class Contacts {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Search for contacts matching the given ICP criteria.\n * Returns a paginated list of enriched contacts.\n */\n async search(\n params: ContactSearchParams,\n options?: RequestOptions,\n ): Promise<Page<Contact>> {\n const { page, perPage, ...body } = params;\n return fetchPage<Contact>({\n client: this.client,\n method: 'POST',\n path: '/api/v1/contacts/search',\n body: { ...body, page: page ?? 1, perPage: perPage ?? 25 },\n responseKey: 'contacts',\n options,\n });\n }\n\n /**\n * Enrich a single contact by email, LinkedIn URL, or name+company.\n */\n async enrich(\n params: ContactEnrichParams,\n options?: RequestOptions,\n ): Promise<Contact> {\n const raw = await this.client.post<{ contact: Contact }>(\n '/api/v1/contacts/enrich',\n params,\n options,\n );\n return raw.contact;\n }\n\n /**\n * Import a batch of contacts (CSV-like).\n */\n async importCsv(\n params: ContactImportParams,\n options?: RequestOptions,\n ): Promise<ImportResult> {\n return this.client.post<ImportResult>('/api/v1/contacts/import', params, options);\n }\n\n /**\n * List stored contacts for the current user. Paginated.\n */\n async list(\n params?: { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<StoredContact>> {\n const query: Record<string, string | number> = {};\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<StoredContact>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/contacts',\n query,\n responseKey: 'contacts',\n options,\n });\n }\n\n /**\n * List all CSV lists (imports) for the current user.\n */\n async csvLists(options?: RequestOptions): Promise<CsvList[]> {\n const raw = await this.client.get<{ lists: CsvList[] }>(\n '/api/v1/contacts/csv-lists',\n options,\n );\n return raw.lists;\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n SequenceCreateParams,\n Sequence,\n SequenceWithStats,\n} from '../types/sequences.js';\n\n/**\n * Resource for managing outreach sequences.\n */\nexport class Sequences {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Create a new outreach sequence.\n */\n async create(\n params: SequenceCreateParams,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n '/api/v1/sequences',\n params,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * List all sequences for the current user. Paginated.\n */\n async list(\n params?: { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<SequenceWithStats>> {\n const query: Record<string, string | number> = {};\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<SequenceWithStats>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/sequences',\n query,\n responseKey: 'sequences',\n options,\n });\n }\n\n /**\n * Get a single sequence by ID.\n */\n async get(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<SequenceWithStats> {\n const raw = await this.client.get<{ sequence: SequenceWithStats }>(\n `/api/v1/sequences/${sequenceId}`,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Pause a running sequence.\n */\n async pause(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n `/api/v1/sequences/${sequenceId}/pause`,\n undefined,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Resume a paused sequence.\n */\n async resume(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n `/api/v1/sequences/${sequenceId}/resume`,\n undefined,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Stop (terminate) a sequence.\n */\n async stop(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n `/api/v1/sequences/${sequenceId}/stop`,\n undefined,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Get the current status of a sequence.\n */\n async status(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<SequenceWithStats> {\n const raw = await this.client.get<{ sequence: SequenceWithStats }>(\n `/api/v1/sequences/${sequenceId}/status`,\n options,\n );\n return raw.sequence;\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n DraftGenerateParams,\n DraftListParams,\n DraftUpdateParams,\n DraftApproveParams,\n DraftSendParams,\n Draft,\n DraftBatchResult,\n DraftApproveResult,\n DraftSendResult,\n} from '../types/drafts.js';\n\n/**\n * Resource for generating, reviewing, approving, and sending outreach drafts.\n */\nexport class Drafts {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Generate outreach drafts for a list of contacts.\n */\n async generate(\n params: DraftGenerateParams,\n options?: RequestOptions,\n ): Promise<DraftBatchResult> {\n return this.client.post<DraftBatchResult>('/api/v1/drafts/generate', params, options);\n }\n\n /**\n * List drafts, optionally filtered by conversation, batch, or status. Paginated.\n */\n async list(\n params?: DraftListParams & { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<Draft>> {\n const query: Record<string, string | number> = {};\n if (params?.conversationId) query.conversationId = params.conversationId;\n if (params?.batchId) query.batchId = params.batchId;\n if (params?.status) query.status = params.status;\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<Draft>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/drafts',\n query,\n responseKey: 'drafts',\n options,\n });\n }\n\n /**\n * Update a specific draft's subject and/or body.\n */\n async update(\n draftId: string,\n params: DraftUpdateParams,\n options?: RequestOptions,\n ): Promise<Draft> {\n const raw = await this.client.put<{ draft: Draft }>(\n `/api/v1/drafts/${draftId}`,\n params,\n options,\n );\n return raw.draft;\n }\n\n /**\n * Approve drafts by their IDs.\n */\n async approve(\n params: DraftApproveParams,\n options?: RequestOptions,\n ): Promise<DraftApproveResult> {\n return this.client.post<DraftApproveResult>('/api/v1/drafts/approve', params, options);\n }\n\n /**\n * Send approved drafts.\n */\n async send(\n params: DraftSendParams,\n options?: RequestOptions,\n ): Promise<DraftSendResult> {\n return this.client.post<DraftSendResult>('/api/v1/drafts/send', params, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n EmailSendParams,\n LinkedInSendParams,\n InstagramSendParams,\n SmsSendParams,\n EmailResult,\n LinkedInResult,\n InstagramResult,\n SmsResult,\n InboxChannel,\n} from '../types/messages.js';\n\n/**\n * Resource for sending messages across channels and accessing the unified inbox.\n */\nexport class Messages {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Send an email via Gmail or AgentMail.\n */\n async sendEmail(\n params: EmailSendParams,\n options?: RequestOptions,\n ): Promise<EmailResult> {\n return this.client.post<EmailResult>('/api/v1/messages/email', params, options);\n }\n\n /**\n * Send a LinkedIn message or connection request.\n */\n async sendLinkedIn(\n params: LinkedInSendParams,\n options?: RequestOptions,\n ): Promise<LinkedInResult> {\n return this.client.post<LinkedInResult>('/api/v1/messages/linkedin', params, options);\n }\n\n /**\n * Send an Instagram DM.\n */\n async sendInstagram(\n params: InstagramSendParams,\n options?: RequestOptions,\n ): Promise<InstagramResult> {\n return this.client.post<InstagramResult>('/api/v1/messages/instagram', params, options);\n }\n\n /**\n * Send an SMS message.\n */\n async sendSms(\n params: SmsSendParams,\n options?: RequestOptions,\n ): Promise<SmsResult> {\n return this.client.post<SmsResult>('/api/v1/messages/sms', params, options);\n }\n\n /**\n * Get the unified inbox for a specific channel.\n */\n async inbox(\n channel: InboxChannel,\n options?: RequestOptions,\n ): Promise<Record<string, unknown>> {\n return this.client.get<Record<string, unknown>>(\n `/api/v1/messages/inbox/${channel}`,\n options,\n );\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ChatCreateParams,\n ChatResponse,\n Conversation,\n ConversationMessage,\n} from '../types/chat.js';\n\n/**\n * Sub-resource for conversation management.\n */\nexport class ConversationsResource {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * List all conversations.\n */\n async list(options?: RequestOptions): Promise<Conversation[]> {\n const raw = await this.client.get<{ conversations: Conversation[] }>(\n '/api/v1/chat/conversations',\n options,\n );\n return raw.conversations;\n }\n\n /**\n * Get messages for a specific conversation.\n */\n async get(\n conversationId: string,\n options?: RequestOptions,\n ): Promise<ConversationMessage[]> {\n const raw = await this.client.get<{ messages: ConversationMessage[] }>(\n `/api/v1/chat/conversations/${conversationId}`,\n options,\n );\n return raw.messages;\n }\n\n /**\n * Delete a conversation.\n */\n async delete(\n conversationId: string,\n options?: RequestOptions,\n ): Promise<void> {\n await this.client.delete(\n `/api/v1/chat/conversations/${conversationId}`,\n options,\n );\n }\n}\n\n/**\n * Resource for the AI chat assistant and conversation management.\n */\nexport class Chat {\n private readonly client: APIClient;\n\n /** Sub-resource for managing conversations. */\n readonly conversations: ConversationsResource;\n\n constructor(client: APIClient) {\n this.client = client;\n this.conversations = new ConversationsResource(client);\n }\n\n /**\n * Send a message to the AI assistant.\n */\n async create(\n params: ChatCreateParams,\n options?: RequestOptions,\n ): Promise<ChatResponse> {\n return this.client.post<ChatResponse>('/api/v1/chat', params, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ChannelName,\n ChannelStatus,\n GmailConnectResult,\n LinkedInConnectParams,\n InstagramConnectParams,\n CheckpointParams,\n ConnectionResult,\n AgentMailCreateParams,\n AgentMailCreateResult,\n SmsVerifyParams,\n SmsConfirmParams,\n SmsVerifyResult,\n} from '../types/channels.js';\n\n/**\n * Sub-resource for Gmail channel operations.\n */\nexport class GmailChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Initiate Gmail OAuth flow. Returns an authUrl for the user to visit.\n */\n async connect(options?: RequestOptions): Promise<GmailConnectResult> {\n return this.client.post<GmailConnectResult>('/api/v1/channels/gmail/connect', undefined, options);\n }\n}\n\n/**\n * Sub-resource for LinkedIn channel operations.\n */\nexport class LinkedInChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Connect a LinkedIn account with credentials.\n */\n async connect(\n params: LinkedInConnectParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/linkedin/connect', params, options);\n }\n\n /**\n * Resolve a LinkedIn 2FA checkpoint.\n */\n async checkpoint(\n params: CheckpointParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/linkedin/checkpoint', params, options);\n }\n}\n\n/**\n * Sub-resource for Instagram channel operations.\n */\nexport class InstagramChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Connect an Instagram account with credentials.\n */\n async connect(\n params: InstagramConnectParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/instagram/connect', params, options);\n }\n\n /**\n * Resolve an Instagram 2FA checkpoint.\n */\n async checkpoint(\n params: CheckpointParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/instagram/checkpoint', params, options);\n }\n}\n\n/**\n * Sub-resource for AgentMail channel operations.\n */\nexport class AgentMailChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Create a new AgentMail address.\n */\n async create(\n params: AgentMailCreateParams,\n options?: RequestOptions,\n ): Promise<AgentMailCreateResult> {\n return this.client.post<AgentMailCreateResult>('/api/v1/channels/agentmail/create', params, options);\n }\n}\n\n/**\n * Sub-resource for SMS channel operations.\n */\nexport class SmsChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Initiate SMS verification for a phone number.\n */\n async verify(\n params: SmsVerifyParams,\n options?: RequestOptions,\n ): Promise<SmsVerifyResult> {\n return this.client.post<SmsVerifyResult>('/api/v1/channels/sms/verify', params, options);\n }\n\n /**\n * Confirm SMS verification with the code.\n */\n async confirm(\n params: SmsConfirmParams,\n options?: RequestOptions,\n ): Promise<SmsVerifyResult> {\n return this.client.post<SmsVerifyResult>('/api/v1/channels/sms/confirm', params, options);\n }\n}\n\n/**\n * Resource for managing channel connections (Gmail, LinkedIn, Instagram, AgentMail, SMS).\n */\nexport class Channels {\n private readonly client: APIClient;\n\n /** Gmail channel operations. */\n readonly gmail: GmailChannel;\n /** LinkedIn channel operations. */\n readonly linkedin: LinkedInChannel;\n /** Instagram channel operations. */\n readonly instagram: InstagramChannel;\n /** AgentMail channel operations. */\n readonly agentmail: AgentMailChannel;\n /** SMS channel operations. */\n readonly sms: SmsChannel;\n\n constructor(client: APIClient) {\n this.client = client;\n this.gmail = new GmailChannel(client);\n this.linkedin = new LinkedInChannel(client);\n this.instagram = new InstagramChannel(client);\n this.agentmail = new AgentMailChannel(client);\n this.sms = new SmsChannel(client);\n }\n\n /**\n * Get the connection status of all channels.\n */\n async status(options?: RequestOptions): Promise<ChannelStatus> {\n return this.client.get<ChannelStatus>('/api/v1/channels/status', options);\n }\n\n /**\n * Disconnect a specific channel.\n */\n async disconnect(\n channel: ChannelName,\n options?: RequestOptions,\n ): Promise<void> {\n await this.client.post(`/api/v1/channels/${channel}/disconnect`, undefined, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type { DocumentUploadParams, Document } from '../types/documents.js';\n\n/**\n * Resource for uploading, listing, and deleting documents.\n */\nexport class Documents {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Upload a document.\n */\n async upload(\n params: DocumentUploadParams,\n options?: RequestOptions,\n ): Promise<Document> {\n const raw = await this.client.post<{ document: Document }>(\n '/api/v1/documents',\n params,\n options,\n );\n return raw.document;\n }\n\n /**\n * List all documents. Paginated.\n */\n async list(\n params?: { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<Document>> {\n const query: Record<string, string | number> = {};\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<Document>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/documents',\n query,\n responseKey: 'documents',\n options,\n });\n }\n\n /**\n * Delete a document by ID.\n */\n async delete(\n documentId: string,\n options?: RequestOptions,\n ): Promise<void> {\n await this.client.delete(`/api/v1/documents/${documentId}`, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ICPAnalysis,\n ChannelRecommendation,\n SequenceStrategy,\n} from '../types/recommendations.js';\n\n/**\n * Resource for AI-powered recommendations (ICP analysis, channel selection, sequence strategy).\n */\nexport class Recommendations {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Get an ICP analysis recommendation.\n */\n async icpAnalysis(options?: RequestOptions): Promise<ICPAnalysis> {\n return this.client.get<ICPAnalysis>('/api/v1/recommendations/icp', options);\n }\n\n /**\n * Get a channel recommendation.\n */\n async channel(options?: RequestOptions): Promise<ChannelRecommendation> {\n return this.client.get<ChannelRecommendation>('/api/v1/recommendations/channel', options);\n }\n\n /**\n * Get a sequence strategy recommendation.\n */\n async sequenceStrategy(options?: RequestOptions): Promise<SequenceStrategy> {\n return this.client.get<SequenceStrategy>('/api/v1/recommendations/sequence-strategy', options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n CreditBalance,\n UsageEntry,\n UsageSummary,\n UsageListParams,\n} from '../types/billing.js';\n\n/**\n * Resource for credit balance and usage tracking.\n */\nexport class Billing {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Get the current credit balance.\n */\n async balance(options?: RequestOptions): Promise<CreditBalance> {\n return this.client.get<CreditBalance>('/api/v1/billing/balance', options);\n }\n\n /**\n * List usage entries. Paginated.\n */\n async usage(\n params?: UsageListParams,\n options?: RequestOptions,\n ): Promise<Page<UsageEntry>> {\n const query: Record<string, string | number> = {};\n if (params?.from) query.from = params.from;\n if (params?.to) query.to = params.to;\n if (params?.page) query.page = params.page;\n\n return fetchPage<UsageEntry>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/billing/usage',\n query,\n responseKey: 'usage',\n options,\n });\n }\n\n /**\n * Get an aggregated usage summary.\n */\n async usageSummary(options?: RequestOptions): Promise<UsageSummary> {\n return this.client.get<UsageSummary>('/api/v1/billing/usage/summary', options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type { UserRegisterParams, UserUpdateParams, User } from '../types/users.js';\n\n/**\n * Resource for user registration and profile management.\n */\nexport class Users {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Register a new user.\n */\n async register(\n params: UserRegisterParams,\n options?: RequestOptions,\n ): Promise<User> {\n const raw = await this.client.post<{ user: User }>(\n '/api/v1/users/register',\n params,\n options,\n );\n return raw.user;\n }\n\n /**\n * Get the current user's profile.\n */\n async me(options?: RequestOptions): Promise<User> {\n const raw = await this.client.get<{ user: User }>('/api/v1/users/me', options);\n return raw.user;\n }\n\n /**\n * Update the current user's profile.\n */\n async update(\n params: UserUpdateParams,\n options?: RequestOptions,\n ): Promise<User> {\n const raw = await this.client.put<{ user: User }>(\n '/api/v1/users/me',\n params,\n options,\n );\n return raw.user;\n }\n}\n","import { APIClient } from './core/api-client.js';\nimport { GeoDedoError } from './core/errors.js';\nimport type { ClientOptions } from './types/shared.js';\n\nimport { Contacts } from './resources/contacts.js';\nimport { Sequences } from './resources/sequences.js';\nimport { Drafts } from './resources/drafts.js';\nimport { Messages } from './resources/messages.js';\nimport { Chat } from './resources/chat.js';\nimport { Channels } from './resources/channels.js';\nimport { Documents } from './resources/documents.js';\nimport { Recommendations } from './resources/recommendations.js';\nimport { Billing } from './resources/billing.js';\nimport { Users } from './resources/users.js';\n\n/**\n * Detect whether we are running in a browser-like environment.\n */\nfunction isBrowser(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined'\n );\n}\n\n/**\n * GeoDedo — the main SDK client.\n *\n * ```ts\n * const client = new GeoDedo({ apiKey: 'gd_live_xxx' });\n * const contacts = await client.contacts.search({ titles: ['CEO'] });\n * ```\n */\nexport class GeoDedo {\n private readonly _client: APIClient;\n\n /** Contact search, enrichment, and import. */\n readonly contacts: Contacts;\n /** Outreach sequence management. */\n readonly sequences: Sequences;\n /** Draft generation, review, and sending. */\n readonly drafts: Drafts;\n /** Direct message sending (email, LinkedIn, Instagram, SMS). */\n readonly messages: Messages;\n /** AI chat assistant. */\n readonly chat: Chat;\n /** Channel connection management. */\n readonly channels: Channels;\n /** Document upload and management. */\n readonly documents: Documents;\n /** AI-powered recommendations. */\n readonly recommendations: Recommendations;\n /** Credit balance and usage tracking. */\n readonly billing: Billing;\n /** User registration and profile management. */\n readonly users: Users;\n\n constructor(options?: Partial<ClientOptions>) {\n // Resolve API key: explicit > env var\n let envKey: string | undefined;\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\n envKey = (globalThis as Record<string, any>).process?.env?.GEODEDO_API_KEY;\n }\n } catch {\n // Ignore — env access not available\n }\n const apiKey = options?.apiKey ?? envKey;\n\n if (!apiKey) {\n throw new GeoDedoError(\n 'The GEODEDO_API_KEY environment variable is missing or empty; either provide it, or pass the `apiKey` option to the GeoDedo constructor.',\n );\n }\n\n // Browser safety check\n if (isBrowser() && !options?.dangerouslyAllowBrowser) {\n throw new GeoDedoError(\n \"It looks like you're running in a browser-like environment.\\n\\n\" +\n 'This is disabled by default, as it risks exposing your secret API key to attackers.\\n' +\n 'If you understand the risks and have appropriate mitigations in place,\\n' +\n 'you can set the `dangerouslyAllowBrowser` option to `true`, e.g.,\\n\\n' +\n \"new GeoDedo({ apiKey: '...', dangerouslyAllowBrowser: true })\",\n );\n }\n\n this._client = new APIClient({\n apiKey,\n userId: options?.userId,\n baseURL: options?.baseURL,\n maxRetries: options?.maxRetries,\n timeout: options?.timeout,\n });\n\n // Initialize all resource namespaces\n this.contacts = new Contacts(this._client);\n this.sequences = new Sequences(this._client);\n this.drafts = new Drafts(this._client);\n this.messages = new Messages(this._client);\n this.chat = new Chat(this._client);\n this.channels = new Channels(this._client);\n this.documents = new Documents(this._client);\n this.recommendations = new Recommendations(this._client);\n this.billing = new Billing(this._client);\n this.users = new Users(this._client);\n }\n}\n"],"mappings":"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","names":["parsed"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/core/errors.ts","../src/core/api-client.ts","../src/core/pagination.ts","../src/resources/contacts.ts","../src/resources/sequences.ts","../src/resources/drafts.ts","../src/resources/messages.ts","../src/resources/chat.ts","../src/resources/channels.ts","../src/resources/documents.ts","../src/resources/recommendations.ts","../src/resources/billing.ts","../src/resources/users.ts","../src/client.ts"],"sourcesContent":["// ── Main client ───────────────────────────────────────────────────────\nexport { GeoDedo } from './client.js';\n\n// ── Core ──────────────────────────────────────────────────────────────\nexport { APIClient } from './core/api-client.js';\nexport type { APIClientOptions } from './core/api-client.js';\nexport { Page } from './core/pagination.js';\nexport type { PageRequestOptions } from './core/pagination.js';\n\n// ── Errors ────────────────────────────────────────────────────────────\nexport {\n GeoDedoError,\n APIError,\n AuthenticationError,\n InsufficientCreditsError,\n PermissionDeniedError,\n NotFoundError,\n ValidationError,\n RateLimitError,\n InternalServerError,\n APIConnectionError,\n APITimeoutError,\n} from './core/errors.js';\n\n// ── Shared types ──────────────────────────────────────────────────────\nexport type {\n RequestOptions,\n ClientOptions,\n PaginationParams,\n PageResponse,\n} from './types/shared.js';\n\n// ── Resource types ────────────────────────────────────────────────────\nexport type {\n ContactSearchParams,\n ContactEnrichParams,\n ContactImportEntry,\n ContactImportParams,\n Contact,\n StoredContact,\n ImportResult,\n CsvList,\n} from './types/contacts.js';\n\nexport type {\n SequenceCreateParams,\n Sequence,\n SequenceStats,\n SequenceWithStats,\n} from './types/sequences.js';\n\nexport type {\n DraftContact,\n DraftGenerateParams,\n DraftListParams,\n DraftUpdateParams,\n DraftApproveParams,\n DraftSendParams,\n Draft,\n DraftBatchResult,\n DraftApproveResult,\n DraftSendError,\n DraftSendResult,\n} from './types/drafts.js';\n\nexport type {\n EmailSendParams,\n LinkedInSendParams,\n InstagramSendParams,\n SmsSendParams,\n EmailResult,\n LinkedInResult,\n InstagramResult,\n SmsResult,\n InboxChannel,\n} from './types/messages.js';\n\nexport type {\n ChatCreateParams,\n ChatResponse,\n Conversation,\n ConversationMessage,\n} from './types/chat.js';\n\nexport type {\n ChannelName,\n ChannelStatus,\n GmailConnectResult,\n LinkedInConnectParams,\n InstagramConnectParams,\n CheckpointParams,\n ConnectionResult,\n AgentMailCreateParams,\n AgentMailCreateResult,\n SmsVerifyParams,\n SmsConfirmParams,\n SmsVerifyResult,\n} from './types/channels.js';\n\nexport type {\n DocumentUploadParams,\n Document,\n} from './types/documents.js';\n\nexport type {\n ICPAnalysis,\n ChannelRecommendation,\n SequenceStrategy,\n} from './types/recommendations.js';\n\nexport type {\n CreditBalance,\n UsageEntry,\n UsageSummary,\n UsageSummaryEntry,\n UsageListParams,\n} from './types/billing.js';\n\nexport type {\n UserRegisterParams,\n UserUpdateParams,\n User,\n} from './types/users.js';\n\n// ── Resource classes (for advanced usage / type narrowing) ────────────\nexport { Contacts } from './resources/contacts.js';\nexport { Sequences } from './resources/sequences.js';\nexport { Drafts } from './resources/drafts.js';\nexport { Messages } from './resources/messages.js';\nexport { Chat, ConversationsResource } from './resources/chat.js';\nexport {\n Channels,\n GmailChannel,\n LinkedInChannel,\n InstagramChannel,\n AgentMailChannel,\n SmsChannel,\n} from './resources/channels.js';\nexport { Documents } from './resources/documents.js';\nexport { Recommendations } from './resources/recommendations.js';\nexport { Billing } from './resources/billing.js';\nexport { Users } from './resources/users.js';\n","/**\n * Base error class for all GeoDedo SDK errors.\n */\nexport class GeoDedoError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GeoDedoError';\n // Restore prototype chain (required when extending builtins in TS)\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error returned when the API responds with a non-2xx status code.\n */\nexport class APIError extends GeoDedoError {\n /** HTTP status code. */\n readonly status: number;\n /** Machine-readable error code from the response body, if present. */\n readonly code: string | undefined;\n /** Request ID from the X-Request-Id response header, if present. */\n readonly requestId: string | undefined;\n /** Raw response body. */\n readonly body: unknown;\n\n constructor(\n status: number,\n body: unknown,\n message: string,\n code?: string,\n requestId?: string,\n ) {\n super(message);\n this.name = 'APIError';\n this.status = status;\n this.code = code;\n this.requestId = requestId;\n this.body = body;\n }\n\n /**\n * Factory that maps an HTTP status code to the appropriate error subclass.\n */\n static fromResponse(\n status: number,\n body: unknown,\n headers?: Headers | Record<string, string>,\n ): APIError {\n const parsed = typeof body === 'object' && body !== null ? (body as Record<string, unknown>) : {};\n const message = typeof parsed.error === 'string' ? parsed.error : `Request failed with status ${status}`;\n const code = typeof parsed.code === 'string' ? parsed.code : undefined;\n\n // Extract request ID from headers\n let requestId: string | undefined;\n if (headers) {\n if (typeof (headers as Headers).get === 'function') {\n requestId = (headers as Headers).get('x-request-id') ?? undefined;\n } else {\n requestId = (headers as Record<string, string>)['x-request-id'];\n }\n }\n\n switch (status) {\n case 401:\n return new AuthenticationError(body, message, code, requestId);\n case 402:\n return new InsufficientCreditsError(\n body,\n message,\n code,\n requestId,\n typeof parsed.credits_needed === 'number' ? parsed.credits_needed : undefined,\n typeof parsed.credits_remaining === 'number' ? parsed.credits_remaining : undefined,\n );\n case 403:\n return new PermissionDeniedError(body, message, code, requestId);\n case 404:\n return new NotFoundError(body, message, code, requestId);\n case 422:\n return new ValidationError(body, message, code, requestId);\n case 429: {\n let retryAfter: number | undefined;\n if (headers) {\n const raw = typeof (headers as Headers).get === 'function'\n ? (headers as Headers).get('retry-after')\n : (headers as Record<string, string>)['retry-after'];\n if (raw) {\n const parsed = Number(raw);\n if (!Number.isNaN(parsed)) retryAfter = parsed;\n }\n }\n return new RateLimitError(body, message, code, requestId, retryAfter);\n }\n default:\n if (status >= 500) {\n return new InternalServerError(status, body, message, code, requestId);\n }\n return new APIError(status, body, message, code, requestId);\n }\n }\n}\n\n/**\n * 401 — Invalid or missing API key.\n */\nexport class AuthenticationError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(401, body, message, code, requestId);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * 402 — Not enough credits to complete the request.\n */\nexport class InsufficientCreditsError extends APIError {\n /** Number of credits required for the operation. */\n readonly creditsRequired: number | undefined;\n /** Current credit balance. */\n readonly creditsRemaining: number | undefined;\n\n constructor(\n body: unknown,\n message: string,\n code?: string,\n requestId?: string,\n creditsRequired?: number,\n creditsRemaining?: number,\n ) {\n super(402, body, message, code, requestId);\n this.name = 'InsufficientCreditsError';\n this.creditsRequired = creditsRequired;\n this.creditsRemaining = creditsRemaining;\n }\n}\n\n/**\n * 403 — Authenticated but not authorized for this operation.\n */\nexport class PermissionDeniedError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(403, body, message, code, requestId);\n this.name = 'PermissionDeniedError';\n }\n}\n\n/**\n * 404 — The requested resource was not found.\n */\nexport class NotFoundError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(404, body, message, code, requestId);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * 422 — Validation error in the request body or parameters.\n */\nexport class ValidationError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(422, body, message, code, requestId);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * 429 — Rate limit exceeded.\n */\nexport class RateLimitError extends APIError {\n /** Seconds to wait before retrying, from the Retry-After header. */\n readonly retryAfter: number | undefined;\n\n constructor(\n body: unknown,\n message: string,\n code?: string,\n requestId?: string,\n retryAfter?: number,\n ) {\n super(429, body, message, code, requestId);\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * 5xx — Internal server error.\n */\nexport class InternalServerError extends APIError {\n constructor(status: number, body: unknown, message: string, code?: string, requestId?: string) {\n super(status, body, message, code, requestId);\n this.name = 'InternalServerError';\n }\n}\n\n/**\n * Network-level failure (DNS, socket, TLS, etc.).\n */\nexport class APIConnectionError extends GeoDedoError {\n /** The underlying error that caused the connection failure. */\n readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'APIConnectionError';\n this.cause = cause;\n }\n}\n\n/**\n * Request timed out before receiving a response.\n */\nexport class APITimeoutError extends APIConnectionError {\n constructor(message: string = 'Request timed out') {\n super(message);\n this.name = 'APITimeoutError';\n }\n}\n","import type { RequestOptions } from '../types/shared.js';\nimport {\n APIError,\n APIConnectionError,\n APITimeoutError,\n} from './errors.js';\n\nconst VERSION = '0.1.0';\nconst DEFAULT_BASE_URL = 'https://geodedo-api.vercel.app';\nconst DEFAULT_TIMEOUT = 60_000; // 60 seconds\nconst DEFAULT_MAX_RETRIES = 2;\nconst MIN_RETRY_DELAY = 500; // 0.5s\nconst MAX_RETRY_DELAY = 5_000; // 5s\n\n/** HTTP methods supported by the client. */\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\n/** Status codes that are eligible for retry. */\nconst RETRYABLE_STATUS_CODES = new Set([429, 409, 500, 502, 503, 504]);\n\nexport interface APIClientOptions {\n apiKey: string;\n userId?: string;\n baseURL?: string;\n maxRetries?: number;\n timeout?: number;\n}\n\n/**\n * Low-level HTTP client that handles auth, retries, timeouts, and error mapping.\n * Uses the built-in `fetch` API (available in Node 18+).\n */\nexport class APIClient {\n readonly apiKey: string;\n readonly userId: string | undefined;\n readonly baseURL: string;\n readonly maxRetries: number;\n readonly timeout: number;\n\n constructor(options: APIClientOptions) {\n this.apiKey = options.apiKey;\n this.userId = options.userId;\n this.baseURL = (options.baseURL ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n /**\n * Core request method. All convenience methods delegate here.\n */\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const url = `${this.baseURL}${path}`;\n\n const apiKey = options?.apiKey ?? this.apiKey;\n const userId = options?.userId ?? this.userId;\n const timeout = options?.timeout ?? this.timeout;\n\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `geodedo-node/${VERSION}`,\n ...options?.headers,\n };\n\n if (userId) {\n headers['X-User-Id'] = userId;\n }\n\n const maxRetries = this.maxRetries;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n // Create a fresh AbortController per attempt for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n // If the caller provided a signal, forward its abort\n const externalSignal = options?.signal;\n let onExternalAbort: (() => void) | undefined;\n if (externalSignal) {\n if (externalSignal.aborted) {\n clearTimeout(timeoutId);\n throw new APITimeoutError('Request aborted');\n }\n onExternalAbort = () => controller.abort();\n externalSignal.addEventListener('abort', onExternalAbort, { once: true });\n }\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers,\n signal: controller.signal,\n };\n\n if (body !== undefined && method !== 'GET') {\n fetchOptions.body = JSON.stringify(body);\n }\n\n let response: Response;\n try {\n response = await fetch(url, fetchOptions);\n } catch (err: unknown) {\n // Distinguish timeout from other network errors\n if (controller.signal.aborted) {\n throw new APITimeoutError();\n }\n throw new APIConnectionError(\n `Connection error: ${err instanceof Error ? err.message : String(err)}`,\n err,\n );\n } finally {\n clearTimeout(timeoutId);\n if (externalSignal && onExternalAbort) {\n externalSignal.removeEventListener('abort', onExternalAbort);\n }\n }\n\n // Success: parse response\n if (response.ok) {\n // 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n return (await response.json()) as T;\n }\n\n // Parse error body\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n errorBody = { error: response.statusText };\n }\n\n const apiError = APIError.fromResponse(response.status, errorBody, response.headers);\n\n // Retry on retryable status codes (but not on last attempt)\n if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < maxRetries) {\n lastError = apiError;\n await this.sleep(this.retryDelay(attempt));\n continue;\n }\n\n throw apiError;\n } catch (err) {\n // If it's a connection/timeout error and we have retries left, retry\n if (\n (err instanceof APIConnectionError || err instanceof APITimeoutError) &&\n attempt < maxRetries\n ) {\n lastError = err;\n await this.sleep(this.retryDelay(attempt));\n continue;\n }\n\n // If it's already one of our error types, just throw it\n if (err instanceof APIError || err instanceof APIConnectionError) {\n throw err;\n }\n\n // Unexpected error — wrap it\n throw new APIConnectionError(\n `Unexpected error: ${err instanceof Error ? err.message : String(err)}`,\n err,\n );\n }\n }\n\n // Should not reach here, but if we do, throw the last error\n throw lastError;\n }\n\n /** Calculate retry delay with exponential backoff and jitter. */\n private retryDelay(attempt: number): number {\n // Exponential backoff: 0.5s, 1s, 2s, 4s, ...\n const base = MIN_RETRY_DELAY * Math.pow(2, attempt);\n const capped = Math.min(base, MAX_RETRY_DELAY);\n // Add jitter: random value between 0 and capped\n const jitter = Math.random() * capped;\n return Math.min(capped + jitter, MAX_RETRY_DELAY);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n // ── Convenience methods ─────────────────────────────────────────────\n\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, undefined, options);\n }\n\n async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, body, options);\n }\n\n async put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, body, options);\n }\n\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, undefined, options);\n }\n}\n","import type { APIClient } from './api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\n\n/**\n * Options needed to fetch the next page of a paginated result.\n */\nexport interface PageRequestOptions {\n /** The API client to use for fetching. */\n client: APIClient;\n /** HTTP method (GET or POST). */\n method: 'GET' | 'POST';\n /** API path. */\n path: string;\n /** Request body (for POST-based pagination like contact search). */\n body?: Record<string, unknown>;\n /** Query parameters appended to the URL. */\n query?: Record<string, string | number>;\n /** The key in the response that contains the array of items. */\n responseKey: string;\n /** Per-request options (auth overrides, etc.). */\n options?: RequestOptions;\n}\n\n/**\n * A single page of results from a paginated API endpoint.\n *\n * Supports:\n * - `data` / `total` / `page` accessors\n * - `hasNextPage()` / `getNextPage()` for manual iteration\n * - `Symbol.asyncIterator` for `for await...of` across all pages\n */\nexport class Page<T> {\n /** The items on this page. */\n readonly data: T[];\n /** Total number of items across all pages. */\n readonly total: number;\n /** Current page number (1-indexed). */\n readonly page: number;\n /** Number of items per page (inferred from the current page size). */\n readonly perPage: number;\n\n private readonly _requestOptions: PageRequestOptions;\n\n constructor(\n data: T[],\n total: number,\n page: number,\n perPage: number,\n requestOptions: PageRequestOptions,\n ) {\n this.data = data;\n this.total = total;\n this.page = page;\n this.perPage = perPage;\n this._requestOptions = requestOptions;\n }\n\n /**\n * Whether there is a next page available.\n */\n hasNextPage(): boolean {\n return this.page * this.perPage < this.total;\n }\n\n /**\n * Fetch the next page. Throws if there is no next page.\n */\n async getNextPage(): Promise<Page<T>> {\n if (!this.hasNextPage()) {\n throw new Error('No more pages available');\n }\n return fetchPage<T>({\n ...this._requestOptions,\n query: {\n ...this._requestOptions.query,\n page: this.page + 1,\n },\n body: this._requestOptions.body\n ? { ...this._requestOptions.body, page: this.page + 1 }\n : undefined,\n });\n }\n\n /**\n * Async iterator that yields every item across all pages,\n * automatically fetching subsequent pages as needed.\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page: Page<T> = this;\n while (true) {\n for (const item of page.data) {\n yield item;\n }\n if (!page.hasNextPage()) break;\n page = await page.getNextPage();\n }\n }\n}\n\n/**\n * Fetch a single page from the API and return a `Page<T>`.\n */\nexport async function fetchPage<T>(\n opts: PageRequestOptions,\n): Promise<Page<T>> {\n const { client, method, path, body, query, responseKey, options } = opts;\n\n // Build the path with query params\n let fullPath = path;\n if (query && Object.keys(query).length > 0) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n fullPath += (fullPath.includes('?') ? '&' : '?') + qs;\n }\n }\n\n let raw: Record<string, unknown>;\n if (method === 'POST') {\n raw = await client.post<Record<string, unknown>>(fullPath, body, options);\n } else {\n raw = await client.get<Record<string, unknown>>(fullPath, options);\n }\n\n const data = (raw[responseKey] as T[]) ?? [];\n const total = (typeof raw.total === 'number' ? raw.total : data.length);\n const page = (typeof raw.page === 'number' ? raw.page : 1);\n // perPage: use pageSize if provided, otherwise infer from result length or default to 25\n const perPage = (typeof raw.pageSize === 'number'\n ? raw.pageSize\n : typeof raw.perPage === 'number'\n ? raw.perPage\n : data.length > 0\n ? data.length\n : 25);\n\n return new Page<T>(data, total, page, perPage, opts);\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ContactSearchParams,\n ContactEnrichParams,\n ContactImportParams,\n Contact,\n StoredContact,\n ImportResult,\n CsvList,\n} from '../types/contacts.js';\n\n/**\n * Resource for contact search, enrichment, import, and listing.\n */\nexport class Contacts {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Search for contacts matching the given ICP criteria.\n * Returns a paginated list of enriched contacts.\n */\n async search(\n params: ContactSearchParams,\n options?: RequestOptions,\n ): Promise<Page<Contact>> {\n const { page, perPage, ...body } = params;\n return fetchPage<Contact>({\n client: this.client,\n method: 'POST',\n path: '/api/v1/contacts/search',\n body: { ...body, page: page ?? 1, perPage: perPage ?? 25 },\n responseKey: 'contacts',\n options,\n });\n }\n\n /**\n * Enrich a single contact by email, LinkedIn URL, or name+company.\n */\n async enrich(\n params: ContactEnrichParams,\n options?: RequestOptions,\n ): Promise<Contact> {\n const raw = await this.client.post<{ contact: Contact }>(\n '/api/v1/contacts/enrich',\n params,\n options,\n );\n return raw.contact;\n }\n\n /**\n * Import a batch of contacts (CSV-like).\n */\n async importCsv(\n params: ContactImportParams,\n options?: RequestOptions,\n ): Promise<ImportResult> {\n return this.client.post<ImportResult>('/api/v1/contacts/import', params, options);\n }\n\n /**\n * List stored contacts for the current user. Paginated.\n */\n async list(\n params?: { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<StoredContact>> {\n const query: Record<string, string | number> = {};\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<StoredContact>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/contacts',\n query,\n responseKey: 'contacts',\n options,\n });\n }\n\n /**\n * List all CSV lists (imports) for the current user.\n */\n async csvLists(options?: RequestOptions): Promise<CsvList[]> {\n const raw = await this.client.get<{ lists: CsvList[] }>(\n '/api/v1/contacts/csv-lists',\n options,\n );\n return raw.lists;\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n SequenceCreateParams,\n Sequence,\n SequenceWithStats,\n} from '../types/sequences.js';\n\n/**\n * Resource for managing outreach sequences.\n */\nexport class Sequences {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Create a new outreach sequence.\n */\n async create(\n params: SequenceCreateParams,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n '/api/v1/sequences',\n params,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * List all sequences for the current user. Paginated.\n */\n async list(\n params?: { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<SequenceWithStats>> {\n const query: Record<string, string | number> = {};\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<SequenceWithStats>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/sequences',\n query,\n responseKey: 'sequences',\n options,\n });\n }\n\n /**\n * Get a single sequence by ID.\n */\n async get(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<SequenceWithStats> {\n const raw = await this.client.get<{ sequence: SequenceWithStats }>(\n `/api/v1/sequences/${sequenceId}`,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Pause a running sequence.\n */\n async pause(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n `/api/v1/sequences/${sequenceId}/pause`,\n undefined,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Resume a paused sequence.\n */\n async resume(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n `/api/v1/sequences/${sequenceId}/resume`,\n undefined,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Stop (terminate) a sequence.\n */\n async stop(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n `/api/v1/sequences/${sequenceId}/stop`,\n undefined,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Get the current status of a sequence.\n */\n async status(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<SequenceWithStats> {\n const raw = await this.client.get<{ sequence: SequenceWithStats }>(\n `/api/v1/sequences/${sequenceId}/status`,\n options,\n );\n return raw.sequence;\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n DraftGenerateParams,\n DraftListParams,\n DraftUpdateParams,\n DraftApproveParams,\n DraftSendParams,\n Draft,\n DraftBatchResult,\n DraftApproveResult,\n DraftSendResult,\n} from '../types/drafts.js';\n\n/**\n * Resource for generating, reviewing, approving, and sending outreach drafts.\n */\nexport class Drafts {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Generate outreach drafts for a list of contacts.\n */\n async generate(\n params: DraftGenerateParams,\n options?: RequestOptions,\n ): Promise<DraftBatchResult> {\n return this.client.post<DraftBatchResult>('/api/v1/drafts/generate', params, options);\n }\n\n /**\n * List drafts, optionally filtered by conversation, batch, or status. Paginated.\n */\n async list(\n params?: DraftListParams & { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<Draft>> {\n const query: Record<string, string | number> = {};\n if (params?.conversationId) query.conversationId = params.conversationId;\n if (params?.batchId) query.batchId = params.batchId;\n if (params?.status) query.status = params.status;\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<Draft>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/drafts',\n query,\n responseKey: 'drafts',\n options,\n });\n }\n\n /**\n * Update a specific draft's subject and/or body.\n */\n async update(\n draftId: string,\n params: DraftUpdateParams,\n options?: RequestOptions,\n ): Promise<Draft> {\n const raw = await this.client.put<{ draft: Draft }>(\n `/api/v1/drafts/${draftId}`,\n params,\n options,\n );\n return raw.draft;\n }\n\n /**\n * Approve drafts by their IDs.\n */\n async approve(\n params: DraftApproveParams,\n options?: RequestOptions,\n ): Promise<DraftApproveResult> {\n return this.client.post<DraftApproveResult>('/api/v1/drafts/approve', params, options);\n }\n\n /**\n * Send approved drafts.\n */\n async send(\n params: DraftSendParams,\n options?: RequestOptions,\n ): Promise<DraftSendResult> {\n return this.client.post<DraftSendResult>('/api/v1/drafts/send', params, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n EmailSendParams,\n LinkedInSendParams,\n InstagramSendParams,\n SmsSendParams,\n EmailResult,\n LinkedInResult,\n InstagramResult,\n SmsResult,\n InboxChannel,\n} from '../types/messages.js';\n\n/**\n * Resource for sending messages across channels and accessing the unified inbox.\n */\nexport class Messages {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Send an email via Gmail or AgentMail.\n */\n async sendEmail(\n params: EmailSendParams,\n options?: RequestOptions,\n ): Promise<EmailResult> {\n return this.client.post<EmailResult>('/api/v1/messages/email', params, options);\n }\n\n /**\n * Send a LinkedIn message or connection request.\n */\n async sendLinkedIn(\n params: LinkedInSendParams,\n options?: RequestOptions,\n ): Promise<LinkedInResult> {\n return this.client.post<LinkedInResult>('/api/v1/messages/linkedin', params, options);\n }\n\n /**\n * Send an Instagram DM.\n */\n async sendInstagram(\n params: InstagramSendParams,\n options?: RequestOptions,\n ): Promise<InstagramResult> {\n return this.client.post<InstagramResult>('/api/v1/messages/instagram', params, options);\n }\n\n /**\n * Send an SMS message.\n */\n async sendSms(\n params: SmsSendParams,\n options?: RequestOptions,\n ): Promise<SmsResult> {\n return this.client.post<SmsResult>('/api/v1/messages/sms', params, options);\n }\n\n /**\n * Get the unified inbox for a specific channel.\n */\n async inbox(\n channel: InboxChannel,\n options?: RequestOptions,\n ): Promise<Record<string, unknown>> {\n return this.client.get<Record<string, unknown>>(\n `/api/v1/messages/inbox/${channel}`,\n options,\n );\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ChatCreateParams,\n ChatResponse,\n Conversation,\n ConversationMessage,\n} from '../types/chat.js';\n\n/**\n * Sub-resource for conversation management.\n */\nexport class ConversationsResource {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * List all conversations.\n */\n async list(options?: RequestOptions): Promise<Conversation[]> {\n const raw = await this.client.get<{ conversations: Conversation[] }>(\n '/api/v1/chat/conversations',\n options,\n );\n return raw.conversations;\n }\n\n /**\n * Get messages for a specific conversation.\n */\n async get(\n conversationId: string,\n options?: RequestOptions,\n ): Promise<ConversationMessage[]> {\n const raw = await this.client.get<{ messages: ConversationMessage[] }>(\n `/api/v1/chat/conversations/${conversationId}`,\n options,\n );\n return raw.messages;\n }\n\n /**\n * Delete a conversation.\n */\n async delete(\n conversationId: string,\n options?: RequestOptions,\n ): Promise<void> {\n await this.client.delete(\n `/api/v1/chat/conversations/${conversationId}`,\n options,\n );\n }\n}\n\n/**\n * Resource for the AI chat assistant and conversation management.\n */\nexport class Chat {\n private readonly client: APIClient;\n\n /** Sub-resource for managing conversations. */\n readonly conversations: ConversationsResource;\n\n constructor(client: APIClient) {\n this.client = client;\n this.conversations = new ConversationsResource(client);\n }\n\n /**\n * Send a message to the AI assistant.\n */\n async create(\n params: ChatCreateParams,\n options?: RequestOptions,\n ): Promise<ChatResponse> {\n return this.client.post<ChatResponse>('/api/v1/chat', params, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ChannelName,\n ChannelStatus,\n GmailConnectResult,\n LinkedInConnectParams,\n InstagramConnectParams,\n CheckpointParams,\n ConnectionResult,\n AgentMailCreateParams,\n AgentMailCreateResult,\n SmsVerifyParams,\n SmsConfirmParams,\n SmsVerifyResult,\n} from '../types/channels.js';\n\n/**\n * Sub-resource for Gmail channel operations.\n */\nexport class GmailChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Initiate Gmail OAuth flow. Returns an authUrl for the user to visit.\n */\n async connect(options?: RequestOptions): Promise<GmailConnectResult> {\n return this.client.post<GmailConnectResult>('/api/v1/channels/gmail/connect', undefined, options);\n }\n}\n\n/**\n * Sub-resource for LinkedIn channel operations.\n */\nexport class LinkedInChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Connect a LinkedIn account with credentials.\n */\n async connect(\n params: LinkedInConnectParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/linkedin/connect', params, options);\n }\n\n /**\n * Resolve a LinkedIn 2FA checkpoint.\n */\n async checkpoint(\n params: CheckpointParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/linkedin/checkpoint', params, options);\n }\n}\n\n/**\n * Sub-resource for Instagram channel operations.\n */\nexport class InstagramChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Connect an Instagram account with credentials.\n */\n async connect(\n params: InstagramConnectParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/instagram/connect', params, options);\n }\n\n /**\n * Resolve an Instagram 2FA checkpoint.\n */\n async checkpoint(\n params: CheckpointParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/instagram/checkpoint', params, options);\n }\n}\n\n/**\n * Sub-resource for AgentMail channel operations.\n */\nexport class AgentMailChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Create a new AgentMail address.\n */\n async create(\n params: AgentMailCreateParams,\n options?: RequestOptions,\n ): Promise<AgentMailCreateResult> {\n return this.client.post<AgentMailCreateResult>('/api/v1/channels/agentmail/create', params, options);\n }\n}\n\n/**\n * Sub-resource for SMS channel operations.\n */\nexport class SmsChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Initiate SMS verification for a phone number.\n */\n async verify(\n params: SmsVerifyParams,\n options?: RequestOptions,\n ): Promise<SmsVerifyResult> {\n return this.client.post<SmsVerifyResult>('/api/v1/channels/sms/verify', params, options);\n }\n\n /**\n * Confirm SMS verification with the code.\n */\n async confirm(\n params: SmsConfirmParams,\n options?: RequestOptions,\n ): Promise<SmsVerifyResult> {\n return this.client.post<SmsVerifyResult>('/api/v1/channels/sms/confirm', params, options);\n }\n}\n\n/**\n * Resource for managing channel connections (Gmail, LinkedIn, Instagram, AgentMail, SMS).\n */\nexport class Channels {\n private readonly client: APIClient;\n\n /** Gmail channel operations. */\n readonly gmail: GmailChannel;\n /** LinkedIn channel operations. */\n readonly linkedin: LinkedInChannel;\n /** Instagram channel operations. */\n readonly instagram: InstagramChannel;\n /** AgentMail channel operations. */\n readonly agentmail: AgentMailChannel;\n /** SMS channel operations. */\n readonly sms: SmsChannel;\n\n constructor(client: APIClient) {\n this.client = client;\n this.gmail = new GmailChannel(client);\n this.linkedin = new LinkedInChannel(client);\n this.instagram = new InstagramChannel(client);\n this.agentmail = new AgentMailChannel(client);\n this.sms = new SmsChannel(client);\n }\n\n /**\n * Get the connection status of all channels.\n */\n async status(options?: RequestOptions): Promise<ChannelStatus> {\n return this.client.get<ChannelStatus>('/api/v1/channels/status', options);\n }\n\n /**\n * Disconnect a specific channel.\n */\n async disconnect(\n channel: ChannelName,\n options?: RequestOptions,\n ): Promise<void> {\n await this.client.post(`/api/v1/channels/${channel}/disconnect`, undefined, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type { DocumentUploadParams, Document } from '../types/documents.js';\n\n/**\n * Resource for uploading, listing, and deleting documents.\n */\nexport class Documents {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Upload a document.\n */\n async upload(\n params: DocumentUploadParams,\n options?: RequestOptions,\n ): Promise<Document> {\n return this.client.post<Document>(\n '/api/v1/documents',\n params,\n options,\n );\n }\n\n /**\n * List all documents. Paginated.\n */\n async list(\n params?: { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<Document>> {\n const query: Record<string, string | number> = {};\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<Document>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/documents',\n query,\n responseKey: 'documents',\n options,\n });\n }\n\n /**\n * Delete a document by ID.\n */\n async delete(\n documentId: string,\n options?: RequestOptions,\n ): Promise<void> {\n await this.client.delete(`/api/v1/documents/${documentId}`, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ICPAnalysis,\n ChannelRecommendation,\n SequenceStrategy,\n} from '../types/recommendations.js';\n\n/**\n * Resource for AI-powered recommendations (ICP analysis, channel selection, sequence strategy).\n */\nexport class Recommendations {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Get an ICP analysis recommendation.\n */\n async icpAnalysis(options?: RequestOptions): Promise<ICPAnalysis> {\n return this.client.post<ICPAnalysis>('/api/v1/recommendations/icp-analysis', undefined, options);\n }\n\n /**\n * Get a channel recommendation.\n */\n async channel(options?: RequestOptions): Promise<ChannelRecommendation> {\n return this.client.post<ChannelRecommendation>('/api/v1/recommendations/channel', undefined, options);\n }\n\n /**\n * Get a sequence strategy recommendation.\n */\n async sequenceStrategy(options?: RequestOptions): Promise<SequenceStrategy> {\n return this.client.post<SequenceStrategy>('/api/v1/recommendations/sequence-strategy', undefined, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n CreditBalance,\n UsageEntry,\n UsageSummary,\n UsageListParams,\n} from '../types/billing.js';\n\n/**\n * Resource for credit balance and usage tracking.\n */\nexport class Billing {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Get the current credit balance.\n */\n async balance(options?: RequestOptions): Promise<CreditBalance> {\n return this.client.get<CreditBalance>('/api/v1/billing/balance', options);\n }\n\n /**\n * List usage entries. Paginated.\n */\n async usage(\n params?: UsageListParams,\n options?: RequestOptions,\n ): Promise<Page<UsageEntry>> {\n const query: Record<string, string | number> = {};\n if (params?.from) query.from = params.from;\n if (params?.to) query.to = params.to;\n if (params?.page) query.page = params.page;\n\n return fetchPage<UsageEntry>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/billing/usage',\n query,\n responseKey: 'usage',\n options,\n });\n }\n\n /**\n * Get an aggregated usage summary.\n */\n async usageSummary(options?: RequestOptions): Promise<UsageSummary> {\n return this.client.get<UsageSummary>('/api/v1/billing/usage/summary', options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type { UserRegisterParams, UserUpdateParams, User } from '../types/users.js';\n\n/**\n * Resource for user registration and profile management.\n */\nexport class Users {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Register a new user.\n */\n async register(\n params: UserRegisterParams,\n options?: RequestOptions,\n ): Promise<User> {\n const raw = await this.client.post<{ user: User }>(\n '/api/v1/users/register',\n params,\n options,\n );\n return raw.user;\n }\n\n /**\n * Get the current user's profile.\n */\n async me(options?: RequestOptions): Promise<User> {\n const raw = await this.client.get<{ user: User }>('/api/v1/users/me', options);\n return raw.user;\n }\n\n /**\n * Update the current user's profile.\n */\n async update(\n params: UserUpdateParams,\n options?: RequestOptions,\n ): Promise<User> {\n const raw = await this.client.put<{ user: User }>(\n '/api/v1/users/me',\n params,\n options,\n );\n return raw.user;\n }\n}\n","import { APIClient } from './core/api-client.js';\nimport { GeoDedoError } from './core/errors.js';\nimport type { ClientOptions } from './types/shared.js';\n\nimport { Contacts } from './resources/contacts.js';\nimport { Sequences } from './resources/sequences.js';\nimport { Drafts } from './resources/drafts.js';\nimport { Messages } from './resources/messages.js';\nimport { Chat } from './resources/chat.js';\nimport { Channels } from './resources/channels.js';\nimport { Documents } from './resources/documents.js';\nimport { Recommendations } from './resources/recommendations.js';\nimport { Billing } from './resources/billing.js';\nimport { Users } from './resources/users.js';\n\n/**\n * Detect whether we are running in a browser-like environment.\n */\nfunction isBrowser(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined'\n );\n}\n\n/**\n * GeoDedo — the main SDK client.\n *\n * ```ts\n * const client = new GeoDedo({ apiKey: 'gd_live_xxx' });\n * const contacts = await client.contacts.search({ titles: ['CEO'] });\n * ```\n */\nexport class GeoDedo {\n private readonly _client: APIClient;\n\n /** Contact search, enrichment, and import. */\n readonly contacts: Contacts;\n /** Outreach sequence management. */\n readonly sequences: Sequences;\n /** Draft generation, review, and sending. */\n readonly drafts: Drafts;\n /** Direct message sending (email, LinkedIn, Instagram, SMS). */\n readonly messages: Messages;\n /** AI chat assistant. */\n readonly chat: Chat;\n /** Channel connection management. */\n readonly channels: Channels;\n /** Document upload and management. */\n readonly documents: Documents;\n /** AI-powered recommendations. */\n readonly recommendations: Recommendations;\n /** Credit balance and usage tracking. */\n readonly billing: Billing;\n /** User registration and profile management. */\n readonly users: Users;\n\n constructor(options?: Partial<ClientOptions>) {\n // Resolve API key: explicit > env var\n let envKey: string | undefined;\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\n envKey = (globalThis as Record<string, any>).process?.env?.GEODEDO_API_KEY;\n }\n } catch {\n // Ignore — env access not available\n }\n const apiKey = options?.apiKey ?? envKey;\n\n if (!apiKey) {\n throw new GeoDedoError(\n 'The GEODEDO_API_KEY environment variable is missing or empty; either provide it, or pass the `apiKey` option to the GeoDedo constructor.',\n );\n }\n\n // Browser safety check\n if (isBrowser() && !options?.dangerouslyAllowBrowser) {\n throw new GeoDedoError(\n \"It looks like you're running in a browser-like environment.\\n\\n\" +\n 'This is disabled by default, as it risks exposing your secret API key to attackers.\\n' +\n 'If you understand the risks and have appropriate mitigations in place,\\n' +\n 'you can set the `dangerouslyAllowBrowser` option to `true`, e.g.,\\n\\n' +\n \"new GeoDedo({ apiKey: '...', dangerouslyAllowBrowser: true })\",\n );\n }\n\n this._client = new APIClient({\n apiKey,\n userId: options?.userId,\n baseURL: options?.baseURL,\n maxRetries: options?.maxRetries,\n timeout: options?.timeout,\n });\n\n // Initialize all resource namespaces\n this.contacts = new Contacts(this._client);\n this.sequences = new Sequences(this._client);\n this.drafts = new Drafts(this._client);\n this.messages = new Messages(this._client);\n this.chat = new Chat(this._client);\n this.channels = new Channels(this._client);\n this.documents = new Documents(this._client);\n this.recommendations = new Recommendations(this._client);\n this.billing = new Billing(this._client);\n this.users = new Users(this._client);\n }\n}\n"],"mappings":"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","names":["parsed"]}
package/dist/index.js CHANGED
@@ -791,12 +791,11 @@ var Documents = class {
791
791
  * Upload a document.
792
792
  */
793
793
  async upload(params, options) {
794
- const raw = await this.client.post(
794
+ return this.client.post(
795
795
  "/api/v1/documents",
796
796
  params,
797
797
  options
798
798
  );
799
- return raw.document;
800
799
  }
801
800
  /**
802
801
  * List all documents. Paginated.
@@ -832,19 +831,19 @@ var Recommendations = class {
832
831
  * Get an ICP analysis recommendation.
833
832
  */
834
833
  async icpAnalysis(options) {
835
- return this.client.get("/api/v1/recommendations/icp", options);
834
+ return this.client.post("/api/v1/recommendations/icp-analysis", void 0, options);
836
835
  }
837
836
  /**
838
837
  * Get a channel recommendation.
839
838
  */
840
839
  async channel(options) {
841
- return this.client.get("/api/v1/recommendations/channel", options);
840
+ return this.client.post("/api/v1/recommendations/channel", void 0, options);
842
841
  }
843
842
  /**
844
843
  * Get a sequence strategy recommendation.
845
844
  */
846
845
  async sequenceStrategy(options) {
847
- return this.client.get("/api/v1/recommendations/sequence-strategy", options);
846
+ return this.client.post("/api/v1/recommendations/sequence-strategy", void 0, options);
848
847
  }
849
848
  };
850
849
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/errors.ts","../src/core/api-client.ts","../src/core/pagination.ts","../src/resources/contacts.ts","../src/resources/sequences.ts","../src/resources/drafts.ts","../src/resources/messages.ts","../src/resources/chat.ts","../src/resources/channels.ts","../src/resources/documents.ts","../src/resources/recommendations.ts","../src/resources/billing.ts","../src/resources/users.ts","../src/client.ts"],"sourcesContent":["/**\n * Base error class for all GeoDedo SDK errors.\n */\nexport class GeoDedoError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GeoDedoError';\n // Restore prototype chain (required when extending builtins in TS)\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error returned when the API responds with a non-2xx status code.\n */\nexport class APIError extends GeoDedoError {\n /** HTTP status code. */\n readonly status: number;\n /** Machine-readable error code from the response body, if present. */\n readonly code: string | undefined;\n /** Request ID from the X-Request-Id response header, if present. */\n readonly requestId: string | undefined;\n /** Raw response body. */\n readonly body: unknown;\n\n constructor(\n status: number,\n body: unknown,\n message: string,\n code?: string,\n requestId?: string,\n ) {\n super(message);\n this.name = 'APIError';\n this.status = status;\n this.code = code;\n this.requestId = requestId;\n this.body = body;\n }\n\n /**\n * Factory that maps an HTTP status code to the appropriate error subclass.\n */\n static fromResponse(\n status: number,\n body: unknown,\n headers?: Headers | Record<string, string>,\n ): APIError {\n const parsed = typeof body === 'object' && body !== null ? (body as Record<string, unknown>) : {};\n const message = typeof parsed.error === 'string' ? parsed.error : `Request failed with status ${status}`;\n const code = typeof parsed.code === 'string' ? parsed.code : undefined;\n\n // Extract request ID from headers\n let requestId: string | undefined;\n if (headers) {\n if (typeof (headers as Headers).get === 'function') {\n requestId = (headers as Headers).get('x-request-id') ?? undefined;\n } else {\n requestId = (headers as Record<string, string>)['x-request-id'];\n }\n }\n\n switch (status) {\n case 401:\n return new AuthenticationError(body, message, code, requestId);\n case 402:\n return new InsufficientCreditsError(\n body,\n message,\n code,\n requestId,\n typeof parsed.credits_needed === 'number' ? parsed.credits_needed : undefined,\n typeof parsed.credits_remaining === 'number' ? parsed.credits_remaining : undefined,\n );\n case 403:\n return new PermissionDeniedError(body, message, code, requestId);\n case 404:\n return new NotFoundError(body, message, code, requestId);\n case 422:\n return new ValidationError(body, message, code, requestId);\n case 429: {\n let retryAfter: number | undefined;\n if (headers) {\n const raw = typeof (headers as Headers).get === 'function'\n ? (headers as Headers).get('retry-after')\n : (headers as Record<string, string>)['retry-after'];\n if (raw) {\n const parsed = Number(raw);\n if (!Number.isNaN(parsed)) retryAfter = parsed;\n }\n }\n return new RateLimitError(body, message, code, requestId, retryAfter);\n }\n default:\n if (status >= 500) {\n return new InternalServerError(status, body, message, code, requestId);\n }\n return new APIError(status, body, message, code, requestId);\n }\n }\n}\n\n/**\n * 401 — Invalid or missing API key.\n */\nexport class AuthenticationError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(401, body, message, code, requestId);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * 402 — Not enough credits to complete the request.\n */\nexport class InsufficientCreditsError extends APIError {\n /** Number of credits required for the operation. */\n readonly creditsRequired: number | undefined;\n /** Current credit balance. */\n readonly creditsRemaining: number | undefined;\n\n constructor(\n body: unknown,\n message: string,\n code?: string,\n requestId?: string,\n creditsRequired?: number,\n creditsRemaining?: number,\n ) {\n super(402, body, message, code, requestId);\n this.name = 'InsufficientCreditsError';\n this.creditsRequired = creditsRequired;\n this.creditsRemaining = creditsRemaining;\n }\n}\n\n/**\n * 403 — Authenticated but not authorized for this operation.\n */\nexport class PermissionDeniedError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(403, body, message, code, requestId);\n this.name = 'PermissionDeniedError';\n }\n}\n\n/**\n * 404 — The requested resource was not found.\n */\nexport class NotFoundError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(404, body, message, code, requestId);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * 422 — Validation error in the request body or parameters.\n */\nexport class ValidationError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(422, body, message, code, requestId);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * 429 — Rate limit exceeded.\n */\nexport class RateLimitError extends APIError {\n /** Seconds to wait before retrying, from the Retry-After header. */\n readonly retryAfter: number | undefined;\n\n constructor(\n body: unknown,\n message: string,\n code?: string,\n requestId?: string,\n retryAfter?: number,\n ) {\n super(429, body, message, code, requestId);\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * 5xx — Internal server error.\n */\nexport class InternalServerError extends APIError {\n constructor(status: number, body: unknown, message: string, code?: string, requestId?: string) {\n super(status, body, message, code, requestId);\n this.name = 'InternalServerError';\n }\n}\n\n/**\n * Network-level failure (DNS, socket, TLS, etc.).\n */\nexport class APIConnectionError extends GeoDedoError {\n /** The underlying error that caused the connection failure. */\n readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'APIConnectionError';\n this.cause = cause;\n }\n}\n\n/**\n * Request timed out before receiving a response.\n */\nexport class APITimeoutError extends APIConnectionError {\n constructor(message: string = 'Request timed out') {\n super(message);\n this.name = 'APITimeoutError';\n }\n}\n","import type { RequestOptions } from '../types/shared.js';\nimport {\n APIError,\n APIConnectionError,\n APITimeoutError,\n} from './errors.js';\n\nconst VERSION = '0.1.0';\nconst DEFAULT_BASE_URL = 'https://geodedo-api.vercel.app';\nconst DEFAULT_TIMEOUT = 60_000; // 60 seconds\nconst DEFAULT_MAX_RETRIES = 2;\nconst MIN_RETRY_DELAY = 500; // 0.5s\nconst MAX_RETRY_DELAY = 5_000; // 5s\n\n/** HTTP methods supported by the client. */\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\n/** Status codes that are eligible for retry. */\nconst RETRYABLE_STATUS_CODES = new Set([429, 409, 500, 502, 503, 504]);\n\nexport interface APIClientOptions {\n apiKey: string;\n userId?: string;\n baseURL?: string;\n maxRetries?: number;\n timeout?: number;\n}\n\n/**\n * Low-level HTTP client that handles auth, retries, timeouts, and error mapping.\n * Uses the built-in `fetch` API (available in Node 18+).\n */\nexport class APIClient {\n readonly apiKey: string;\n readonly userId: string | undefined;\n readonly baseURL: string;\n readonly maxRetries: number;\n readonly timeout: number;\n\n constructor(options: APIClientOptions) {\n this.apiKey = options.apiKey;\n this.userId = options.userId;\n this.baseURL = (options.baseURL ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n /**\n * Core request method. All convenience methods delegate here.\n */\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const url = `${this.baseURL}${path}`;\n\n const apiKey = options?.apiKey ?? this.apiKey;\n const userId = options?.userId ?? this.userId;\n const timeout = options?.timeout ?? this.timeout;\n\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `geodedo-node/${VERSION}`,\n ...options?.headers,\n };\n\n if (userId) {\n headers['X-User-Id'] = userId;\n }\n\n const maxRetries = this.maxRetries;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n // Create a fresh AbortController per attempt for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n // If the caller provided a signal, forward its abort\n const externalSignal = options?.signal;\n let onExternalAbort: (() => void) | undefined;\n if (externalSignal) {\n if (externalSignal.aborted) {\n clearTimeout(timeoutId);\n throw new APITimeoutError('Request aborted');\n }\n onExternalAbort = () => controller.abort();\n externalSignal.addEventListener('abort', onExternalAbort, { once: true });\n }\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers,\n signal: controller.signal,\n };\n\n if (body !== undefined && method !== 'GET') {\n fetchOptions.body = JSON.stringify(body);\n }\n\n let response: Response;\n try {\n response = await fetch(url, fetchOptions);\n } catch (err: unknown) {\n // Distinguish timeout from other network errors\n if (controller.signal.aborted) {\n throw new APITimeoutError();\n }\n throw new APIConnectionError(\n `Connection error: ${err instanceof Error ? err.message : String(err)}`,\n err,\n );\n } finally {\n clearTimeout(timeoutId);\n if (externalSignal && onExternalAbort) {\n externalSignal.removeEventListener('abort', onExternalAbort);\n }\n }\n\n // Success: parse response\n if (response.ok) {\n // 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n return (await response.json()) as T;\n }\n\n // Parse error body\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n errorBody = { error: response.statusText };\n }\n\n const apiError = APIError.fromResponse(response.status, errorBody, response.headers);\n\n // Retry on retryable status codes (but not on last attempt)\n if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < maxRetries) {\n lastError = apiError;\n await this.sleep(this.retryDelay(attempt));\n continue;\n }\n\n throw apiError;\n } catch (err) {\n // If it's a connection/timeout error and we have retries left, retry\n if (\n (err instanceof APIConnectionError || err instanceof APITimeoutError) &&\n attempt < maxRetries\n ) {\n lastError = err;\n await this.sleep(this.retryDelay(attempt));\n continue;\n }\n\n // If it's already one of our error types, just throw it\n if (err instanceof APIError || err instanceof APIConnectionError) {\n throw err;\n }\n\n // Unexpected error — wrap it\n throw new APIConnectionError(\n `Unexpected error: ${err instanceof Error ? err.message : String(err)}`,\n err,\n );\n }\n }\n\n // Should not reach here, but if we do, throw the last error\n throw lastError;\n }\n\n /** Calculate retry delay with exponential backoff and jitter. */\n private retryDelay(attempt: number): number {\n // Exponential backoff: 0.5s, 1s, 2s, 4s, ...\n const base = MIN_RETRY_DELAY * Math.pow(2, attempt);\n const capped = Math.min(base, MAX_RETRY_DELAY);\n // Add jitter: random value between 0 and capped\n const jitter = Math.random() * capped;\n return Math.min(capped + jitter, MAX_RETRY_DELAY);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n // ── Convenience methods ─────────────────────────────────────────────\n\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, undefined, options);\n }\n\n async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, body, options);\n }\n\n async put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, body, options);\n }\n\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, undefined, options);\n }\n}\n","import type { APIClient } from './api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\n\n/**\n * Options needed to fetch the next page of a paginated result.\n */\nexport interface PageRequestOptions {\n /** The API client to use for fetching. */\n client: APIClient;\n /** HTTP method (GET or POST). */\n method: 'GET' | 'POST';\n /** API path. */\n path: string;\n /** Request body (for POST-based pagination like contact search). */\n body?: Record<string, unknown>;\n /** Query parameters appended to the URL. */\n query?: Record<string, string | number>;\n /** The key in the response that contains the array of items. */\n responseKey: string;\n /** Per-request options (auth overrides, etc.). */\n options?: RequestOptions;\n}\n\n/**\n * A single page of results from a paginated API endpoint.\n *\n * Supports:\n * - `data` / `total` / `page` accessors\n * - `hasNextPage()` / `getNextPage()` for manual iteration\n * - `Symbol.asyncIterator` for `for await...of` across all pages\n */\nexport class Page<T> {\n /** The items on this page. */\n readonly data: T[];\n /** Total number of items across all pages. */\n readonly total: number;\n /** Current page number (1-indexed). */\n readonly page: number;\n /** Number of items per page (inferred from the current page size). */\n readonly perPage: number;\n\n private readonly _requestOptions: PageRequestOptions;\n\n constructor(\n data: T[],\n total: number,\n page: number,\n perPage: number,\n requestOptions: PageRequestOptions,\n ) {\n this.data = data;\n this.total = total;\n this.page = page;\n this.perPage = perPage;\n this._requestOptions = requestOptions;\n }\n\n /**\n * Whether there is a next page available.\n */\n hasNextPage(): boolean {\n return this.page * this.perPage < this.total;\n }\n\n /**\n * Fetch the next page. Throws if there is no next page.\n */\n async getNextPage(): Promise<Page<T>> {\n if (!this.hasNextPage()) {\n throw new Error('No more pages available');\n }\n return fetchPage<T>({\n ...this._requestOptions,\n query: {\n ...this._requestOptions.query,\n page: this.page + 1,\n },\n body: this._requestOptions.body\n ? { ...this._requestOptions.body, page: this.page + 1 }\n : undefined,\n });\n }\n\n /**\n * Async iterator that yields every item across all pages,\n * automatically fetching subsequent pages as needed.\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page: Page<T> = this;\n while (true) {\n for (const item of page.data) {\n yield item;\n }\n if (!page.hasNextPage()) break;\n page = await page.getNextPage();\n }\n }\n}\n\n/**\n * Fetch a single page from the API and return a `Page<T>`.\n */\nexport async function fetchPage<T>(\n opts: PageRequestOptions,\n): Promise<Page<T>> {\n const { client, method, path, body, query, responseKey, options } = opts;\n\n // Build the path with query params\n let fullPath = path;\n if (query && Object.keys(query).length > 0) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n fullPath += (fullPath.includes('?') ? '&' : '?') + qs;\n }\n }\n\n let raw: Record<string, unknown>;\n if (method === 'POST') {\n raw = await client.post<Record<string, unknown>>(fullPath, body, options);\n } else {\n raw = await client.get<Record<string, unknown>>(fullPath, options);\n }\n\n const data = (raw[responseKey] as T[]) ?? [];\n const total = (typeof raw.total === 'number' ? raw.total : data.length);\n const page = (typeof raw.page === 'number' ? raw.page : 1);\n // perPage: use pageSize if provided, otherwise infer from result length or default to 25\n const perPage = (typeof raw.pageSize === 'number'\n ? raw.pageSize\n : typeof raw.perPage === 'number'\n ? raw.perPage\n : data.length > 0\n ? data.length\n : 25);\n\n return new Page<T>(data, total, page, perPage, opts);\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ContactSearchParams,\n ContactEnrichParams,\n ContactImportParams,\n Contact,\n StoredContact,\n ImportResult,\n CsvList,\n} from '../types/contacts.js';\n\n/**\n * Resource for contact search, enrichment, import, and listing.\n */\nexport class Contacts {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Search for contacts matching the given ICP criteria.\n * Returns a paginated list of enriched contacts.\n */\n async search(\n params: ContactSearchParams,\n options?: RequestOptions,\n ): Promise<Page<Contact>> {\n const { page, perPage, ...body } = params;\n return fetchPage<Contact>({\n client: this.client,\n method: 'POST',\n path: '/api/v1/contacts/search',\n body: { ...body, page: page ?? 1, perPage: perPage ?? 25 },\n responseKey: 'contacts',\n options,\n });\n }\n\n /**\n * Enrich a single contact by email, LinkedIn URL, or name+company.\n */\n async enrich(\n params: ContactEnrichParams,\n options?: RequestOptions,\n ): Promise<Contact> {\n const raw = await this.client.post<{ contact: Contact }>(\n '/api/v1/contacts/enrich',\n params,\n options,\n );\n return raw.contact;\n }\n\n /**\n * Import a batch of contacts (CSV-like).\n */\n async importCsv(\n params: ContactImportParams,\n options?: RequestOptions,\n ): Promise<ImportResult> {\n return this.client.post<ImportResult>('/api/v1/contacts/import', params, options);\n }\n\n /**\n * List stored contacts for the current user. Paginated.\n */\n async list(\n params?: { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<StoredContact>> {\n const query: Record<string, string | number> = {};\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<StoredContact>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/contacts',\n query,\n responseKey: 'contacts',\n options,\n });\n }\n\n /**\n * List all CSV lists (imports) for the current user.\n */\n async csvLists(options?: RequestOptions): Promise<CsvList[]> {\n const raw = await this.client.get<{ lists: CsvList[] }>(\n '/api/v1/contacts/csv-lists',\n options,\n );\n return raw.lists;\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n SequenceCreateParams,\n Sequence,\n SequenceWithStats,\n} from '../types/sequences.js';\n\n/**\n * Resource for managing outreach sequences.\n */\nexport class Sequences {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Create a new outreach sequence.\n */\n async create(\n params: SequenceCreateParams,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n '/api/v1/sequences',\n params,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * List all sequences for the current user. Paginated.\n */\n async list(\n params?: { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<SequenceWithStats>> {\n const query: Record<string, string | number> = {};\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<SequenceWithStats>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/sequences',\n query,\n responseKey: 'sequences',\n options,\n });\n }\n\n /**\n * Get a single sequence by ID.\n */\n async get(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<SequenceWithStats> {\n const raw = await this.client.get<{ sequence: SequenceWithStats }>(\n `/api/v1/sequences/${sequenceId}`,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Pause a running sequence.\n */\n async pause(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n `/api/v1/sequences/${sequenceId}/pause`,\n undefined,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Resume a paused sequence.\n */\n async resume(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n `/api/v1/sequences/${sequenceId}/resume`,\n undefined,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Stop (terminate) a sequence.\n */\n async stop(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n `/api/v1/sequences/${sequenceId}/stop`,\n undefined,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Get the current status of a sequence.\n */\n async status(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<SequenceWithStats> {\n const raw = await this.client.get<{ sequence: SequenceWithStats }>(\n `/api/v1/sequences/${sequenceId}/status`,\n options,\n );\n return raw.sequence;\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n DraftGenerateParams,\n DraftListParams,\n DraftUpdateParams,\n DraftApproveParams,\n DraftSendParams,\n Draft,\n DraftBatchResult,\n DraftApproveResult,\n DraftSendResult,\n} from '../types/drafts.js';\n\n/**\n * Resource for generating, reviewing, approving, and sending outreach drafts.\n */\nexport class Drafts {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Generate outreach drafts for a list of contacts.\n */\n async generate(\n params: DraftGenerateParams,\n options?: RequestOptions,\n ): Promise<DraftBatchResult> {\n return this.client.post<DraftBatchResult>('/api/v1/drafts/generate', params, options);\n }\n\n /**\n * List drafts, optionally filtered by conversation, batch, or status. Paginated.\n */\n async list(\n params?: DraftListParams & { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<Draft>> {\n const query: Record<string, string | number> = {};\n if (params?.conversationId) query.conversationId = params.conversationId;\n if (params?.batchId) query.batchId = params.batchId;\n if (params?.status) query.status = params.status;\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<Draft>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/drafts',\n query,\n responseKey: 'drafts',\n options,\n });\n }\n\n /**\n * Update a specific draft's subject and/or body.\n */\n async update(\n draftId: string,\n params: DraftUpdateParams,\n options?: RequestOptions,\n ): Promise<Draft> {\n const raw = await this.client.put<{ draft: Draft }>(\n `/api/v1/drafts/${draftId}`,\n params,\n options,\n );\n return raw.draft;\n }\n\n /**\n * Approve drafts by their IDs.\n */\n async approve(\n params: DraftApproveParams,\n options?: RequestOptions,\n ): Promise<DraftApproveResult> {\n return this.client.post<DraftApproveResult>('/api/v1/drafts/approve', params, options);\n }\n\n /**\n * Send approved drafts.\n */\n async send(\n params: DraftSendParams,\n options?: RequestOptions,\n ): Promise<DraftSendResult> {\n return this.client.post<DraftSendResult>('/api/v1/drafts/send', params, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n EmailSendParams,\n LinkedInSendParams,\n InstagramSendParams,\n SmsSendParams,\n EmailResult,\n LinkedInResult,\n InstagramResult,\n SmsResult,\n InboxChannel,\n} from '../types/messages.js';\n\n/**\n * Resource for sending messages across channels and accessing the unified inbox.\n */\nexport class Messages {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Send an email via Gmail or AgentMail.\n */\n async sendEmail(\n params: EmailSendParams,\n options?: RequestOptions,\n ): Promise<EmailResult> {\n return this.client.post<EmailResult>('/api/v1/messages/email', params, options);\n }\n\n /**\n * Send a LinkedIn message or connection request.\n */\n async sendLinkedIn(\n params: LinkedInSendParams,\n options?: RequestOptions,\n ): Promise<LinkedInResult> {\n return this.client.post<LinkedInResult>('/api/v1/messages/linkedin', params, options);\n }\n\n /**\n * Send an Instagram DM.\n */\n async sendInstagram(\n params: InstagramSendParams,\n options?: RequestOptions,\n ): Promise<InstagramResult> {\n return this.client.post<InstagramResult>('/api/v1/messages/instagram', params, options);\n }\n\n /**\n * Send an SMS message.\n */\n async sendSms(\n params: SmsSendParams,\n options?: RequestOptions,\n ): Promise<SmsResult> {\n return this.client.post<SmsResult>('/api/v1/messages/sms', params, options);\n }\n\n /**\n * Get the unified inbox for a specific channel.\n */\n async inbox(\n channel: InboxChannel,\n options?: RequestOptions,\n ): Promise<Record<string, unknown>> {\n return this.client.get<Record<string, unknown>>(\n `/api/v1/messages/inbox/${channel}`,\n options,\n );\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ChatCreateParams,\n ChatResponse,\n Conversation,\n ConversationMessage,\n} from '../types/chat.js';\n\n/**\n * Sub-resource for conversation management.\n */\nexport class ConversationsResource {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * List all conversations.\n */\n async list(options?: RequestOptions): Promise<Conversation[]> {\n const raw = await this.client.get<{ conversations: Conversation[] }>(\n '/api/v1/chat/conversations',\n options,\n );\n return raw.conversations;\n }\n\n /**\n * Get messages for a specific conversation.\n */\n async get(\n conversationId: string,\n options?: RequestOptions,\n ): Promise<ConversationMessage[]> {\n const raw = await this.client.get<{ messages: ConversationMessage[] }>(\n `/api/v1/chat/conversations/${conversationId}`,\n options,\n );\n return raw.messages;\n }\n\n /**\n * Delete a conversation.\n */\n async delete(\n conversationId: string,\n options?: RequestOptions,\n ): Promise<void> {\n await this.client.delete(\n `/api/v1/chat/conversations/${conversationId}`,\n options,\n );\n }\n}\n\n/**\n * Resource for the AI chat assistant and conversation management.\n */\nexport class Chat {\n private readonly client: APIClient;\n\n /** Sub-resource for managing conversations. */\n readonly conversations: ConversationsResource;\n\n constructor(client: APIClient) {\n this.client = client;\n this.conversations = new ConversationsResource(client);\n }\n\n /**\n * Send a message to the AI assistant.\n */\n async create(\n params: ChatCreateParams,\n options?: RequestOptions,\n ): Promise<ChatResponse> {\n return this.client.post<ChatResponse>('/api/v1/chat', params, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ChannelName,\n ChannelStatus,\n GmailConnectResult,\n LinkedInConnectParams,\n InstagramConnectParams,\n CheckpointParams,\n ConnectionResult,\n AgentMailCreateParams,\n AgentMailCreateResult,\n SmsVerifyParams,\n SmsConfirmParams,\n SmsVerifyResult,\n} from '../types/channels.js';\n\n/**\n * Sub-resource for Gmail channel operations.\n */\nexport class GmailChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Initiate Gmail OAuth flow. Returns an authUrl for the user to visit.\n */\n async connect(options?: RequestOptions): Promise<GmailConnectResult> {\n return this.client.post<GmailConnectResult>('/api/v1/channels/gmail/connect', undefined, options);\n }\n}\n\n/**\n * Sub-resource for LinkedIn channel operations.\n */\nexport class LinkedInChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Connect a LinkedIn account with credentials.\n */\n async connect(\n params: LinkedInConnectParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/linkedin/connect', params, options);\n }\n\n /**\n * Resolve a LinkedIn 2FA checkpoint.\n */\n async checkpoint(\n params: CheckpointParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/linkedin/checkpoint', params, options);\n }\n}\n\n/**\n * Sub-resource for Instagram channel operations.\n */\nexport class InstagramChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Connect an Instagram account with credentials.\n */\n async connect(\n params: InstagramConnectParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/instagram/connect', params, options);\n }\n\n /**\n * Resolve an Instagram 2FA checkpoint.\n */\n async checkpoint(\n params: CheckpointParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/instagram/checkpoint', params, options);\n }\n}\n\n/**\n * Sub-resource for AgentMail channel operations.\n */\nexport class AgentMailChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Create a new AgentMail address.\n */\n async create(\n params: AgentMailCreateParams,\n options?: RequestOptions,\n ): Promise<AgentMailCreateResult> {\n return this.client.post<AgentMailCreateResult>('/api/v1/channels/agentmail/create', params, options);\n }\n}\n\n/**\n * Sub-resource for SMS channel operations.\n */\nexport class SmsChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Initiate SMS verification for a phone number.\n */\n async verify(\n params: SmsVerifyParams,\n options?: RequestOptions,\n ): Promise<SmsVerifyResult> {\n return this.client.post<SmsVerifyResult>('/api/v1/channels/sms/verify', params, options);\n }\n\n /**\n * Confirm SMS verification with the code.\n */\n async confirm(\n params: SmsConfirmParams,\n options?: RequestOptions,\n ): Promise<SmsVerifyResult> {\n return this.client.post<SmsVerifyResult>('/api/v1/channels/sms/confirm', params, options);\n }\n}\n\n/**\n * Resource for managing channel connections (Gmail, LinkedIn, Instagram, AgentMail, SMS).\n */\nexport class Channels {\n private readonly client: APIClient;\n\n /** Gmail channel operations. */\n readonly gmail: GmailChannel;\n /** LinkedIn channel operations. */\n readonly linkedin: LinkedInChannel;\n /** Instagram channel operations. */\n readonly instagram: InstagramChannel;\n /** AgentMail channel operations. */\n readonly agentmail: AgentMailChannel;\n /** SMS channel operations. */\n readonly sms: SmsChannel;\n\n constructor(client: APIClient) {\n this.client = client;\n this.gmail = new GmailChannel(client);\n this.linkedin = new LinkedInChannel(client);\n this.instagram = new InstagramChannel(client);\n this.agentmail = new AgentMailChannel(client);\n this.sms = new SmsChannel(client);\n }\n\n /**\n * Get the connection status of all channels.\n */\n async status(options?: RequestOptions): Promise<ChannelStatus> {\n return this.client.get<ChannelStatus>('/api/v1/channels/status', options);\n }\n\n /**\n * Disconnect a specific channel.\n */\n async disconnect(\n channel: ChannelName,\n options?: RequestOptions,\n ): Promise<void> {\n await this.client.post(`/api/v1/channels/${channel}/disconnect`, undefined, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type { DocumentUploadParams, Document } from '../types/documents.js';\n\n/**\n * Resource for uploading, listing, and deleting documents.\n */\nexport class Documents {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Upload a document.\n */\n async upload(\n params: DocumentUploadParams,\n options?: RequestOptions,\n ): Promise<Document> {\n const raw = await this.client.post<{ document: Document }>(\n '/api/v1/documents',\n params,\n options,\n );\n return raw.document;\n }\n\n /**\n * List all documents. Paginated.\n */\n async list(\n params?: { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<Document>> {\n const query: Record<string, string | number> = {};\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<Document>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/documents',\n query,\n responseKey: 'documents',\n options,\n });\n }\n\n /**\n * Delete a document by ID.\n */\n async delete(\n documentId: string,\n options?: RequestOptions,\n ): Promise<void> {\n await this.client.delete(`/api/v1/documents/${documentId}`, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ICPAnalysis,\n ChannelRecommendation,\n SequenceStrategy,\n} from '../types/recommendations.js';\n\n/**\n * Resource for AI-powered recommendations (ICP analysis, channel selection, sequence strategy).\n */\nexport class Recommendations {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Get an ICP analysis recommendation.\n */\n async icpAnalysis(options?: RequestOptions): Promise<ICPAnalysis> {\n return this.client.get<ICPAnalysis>('/api/v1/recommendations/icp', options);\n }\n\n /**\n * Get a channel recommendation.\n */\n async channel(options?: RequestOptions): Promise<ChannelRecommendation> {\n return this.client.get<ChannelRecommendation>('/api/v1/recommendations/channel', options);\n }\n\n /**\n * Get a sequence strategy recommendation.\n */\n async sequenceStrategy(options?: RequestOptions): Promise<SequenceStrategy> {\n return this.client.get<SequenceStrategy>('/api/v1/recommendations/sequence-strategy', options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n CreditBalance,\n UsageEntry,\n UsageSummary,\n UsageListParams,\n} from '../types/billing.js';\n\n/**\n * Resource for credit balance and usage tracking.\n */\nexport class Billing {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Get the current credit balance.\n */\n async balance(options?: RequestOptions): Promise<CreditBalance> {\n return this.client.get<CreditBalance>('/api/v1/billing/balance', options);\n }\n\n /**\n * List usage entries. Paginated.\n */\n async usage(\n params?: UsageListParams,\n options?: RequestOptions,\n ): Promise<Page<UsageEntry>> {\n const query: Record<string, string | number> = {};\n if (params?.from) query.from = params.from;\n if (params?.to) query.to = params.to;\n if (params?.page) query.page = params.page;\n\n return fetchPage<UsageEntry>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/billing/usage',\n query,\n responseKey: 'usage',\n options,\n });\n }\n\n /**\n * Get an aggregated usage summary.\n */\n async usageSummary(options?: RequestOptions): Promise<UsageSummary> {\n return this.client.get<UsageSummary>('/api/v1/billing/usage/summary', options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type { UserRegisterParams, UserUpdateParams, User } from '../types/users.js';\n\n/**\n * Resource for user registration and profile management.\n */\nexport class Users {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Register a new user.\n */\n async register(\n params: UserRegisterParams,\n options?: RequestOptions,\n ): Promise<User> {\n const raw = await this.client.post<{ user: User }>(\n '/api/v1/users/register',\n params,\n options,\n );\n return raw.user;\n }\n\n /**\n * Get the current user's profile.\n */\n async me(options?: RequestOptions): Promise<User> {\n const raw = await this.client.get<{ user: User }>('/api/v1/users/me', options);\n return raw.user;\n }\n\n /**\n * Update the current user's profile.\n */\n async update(\n params: UserUpdateParams,\n options?: RequestOptions,\n ): Promise<User> {\n const raw = await this.client.put<{ user: User }>(\n '/api/v1/users/me',\n params,\n options,\n );\n return raw.user;\n }\n}\n","import { APIClient } from './core/api-client.js';\nimport { GeoDedoError } from './core/errors.js';\nimport type { ClientOptions } from './types/shared.js';\n\nimport { Contacts } from './resources/contacts.js';\nimport { Sequences } from './resources/sequences.js';\nimport { Drafts } from './resources/drafts.js';\nimport { Messages } from './resources/messages.js';\nimport { Chat } from './resources/chat.js';\nimport { Channels } from './resources/channels.js';\nimport { Documents } from './resources/documents.js';\nimport { Recommendations } from './resources/recommendations.js';\nimport { Billing } from './resources/billing.js';\nimport { Users } from './resources/users.js';\n\n/**\n * Detect whether we are running in a browser-like environment.\n */\nfunction isBrowser(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined'\n );\n}\n\n/**\n * GeoDedo — the main SDK client.\n *\n * ```ts\n * const client = new GeoDedo({ apiKey: 'gd_live_xxx' });\n * const contacts = await client.contacts.search({ titles: ['CEO'] });\n * ```\n */\nexport class GeoDedo {\n private readonly _client: APIClient;\n\n /** Contact search, enrichment, and import. */\n readonly contacts: Contacts;\n /** Outreach sequence management. */\n readonly sequences: Sequences;\n /** Draft generation, review, and sending. */\n readonly drafts: Drafts;\n /** Direct message sending (email, LinkedIn, Instagram, SMS). */\n readonly messages: Messages;\n /** AI chat assistant. */\n readonly chat: Chat;\n /** Channel connection management. */\n readonly channels: Channels;\n /** Document upload and management. */\n readonly documents: Documents;\n /** AI-powered recommendations. */\n readonly recommendations: Recommendations;\n /** Credit balance and usage tracking. */\n readonly billing: Billing;\n /** User registration and profile management. */\n readonly users: Users;\n\n constructor(options?: Partial<ClientOptions>) {\n // Resolve API key: explicit > env var\n let envKey: string | undefined;\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\n envKey = (globalThis as Record<string, any>).process?.env?.GEODEDO_API_KEY;\n }\n } catch {\n // Ignore — env access not available\n }\n const apiKey = options?.apiKey ?? envKey;\n\n if (!apiKey) {\n throw new GeoDedoError(\n 'The GEODEDO_API_KEY environment variable is missing or empty; either provide it, or pass the `apiKey` option to the GeoDedo constructor.',\n );\n }\n\n // Browser safety check\n if (isBrowser() && !options?.dangerouslyAllowBrowser) {\n throw new GeoDedoError(\n \"It looks like you're running in a browser-like environment.\\n\\n\" +\n 'This is disabled by default, as it risks exposing your secret API key to attackers.\\n' +\n 'If you understand the risks and have appropriate mitigations in place,\\n' +\n 'you can set the `dangerouslyAllowBrowser` option to `true`, e.g.,\\n\\n' +\n \"new GeoDedo({ apiKey: '...', dangerouslyAllowBrowser: true })\",\n );\n }\n\n this._client = new APIClient({\n apiKey,\n userId: options?.userId,\n baseURL: options?.baseURL,\n maxRetries: options?.maxRetries,\n timeout: options?.timeout,\n });\n\n // Initialize all resource namespaces\n this.contacts = new Contacts(this._client);\n this.sequences = new Sequences(this._client);\n this.drafts = new Drafts(this._client);\n this.messages = new Messages(this._client);\n this.chat = new Chat(this._client);\n this.channels = new Channels(this._client);\n this.documents = new Documents(this._client);\n this.recommendations = new Recommendations(this._client);\n this.billing = new Billing(this._client);\n this.users = new Users(this._client);\n }\n}\n"],"mappings":"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","names":["parsed"]}
1
+ {"version":3,"sources":["../src/core/errors.ts","../src/core/api-client.ts","../src/core/pagination.ts","../src/resources/contacts.ts","../src/resources/sequences.ts","../src/resources/drafts.ts","../src/resources/messages.ts","../src/resources/chat.ts","../src/resources/channels.ts","../src/resources/documents.ts","../src/resources/recommendations.ts","../src/resources/billing.ts","../src/resources/users.ts","../src/client.ts"],"sourcesContent":["/**\n * Base error class for all GeoDedo SDK errors.\n */\nexport class GeoDedoError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GeoDedoError';\n // Restore prototype chain (required when extending builtins in TS)\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Error returned when the API responds with a non-2xx status code.\n */\nexport class APIError extends GeoDedoError {\n /** HTTP status code. */\n readonly status: number;\n /** Machine-readable error code from the response body, if present. */\n readonly code: string | undefined;\n /** Request ID from the X-Request-Id response header, if present. */\n readonly requestId: string | undefined;\n /** Raw response body. */\n readonly body: unknown;\n\n constructor(\n status: number,\n body: unknown,\n message: string,\n code?: string,\n requestId?: string,\n ) {\n super(message);\n this.name = 'APIError';\n this.status = status;\n this.code = code;\n this.requestId = requestId;\n this.body = body;\n }\n\n /**\n * Factory that maps an HTTP status code to the appropriate error subclass.\n */\n static fromResponse(\n status: number,\n body: unknown,\n headers?: Headers | Record<string, string>,\n ): APIError {\n const parsed = typeof body === 'object' && body !== null ? (body as Record<string, unknown>) : {};\n const message = typeof parsed.error === 'string' ? parsed.error : `Request failed with status ${status}`;\n const code = typeof parsed.code === 'string' ? parsed.code : undefined;\n\n // Extract request ID from headers\n let requestId: string | undefined;\n if (headers) {\n if (typeof (headers as Headers).get === 'function') {\n requestId = (headers as Headers).get('x-request-id') ?? undefined;\n } else {\n requestId = (headers as Record<string, string>)['x-request-id'];\n }\n }\n\n switch (status) {\n case 401:\n return new AuthenticationError(body, message, code, requestId);\n case 402:\n return new InsufficientCreditsError(\n body,\n message,\n code,\n requestId,\n typeof parsed.credits_needed === 'number' ? parsed.credits_needed : undefined,\n typeof parsed.credits_remaining === 'number' ? parsed.credits_remaining : undefined,\n );\n case 403:\n return new PermissionDeniedError(body, message, code, requestId);\n case 404:\n return new NotFoundError(body, message, code, requestId);\n case 422:\n return new ValidationError(body, message, code, requestId);\n case 429: {\n let retryAfter: number | undefined;\n if (headers) {\n const raw = typeof (headers as Headers).get === 'function'\n ? (headers as Headers).get('retry-after')\n : (headers as Record<string, string>)['retry-after'];\n if (raw) {\n const parsed = Number(raw);\n if (!Number.isNaN(parsed)) retryAfter = parsed;\n }\n }\n return new RateLimitError(body, message, code, requestId, retryAfter);\n }\n default:\n if (status >= 500) {\n return new InternalServerError(status, body, message, code, requestId);\n }\n return new APIError(status, body, message, code, requestId);\n }\n }\n}\n\n/**\n * 401 — Invalid or missing API key.\n */\nexport class AuthenticationError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(401, body, message, code, requestId);\n this.name = 'AuthenticationError';\n }\n}\n\n/**\n * 402 — Not enough credits to complete the request.\n */\nexport class InsufficientCreditsError extends APIError {\n /** Number of credits required for the operation. */\n readonly creditsRequired: number | undefined;\n /** Current credit balance. */\n readonly creditsRemaining: number | undefined;\n\n constructor(\n body: unknown,\n message: string,\n code?: string,\n requestId?: string,\n creditsRequired?: number,\n creditsRemaining?: number,\n ) {\n super(402, body, message, code, requestId);\n this.name = 'InsufficientCreditsError';\n this.creditsRequired = creditsRequired;\n this.creditsRemaining = creditsRemaining;\n }\n}\n\n/**\n * 403 — Authenticated but not authorized for this operation.\n */\nexport class PermissionDeniedError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(403, body, message, code, requestId);\n this.name = 'PermissionDeniedError';\n }\n}\n\n/**\n * 404 — The requested resource was not found.\n */\nexport class NotFoundError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(404, body, message, code, requestId);\n this.name = 'NotFoundError';\n }\n}\n\n/**\n * 422 — Validation error in the request body or parameters.\n */\nexport class ValidationError extends APIError {\n constructor(body: unknown, message: string, code?: string, requestId?: string) {\n super(422, body, message, code, requestId);\n this.name = 'ValidationError';\n }\n}\n\n/**\n * 429 — Rate limit exceeded.\n */\nexport class RateLimitError extends APIError {\n /** Seconds to wait before retrying, from the Retry-After header. */\n readonly retryAfter: number | undefined;\n\n constructor(\n body: unknown,\n message: string,\n code?: string,\n requestId?: string,\n retryAfter?: number,\n ) {\n super(429, body, message, code, requestId);\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/**\n * 5xx — Internal server error.\n */\nexport class InternalServerError extends APIError {\n constructor(status: number, body: unknown, message: string, code?: string, requestId?: string) {\n super(status, body, message, code, requestId);\n this.name = 'InternalServerError';\n }\n}\n\n/**\n * Network-level failure (DNS, socket, TLS, etc.).\n */\nexport class APIConnectionError extends GeoDedoError {\n /** The underlying error that caused the connection failure. */\n readonly cause: unknown;\n\n constructor(message: string, cause?: unknown) {\n super(message);\n this.name = 'APIConnectionError';\n this.cause = cause;\n }\n}\n\n/**\n * Request timed out before receiving a response.\n */\nexport class APITimeoutError extends APIConnectionError {\n constructor(message: string = 'Request timed out') {\n super(message);\n this.name = 'APITimeoutError';\n }\n}\n","import type { RequestOptions } from '../types/shared.js';\nimport {\n APIError,\n APIConnectionError,\n APITimeoutError,\n} from './errors.js';\n\nconst VERSION = '0.1.0';\nconst DEFAULT_BASE_URL = 'https://geodedo-api.vercel.app';\nconst DEFAULT_TIMEOUT = 60_000; // 60 seconds\nconst DEFAULT_MAX_RETRIES = 2;\nconst MIN_RETRY_DELAY = 500; // 0.5s\nconst MAX_RETRY_DELAY = 5_000; // 5s\n\n/** HTTP methods supported by the client. */\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n\n/** Status codes that are eligible for retry. */\nconst RETRYABLE_STATUS_CODES = new Set([429, 409, 500, 502, 503, 504]);\n\nexport interface APIClientOptions {\n apiKey: string;\n userId?: string;\n baseURL?: string;\n maxRetries?: number;\n timeout?: number;\n}\n\n/**\n * Low-level HTTP client that handles auth, retries, timeouts, and error mapping.\n * Uses the built-in `fetch` API (available in Node 18+).\n */\nexport class APIClient {\n readonly apiKey: string;\n readonly userId: string | undefined;\n readonly baseURL: string;\n readonly maxRetries: number;\n readonly timeout: number;\n\n constructor(options: APIClientOptions) {\n this.apiKey = options.apiKey;\n this.userId = options.userId;\n this.baseURL = (options.baseURL ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n this.maxRetries = options.maxRetries ?? DEFAULT_MAX_RETRIES;\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n }\n\n /**\n * Core request method. All convenience methods delegate here.\n */\n async request<T>(\n method: HttpMethod,\n path: string,\n body?: unknown,\n options?: RequestOptions,\n ): Promise<T> {\n const url = `${this.baseURL}${path}`;\n\n const apiKey = options?.apiKey ?? this.apiKey;\n const userId = options?.userId ?? this.userId;\n const timeout = options?.timeout ?? this.timeout;\n\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': `geodedo-node/${VERSION}`,\n ...options?.headers,\n };\n\n if (userId) {\n headers['X-User-Id'] = userId;\n }\n\n const maxRetries = this.maxRetries;\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n // Create a fresh AbortController per attempt for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n // If the caller provided a signal, forward its abort\n const externalSignal = options?.signal;\n let onExternalAbort: (() => void) | undefined;\n if (externalSignal) {\n if (externalSignal.aborted) {\n clearTimeout(timeoutId);\n throw new APITimeoutError('Request aborted');\n }\n onExternalAbort = () => controller.abort();\n externalSignal.addEventListener('abort', onExternalAbort, { once: true });\n }\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers,\n signal: controller.signal,\n };\n\n if (body !== undefined && method !== 'GET') {\n fetchOptions.body = JSON.stringify(body);\n }\n\n let response: Response;\n try {\n response = await fetch(url, fetchOptions);\n } catch (err: unknown) {\n // Distinguish timeout from other network errors\n if (controller.signal.aborted) {\n throw new APITimeoutError();\n }\n throw new APIConnectionError(\n `Connection error: ${err instanceof Error ? err.message : String(err)}`,\n err,\n );\n } finally {\n clearTimeout(timeoutId);\n if (externalSignal && onExternalAbort) {\n externalSignal.removeEventListener('abort', onExternalAbort);\n }\n }\n\n // Success: parse response\n if (response.ok) {\n // 204 No Content\n if (response.status === 204) {\n return undefined as T;\n }\n return (await response.json()) as T;\n }\n\n // Parse error body\n let errorBody: unknown;\n try {\n errorBody = await response.json();\n } catch {\n errorBody = { error: response.statusText };\n }\n\n const apiError = APIError.fromResponse(response.status, errorBody, response.headers);\n\n // Retry on retryable status codes (but not on last attempt)\n if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < maxRetries) {\n lastError = apiError;\n await this.sleep(this.retryDelay(attempt));\n continue;\n }\n\n throw apiError;\n } catch (err) {\n // If it's a connection/timeout error and we have retries left, retry\n if (\n (err instanceof APIConnectionError || err instanceof APITimeoutError) &&\n attempt < maxRetries\n ) {\n lastError = err;\n await this.sleep(this.retryDelay(attempt));\n continue;\n }\n\n // If it's already one of our error types, just throw it\n if (err instanceof APIError || err instanceof APIConnectionError) {\n throw err;\n }\n\n // Unexpected error — wrap it\n throw new APIConnectionError(\n `Unexpected error: ${err instanceof Error ? err.message : String(err)}`,\n err,\n );\n }\n }\n\n // Should not reach here, but if we do, throw the last error\n throw lastError;\n }\n\n /** Calculate retry delay with exponential backoff and jitter. */\n private retryDelay(attempt: number): number {\n // Exponential backoff: 0.5s, 1s, 2s, 4s, ...\n const base = MIN_RETRY_DELAY * Math.pow(2, attempt);\n const capped = Math.min(base, MAX_RETRY_DELAY);\n // Add jitter: random value between 0 and capped\n const jitter = Math.random() * capped;\n return Math.min(capped + jitter, MAX_RETRY_DELAY);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n // ── Convenience methods ─────────────────────────────────────────────\n\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('GET', path, undefined, options);\n }\n\n async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('POST', path, body, options);\n }\n\n async put<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>('PUT', path, body, options);\n }\n\n async delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>('DELETE', path, undefined, options);\n }\n}\n","import type { APIClient } from './api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\n\n/**\n * Options needed to fetch the next page of a paginated result.\n */\nexport interface PageRequestOptions {\n /** The API client to use for fetching. */\n client: APIClient;\n /** HTTP method (GET or POST). */\n method: 'GET' | 'POST';\n /** API path. */\n path: string;\n /** Request body (for POST-based pagination like contact search). */\n body?: Record<string, unknown>;\n /** Query parameters appended to the URL. */\n query?: Record<string, string | number>;\n /** The key in the response that contains the array of items. */\n responseKey: string;\n /** Per-request options (auth overrides, etc.). */\n options?: RequestOptions;\n}\n\n/**\n * A single page of results from a paginated API endpoint.\n *\n * Supports:\n * - `data` / `total` / `page` accessors\n * - `hasNextPage()` / `getNextPage()` for manual iteration\n * - `Symbol.asyncIterator` for `for await...of` across all pages\n */\nexport class Page<T> {\n /** The items on this page. */\n readonly data: T[];\n /** Total number of items across all pages. */\n readonly total: number;\n /** Current page number (1-indexed). */\n readonly page: number;\n /** Number of items per page (inferred from the current page size). */\n readonly perPage: number;\n\n private readonly _requestOptions: PageRequestOptions;\n\n constructor(\n data: T[],\n total: number,\n page: number,\n perPage: number,\n requestOptions: PageRequestOptions,\n ) {\n this.data = data;\n this.total = total;\n this.page = page;\n this.perPage = perPage;\n this._requestOptions = requestOptions;\n }\n\n /**\n * Whether there is a next page available.\n */\n hasNextPage(): boolean {\n return this.page * this.perPage < this.total;\n }\n\n /**\n * Fetch the next page. Throws if there is no next page.\n */\n async getNextPage(): Promise<Page<T>> {\n if (!this.hasNextPage()) {\n throw new Error('No more pages available');\n }\n return fetchPage<T>({\n ...this._requestOptions,\n query: {\n ...this._requestOptions.query,\n page: this.page + 1,\n },\n body: this._requestOptions.body\n ? { ...this._requestOptions.body, page: this.page + 1 }\n : undefined,\n });\n }\n\n /**\n * Async iterator that yields every item across all pages,\n * automatically fetching subsequent pages as needed.\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page: Page<T> = this;\n while (true) {\n for (const item of page.data) {\n yield item;\n }\n if (!page.hasNextPage()) break;\n page = await page.getNextPage();\n }\n }\n}\n\n/**\n * Fetch a single page from the API and return a `Page<T>`.\n */\nexport async function fetchPage<T>(\n opts: PageRequestOptions,\n): Promise<Page<T>> {\n const { client, method, path, body, query, responseKey, options } = opts;\n\n // Build the path with query params\n let fullPath = path;\n if (query && Object.keys(query).length > 0) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) {\n params.set(key, String(value));\n }\n }\n const qs = params.toString();\n if (qs) {\n fullPath += (fullPath.includes('?') ? '&' : '?') + qs;\n }\n }\n\n let raw: Record<string, unknown>;\n if (method === 'POST') {\n raw = await client.post<Record<string, unknown>>(fullPath, body, options);\n } else {\n raw = await client.get<Record<string, unknown>>(fullPath, options);\n }\n\n const data = (raw[responseKey] as T[]) ?? [];\n const total = (typeof raw.total === 'number' ? raw.total : data.length);\n const page = (typeof raw.page === 'number' ? raw.page : 1);\n // perPage: use pageSize if provided, otherwise infer from result length or default to 25\n const perPage = (typeof raw.pageSize === 'number'\n ? raw.pageSize\n : typeof raw.perPage === 'number'\n ? raw.perPage\n : data.length > 0\n ? data.length\n : 25);\n\n return new Page<T>(data, total, page, perPage, opts);\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ContactSearchParams,\n ContactEnrichParams,\n ContactImportParams,\n Contact,\n StoredContact,\n ImportResult,\n CsvList,\n} from '../types/contacts.js';\n\n/**\n * Resource for contact search, enrichment, import, and listing.\n */\nexport class Contacts {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Search for contacts matching the given ICP criteria.\n * Returns a paginated list of enriched contacts.\n */\n async search(\n params: ContactSearchParams,\n options?: RequestOptions,\n ): Promise<Page<Contact>> {\n const { page, perPage, ...body } = params;\n return fetchPage<Contact>({\n client: this.client,\n method: 'POST',\n path: '/api/v1/contacts/search',\n body: { ...body, page: page ?? 1, perPage: perPage ?? 25 },\n responseKey: 'contacts',\n options,\n });\n }\n\n /**\n * Enrich a single contact by email, LinkedIn URL, or name+company.\n */\n async enrich(\n params: ContactEnrichParams,\n options?: RequestOptions,\n ): Promise<Contact> {\n const raw = await this.client.post<{ contact: Contact }>(\n '/api/v1/contacts/enrich',\n params,\n options,\n );\n return raw.contact;\n }\n\n /**\n * Import a batch of contacts (CSV-like).\n */\n async importCsv(\n params: ContactImportParams,\n options?: RequestOptions,\n ): Promise<ImportResult> {\n return this.client.post<ImportResult>('/api/v1/contacts/import', params, options);\n }\n\n /**\n * List stored contacts for the current user. Paginated.\n */\n async list(\n params?: { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<StoredContact>> {\n const query: Record<string, string | number> = {};\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<StoredContact>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/contacts',\n query,\n responseKey: 'contacts',\n options,\n });\n }\n\n /**\n * List all CSV lists (imports) for the current user.\n */\n async csvLists(options?: RequestOptions): Promise<CsvList[]> {\n const raw = await this.client.get<{ lists: CsvList[] }>(\n '/api/v1/contacts/csv-lists',\n options,\n );\n return raw.lists;\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n SequenceCreateParams,\n Sequence,\n SequenceWithStats,\n} from '../types/sequences.js';\n\n/**\n * Resource for managing outreach sequences.\n */\nexport class Sequences {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Create a new outreach sequence.\n */\n async create(\n params: SequenceCreateParams,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n '/api/v1/sequences',\n params,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * List all sequences for the current user. Paginated.\n */\n async list(\n params?: { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<SequenceWithStats>> {\n const query: Record<string, string | number> = {};\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<SequenceWithStats>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/sequences',\n query,\n responseKey: 'sequences',\n options,\n });\n }\n\n /**\n * Get a single sequence by ID.\n */\n async get(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<SequenceWithStats> {\n const raw = await this.client.get<{ sequence: SequenceWithStats }>(\n `/api/v1/sequences/${sequenceId}`,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Pause a running sequence.\n */\n async pause(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n `/api/v1/sequences/${sequenceId}/pause`,\n undefined,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Resume a paused sequence.\n */\n async resume(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n `/api/v1/sequences/${sequenceId}/resume`,\n undefined,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Stop (terminate) a sequence.\n */\n async stop(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<Sequence> {\n const raw = await this.client.post<{ sequence: Sequence }>(\n `/api/v1/sequences/${sequenceId}/stop`,\n undefined,\n options,\n );\n return raw.sequence;\n }\n\n /**\n * Get the current status of a sequence.\n */\n async status(\n sequenceId: string,\n options?: RequestOptions,\n ): Promise<SequenceWithStats> {\n const raw = await this.client.get<{ sequence: SequenceWithStats }>(\n `/api/v1/sequences/${sequenceId}/status`,\n options,\n );\n return raw.sequence;\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n DraftGenerateParams,\n DraftListParams,\n DraftUpdateParams,\n DraftApproveParams,\n DraftSendParams,\n Draft,\n DraftBatchResult,\n DraftApproveResult,\n DraftSendResult,\n} from '../types/drafts.js';\n\n/**\n * Resource for generating, reviewing, approving, and sending outreach drafts.\n */\nexport class Drafts {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Generate outreach drafts for a list of contacts.\n */\n async generate(\n params: DraftGenerateParams,\n options?: RequestOptions,\n ): Promise<DraftBatchResult> {\n return this.client.post<DraftBatchResult>('/api/v1/drafts/generate', params, options);\n }\n\n /**\n * List drafts, optionally filtered by conversation, batch, or status. Paginated.\n */\n async list(\n params?: DraftListParams & { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<Draft>> {\n const query: Record<string, string | number> = {};\n if (params?.conversationId) query.conversationId = params.conversationId;\n if (params?.batchId) query.batchId = params.batchId;\n if (params?.status) query.status = params.status;\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<Draft>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/drafts',\n query,\n responseKey: 'drafts',\n options,\n });\n }\n\n /**\n * Update a specific draft's subject and/or body.\n */\n async update(\n draftId: string,\n params: DraftUpdateParams,\n options?: RequestOptions,\n ): Promise<Draft> {\n const raw = await this.client.put<{ draft: Draft }>(\n `/api/v1/drafts/${draftId}`,\n params,\n options,\n );\n return raw.draft;\n }\n\n /**\n * Approve drafts by their IDs.\n */\n async approve(\n params: DraftApproveParams,\n options?: RequestOptions,\n ): Promise<DraftApproveResult> {\n return this.client.post<DraftApproveResult>('/api/v1/drafts/approve', params, options);\n }\n\n /**\n * Send approved drafts.\n */\n async send(\n params: DraftSendParams,\n options?: RequestOptions,\n ): Promise<DraftSendResult> {\n return this.client.post<DraftSendResult>('/api/v1/drafts/send', params, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n EmailSendParams,\n LinkedInSendParams,\n InstagramSendParams,\n SmsSendParams,\n EmailResult,\n LinkedInResult,\n InstagramResult,\n SmsResult,\n InboxChannel,\n} from '../types/messages.js';\n\n/**\n * Resource for sending messages across channels and accessing the unified inbox.\n */\nexport class Messages {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Send an email via Gmail or AgentMail.\n */\n async sendEmail(\n params: EmailSendParams,\n options?: RequestOptions,\n ): Promise<EmailResult> {\n return this.client.post<EmailResult>('/api/v1/messages/email', params, options);\n }\n\n /**\n * Send a LinkedIn message or connection request.\n */\n async sendLinkedIn(\n params: LinkedInSendParams,\n options?: RequestOptions,\n ): Promise<LinkedInResult> {\n return this.client.post<LinkedInResult>('/api/v1/messages/linkedin', params, options);\n }\n\n /**\n * Send an Instagram DM.\n */\n async sendInstagram(\n params: InstagramSendParams,\n options?: RequestOptions,\n ): Promise<InstagramResult> {\n return this.client.post<InstagramResult>('/api/v1/messages/instagram', params, options);\n }\n\n /**\n * Send an SMS message.\n */\n async sendSms(\n params: SmsSendParams,\n options?: RequestOptions,\n ): Promise<SmsResult> {\n return this.client.post<SmsResult>('/api/v1/messages/sms', params, options);\n }\n\n /**\n * Get the unified inbox for a specific channel.\n */\n async inbox(\n channel: InboxChannel,\n options?: RequestOptions,\n ): Promise<Record<string, unknown>> {\n return this.client.get<Record<string, unknown>>(\n `/api/v1/messages/inbox/${channel}`,\n options,\n );\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ChatCreateParams,\n ChatResponse,\n Conversation,\n ConversationMessage,\n} from '../types/chat.js';\n\n/**\n * Sub-resource for conversation management.\n */\nexport class ConversationsResource {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * List all conversations.\n */\n async list(options?: RequestOptions): Promise<Conversation[]> {\n const raw = await this.client.get<{ conversations: Conversation[] }>(\n '/api/v1/chat/conversations',\n options,\n );\n return raw.conversations;\n }\n\n /**\n * Get messages for a specific conversation.\n */\n async get(\n conversationId: string,\n options?: RequestOptions,\n ): Promise<ConversationMessage[]> {\n const raw = await this.client.get<{ messages: ConversationMessage[] }>(\n `/api/v1/chat/conversations/${conversationId}`,\n options,\n );\n return raw.messages;\n }\n\n /**\n * Delete a conversation.\n */\n async delete(\n conversationId: string,\n options?: RequestOptions,\n ): Promise<void> {\n await this.client.delete(\n `/api/v1/chat/conversations/${conversationId}`,\n options,\n );\n }\n}\n\n/**\n * Resource for the AI chat assistant and conversation management.\n */\nexport class Chat {\n private readonly client: APIClient;\n\n /** Sub-resource for managing conversations. */\n readonly conversations: ConversationsResource;\n\n constructor(client: APIClient) {\n this.client = client;\n this.conversations = new ConversationsResource(client);\n }\n\n /**\n * Send a message to the AI assistant.\n */\n async create(\n params: ChatCreateParams,\n options?: RequestOptions,\n ): Promise<ChatResponse> {\n return this.client.post<ChatResponse>('/api/v1/chat', params, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ChannelName,\n ChannelStatus,\n GmailConnectResult,\n LinkedInConnectParams,\n InstagramConnectParams,\n CheckpointParams,\n ConnectionResult,\n AgentMailCreateParams,\n AgentMailCreateResult,\n SmsVerifyParams,\n SmsConfirmParams,\n SmsVerifyResult,\n} from '../types/channels.js';\n\n/**\n * Sub-resource for Gmail channel operations.\n */\nexport class GmailChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Initiate Gmail OAuth flow. Returns an authUrl for the user to visit.\n */\n async connect(options?: RequestOptions): Promise<GmailConnectResult> {\n return this.client.post<GmailConnectResult>('/api/v1/channels/gmail/connect', undefined, options);\n }\n}\n\n/**\n * Sub-resource for LinkedIn channel operations.\n */\nexport class LinkedInChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Connect a LinkedIn account with credentials.\n */\n async connect(\n params: LinkedInConnectParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/linkedin/connect', params, options);\n }\n\n /**\n * Resolve a LinkedIn 2FA checkpoint.\n */\n async checkpoint(\n params: CheckpointParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/linkedin/checkpoint', params, options);\n }\n}\n\n/**\n * Sub-resource for Instagram channel operations.\n */\nexport class InstagramChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Connect an Instagram account with credentials.\n */\n async connect(\n params: InstagramConnectParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/instagram/connect', params, options);\n }\n\n /**\n * Resolve an Instagram 2FA checkpoint.\n */\n async checkpoint(\n params: CheckpointParams,\n options?: RequestOptions,\n ): Promise<ConnectionResult> {\n return this.client.post<ConnectionResult>('/api/v1/channels/instagram/checkpoint', params, options);\n }\n}\n\n/**\n * Sub-resource for AgentMail channel operations.\n */\nexport class AgentMailChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Create a new AgentMail address.\n */\n async create(\n params: AgentMailCreateParams,\n options?: RequestOptions,\n ): Promise<AgentMailCreateResult> {\n return this.client.post<AgentMailCreateResult>('/api/v1/channels/agentmail/create', params, options);\n }\n}\n\n/**\n * Sub-resource for SMS channel operations.\n */\nexport class SmsChannel {\n private readonly client: APIClient;\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Initiate SMS verification for a phone number.\n */\n async verify(\n params: SmsVerifyParams,\n options?: RequestOptions,\n ): Promise<SmsVerifyResult> {\n return this.client.post<SmsVerifyResult>('/api/v1/channels/sms/verify', params, options);\n }\n\n /**\n * Confirm SMS verification with the code.\n */\n async confirm(\n params: SmsConfirmParams,\n options?: RequestOptions,\n ): Promise<SmsVerifyResult> {\n return this.client.post<SmsVerifyResult>('/api/v1/channels/sms/confirm', params, options);\n }\n}\n\n/**\n * Resource for managing channel connections (Gmail, LinkedIn, Instagram, AgentMail, SMS).\n */\nexport class Channels {\n private readonly client: APIClient;\n\n /** Gmail channel operations. */\n readonly gmail: GmailChannel;\n /** LinkedIn channel operations. */\n readonly linkedin: LinkedInChannel;\n /** Instagram channel operations. */\n readonly instagram: InstagramChannel;\n /** AgentMail channel operations. */\n readonly agentmail: AgentMailChannel;\n /** SMS channel operations. */\n readonly sms: SmsChannel;\n\n constructor(client: APIClient) {\n this.client = client;\n this.gmail = new GmailChannel(client);\n this.linkedin = new LinkedInChannel(client);\n this.instagram = new InstagramChannel(client);\n this.agentmail = new AgentMailChannel(client);\n this.sms = new SmsChannel(client);\n }\n\n /**\n * Get the connection status of all channels.\n */\n async status(options?: RequestOptions): Promise<ChannelStatus> {\n return this.client.get<ChannelStatus>('/api/v1/channels/status', options);\n }\n\n /**\n * Disconnect a specific channel.\n */\n async disconnect(\n channel: ChannelName,\n options?: RequestOptions,\n ): Promise<void> {\n await this.client.post(`/api/v1/channels/${channel}/disconnect`, undefined, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type { DocumentUploadParams, Document } from '../types/documents.js';\n\n/**\n * Resource for uploading, listing, and deleting documents.\n */\nexport class Documents {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Upload a document.\n */\n async upload(\n params: DocumentUploadParams,\n options?: RequestOptions,\n ): Promise<Document> {\n return this.client.post<Document>(\n '/api/v1/documents',\n params,\n options,\n );\n }\n\n /**\n * List all documents. Paginated.\n */\n async list(\n params?: { page?: number; perPage?: number },\n options?: RequestOptions,\n ): Promise<Page<Document>> {\n const query: Record<string, string | number> = {};\n if (params?.page) query.page = params.page;\n if (params?.perPage) query.perPage = params.perPage;\n\n return fetchPage<Document>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/documents',\n query,\n responseKey: 'documents',\n options,\n });\n }\n\n /**\n * Delete a document by ID.\n */\n async delete(\n documentId: string,\n options?: RequestOptions,\n ): Promise<void> {\n await this.client.delete(`/api/v1/documents/${documentId}`, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n ICPAnalysis,\n ChannelRecommendation,\n SequenceStrategy,\n} from '../types/recommendations.js';\n\n/**\n * Resource for AI-powered recommendations (ICP analysis, channel selection, sequence strategy).\n */\nexport class Recommendations {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Get an ICP analysis recommendation.\n */\n async icpAnalysis(options?: RequestOptions): Promise<ICPAnalysis> {\n return this.client.post<ICPAnalysis>('/api/v1/recommendations/icp-analysis', undefined, options);\n }\n\n /**\n * Get a channel recommendation.\n */\n async channel(options?: RequestOptions): Promise<ChannelRecommendation> {\n return this.client.post<ChannelRecommendation>('/api/v1/recommendations/channel', undefined, options);\n }\n\n /**\n * Get a sequence strategy recommendation.\n */\n async sequenceStrategy(options?: RequestOptions): Promise<SequenceStrategy> {\n return this.client.post<SequenceStrategy>('/api/v1/recommendations/sequence-strategy', undefined, options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport { Page, fetchPage } from '../core/pagination.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type {\n CreditBalance,\n UsageEntry,\n UsageSummary,\n UsageListParams,\n} from '../types/billing.js';\n\n/**\n * Resource for credit balance and usage tracking.\n */\nexport class Billing {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Get the current credit balance.\n */\n async balance(options?: RequestOptions): Promise<CreditBalance> {\n return this.client.get<CreditBalance>('/api/v1/billing/balance', options);\n }\n\n /**\n * List usage entries. Paginated.\n */\n async usage(\n params?: UsageListParams,\n options?: RequestOptions,\n ): Promise<Page<UsageEntry>> {\n const query: Record<string, string | number> = {};\n if (params?.from) query.from = params.from;\n if (params?.to) query.to = params.to;\n if (params?.page) query.page = params.page;\n\n return fetchPage<UsageEntry>({\n client: this.client,\n method: 'GET',\n path: '/api/v1/billing/usage',\n query,\n responseKey: 'usage',\n options,\n });\n }\n\n /**\n * Get an aggregated usage summary.\n */\n async usageSummary(options?: RequestOptions): Promise<UsageSummary> {\n return this.client.get<UsageSummary>('/api/v1/billing/usage/summary', options);\n }\n}\n","import type { APIClient } from '../core/api-client.js';\nimport type { RequestOptions } from '../types/shared.js';\nimport type { UserRegisterParams, UserUpdateParams, User } from '../types/users.js';\n\n/**\n * Resource for user registration and profile management.\n */\nexport class Users {\n private readonly client: APIClient;\n\n constructor(client: APIClient) {\n this.client = client;\n }\n\n /**\n * Register a new user.\n */\n async register(\n params: UserRegisterParams,\n options?: RequestOptions,\n ): Promise<User> {\n const raw = await this.client.post<{ user: User }>(\n '/api/v1/users/register',\n params,\n options,\n );\n return raw.user;\n }\n\n /**\n * Get the current user's profile.\n */\n async me(options?: RequestOptions): Promise<User> {\n const raw = await this.client.get<{ user: User }>('/api/v1/users/me', options);\n return raw.user;\n }\n\n /**\n * Update the current user's profile.\n */\n async update(\n params: UserUpdateParams,\n options?: RequestOptions,\n ): Promise<User> {\n const raw = await this.client.put<{ user: User }>(\n '/api/v1/users/me',\n params,\n options,\n );\n return raw.user;\n }\n}\n","import { APIClient } from './core/api-client.js';\nimport { GeoDedoError } from './core/errors.js';\nimport type { ClientOptions } from './types/shared.js';\n\nimport { Contacts } from './resources/contacts.js';\nimport { Sequences } from './resources/sequences.js';\nimport { Drafts } from './resources/drafts.js';\nimport { Messages } from './resources/messages.js';\nimport { Chat } from './resources/chat.js';\nimport { Channels } from './resources/channels.js';\nimport { Documents } from './resources/documents.js';\nimport { Recommendations } from './resources/recommendations.js';\nimport { Billing } from './resources/billing.js';\nimport { Users } from './resources/users.js';\n\n/**\n * Detect whether we are running in a browser-like environment.\n */\nfunction isBrowser(): boolean {\n return (\n typeof window !== 'undefined' &&\n typeof window.document !== 'undefined'\n );\n}\n\n/**\n * GeoDedo — the main SDK client.\n *\n * ```ts\n * const client = new GeoDedo({ apiKey: 'gd_live_xxx' });\n * const contacts = await client.contacts.search({ titles: ['CEO'] });\n * ```\n */\nexport class GeoDedo {\n private readonly _client: APIClient;\n\n /** Contact search, enrichment, and import. */\n readonly contacts: Contacts;\n /** Outreach sequence management. */\n readonly sequences: Sequences;\n /** Draft generation, review, and sending. */\n readonly drafts: Drafts;\n /** Direct message sending (email, LinkedIn, Instagram, SMS). */\n readonly messages: Messages;\n /** AI chat assistant. */\n readonly chat: Chat;\n /** Channel connection management. */\n readonly channels: Channels;\n /** Document upload and management. */\n readonly documents: Documents;\n /** AI-powered recommendations. */\n readonly recommendations: Recommendations;\n /** Credit balance and usage tracking. */\n readonly billing: Billing;\n /** User registration and profile management. */\n readonly users: Users;\n\n constructor(options?: Partial<ClientOptions>) {\n // Resolve API key: explicit > env var\n let envKey: string | undefined;\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (typeof globalThis !== 'undefined' && 'process' in globalThis) {\n envKey = (globalThis as Record<string, any>).process?.env?.GEODEDO_API_KEY;\n }\n } catch {\n // Ignore — env access not available\n }\n const apiKey = options?.apiKey ?? envKey;\n\n if (!apiKey) {\n throw new GeoDedoError(\n 'The GEODEDO_API_KEY environment variable is missing or empty; either provide it, or pass the `apiKey` option to the GeoDedo constructor.',\n );\n }\n\n // Browser safety check\n if (isBrowser() && !options?.dangerouslyAllowBrowser) {\n throw new GeoDedoError(\n \"It looks like you're running in a browser-like environment.\\n\\n\" +\n 'This is disabled by default, as it risks exposing your secret API key to attackers.\\n' +\n 'If you understand the risks and have appropriate mitigations in place,\\n' +\n 'you can set the `dangerouslyAllowBrowser` option to `true`, e.g.,\\n\\n' +\n \"new GeoDedo({ apiKey: '...', dangerouslyAllowBrowser: true })\",\n );\n }\n\n this._client = new APIClient({\n apiKey,\n userId: options?.userId,\n baseURL: options?.baseURL,\n maxRetries: options?.maxRetries,\n timeout: options?.timeout,\n });\n\n // Initialize all resource namespaces\n this.contacts = new Contacts(this._client);\n this.sequences = new Sequences(this._client);\n this.drafts = new Drafts(this._client);\n this.messages = new Messages(this._client);\n this.chat = new Chat(this._client);\n this.channels = new Channels(this._client);\n this.documents = new Documents(this._client);\n this.recommendations = new Recommendations(this._client);\n this.billing = new Billing(this._client);\n this.users = new Users(this._client);\n }\n}\n"],"mappings":"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","names":["parsed"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "geodedo",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Official TypeScript SDK for the GeoDedo API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",