@kepler-insights/sdk 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +27 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -3
- package/dist/index.d.ts +14 -3
- package/dist/index.js +27 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -46,7 +46,7 @@ var JobFailed = class extends KeplerError {
|
|
|
46
46
|
};
|
|
47
47
|
|
|
48
48
|
// src/version.ts
|
|
49
|
-
var VERSION = "1.
|
|
49
|
+
var VERSION = "1.1.0";
|
|
50
50
|
|
|
51
51
|
// src/http.ts
|
|
52
52
|
var DEFAULT_TIMEOUT_MS = 7e4;
|
|
@@ -222,13 +222,36 @@ var Kepler = class {
|
|
|
222
222
|
}
|
|
223
223
|
// ── Scoring ──────────────────────────────────────────────────────────
|
|
224
224
|
/**
|
|
225
|
-
* Score a company. Blocks
|
|
226
|
-
*
|
|
225
|
+
* Score a company. Blocks until the score is available.
|
|
226
|
+
*
|
|
227
|
+
* - Cached path (fresh record exists): returns inline in <1s.
|
|
228
|
+
* - Cold path: server returns 202 + job_id; this method internally polls
|
|
229
|
+
* until the job settles. Cold scoring runs typically 25-90 seconds.
|
|
230
|
+
*
|
|
231
|
+
* Pass `{ timeoutMs }` to bound the cold-wait (default 180_000 ms = 3 min).
|
|
232
|
+
* Throws {@link JobTimeout} if the cold job hasn't settled before the
|
|
233
|
+
* timeout; the job continues server-side and can be recovered via
|
|
234
|
+
* {@link getJob} using the job_id from the error payload.
|
|
235
|
+
*
|
|
236
|
+
* For non-blocking access, use {@link startScore} for a Job handle.
|
|
227
237
|
*/
|
|
228
238
|
async score(domain, opts = {}) {
|
|
229
239
|
const body = { domain };
|
|
230
240
|
if (opts.forceFresh) body.force_fresh = true;
|
|
231
|
-
|
|
241
|
+
const raw = await this.transport.post(
|
|
242
|
+
"/v1/score",
|
|
243
|
+
body
|
|
244
|
+
);
|
|
245
|
+
if (!("job_id" in raw) && "composite_score" in raw) {
|
|
246
|
+
return raw;
|
|
247
|
+
}
|
|
248
|
+
const start = raw;
|
|
249
|
+
const job = new Job(this, {
|
|
250
|
+
job_id: start.job_id,
|
|
251
|
+
status: start.status,
|
|
252
|
+
domain: start.domain
|
|
253
|
+
});
|
|
254
|
+
return job.wait({ timeoutMs: opts.timeoutMs ?? 18e4 });
|
|
232
255
|
}
|
|
233
256
|
/**
|
|
234
257
|
* Read the latest cached score. Never triggers a cold run.
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/http.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Exception hierarchy for the Kepler Insights SDK.\n *\n * Branch with `instanceof` or on the stable `code` string. Error messages\n * may be tightened over time; the codes are stable.\n *\n * try {\n * const score = await client.score(\"stripe.com\");\n * } catch (err) {\n * if (err instanceof FreeTierSandboxOnly) { ... }\n * if (err instanceof ColdBudgetExhausted) { ... }\n * }\n */\n\nexport interface KeplerErrorOptions {\n statusCode?: number;\n response?: unknown;\n}\n\n/** Base class for every error raised by the SDK. */\nexport class KeplerError extends Error {\n public readonly code: string;\n public readonly statusCode?: number;\n public readonly response?: unknown;\n\n constructor(code: string, message: string = \"\", opts: KeplerErrorOptions = {}) {\n const rendered = message ? `[${code}] ${message}` : `[${code}]`;\n super(rendered);\n this.name = new.target.name;\n this.code = code;\n if (opts.statusCode !== undefined) this.statusCode = opts.statusCode;\n if (opts.response !== undefined) this.response = opts.response;\n // V8 stack trace cleanup\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\n// ── 4xx — caller errors ───────────────────────────────────────────────────\n\n/** 401: missing, invalid, or revoked API key. */\nexport class AuthError extends KeplerError {}\n\n/** 403: live key on Free tier attempted a real-domain score. */\nexport class FreeTierSandboxOnly extends KeplerError {}\n\n/** 403: catch-all forbidden (e.g. polling someone else's job_id). */\nexport class Forbidden extends KeplerError {}\n\n/** 404: domain has no score on file, or job_id expired/unknown. */\nexport class NotFound extends KeplerError {}\n\n/** 400: malformed request (bad domain, unsupported window, etc.). */\nexport class ValidationError extends KeplerError {}\n\n/** 429: rate-limited. `retryAfter` carries the Retry-After header in seconds. */\nexport class RateLimitError extends KeplerError {\n public readonly retryAfter?: number;\n\n constructor(\n code: string,\n message: string = \"\",\n opts: KeplerErrorOptions & { retryAfter?: number } = {},\n ) {\n super(code, message, opts);\n if (opts.retryAfter !== undefined) this.retryAfter = opts.retryAfter;\n }\n}\n\n/** 429 cold_budget_exhausted: monthly cold-call cap hit. `retryAfter` points at the next monthly reset (UTC). */\nexport class ColdBudgetExhausted extends RateLimitError {}\n\n// ── 5xx — server / pipeline errors ────────────────────────────────────────\n\n/** 5xx: server-side error. Retry once; if persistent, contact support. */\nexport class ServerError extends KeplerError {}\n\n/** 504: cold scoring exceeded sync budget. Poll GET /v1/score/{domain} in ~30s, or use startScore for async. */\nexport class ScoringTimeout extends ServerError {}\n\n// ── Client-side errors (no HTTP status) ───────────────────────────────────\n\n/** `Job.wait()` exceeded the caller's timeout while the job was still pending. */\nexport class JobTimeout extends KeplerError {}\n\n/** Async scoring job ended in `failed`. `code` carries the failure_reason. */\nexport class JobFailed extends KeplerError {}\n","export const VERSION = \"1.0.0\";\n","/**\n * Internal HTTP layer for the Kepler SDK.\n *\n * Responsibilities:\n * - Wrap fetch with auth + user-agent headers.\n * - Retry on 5xx and network errors with exponential backoff.\n * - Map responses → typed exception classes from `errors.ts`.\n *\n * Not part of the public API.\n */\n\nimport {\n AuthError,\n ColdBudgetExhausted,\n Forbidden,\n FreeTierSandboxOnly,\n KeplerError,\n NotFound,\n RateLimitError,\n ScoringTimeout,\n ServerError,\n ValidationError,\n} from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\n\nexport interface TransportOptions {\n apiKey: string;\n baseUrl: string;\n timeoutMs?: number;\n retries?: number;\n fetchImpl?: typeof fetch;\n}\n\nconst DEFAULT_TIMEOUT_MS = 70_000;\nconst DEFAULT_RETRIES = 3;\nconst BACKOFF_BASE_MS = 500;\n\nconst RATE_LIMIT_CODES = new Set([\"cold_budget_exhausted\"]);\nconst FREE_TIER_CODES = new Set([\"free_tier_sandbox_only\"]);\n\ninterface ErrorBody {\n error?: string;\n message?: string;\n reason?: string;\n [k: string]: unknown;\n}\n\nexport class Transport {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly retries: number;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: TransportOptions) {\n if (!opts.apiKey) {\n throw new AuthError(\"missing_api_key\", \"Set apiKey when creating Kepler()\");\n }\n this.apiKey = opts.apiKey;\n this.baseUrl = opts.baseUrl.replace(/\\/$/, \"\");\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.retries = Math.max(0, opts.retries ?? DEFAULT_RETRIES);\n this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);\n\n if (typeof this.fetchImpl !== \"function\") {\n throw new ServerError(\n \"fetch_unavailable\",\n \"globalThis.fetch is not defined. Use Node 18+ or pass fetchImpl.\",\n );\n }\n }\n\n async get<T>(path: string, params?: Record<string, string | number>): Promise<T> {\n return this.request<T>(\"GET\", path, { params });\n }\n\n async post<T>(\n path: string,\n body?: Record<string, unknown>,\n params?: Record<string, string | number>,\n ): Promise<T> {\n return this.request<T>(\"POST\", path, { body, params });\n }\n\n private async request<T>(\n method: string,\n path: string,\n opts: { body?: Record<string, unknown>; params?: Record<string, string | number> },\n ): Promise<T> {\n const url = this.buildUrl(path, opts.params);\n let lastErr: unknown = null;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers: this.buildHeaders(opts.body !== undefined),\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n lastErr = err;\n if (attempt < this.retries) {\n await sleep(BACKOFF_BASE_MS * 2 ** attempt);\n continue;\n }\n throw new ServerError(\n \"network_error\",\n `HTTP request failed after ${this.retries + 1} attempts: ${stringifyError(err)}`,\n );\n }\n clearTimeout(timer);\n\n if (response.status >= 500 && attempt < this.retries) {\n await sleep(BACKOFF_BASE_MS * 2 ** attempt);\n continue;\n }\n\n return this.handle<T>(response);\n }\n\n throw new ServerError(\"internal\", `exhausted retries: ${stringifyError(lastErr)}`);\n }\n\n private buildUrl(path: string, params?: Record<string, string | number>): string {\n const url = new URL(path.startsWith(\"/\") ? path : `/${path}`, this.baseUrl);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(hasBody: boolean): Record<string, string> {\n const h: Record<string, string> = {\n \"X-API-Key\": this.apiKey,\n \"User-Agent\": `kepler-insights-typescript/${VERSION}`,\n \"Accept\": \"application/json\",\n };\n if (hasBody) h[\"Content-Type\"] = \"application/json\";\n return h;\n }\n\n private async handle<T>(response: Response): Promise<T> {\n const body = await safeJson(response);\n\n if (response.status >= 200 && response.status < 300) {\n return (body ?? {}) as T;\n }\n\n const errBody = (body ?? {}) as ErrorBody;\n const code = (errBody.error ?? \"\").trim();\n const message = (errBody.message ?? \"\").trim();\n const status = response.status;\n\n if (status === 401) {\n throw new AuthError(code || \"unauthorized\", message, { statusCode: status, response: body });\n }\n if (status === 403) {\n const Cls = FREE_TIER_CODES.has(code) ? FreeTierSandboxOnly : Forbidden;\n throw new Cls(code || \"forbidden\", message, { statusCode: status, response: body });\n }\n if (status === 404) {\n throw new NotFound(code || \"not_found\", message, { statusCode: status, response: body });\n }\n if (status === 429) {\n const retryAfter = parseRetryAfter(response);\n const Cls = RATE_LIMIT_CODES.has(code) ? ColdBudgetExhausted : RateLimitError;\n throw new Cls(code || \"rate_limited\", message, {\n statusCode: status,\n response: body,\n retryAfter,\n });\n }\n if (status === 504) {\n throw new ScoringTimeout(code || \"scoring_timeout\", message, {\n statusCode: status, response: body,\n });\n }\n if (status >= 400 && status < 500) {\n throw new ValidationError(code || `http_${status}`, message, {\n statusCode: status, response: body,\n });\n }\n throw new ServerError(code || `http_${status}`, message, {\n statusCode: status, response: body,\n });\n }\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\nasync function safeJson(response: Response): Promise<unknown | null> {\n try {\n const text = await response.text();\n return text ? JSON.parse(text) : null;\n } catch {\n return null;\n }\n}\n\nfunction parseRetryAfter(response: Response): number | undefined {\n const raw = response.headers.get(\"Retry-After\") ?? response.headers.get(\"retry-after\");\n if (!raw) return undefined;\n const n = parseInt(raw, 10);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction stringifyError(err: unknown): string {\n if (err instanceof KeplerError) return err.message;\n if (err instanceof Error) return err.message;\n return String(err);\n}\n","/**\n * High-level Kepler Insights API client.\n *\n * Usage\n * -----\n *\n * import { Kepler } from \"@kepler-insights/sdk\";\n * const client = new Kepler({ apiKey: \"ki_live_...\" });\n * const score = await client.score(\"stripe.com\");\n * console.log(score.ki_rating, score.composite_score);\n *\n * Async cold scoring\n * ------------------\n *\n * const job = await client.startScore(\"stripe.com\");\n * const score = await job.wait({ timeoutMs: 180_000 });\n */\n\nimport { JobFailed, JobTimeout } from \"./errors.js\";\nimport { Transport, TransportOptions } from \"./http.js\";\nimport type {\n Cohort,\n Confidence,\n Distribution,\n HistoryPage,\n HistoryRecord,\n JobResponse,\n Movers,\n Score,\n SignalsManifest,\n StartAsyncResponse,\n Usage,\n Window,\n} from \"./types.js\";\n\nexport interface KeplerOptions {\n apiKey: string;\n baseUrl?: string;\n timeoutMs?: number;\n retries?: number;\n /** Inject a custom fetch (e.g. for proxies, custom TLS). Defaults to globalThis.fetch. */\n fetchImpl?: typeof fetch;\n}\n\nexport interface JobWaitOptions {\n /** Total wait budget in milliseconds. Default 180_000 (3 min). */\n timeoutMs?: number;\n /** Poll interval in milliseconds. Default 5_000. */\n intervalMs?: number;\n}\n\nconst DEFAULT_BASE_URL = \"https://api.keplerinsights.us\";\nconst DEFAULT_JOB_INTERVAL_MS = 5_000;\nconst DEFAULT_JOB_TIMEOUT_MS = 180_000;\n\n\nexport class Kepler {\n private readonly transport: Transport;\n\n constructor(opts: KeplerOptions) {\n const transportOpts: TransportOptions = {\n apiKey: opts.apiKey,\n baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,\n timeoutMs: opts.timeoutMs ?? 70_000,\n retries: opts.retries ?? 3,\n };\n if (opts.fetchImpl) transportOpts.fetchImpl = opts.fetchImpl;\n this.transport = new Transport(transportOpts);\n }\n\n // ── Scoring ──────────────────────────────────────────────────────────\n\n /**\n * Score a company. Blocks up to ~70s on cold scoring.\n * Returns a cached record if one exists within the tier's freshness window.\n */\n async score(domain: string, opts: { forceFresh?: boolean } = {}): Promise<Score> {\n const body: Record<string, unknown> = { domain };\n if (opts.forceFresh) body.force_fresh = true;\n return this.transport.post<Score>(\"/v1/score\", body);\n }\n\n /**\n * Read the latest cached score. Never triggers a cold run.\n * Throws {@link NotFound} if the domain has never been scored.\n */\n async getScore(domain: string): Promise<Score> {\n return this.transport.get<Score>(`/v1/score/${encodeURIComponent(domain)}`);\n }\n\n /**\n * Start an async cold-scoring job (Growth+ tiers). Returns a Job handle.\n * Use {@link Job.wait} to block until completion.\n */\n async startScore(domain: string, opts: { forceFresh?: boolean } = {}): Promise<Job> {\n const body: Record<string, unknown> = { domain, wait: false };\n if (opts.forceFresh) body.force_fresh = true;\n const raw = await this.transport.post<StartAsyncResponse | Score>(\n \"/v1/score\",\n body,\n { wait: \"false\" },\n );\n\n // Cached-fresh short-circuit: server returned a sync 200 score because\n // no cold work was needed. Wrap as a Job already in `complete` state.\n if (!(\"job_id\" in raw) && \"composite_score\" in raw) {\n return Job._fromCachedScore(this, raw as Score);\n }\n const start = raw as StartAsyncResponse;\n return new Job(this, {\n job_id: start.job_id,\n status: start.status,\n domain: start.domain,\n });\n }\n\n /** Single poll of an async scoring job. */\n async getJob(jobId: string): Promise<JobResponse> {\n return this.transport.get<JobResponse>(`/v1/jobs/${encodeURIComponent(jobId)}`);\n }\n\n // ── History / cohort / confidence ────────────────────────────────────\n\n async history(\n domain: string,\n opts: { limit?: number; cursor?: string } = {},\n ): Promise<HistoryPage> {\n const params: Record<string, string | number> = { limit: opts.limit ?? 100 };\n if (opts.cursor) params.cursor = opts.cursor;\n return this.transport.get<HistoryPage>(\n `/v1/score/${encodeURIComponent(domain)}/history`,\n params,\n );\n }\n\n /** Auto-paginating async iterator over every history record. */\n async *iterHistory(\n domain: string,\n opts: { pageSize?: number; maxRecords?: number } = {},\n ): AsyncIterable<HistoryRecord> {\n const pageSize = opts.pageSize ?? 100;\n let cursor: string | undefined;\n let seen = 0;\n for (;;) {\n const pageOpts: { limit: number; cursor?: string } = { limit: pageSize };\n if (cursor !== undefined) pageOpts.cursor = cursor;\n const page = await this.history(domain, pageOpts);\n for (const rec of page.records) {\n if (opts.maxRecords !== undefined && seen >= opts.maxRecords) return;\n yield rec;\n seen += 1;\n }\n if (!page.next_cursor) return;\n cursor = page.next_cursor;\n }\n }\n\n async cohort(domain: string): Promise<Cohort> {\n return this.transport.get<Cohort>(`/v1/company/${encodeURIComponent(domain)}/cohort`);\n }\n\n async confidence(domain: string): Promise<Confidence> {\n return this.transport.get<Confidence>(\n `/v1/company/${encodeURIComponent(domain)}/confidence`,\n );\n }\n\n // ── Universe ─────────────────────────────────────────────────────────\n\n async distribution(): Promise<Distribution> {\n return this.transport.get<Distribution>(\"/v1/distribution\");\n }\n\n async movers(window: Window = \"30d\"): Promise<Movers> {\n return this.transport.get<Movers>(\"/v1/movers\", { window });\n }\n\n // ── Meta ─────────────────────────────────────────────────────────────\n\n async signals(): Promise<SignalsManifest> {\n return this.transport.get<SignalsManifest>(\"/v1/signals\");\n }\n\n async usage(): Promise<Usage> {\n return this.transport.get<Usage>(\"/v1/usage\");\n }\n}\n\n\n/** Handle to an async scoring job started via {@link Kepler.startScore}. */\nexport class Job {\n private response: JobResponse;\n private readonly client: Kepler;\n /** Set when the API short-circuits to a sync 200 (no cold work needed). */\n private cachedScore: Score | null = null;\n\n constructor(client: Kepler, response: JobResponse) {\n this.client = client;\n this.response = response;\n }\n\n /** Internal: wrap a sync-200 cached score response as a Job in `complete` state. */\n static _fromCachedScore(client: Kepler, score: Score): Job {\n const synthetic: JobResponse = {\n job_id: \"cached-fresh\",\n status: \"complete\",\n domain: score.domain,\n completed_at: score.scored_at,\n result_ref: { domain: score.domain, scored_at: score.scored_at },\n score_url: `/v1/score/${score.domain}`,\n };\n const job = new Job(client, synthetic);\n job.cachedScore = score;\n return job;\n }\n\n get id(): string {\n return this.response.job_id;\n }\n\n get status(): string {\n return this.response.status;\n }\n\n get domain(): string {\n return this.response.domain;\n }\n\n get raw(): JobResponse {\n return this.response;\n }\n\n /** One-shot poll. Updates the cached `raw` in place. */\n async refresh(): Promise<JobResponse> {\n if (this.id === \"cached-fresh\") return this.response;\n this.response = await this.client.getJob(this.id);\n return this.response;\n }\n\n /**\n * Poll until the job settles, then return the resulting {@link Score}.\n * Throws {@link JobFailed} on a `failed` status, or {@link JobTimeout}\n * if the job is still `pending` after `timeoutMs`.\n */\n async wait(opts: JobWaitOptions = {}): Promise<Score> {\n if (this.status === \"complete\" && this.cachedScore !== null) {\n return this.cachedScore;\n }\n\n const timeoutMs = opts.timeoutMs ?? DEFAULT_JOB_TIMEOUT_MS;\n const intervalMs = opts.intervalMs ?? DEFAULT_JOB_INTERVAL_MS;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n await this.refresh();\n if (this.response.status === \"complete\") {\n if (!this.response.result_ref) {\n throw new JobFailed(\n \"scoring_completed_no_record\",\n \"Job complete but result_ref missing\",\n );\n }\n return this.client.getScore(this.response.result_ref.domain);\n }\n if (this.response.status === \"failed\") {\n throw new JobFailed(\n this.response.failure_reason ?? \"sfn_failed\",\n `Job ${this.id} ended in failed state`,\n );\n }\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n\n throw new JobTimeout(\n \"job_timeout\",\n `Job ${this.id} did not settle within ${timeoutMs}ms`,\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/http.ts","../src/client.ts"],"names":[],"mappings":";;;AAoBO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EACrB,IAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EAEhB,YAAY,IAAA,EAAc,OAAA,GAAkB,EAAA,EAAI,IAAA,GAA2B,EAAC,EAAG;AAC7E,IAAA,MAAM,QAAA,GAAW,UAAU,CAAA,CAAA,EAAI,IAAI,KAAK,OAAO,CAAA,CAAA,GAAK,IAAI,IAAI,CAAA,CAAA,CAAA;AAC5D,IAAA,KAAA,CAAM,QAAQ,CAAA;AACd,IAAA,IAAA,CAAK,OAAO,GAAA,CAAA,MAAA,CAAW,IAAA;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAI,IAAA,CAAK,UAAA,KAAe,MAAA,EAAW,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AAC1D,IAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AAEtD,IAAA,IAAI,OAAO,KAAA,CAAM,iBAAA,KAAsB,UAAA,EAAY;AACjD,MAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,GAAA,CAAA,MAAU,CAAA;AAAA,IAC1C;AAAA,EACF;AACF;AAKO,IAAM,SAAA,GAAN,cAAwB,WAAA,CAAY;AAAC;AAGrC,IAAM,mBAAA,GAAN,cAAkC,WAAA,CAAY;AAAC;AAG/C,IAAM,SAAA,GAAN,cAAwB,WAAA,CAAY;AAAC;AAGrC,IAAM,QAAA,GAAN,cAAuB,WAAA,CAAY;AAAC;AAGpC,IAAM,eAAA,GAAN,cAA8B,WAAA,CAAY;AAAC;AAG3C,IAAM,cAAA,GAAN,cAA6B,WAAA,CAAY;AAAA,EAC9B,UAAA;AAAA,EAEhB,YACE,IAAA,EACA,OAAA,GAAkB,EAAA,EAClB,IAAA,GAAqD,EAAC,EACtD;AACA,IAAA,KAAA,CAAM,IAAA,EAAM,SAAS,IAAI,CAAA;AACzB,IAAA,IAAI,IAAA,CAAK,UAAA,KAAe,MAAA,EAAW,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AAAA,EAC5D;AACF;AAGO,IAAM,mBAAA,GAAN,cAAkC,cAAA,CAAe;AAAC;AAKlD,IAAM,WAAA,GAAN,cAA0B,WAAA,CAAY;AAAC;AAGvC,IAAM,cAAA,GAAN,cAA6B,WAAA,CAAY;AAAC;AAK1C,IAAM,UAAA,GAAN,cAAyB,WAAA,CAAY;AAAC;AAGtC,IAAM,SAAA,GAAN,cAAwB,WAAA,CAAY;AAAC;;;ACvFrC,IAAM,OAAA,GAAU;;;ACiCvB,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,eAAA,GAAkB,CAAA;AACxB,IAAM,eAAA,GAAkB,GAAA;AAExB,IAAM,gBAAA,mBAAmB,IAAI,GAAA,CAAI,CAAC,uBAAuB,CAAC,CAAA;AAC1D,IAAM,eAAA,mBAAkB,IAAI,GAAA,CAAI,CAAC,wBAAwB,CAAC,CAAA;AASnD,IAAM,YAAN,MAAgB;AAAA,EACJ,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EAEjB,YAAY,IAAA,EAAwB;AAClC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,SAAA,CAAU,iBAAA,EAAmB,mCAAmC,CAAA;AAAA,IAC5E;AACA,IAAA,IAAA,CAAK,SAAY,IAAA,CAAK,MAAA;AACtB,IAAA,IAAA,CAAK,OAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,kBAAA;AACnC,IAAA,IAAA,CAAK,UAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,WAAW,eAAe,CAAA;AAC5D,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA,IAAa,UAAA,CAAW,KAAA,CAAM,KAAK,UAAU,CAAA;AAEnE,IAAA,IAAI,OAAO,IAAA,CAAK,SAAA,KAAc,UAAA,EAAY;AACxC,MAAA,MAAM,IAAI,WAAA;AAAA,QACR,mBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,GAAA,CAAO,IAAA,EAAc,MAAA,EAAsD;AAC/E,IAAA,OAAO,KAAK,OAAA,CAAW,KAAA,EAAO,IAAA,EAAM,EAAE,QAAQ,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,IAAA,CACJ,IAAA,EACA,IAAA,EACA,MAAA,EACY;AACZ,IAAA,OAAO,KAAK,OAAA,CAAW,MAAA,EAAQ,MAAM,EAAE,IAAA,EAAM,QAAQ,CAAA;AAAA,EACvD;AAAA,EAEA,MAAc,OAAA,CACZ,MAAA,EACA,IAAA,EACA,IAAA,EACY;AACZ,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAK,MAAM,CAAA;AAC3C,IAAA,IAAI,OAAA,GAAmB,IAAA;AAEvB,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,SAAS,OAAA,EAAA,EAAW;AACxD,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,SAAS,CAAA;AACjE,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,UACnC,MAAA;AAAA,UACA,OAAA,EAAS,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,SAAS,KAAA,CAAS,CAAA;AAAA,UAClD,IAAA,EAAM,KAAK,IAAA,KAAS,KAAA,CAAA,GAAY,KAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,UAC5D,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,OAAA,GAAU,GAAA;AACV,QAAA,IAAI,OAAA,GAAU,KAAK,OAAA,EAAS;AAC1B,UAAA,MAAM,KAAA,CAAM,eAAA,GAAkB,CAAA,IAAK,OAAO,CAAA;AAC1C,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAI,WAAA;AAAA,UACR,eAAA;AAAA,UACA,6BAA6B,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA,WAAA,EAAc,cAAA,CAAe,GAAG,CAAC,CAAA;AAAA,SAChF;AAAA,MACF;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAElB,MAAA,IAAI,QAAA,CAAS,MAAA,IAAU,GAAA,IAAO,OAAA,GAAU,KAAK,OAAA,EAAS;AACpD,QAAA,MAAM,KAAA,CAAM,eAAA,GAAkB,CAAA,IAAK,OAAO,CAAA;AAC1C,QAAA;AAAA,MACF;AAEA,MAAA,OAAO,IAAA,CAAK,OAAU,QAAQ,CAAA;AAAA,IAChC;AAEA,IAAA,MAAM,IAAI,WAAA,CAAY,UAAA,EAAY,sBAAsB,cAAA,CAAe,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,EACnF;AAAA,EAEQ,QAAA,CAAS,MAAc,MAAA,EAAkD;AAC/E,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA;AAC1E,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3C,QAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MACnC;AAAA,IACF;AACA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA,EAEQ,aAAa,OAAA,EAA0C;AAC7D,IAAA,MAAM,CAAA,GAA4B;AAAA,MAChC,aAAc,IAAA,CAAK,MAAA;AAAA,MACnB,YAAA,EAAc,8BAA8B,OAAO,CAAA,CAAA;AAAA,MACnD,QAAA,EAAc;AAAA,KAChB;AACA,IAAA,IAAI,OAAA,EAAS,CAAA,CAAE,cAAc,CAAA,GAAI,kBAAA;AACjC,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,MAAc,OAAU,QAAA,EAAgC;AACtD,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,QAAQ,CAAA;AAEpC,IAAA,IAAI,QAAA,CAAS,MAAA,IAAU,GAAA,IAAO,QAAA,CAAS,SAAS,GAAA,EAAK;AACnD,MAAA,OAAQ,QAAQ,EAAC;AAAA,IACnB;AAEA,IAAA,MAAM,OAAA,GAAW,QAAQ,EAAC;AAC1B,IAAA,MAAM,IAAA,GAAA,CAAW,OAAA,CAAQ,KAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AAC9C,IAAA,MAAM,OAAA,GAAA,CAAW,OAAA,CAAQ,OAAA,IAAY,EAAA,EAAI,IAAA,EAAK;AAC9C,IAAA,MAAM,SAAU,QAAA,CAAS,MAAA;AAEzB,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,MAAM,IAAI,SAAA,CAAU,IAAA,IAAQ,cAAA,EAAgB,OAAA,EAAS,EAAE,UAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,IAC7F;AACA,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,GAAA,CAAI,IAAI,IAAI,mBAAA,GAAsB,SAAA;AAC9D,MAAA,MAAM,IAAI,GAAA,CAAI,IAAA,IAAQ,WAAA,EAAa,OAAA,EAAS,EAAE,UAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,IACpF;AACA,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,MAAM,IAAI,QAAA,CAAS,IAAA,IAAQ,WAAA,EAAa,OAAA,EAAS,EAAE,UAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,IACzF;AACA,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,MAAM,UAAA,GAAa,gBAAgB,QAAQ,CAAA;AAC3C,MAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,GAAA,CAAI,IAAI,IAAI,mBAAA,GAAsB,cAAA;AAC/D,MAAA,MAAM,IAAI,GAAA,CAAI,IAAA,IAAQ,cAAA,EAAgB,OAAA,EAAS;AAAA,QAC7C,UAAA,EAAY,MAAA;AAAA,QACZ,QAAA,EAAU,IAAA;AAAA,QACV;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,IAAI,WAAW,GAAA,EAAK;AAClB,MAAA,MAAM,IAAI,cAAA,CAAe,IAAA,IAAQ,iBAAA,EAAmB,OAAA,EAAS;AAAA,QAC3D,UAAA,EAAY,MAAA;AAAA,QAAQ,QAAA,EAAU;AAAA,OAC/B,CAAA;AAAA,IACH;AACA,IAAA,IAAI,MAAA,IAAU,GAAA,IAAO,MAAA,GAAS,GAAA,EAAK;AACjC,MAAA,MAAM,IAAI,eAAA,CAAgB,IAAA,IAAQ,CAAA,KAAA,EAAQ,MAAM,IAAI,OAAA,EAAS;AAAA,QAC3D,UAAA,EAAY,MAAA;AAAA,QAAQ,QAAA,EAAU;AAAA,OAC/B,CAAA;AAAA,IACH;AACA,IAAA,MAAM,IAAI,WAAA,CAAY,IAAA,IAAQ,CAAA,KAAA,EAAQ,MAAM,IAAI,OAAA,EAAS;AAAA,MACvD,UAAA,EAAY,MAAA;AAAA,MAAQ,QAAA,EAAU;AAAA,KAC/B,CAAA;AAAA,EACH;AACF,CAAA;AAIA,eAAe,SAAS,QAAA,EAA6C;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,QAAA,EAAwC;AAC/D,EAAA,MAAM,GAAA,GAAM,SAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA,IAAK,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACrF,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA;AAC1B,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,MAAA;AAClC;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,EAAE,CAAC,CAAA;AAC7C;AAEA,SAAS,eAAe,GAAA,EAAsB;AAC5C,EAAA,IAAI,GAAA,YAAe,WAAA,EAAa,OAAO,GAAA,CAAI,OAAA;AAC3C,EAAA,IAAI,GAAA,YAAe,KAAA,EAAO,OAAO,GAAA,CAAI,OAAA;AACrC,EAAA,OAAO,OAAO,GAAG,CAAA;AACnB;;;AC1KA,IAAM,gBAAA,GAAmB,+BAAA;AACzB,IAAM,uBAAA,GAA0B,GAAA;AAChC,IAAM,sBAAA,GAAyB,IAAA;AAGxB,IAAM,SAAN,MAAa;AAAA,EACD,SAAA;AAAA,EAEjB,YAAY,IAAA,EAAqB;AAC/B,IAAA,MAAM,aAAA,GAAkC;AAAA,MACtC,QAAW,IAAA,CAAK,MAAA;AAAA,MAChB,OAAA,EAAW,KAAK,OAAA,IAAW,gBAAA;AAAA,MAC3B,SAAA,EAAW,KAAK,SAAA,IAAa,GAAA;AAAA,MAC7B,OAAA,EAAW,KAAK,OAAA,IAAW;AAAA,KAC7B;AACA,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,aAAA,CAAc,SAAA,GAAY,IAAA,CAAK,SAAA;AACnD,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,aAAa,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,KAAA,CACJ,MAAA,EACA,IAAA,GAAqD,EAAC,EACtC;AAChB,IAAA,MAAM,IAAA,GAAgC,EAAE,MAAA,EAAO;AAC/C,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,WAAA,GAAc,IAAA;AACxC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA;AAAA,MAC/B,WAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,EAAE,QAAA,IAAY,GAAA,CAAA,IAAQ,iBAAA,IAAqB,GAAA,EAAK;AAClD,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,GAAA;AACd,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,EAAM;AAAA,MACxB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AACD,IAAA,OAAO,IAAI,IAAA,CAAK,EAAE,WAAW,IAAA,CAAK,SAAA,IAAa,MAAS,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS,MAAA,EAAgC;AAC7C,IAAA,OAAO,KAAK,SAAA,CAAU,GAAA,CAAW,aAAa,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,CAAW,MAAA,EAAgB,IAAA,GAAiC,EAAC,EAAiB;AAClF,IAAA,MAAM,IAAA,GAAgC,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAM;AAC5D,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,WAAA,GAAc,IAAA;AACxC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA;AAAA,MAC/B,WAAA;AAAA,MACA,IAAA;AAAA,MACA,EAAE,MAAM,OAAA;AAAQ,KAClB;AAIA,IAAA,IAAI,EAAE,QAAA,IAAY,GAAA,CAAA,IAAQ,iBAAA,IAAqB,GAAA,EAAK;AAClD,MAAA,OAAO,GAAA,CAAI,gBAAA,CAAiB,IAAA,EAAM,GAAY,CAAA;AAAA,IAChD;AACA,IAAA,MAAM,KAAA,GAAQ,GAAA;AACd,IAAA,OAAO,IAAI,IAAI,IAAA,EAAM;AAAA,MACnB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAO,KAAA,EAAqC;AAChD,IAAA,OAAO,KAAK,SAAA,CAAU,GAAA,CAAiB,YAAY,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,EAChF;AAAA;AAAA,EAIA,MAAM,OAAA,CACJ,MAAA,EACA,IAAA,GAA4C,EAAC,EACvB;AACtB,IAAA,MAAM,MAAA,GAA0C,EAAE,KAAA,EAAO,IAAA,CAAK,SAAS,GAAA,EAAI;AAC3E,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,MAAA;AACtC,IAAA,OAAO,KAAK,SAAA,CAAU,GAAA;AAAA,MACpB,CAAA,UAAA,EAAa,kBAAA,CAAmB,MAAM,CAAC,CAAA,QAAA,CAAA;AAAA,MACvC;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,WAAA,CACL,MAAA,EACA,IAAA,GAAmD,EAAC,EACtB;AAC9B,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,GAAA;AAClC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,WAAS;AACP,MAAA,MAAM,QAAA,GAA+C,EAAE,KAAA,EAAO,QAAA,EAAS;AACvE,MAAA,IAAI,MAAA,KAAW,MAAA,EAAW,QAAA,CAAS,MAAA,GAAS,MAAA;AAC5C,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,QAAQ,CAAA;AAChD,MAAA,KAAA,MAAW,GAAA,IAAO,KAAK,OAAA,EAAS;AAC9B,QAAA,IAAI,IAAA,CAAK,UAAA,KAAe,MAAA,IAAa,IAAA,IAAQ,KAAK,UAAA,EAAY;AAC9D,QAAA,MAAM,GAAA;AACN,QAAA,IAAA,IAAQ,CAAA;AAAA,MACV;AACA,MAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,MAAA,MAAA,GAAS,IAAA,CAAK,WAAA;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAA,EAAiC;AAC5C,IAAA,OAAO,KAAK,SAAA,CAAU,GAAA,CAAY,eAAe,kBAAA,CAAmB,MAAM,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EACtF;AAAA,EAEA,MAAM,WAAW,MAAA,EAAqC;AACpD,IAAA,OAAO,KAAK,SAAA,CAAU,GAAA;AAAA,MACpB,CAAA,YAAA,EAAe,kBAAA,CAAmB,MAAM,CAAC,CAAA,WAAA;AAAA,KAC3C;AAAA,EACF;AAAA;AAAA,EAIA,MAAM,YAAA,GAAsC;AAC1C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAkB,kBAAkB,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,MAAA,CAAO,MAAA,GAAiB,KAAA,EAAwB;AACpD,IAAA,OAAO,KAAK,SAAA,CAAU,GAAA,CAAY,YAAA,EAAc,EAAE,QAAQ,CAAA;AAAA,EAC5D;AAAA;AAAA,EAIA,MAAM,OAAA,GAAoC;AACxC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAqB,aAAa,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,KAAA,GAAwB;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAW,WAAW,CAAA;AAAA,EAC9C;AACF;AAIO,IAAM,GAAA,GAAN,MAAM,IAAA,CAAI;AAAA,EACP,QAAA;AAAA,EACS,MAAA;AAAA;AAAA,EAET,WAAA,GAA4B,IAAA;AAAA,EAEpC,WAAA,CAAY,QAAgB,QAAA,EAAuB;AACjD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA;AAAA,EAGA,OAAO,gBAAA,CAAiB,MAAA,EAAgB,KAAA,EAAmB;AACzD,IAAA,MAAM,SAAA,GAAyB;AAAA,MAC7B,MAAA,EAAc,cAAA;AAAA,MACd,MAAA,EAAc,UAAA;AAAA,MACd,QAAc,KAAA,CAAM,MAAA;AAAA,MACpB,cAAc,KAAA,CAAM,SAAA;AAAA,MACpB,YAAc,EAAE,MAAA,EAAQ,MAAM,MAAA,EAAQ,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,MACjE,SAAA,EAAc,CAAA,UAAA,EAAa,KAAA,CAAM,MAAM,CAAA;AAAA,KACzC;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAI,MAAA,EAAQ,SAAS,CAAA;AACrC,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,IAAI,EAAA,GAAa;AACf,IAAA,OAAO,KAAK,QAAA,CAAS,MAAA;AAAA,EACvB;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,QAAA,CAAS,MAAA;AAAA,EACvB;AAAA,EAEA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,QAAA,CAAS,MAAA;AAAA,EACvB;AAAA,EAEA,IAAI,GAAA,GAAmB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,OAAA,GAAgC;AACpC,IAAA,IAAI,IAAA,CAAK,EAAA,KAAO,cAAA,EAAgB,OAAO,IAAA,CAAK,QAAA;AAC5C,IAAA,IAAA,CAAK,WAAW,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,KAAK,EAAE,CAAA;AAChD,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAA,CAAK,IAAA,GAAuB,EAAC,EAAmB;AACpD,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,UAAA,IAAc,IAAA,CAAK,gBAAgB,IAAA,EAAM;AAC3D,MAAA,OAAO,IAAA,CAAK,WAAA;AAAA,IACd;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,sBAAA;AACpC,IAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,uBAAA;AACtC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,UAAA,EAAY;AACvC,QAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,UAAA,EAAY;AAC7B,UAAA,MAAM,IAAI,SAAA;AAAA,YACR,6BAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AACA,QAAA,OAAO,KAAK,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,WAAW,MAAM,CAAA;AAAA,MAC7D;AACA,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,QAAA,EAAU;AACrC,QAAA,MAAM,IAAI,SAAA;AAAA,UACR,IAAA,CAAK,SAAS,cAAA,IAAkB,YAAA;AAAA,UAChC,CAAA,IAAA,EAAO,KAAK,EAAE,CAAA,sBAAA;AAAA,SAChB;AAAA,MACF;AACA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,UAAU,CAAC,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,IAAI,UAAA;AAAA,MACR,aAAA;AAAA,MACA,CAAA,IAAA,EAAO,IAAA,CAAK,EAAE,CAAA,uBAAA,EAA0B,SAAS,CAAA,EAAA;AAAA,KACnD;AAAA,EACF;AACF","file":"index.cjs","sourcesContent":["/**\n * Exception hierarchy for the Kepler Insights SDK.\n *\n * Branch with `instanceof` or on the stable `code` string. Error messages\n * may be tightened over time; the codes are stable.\n *\n * try {\n * const score = await client.score(\"stripe.com\");\n * } catch (err) {\n * if (err instanceof FreeTierSandboxOnly) { ... }\n * if (err instanceof ColdBudgetExhausted) { ... }\n * }\n */\n\nexport interface KeplerErrorOptions {\n statusCode?: number;\n response?: unknown;\n}\n\n/** Base class for every error raised by the SDK. */\nexport class KeplerError extends Error {\n public readonly code: string;\n public readonly statusCode?: number;\n public readonly response?: unknown;\n\n constructor(code: string, message: string = \"\", opts: KeplerErrorOptions = {}) {\n const rendered = message ? `[${code}] ${message}` : `[${code}]`;\n super(rendered);\n this.name = new.target.name;\n this.code = code;\n if (opts.statusCode !== undefined) this.statusCode = opts.statusCode;\n if (opts.response !== undefined) this.response = opts.response;\n // V8 stack trace cleanup\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\n// ── 4xx — caller errors ───────────────────────────────────────────────────\n\n/** 401: missing, invalid, or revoked API key. */\nexport class AuthError extends KeplerError {}\n\n/** 403: live key on Free tier attempted a real-domain score. */\nexport class FreeTierSandboxOnly extends KeplerError {}\n\n/** 403: catch-all forbidden (e.g. polling someone else's job_id). */\nexport class Forbidden extends KeplerError {}\n\n/** 404: domain has no score on file, or job_id expired/unknown. */\nexport class NotFound extends KeplerError {}\n\n/** 400: malformed request (bad domain, unsupported window, etc.). */\nexport class ValidationError extends KeplerError {}\n\n/** 429: rate-limited. `retryAfter` carries the Retry-After header in seconds. */\nexport class RateLimitError extends KeplerError {\n public readonly retryAfter?: number;\n\n constructor(\n code: string,\n message: string = \"\",\n opts: KeplerErrorOptions & { retryAfter?: number } = {},\n ) {\n super(code, message, opts);\n if (opts.retryAfter !== undefined) this.retryAfter = opts.retryAfter;\n }\n}\n\n/** 429 cold_budget_exhausted: monthly cold-call cap hit. `retryAfter` points at the next monthly reset (UTC). */\nexport class ColdBudgetExhausted extends RateLimitError {}\n\n// ── 5xx — server / pipeline errors ────────────────────────────────────────\n\n/** 5xx: server-side error. Retry once; if persistent, contact support. */\nexport class ServerError extends KeplerError {}\n\n/** 504: cold scoring exceeded sync budget. Poll GET /v1/score/{domain} in ~30s, or use startScore for async. */\nexport class ScoringTimeout extends ServerError {}\n\n// ── Client-side errors (no HTTP status) ───────────────────────────────────\n\n/** `Job.wait()` exceeded the caller's timeout while the job was still pending. */\nexport class JobTimeout extends KeplerError {}\n\n/** Async scoring job ended in `failed`. `code` carries the failure_reason. */\nexport class JobFailed extends KeplerError {}\n","export const VERSION = \"1.1.0\";\n","/**\n * Internal HTTP layer for the Kepler SDK.\n *\n * Responsibilities:\n * - Wrap fetch with auth + user-agent headers.\n * - Retry on 5xx and network errors with exponential backoff.\n * - Map responses → typed exception classes from `errors.ts`.\n *\n * Not part of the public API.\n */\n\nimport {\n AuthError,\n ColdBudgetExhausted,\n Forbidden,\n FreeTierSandboxOnly,\n KeplerError,\n NotFound,\n RateLimitError,\n ScoringTimeout,\n ServerError,\n ValidationError,\n} from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\n\nexport interface TransportOptions {\n apiKey: string;\n baseUrl: string;\n timeoutMs?: number;\n retries?: number;\n fetchImpl?: typeof fetch;\n}\n\nconst DEFAULT_TIMEOUT_MS = 70_000;\nconst DEFAULT_RETRIES = 3;\nconst BACKOFF_BASE_MS = 500;\n\nconst RATE_LIMIT_CODES = new Set([\"cold_budget_exhausted\"]);\nconst FREE_TIER_CODES = new Set([\"free_tier_sandbox_only\"]);\n\ninterface ErrorBody {\n error?: string;\n message?: string;\n reason?: string;\n [k: string]: unknown;\n}\n\nexport class Transport {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly retries: number;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: TransportOptions) {\n if (!opts.apiKey) {\n throw new AuthError(\"missing_api_key\", \"Set apiKey when creating Kepler()\");\n }\n this.apiKey = opts.apiKey;\n this.baseUrl = opts.baseUrl.replace(/\\/$/, \"\");\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.retries = Math.max(0, opts.retries ?? DEFAULT_RETRIES);\n this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);\n\n if (typeof this.fetchImpl !== \"function\") {\n throw new ServerError(\n \"fetch_unavailable\",\n \"globalThis.fetch is not defined. Use Node 18+ or pass fetchImpl.\",\n );\n }\n }\n\n async get<T>(path: string, params?: Record<string, string | number>): Promise<T> {\n return this.request<T>(\"GET\", path, { params });\n }\n\n async post<T>(\n path: string,\n body?: Record<string, unknown>,\n params?: Record<string, string | number>,\n ): Promise<T> {\n return this.request<T>(\"POST\", path, { body, params });\n }\n\n private async request<T>(\n method: string,\n path: string,\n opts: { body?: Record<string, unknown>; params?: Record<string, string | number> },\n ): Promise<T> {\n const url = this.buildUrl(path, opts.params);\n let lastErr: unknown = null;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers: this.buildHeaders(opts.body !== undefined),\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n lastErr = err;\n if (attempt < this.retries) {\n await sleep(BACKOFF_BASE_MS * 2 ** attempt);\n continue;\n }\n throw new ServerError(\n \"network_error\",\n `HTTP request failed after ${this.retries + 1} attempts: ${stringifyError(err)}`,\n );\n }\n clearTimeout(timer);\n\n if (response.status >= 500 && attempt < this.retries) {\n await sleep(BACKOFF_BASE_MS * 2 ** attempt);\n continue;\n }\n\n return this.handle<T>(response);\n }\n\n throw new ServerError(\"internal\", `exhausted retries: ${stringifyError(lastErr)}`);\n }\n\n private buildUrl(path: string, params?: Record<string, string | number>): string {\n const url = new URL(path.startsWith(\"/\") ? path : `/${path}`, this.baseUrl);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(hasBody: boolean): Record<string, string> {\n const h: Record<string, string> = {\n \"X-API-Key\": this.apiKey,\n \"User-Agent\": `kepler-insights-typescript/${VERSION}`,\n \"Accept\": \"application/json\",\n };\n if (hasBody) h[\"Content-Type\"] = \"application/json\";\n return h;\n }\n\n private async handle<T>(response: Response): Promise<T> {\n const body = await safeJson(response);\n\n if (response.status >= 200 && response.status < 300) {\n return (body ?? {}) as T;\n }\n\n const errBody = (body ?? {}) as ErrorBody;\n const code = (errBody.error ?? \"\").trim();\n const message = (errBody.message ?? \"\").trim();\n const status = response.status;\n\n if (status === 401) {\n throw new AuthError(code || \"unauthorized\", message, { statusCode: status, response: body });\n }\n if (status === 403) {\n const Cls = FREE_TIER_CODES.has(code) ? FreeTierSandboxOnly : Forbidden;\n throw new Cls(code || \"forbidden\", message, { statusCode: status, response: body });\n }\n if (status === 404) {\n throw new NotFound(code || \"not_found\", message, { statusCode: status, response: body });\n }\n if (status === 429) {\n const retryAfter = parseRetryAfter(response);\n const Cls = RATE_LIMIT_CODES.has(code) ? ColdBudgetExhausted : RateLimitError;\n throw new Cls(code || \"rate_limited\", message, {\n statusCode: status,\n response: body,\n retryAfter,\n });\n }\n if (status === 504) {\n throw new ScoringTimeout(code || \"scoring_timeout\", message, {\n statusCode: status, response: body,\n });\n }\n if (status >= 400 && status < 500) {\n throw new ValidationError(code || `http_${status}`, message, {\n statusCode: status, response: body,\n });\n }\n throw new ServerError(code || `http_${status}`, message, {\n statusCode: status, response: body,\n });\n }\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\nasync function safeJson(response: Response): Promise<unknown | null> {\n try {\n const text = await response.text();\n return text ? JSON.parse(text) : null;\n } catch {\n return null;\n }\n}\n\nfunction parseRetryAfter(response: Response): number | undefined {\n const raw = response.headers.get(\"Retry-After\") ?? response.headers.get(\"retry-after\");\n if (!raw) return undefined;\n const n = parseInt(raw, 10);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction stringifyError(err: unknown): string {\n if (err instanceof KeplerError) return err.message;\n if (err instanceof Error) return err.message;\n return String(err);\n}\n","/**\n * High-level Kepler Insights API client.\n *\n * Usage\n * -----\n *\n * import { Kepler } from \"@kepler-insights/sdk\";\n * const client = new Kepler({ apiKey: \"ki_live_...\" });\n * const score = await client.score(\"stripe.com\");\n * console.log(score.ki_rating, score.composite_score);\n *\n * Async cold scoring\n * ------------------\n *\n * const job = await client.startScore(\"stripe.com\");\n * const score = await job.wait({ timeoutMs: 180_000 });\n */\n\nimport { JobFailed, JobTimeout } from \"./errors.js\";\nimport { Transport, TransportOptions } from \"./http.js\";\nimport type {\n Cohort,\n Confidence,\n Distribution,\n HistoryPage,\n HistoryRecord,\n JobResponse,\n Movers,\n Score,\n SignalsManifest,\n StartAsyncResponse,\n Usage,\n Window,\n} from \"./types.js\";\n\nexport interface KeplerOptions {\n apiKey: string;\n baseUrl?: string;\n timeoutMs?: number;\n retries?: number;\n /** Inject a custom fetch (e.g. for proxies, custom TLS). Defaults to globalThis.fetch. */\n fetchImpl?: typeof fetch;\n}\n\nexport interface JobWaitOptions {\n /** Total wait budget in milliseconds. Default 180_000 (3 min). */\n timeoutMs?: number;\n /** Poll interval in milliseconds. Default 5_000. */\n intervalMs?: number;\n}\n\nconst DEFAULT_BASE_URL = \"https://api.keplerinsights.us\";\nconst DEFAULT_JOB_INTERVAL_MS = 5_000;\nconst DEFAULT_JOB_TIMEOUT_MS = 180_000;\n\n\nexport class Kepler {\n private readonly transport: Transport;\n\n constructor(opts: KeplerOptions) {\n const transportOpts: TransportOptions = {\n apiKey: opts.apiKey,\n baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,\n timeoutMs: opts.timeoutMs ?? 70_000,\n retries: opts.retries ?? 3,\n };\n if (opts.fetchImpl) transportOpts.fetchImpl = opts.fetchImpl;\n this.transport = new Transport(transportOpts);\n }\n\n // ── Scoring ──────────────────────────────────────────────────────────\n\n /**\n * Score a company. Blocks until the score is available.\n *\n * - Cached path (fresh record exists): returns inline in <1s.\n * - Cold path: server returns 202 + job_id; this method internally polls\n * until the job settles. Cold scoring runs typically 25-90 seconds.\n *\n * Pass `{ timeoutMs }` to bound the cold-wait (default 180_000 ms = 3 min).\n * Throws {@link JobTimeout} if the cold job hasn't settled before the\n * timeout; the job continues server-side and can be recovered via\n * {@link getJob} using the job_id from the error payload.\n *\n * For non-blocking access, use {@link startScore} for a Job handle.\n */\n async score(\n domain: string,\n opts: { forceFresh?: boolean; timeoutMs?: number } = {},\n ): Promise<Score> {\n const body: Record<string, unknown> = { domain };\n if (opts.forceFresh) body.force_fresh = true;\n const raw = await this.transport.post<StartAsyncResponse | Score>(\n \"/v1/score\",\n body,\n );\n // Cached-fresh: 200 with a score body.\n if (!(\"job_id\" in raw) && \"composite_score\" in raw) {\n return raw as Score;\n }\n // Cold path: 202 with a job body — auto-poll until terminal.\n const start = raw as StartAsyncResponse;\n const job = new Job(this, {\n job_id: start.job_id,\n status: start.status,\n domain: start.domain,\n });\n return job.wait({ timeoutMs: opts.timeoutMs ?? 180_000 });\n }\n\n /**\n * Read the latest cached score. Never triggers a cold run.\n * Throws {@link NotFound} if the domain has never been scored.\n */\n async getScore(domain: string): Promise<Score> {\n return this.transport.get<Score>(`/v1/score/${encodeURIComponent(domain)}`);\n }\n\n /**\n * Start an async cold-scoring job (Growth+ tiers). Returns a Job handle.\n * Use {@link Job.wait} to block until completion.\n */\n async startScore(domain: string, opts: { forceFresh?: boolean } = {}): Promise<Job> {\n const body: Record<string, unknown> = { domain, wait: false };\n if (opts.forceFresh) body.force_fresh = true;\n const raw = await this.transport.post<StartAsyncResponse | Score>(\n \"/v1/score\",\n body,\n { wait: \"false\" },\n );\n\n // Cached-fresh short-circuit: server returned a sync 200 score because\n // no cold work was needed. Wrap as a Job already in `complete` state.\n if (!(\"job_id\" in raw) && \"composite_score\" in raw) {\n return Job._fromCachedScore(this, raw as Score);\n }\n const start = raw as StartAsyncResponse;\n return new Job(this, {\n job_id: start.job_id,\n status: start.status,\n domain: start.domain,\n });\n }\n\n /** Single poll of an async scoring job. */\n async getJob(jobId: string): Promise<JobResponse> {\n return this.transport.get<JobResponse>(`/v1/jobs/${encodeURIComponent(jobId)}`);\n }\n\n // ── History / cohort / confidence ────────────────────────────────────\n\n async history(\n domain: string,\n opts: { limit?: number; cursor?: string } = {},\n ): Promise<HistoryPage> {\n const params: Record<string, string | number> = { limit: opts.limit ?? 100 };\n if (opts.cursor) params.cursor = opts.cursor;\n return this.transport.get<HistoryPage>(\n `/v1/score/${encodeURIComponent(domain)}/history`,\n params,\n );\n }\n\n /** Auto-paginating async iterator over every history record. */\n async *iterHistory(\n domain: string,\n opts: { pageSize?: number; maxRecords?: number } = {},\n ): AsyncIterable<HistoryRecord> {\n const pageSize = opts.pageSize ?? 100;\n let cursor: string | undefined;\n let seen = 0;\n for (;;) {\n const pageOpts: { limit: number; cursor?: string } = { limit: pageSize };\n if (cursor !== undefined) pageOpts.cursor = cursor;\n const page = await this.history(domain, pageOpts);\n for (const rec of page.records) {\n if (opts.maxRecords !== undefined && seen >= opts.maxRecords) return;\n yield rec;\n seen += 1;\n }\n if (!page.next_cursor) return;\n cursor = page.next_cursor;\n }\n }\n\n async cohort(domain: string): Promise<Cohort> {\n return this.transport.get<Cohort>(`/v1/company/${encodeURIComponent(domain)}/cohort`);\n }\n\n async confidence(domain: string): Promise<Confidence> {\n return this.transport.get<Confidence>(\n `/v1/company/${encodeURIComponent(domain)}/confidence`,\n );\n }\n\n // ── Universe ─────────────────────────────────────────────────────────\n\n async distribution(): Promise<Distribution> {\n return this.transport.get<Distribution>(\"/v1/distribution\");\n }\n\n async movers(window: Window = \"30d\"): Promise<Movers> {\n return this.transport.get<Movers>(\"/v1/movers\", { window });\n }\n\n // ── Meta ─────────────────────────────────────────────────────────────\n\n async signals(): Promise<SignalsManifest> {\n return this.transport.get<SignalsManifest>(\"/v1/signals\");\n }\n\n async usage(): Promise<Usage> {\n return this.transport.get<Usage>(\"/v1/usage\");\n }\n}\n\n\n/** Handle to an async scoring job started via {@link Kepler.startScore}. */\nexport class Job {\n private response: JobResponse;\n private readonly client: Kepler;\n /** Set when the API short-circuits to a sync 200 (no cold work needed). */\n private cachedScore: Score | null = null;\n\n constructor(client: Kepler, response: JobResponse) {\n this.client = client;\n this.response = response;\n }\n\n /** Internal: wrap a sync-200 cached score response as a Job in `complete` state. */\n static _fromCachedScore(client: Kepler, score: Score): Job {\n const synthetic: JobResponse = {\n job_id: \"cached-fresh\",\n status: \"complete\",\n domain: score.domain,\n completed_at: score.scored_at,\n result_ref: { domain: score.domain, scored_at: score.scored_at },\n score_url: `/v1/score/${score.domain}`,\n };\n const job = new Job(client, synthetic);\n job.cachedScore = score;\n return job;\n }\n\n get id(): string {\n return this.response.job_id;\n }\n\n get status(): string {\n return this.response.status;\n }\n\n get domain(): string {\n return this.response.domain;\n }\n\n get raw(): JobResponse {\n return this.response;\n }\n\n /** One-shot poll. Updates the cached `raw` in place. */\n async refresh(): Promise<JobResponse> {\n if (this.id === \"cached-fresh\") return this.response;\n this.response = await this.client.getJob(this.id);\n return this.response;\n }\n\n /**\n * Poll until the job settles, then return the resulting {@link Score}.\n * Throws {@link JobFailed} on a `failed` status, or {@link JobTimeout}\n * if the job is still `pending` after `timeoutMs`.\n */\n async wait(opts: JobWaitOptions = {}): Promise<Score> {\n if (this.status === \"complete\" && this.cachedScore !== null) {\n return this.cachedScore;\n }\n\n const timeoutMs = opts.timeoutMs ?? DEFAULT_JOB_TIMEOUT_MS;\n const intervalMs = opts.intervalMs ?? DEFAULT_JOB_INTERVAL_MS;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n await this.refresh();\n if (this.response.status === \"complete\") {\n if (!this.response.result_ref) {\n throw new JobFailed(\n \"scoring_completed_no_record\",\n \"Job complete but result_ref missing\",\n );\n }\n return this.client.getScore(this.response.result_ref.domain);\n }\n if (this.response.status === \"failed\") {\n throw new JobFailed(\n this.response.failure_reason ?? \"sfn_failed\",\n `Job ${this.id} ended in failed state`,\n );\n }\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n\n throw new JobTimeout(\n \"job_timeout\",\n `Job ${this.id} did not settle within ${timeoutMs}ms`,\n );\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -225,11 +225,22 @@ declare class Kepler {
|
|
|
225
225
|
private readonly transport;
|
|
226
226
|
constructor(opts: KeplerOptions);
|
|
227
227
|
/**
|
|
228
|
-
* Score a company. Blocks
|
|
229
|
-
*
|
|
228
|
+
* Score a company. Blocks until the score is available.
|
|
229
|
+
*
|
|
230
|
+
* - Cached path (fresh record exists): returns inline in <1s.
|
|
231
|
+
* - Cold path: server returns 202 + job_id; this method internally polls
|
|
232
|
+
* until the job settles. Cold scoring runs typically 25-90 seconds.
|
|
233
|
+
*
|
|
234
|
+
* Pass `{ timeoutMs }` to bound the cold-wait (default 180_000 ms = 3 min).
|
|
235
|
+
* Throws {@link JobTimeout} if the cold job hasn't settled before the
|
|
236
|
+
* timeout; the job continues server-side and can be recovered via
|
|
237
|
+
* {@link getJob} using the job_id from the error payload.
|
|
238
|
+
*
|
|
239
|
+
* For non-blocking access, use {@link startScore} for a Job handle.
|
|
230
240
|
*/
|
|
231
241
|
score(domain: string, opts?: {
|
|
232
242
|
forceFresh?: boolean;
|
|
243
|
+
timeoutMs?: number;
|
|
233
244
|
}): Promise<Score>;
|
|
234
245
|
/**
|
|
235
246
|
* Read the latest cached score. Never triggers a cold run.
|
|
@@ -346,6 +357,6 @@ declare class JobTimeout extends KeplerError {
|
|
|
346
357
|
declare class JobFailed extends KeplerError {
|
|
347
358
|
}
|
|
348
359
|
|
|
349
|
-
declare const VERSION = "1.
|
|
360
|
+
declare const VERSION = "1.1.0";
|
|
350
361
|
|
|
351
362
|
export { type Actionability, AuthError, type BucketDelta, type Buckets, type CacheStatus, type Cohort, type CohortMember, type CohortStats, type CohortTarget, ColdBudgetExhausted, type Confidence, type ConfidenceBand, type Distribution, Forbidden, FreeTierSandboxOnly, type HistBin, type HistoryPage, type HistoryRecord, Job, JobFailed, type JobResponse, type JobResultRef, type JobStatus, JobTimeout, type JobWaitOptions, Kepler, KeplerError, type KeplerOptions, type MoverRow, type Movers, NotFound, type Rank, RateLimitError, type Score, ScoringTimeout, ServerError, type Signal, type SignalsManifest, type TierLimits, type Universe, type Usage, VERSION, ValidationError, type Window, type XKeplerMeta };
|
package/dist/index.d.ts
CHANGED
|
@@ -225,11 +225,22 @@ declare class Kepler {
|
|
|
225
225
|
private readonly transport;
|
|
226
226
|
constructor(opts: KeplerOptions);
|
|
227
227
|
/**
|
|
228
|
-
* Score a company. Blocks
|
|
229
|
-
*
|
|
228
|
+
* Score a company. Blocks until the score is available.
|
|
229
|
+
*
|
|
230
|
+
* - Cached path (fresh record exists): returns inline in <1s.
|
|
231
|
+
* - Cold path: server returns 202 + job_id; this method internally polls
|
|
232
|
+
* until the job settles. Cold scoring runs typically 25-90 seconds.
|
|
233
|
+
*
|
|
234
|
+
* Pass `{ timeoutMs }` to bound the cold-wait (default 180_000 ms = 3 min).
|
|
235
|
+
* Throws {@link JobTimeout} if the cold job hasn't settled before the
|
|
236
|
+
* timeout; the job continues server-side and can be recovered via
|
|
237
|
+
* {@link getJob} using the job_id from the error payload.
|
|
238
|
+
*
|
|
239
|
+
* For non-blocking access, use {@link startScore} for a Job handle.
|
|
230
240
|
*/
|
|
231
241
|
score(domain: string, opts?: {
|
|
232
242
|
forceFresh?: boolean;
|
|
243
|
+
timeoutMs?: number;
|
|
233
244
|
}): Promise<Score>;
|
|
234
245
|
/**
|
|
235
246
|
* Read the latest cached score. Never triggers a cold run.
|
|
@@ -346,6 +357,6 @@ declare class JobTimeout extends KeplerError {
|
|
|
346
357
|
declare class JobFailed extends KeplerError {
|
|
347
358
|
}
|
|
348
359
|
|
|
349
|
-
declare const VERSION = "1.
|
|
360
|
+
declare const VERSION = "1.1.0";
|
|
350
361
|
|
|
351
362
|
export { type Actionability, AuthError, type BucketDelta, type Buckets, type CacheStatus, type Cohort, type CohortMember, type CohortStats, type CohortTarget, ColdBudgetExhausted, type Confidence, type ConfidenceBand, type Distribution, Forbidden, FreeTierSandboxOnly, type HistBin, type HistoryPage, type HistoryRecord, Job, JobFailed, type JobResponse, type JobResultRef, type JobStatus, JobTimeout, type JobWaitOptions, Kepler, KeplerError, type KeplerOptions, type MoverRow, type Movers, NotFound, type Rank, RateLimitError, type Score, ScoringTimeout, ServerError, type Signal, type SignalsManifest, type TierLimits, type Universe, type Usage, VERSION, ValidationError, type Window, type XKeplerMeta };
|
package/dist/index.js
CHANGED
|
@@ -44,7 +44,7 @@ var JobFailed = class extends KeplerError {
|
|
|
44
44
|
};
|
|
45
45
|
|
|
46
46
|
// src/version.ts
|
|
47
|
-
var VERSION = "1.
|
|
47
|
+
var VERSION = "1.1.0";
|
|
48
48
|
|
|
49
49
|
// src/http.ts
|
|
50
50
|
var DEFAULT_TIMEOUT_MS = 7e4;
|
|
@@ -220,13 +220,36 @@ var Kepler = class {
|
|
|
220
220
|
}
|
|
221
221
|
// ── Scoring ──────────────────────────────────────────────────────────
|
|
222
222
|
/**
|
|
223
|
-
* Score a company. Blocks
|
|
224
|
-
*
|
|
223
|
+
* Score a company. Blocks until the score is available.
|
|
224
|
+
*
|
|
225
|
+
* - Cached path (fresh record exists): returns inline in <1s.
|
|
226
|
+
* - Cold path: server returns 202 + job_id; this method internally polls
|
|
227
|
+
* until the job settles. Cold scoring runs typically 25-90 seconds.
|
|
228
|
+
*
|
|
229
|
+
* Pass `{ timeoutMs }` to bound the cold-wait (default 180_000 ms = 3 min).
|
|
230
|
+
* Throws {@link JobTimeout} if the cold job hasn't settled before the
|
|
231
|
+
* timeout; the job continues server-side and can be recovered via
|
|
232
|
+
* {@link getJob} using the job_id from the error payload.
|
|
233
|
+
*
|
|
234
|
+
* For non-blocking access, use {@link startScore} for a Job handle.
|
|
225
235
|
*/
|
|
226
236
|
async score(domain, opts = {}) {
|
|
227
237
|
const body = { domain };
|
|
228
238
|
if (opts.forceFresh) body.force_fresh = true;
|
|
229
|
-
|
|
239
|
+
const raw = await this.transport.post(
|
|
240
|
+
"/v1/score",
|
|
241
|
+
body
|
|
242
|
+
);
|
|
243
|
+
if (!("job_id" in raw) && "composite_score" in raw) {
|
|
244
|
+
return raw;
|
|
245
|
+
}
|
|
246
|
+
const start = raw;
|
|
247
|
+
const job = new Job(this, {
|
|
248
|
+
job_id: start.job_id,
|
|
249
|
+
status: start.status,
|
|
250
|
+
domain: start.domain
|
|
251
|
+
});
|
|
252
|
+
return job.wait({ timeoutMs: opts.timeoutMs ?? 18e4 });
|
|
230
253
|
}
|
|
231
254
|
/**
|
|
232
255
|
* Read the latest cached score. Never triggers a cold run.
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/http.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Exception hierarchy for the Kepler Insights SDK.\n *\n * Branch with `instanceof` or on the stable `code` string. Error messages\n * may be tightened over time; the codes are stable.\n *\n * try {\n * const score = await client.score(\"stripe.com\");\n * } catch (err) {\n * if (err instanceof FreeTierSandboxOnly) { ... }\n * if (err instanceof ColdBudgetExhausted) { ... }\n * }\n */\n\nexport interface KeplerErrorOptions {\n statusCode?: number;\n response?: unknown;\n}\n\n/** Base class for every error raised by the SDK. */\nexport class KeplerError extends Error {\n public readonly code: string;\n public readonly statusCode?: number;\n public readonly response?: unknown;\n\n constructor(code: string, message: string = \"\", opts: KeplerErrorOptions = {}) {\n const rendered = message ? `[${code}] ${message}` : `[${code}]`;\n super(rendered);\n this.name = new.target.name;\n this.code = code;\n if (opts.statusCode !== undefined) this.statusCode = opts.statusCode;\n if (opts.response !== undefined) this.response = opts.response;\n // V8 stack trace cleanup\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\n// ── 4xx — caller errors ───────────────────────────────────────────────────\n\n/** 401: missing, invalid, or revoked API key. */\nexport class AuthError extends KeplerError {}\n\n/** 403: live key on Free tier attempted a real-domain score. */\nexport class FreeTierSandboxOnly extends KeplerError {}\n\n/** 403: catch-all forbidden (e.g. polling someone else's job_id). */\nexport class Forbidden extends KeplerError {}\n\n/** 404: domain has no score on file, or job_id expired/unknown. */\nexport class NotFound extends KeplerError {}\n\n/** 400: malformed request (bad domain, unsupported window, etc.). */\nexport class ValidationError extends KeplerError {}\n\n/** 429: rate-limited. `retryAfter` carries the Retry-After header in seconds. */\nexport class RateLimitError extends KeplerError {\n public readonly retryAfter?: number;\n\n constructor(\n code: string,\n message: string = \"\",\n opts: KeplerErrorOptions & { retryAfter?: number } = {},\n ) {\n super(code, message, opts);\n if (opts.retryAfter !== undefined) this.retryAfter = opts.retryAfter;\n }\n}\n\n/** 429 cold_budget_exhausted: monthly cold-call cap hit. `retryAfter` points at the next monthly reset (UTC). */\nexport class ColdBudgetExhausted extends RateLimitError {}\n\n// ── 5xx — server / pipeline errors ────────────────────────────────────────\n\n/** 5xx: server-side error. Retry once; if persistent, contact support. */\nexport class ServerError extends KeplerError {}\n\n/** 504: cold scoring exceeded sync budget. Poll GET /v1/score/{domain} in ~30s, or use startScore for async. */\nexport class ScoringTimeout extends ServerError {}\n\n// ── Client-side errors (no HTTP status) ───────────────────────────────────\n\n/** `Job.wait()` exceeded the caller's timeout while the job was still pending. */\nexport class JobTimeout extends KeplerError {}\n\n/** Async scoring job ended in `failed`. `code` carries the failure_reason. */\nexport class JobFailed extends KeplerError {}\n","export const VERSION = \"1.0.0\";\n","/**\n * Internal HTTP layer for the Kepler SDK.\n *\n * Responsibilities:\n * - Wrap fetch with auth + user-agent headers.\n * - Retry on 5xx and network errors with exponential backoff.\n * - Map responses → typed exception classes from `errors.ts`.\n *\n * Not part of the public API.\n */\n\nimport {\n AuthError,\n ColdBudgetExhausted,\n Forbidden,\n FreeTierSandboxOnly,\n KeplerError,\n NotFound,\n RateLimitError,\n ScoringTimeout,\n ServerError,\n ValidationError,\n} from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\n\nexport interface TransportOptions {\n apiKey: string;\n baseUrl: string;\n timeoutMs?: number;\n retries?: number;\n fetchImpl?: typeof fetch;\n}\n\nconst DEFAULT_TIMEOUT_MS = 70_000;\nconst DEFAULT_RETRIES = 3;\nconst BACKOFF_BASE_MS = 500;\n\nconst RATE_LIMIT_CODES = new Set([\"cold_budget_exhausted\"]);\nconst FREE_TIER_CODES = new Set([\"free_tier_sandbox_only\"]);\n\ninterface ErrorBody {\n error?: string;\n message?: string;\n reason?: string;\n [k: string]: unknown;\n}\n\nexport class Transport {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly retries: number;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: TransportOptions) {\n if (!opts.apiKey) {\n throw new AuthError(\"missing_api_key\", \"Set apiKey when creating Kepler()\");\n }\n this.apiKey = opts.apiKey;\n this.baseUrl = opts.baseUrl.replace(/\\/$/, \"\");\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.retries = Math.max(0, opts.retries ?? DEFAULT_RETRIES);\n this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);\n\n if (typeof this.fetchImpl !== \"function\") {\n throw new ServerError(\n \"fetch_unavailable\",\n \"globalThis.fetch is not defined. Use Node 18+ or pass fetchImpl.\",\n );\n }\n }\n\n async get<T>(path: string, params?: Record<string, string | number>): Promise<T> {\n return this.request<T>(\"GET\", path, { params });\n }\n\n async post<T>(\n path: string,\n body?: Record<string, unknown>,\n params?: Record<string, string | number>,\n ): Promise<T> {\n return this.request<T>(\"POST\", path, { body, params });\n }\n\n private async request<T>(\n method: string,\n path: string,\n opts: { body?: Record<string, unknown>; params?: Record<string, string | number> },\n ): Promise<T> {\n const url = this.buildUrl(path, opts.params);\n let lastErr: unknown = null;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers: this.buildHeaders(opts.body !== undefined),\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n lastErr = err;\n if (attempt < this.retries) {\n await sleep(BACKOFF_BASE_MS * 2 ** attempt);\n continue;\n }\n throw new ServerError(\n \"network_error\",\n `HTTP request failed after ${this.retries + 1} attempts: ${stringifyError(err)}`,\n );\n }\n clearTimeout(timer);\n\n if (response.status >= 500 && attempt < this.retries) {\n await sleep(BACKOFF_BASE_MS * 2 ** attempt);\n continue;\n }\n\n return this.handle<T>(response);\n }\n\n throw new ServerError(\"internal\", `exhausted retries: ${stringifyError(lastErr)}`);\n }\n\n private buildUrl(path: string, params?: Record<string, string | number>): string {\n const url = new URL(path.startsWith(\"/\") ? path : `/${path}`, this.baseUrl);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(hasBody: boolean): Record<string, string> {\n const h: Record<string, string> = {\n \"X-API-Key\": this.apiKey,\n \"User-Agent\": `kepler-insights-typescript/${VERSION}`,\n \"Accept\": \"application/json\",\n };\n if (hasBody) h[\"Content-Type\"] = \"application/json\";\n return h;\n }\n\n private async handle<T>(response: Response): Promise<T> {\n const body = await safeJson(response);\n\n if (response.status >= 200 && response.status < 300) {\n return (body ?? {}) as T;\n }\n\n const errBody = (body ?? {}) as ErrorBody;\n const code = (errBody.error ?? \"\").trim();\n const message = (errBody.message ?? \"\").trim();\n const status = response.status;\n\n if (status === 401) {\n throw new AuthError(code || \"unauthorized\", message, { statusCode: status, response: body });\n }\n if (status === 403) {\n const Cls = FREE_TIER_CODES.has(code) ? FreeTierSandboxOnly : Forbidden;\n throw new Cls(code || \"forbidden\", message, { statusCode: status, response: body });\n }\n if (status === 404) {\n throw new NotFound(code || \"not_found\", message, { statusCode: status, response: body });\n }\n if (status === 429) {\n const retryAfter = parseRetryAfter(response);\n const Cls = RATE_LIMIT_CODES.has(code) ? ColdBudgetExhausted : RateLimitError;\n throw new Cls(code || \"rate_limited\", message, {\n statusCode: status,\n response: body,\n retryAfter,\n });\n }\n if (status === 504) {\n throw new ScoringTimeout(code || \"scoring_timeout\", message, {\n statusCode: status, response: body,\n });\n }\n if (status >= 400 && status < 500) {\n throw new ValidationError(code || `http_${status}`, message, {\n statusCode: status, response: body,\n });\n }\n throw new ServerError(code || `http_${status}`, message, {\n statusCode: status, response: body,\n });\n }\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\nasync function safeJson(response: Response): Promise<unknown | null> {\n try {\n const text = await response.text();\n return text ? JSON.parse(text) : null;\n } catch {\n return null;\n }\n}\n\nfunction parseRetryAfter(response: Response): number | undefined {\n const raw = response.headers.get(\"Retry-After\") ?? response.headers.get(\"retry-after\");\n if (!raw) return undefined;\n const n = parseInt(raw, 10);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction stringifyError(err: unknown): string {\n if (err instanceof KeplerError) return err.message;\n if (err instanceof Error) return err.message;\n return String(err);\n}\n","/**\n * High-level Kepler Insights API client.\n *\n * Usage\n * -----\n *\n * import { Kepler } from \"@kepler-insights/sdk\";\n * const client = new Kepler({ apiKey: \"ki_live_...\" });\n * const score = await client.score(\"stripe.com\");\n * console.log(score.ki_rating, score.composite_score);\n *\n * Async cold scoring\n * ------------------\n *\n * const job = await client.startScore(\"stripe.com\");\n * const score = await job.wait({ timeoutMs: 180_000 });\n */\n\nimport { JobFailed, JobTimeout } from \"./errors.js\";\nimport { Transport, TransportOptions } from \"./http.js\";\nimport type {\n Cohort,\n Confidence,\n Distribution,\n HistoryPage,\n HistoryRecord,\n JobResponse,\n Movers,\n Score,\n SignalsManifest,\n StartAsyncResponse,\n Usage,\n Window,\n} from \"./types.js\";\n\nexport interface KeplerOptions {\n apiKey: string;\n baseUrl?: string;\n timeoutMs?: number;\n retries?: number;\n /** Inject a custom fetch (e.g. for proxies, custom TLS). Defaults to globalThis.fetch. */\n fetchImpl?: typeof fetch;\n}\n\nexport interface JobWaitOptions {\n /** Total wait budget in milliseconds. Default 180_000 (3 min). */\n timeoutMs?: number;\n /** Poll interval in milliseconds. Default 5_000. */\n intervalMs?: number;\n}\n\nconst DEFAULT_BASE_URL = \"https://api.keplerinsights.us\";\nconst DEFAULT_JOB_INTERVAL_MS = 5_000;\nconst DEFAULT_JOB_TIMEOUT_MS = 180_000;\n\n\nexport class Kepler {\n private readonly transport: Transport;\n\n constructor(opts: KeplerOptions) {\n const transportOpts: TransportOptions = {\n apiKey: opts.apiKey,\n baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,\n timeoutMs: opts.timeoutMs ?? 70_000,\n retries: opts.retries ?? 3,\n };\n if (opts.fetchImpl) transportOpts.fetchImpl = opts.fetchImpl;\n this.transport = new Transport(transportOpts);\n }\n\n // ── Scoring ──────────────────────────────────────────────────────────\n\n /**\n * Score a company. Blocks up to ~70s on cold scoring.\n * Returns a cached record if one exists within the tier's freshness window.\n */\n async score(domain: string, opts: { forceFresh?: boolean } = {}): Promise<Score> {\n const body: Record<string, unknown> = { domain };\n if (opts.forceFresh) body.force_fresh = true;\n return this.transport.post<Score>(\"/v1/score\", body);\n }\n\n /**\n * Read the latest cached score. Never triggers a cold run.\n * Throws {@link NotFound} if the domain has never been scored.\n */\n async getScore(domain: string): Promise<Score> {\n return this.transport.get<Score>(`/v1/score/${encodeURIComponent(domain)}`);\n }\n\n /**\n * Start an async cold-scoring job (Growth+ tiers). Returns a Job handle.\n * Use {@link Job.wait} to block until completion.\n */\n async startScore(domain: string, opts: { forceFresh?: boolean } = {}): Promise<Job> {\n const body: Record<string, unknown> = { domain, wait: false };\n if (opts.forceFresh) body.force_fresh = true;\n const raw = await this.transport.post<StartAsyncResponse | Score>(\n \"/v1/score\",\n body,\n { wait: \"false\" },\n );\n\n // Cached-fresh short-circuit: server returned a sync 200 score because\n // no cold work was needed. Wrap as a Job already in `complete` state.\n if (!(\"job_id\" in raw) && \"composite_score\" in raw) {\n return Job._fromCachedScore(this, raw as Score);\n }\n const start = raw as StartAsyncResponse;\n return new Job(this, {\n job_id: start.job_id,\n status: start.status,\n domain: start.domain,\n });\n }\n\n /** Single poll of an async scoring job. */\n async getJob(jobId: string): Promise<JobResponse> {\n return this.transport.get<JobResponse>(`/v1/jobs/${encodeURIComponent(jobId)}`);\n }\n\n // ── History / cohort / confidence ────────────────────────────────────\n\n async history(\n domain: string,\n opts: { limit?: number; cursor?: string } = {},\n ): Promise<HistoryPage> {\n const params: Record<string, string | number> = { limit: opts.limit ?? 100 };\n if (opts.cursor) params.cursor = opts.cursor;\n return this.transport.get<HistoryPage>(\n `/v1/score/${encodeURIComponent(domain)}/history`,\n params,\n );\n }\n\n /** Auto-paginating async iterator over every history record. */\n async *iterHistory(\n domain: string,\n opts: { pageSize?: number; maxRecords?: number } = {},\n ): AsyncIterable<HistoryRecord> {\n const pageSize = opts.pageSize ?? 100;\n let cursor: string | undefined;\n let seen = 0;\n for (;;) {\n const pageOpts: { limit: number; cursor?: string } = { limit: pageSize };\n if (cursor !== undefined) pageOpts.cursor = cursor;\n const page = await this.history(domain, pageOpts);\n for (const rec of page.records) {\n if (opts.maxRecords !== undefined && seen >= opts.maxRecords) return;\n yield rec;\n seen += 1;\n }\n if (!page.next_cursor) return;\n cursor = page.next_cursor;\n }\n }\n\n async cohort(domain: string): Promise<Cohort> {\n return this.transport.get<Cohort>(`/v1/company/${encodeURIComponent(domain)}/cohort`);\n }\n\n async confidence(domain: string): Promise<Confidence> {\n return this.transport.get<Confidence>(\n `/v1/company/${encodeURIComponent(domain)}/confidence`,\n );\n }\n\n // ── Universe ─────────────────────────────────────────────────────────\n\n async distribution(): Promise<Distribution> {\n return this.transport.get<Distribution>(\"/v1/distribution\");\n }\n\n async movers(window: Window = \"30d\"): Promise<Movers> {\n return this.transport.get<Movers>(\"/v1/movers\", { window });\n }\n\n // ── Meta ─────────────────────────────────────────────────────────────\n\n async signals(): Promise<SignalsManifest> {\n return this.transport.get<SignalsManifest>(\"/v1/signals\");\n }\n\n async usage(): Promise<Usage> {\n return this.transport.get<Usage>(\"/v1/usage\");\n }\n}\n\n\n/** Handle to an async scoring job started via {@link Kepler.startScore}. */\nexport class Job {\n private response: JobResponse;\n private readonly client: Kepler;\n /** Set when the API short-circuits to a sync 200 (no cold work needed). */\n private cachedScore: Score | null = null;\n\n constructor(client: Kepler, response: JobResponse) {\n this.client = client;\n this.response = response;\n }\n\n /** Internal: wrap a sync-200 cached score response as a Job in `complete` state. */\n static _fromCachedScore(client: Kepler, score: Score): Job {\n const synthetic: JobResponse = {\n job_id: \"cached-fresh\",\n status: \"complete\",\n domain: score.domain,\n completed_at: score.scored_at,\n result_ref: { domain: score.domain, scored_at: score.scored_at },\n score_url: `/v1/score/${score.domain}`,\n };\n const job = new Job(client, synthetic);\n job.cachedScore = score;\n return job;\n }\n\n get id(): string {\n return this.response.job_id;\n }\n\n get status(): string {\n return this.response.status;\n }\n\n get domain(): string {\n return this.response.domain;\n }\n\n get raw(): JobResponse {\n return this.response;\n }\n\n /** One-shot poll. Updates the cached `raw` in place. */\n async refresh(): Promise<JobResponse> {\n if (this.id === \"cached-fresh\") return this.response;\n this.response = await this.client.getJob(this.id);\n return this.response;\n }\n\n /**\n * Poll until the job settles, then return the resulting {@link Score}.\n * Throws {@link JobFailed} on a `failed` status, or {@link JobTimeout}\n * if the job is still `pending` after `timeoutMs`.\n */\n async wait(opts: JobWaitOptions = {}): Promise<Score> {\n if (this.status === \"complete\" && this.cachedScore !== null) {\n return this.cachedScore;\n }\n\n const timeoutMs = opts.timeoutMs ?? DEFAULT_JOB_TIMEOUT_MS;\n const intervalMs = opts.intervalMs ?? DEFAULT_JOB_INTERVAL_MS;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n await this.refresh();\n if (this.response.status === \"complete\") {\n if (!this.response.result_ref) {\n throw new JobFailed(\n \"scoring_completed_no_record\",\n \"Job complete but result_ref missing\",\n );\n }\n return this.client.getScore(this.response.result_ref.domain);\n }\n if (this.response.status === \"failed\") {\n throw new JobFailed(\n this.response.failure_reason ?? \"sfn_failed\",\n `Job ${this.id} ended in failed state`,\n );\n }\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n\n throw new JobTimeout(\n \"job_timeout\",\n `Job ${this.id} did not settle within ${timeoutMs}ms`,\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/version.ts","../src/http.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Exception hierarchy for the Kepler Insights SDK.\n *\n * Branch with `instanceof` or on the stable `code` string. Error messages\n * may be tightened over time; the codes are stable.\n *\n * try {\n * const score = await client.score(\"stripe.com\");\n * } catch (err) {\n * if (err instanceof FreeTierSandboxOnly) { ... }\n * if (err instanceof ColdBudgetExhausted) { ... }\n * }\n */\n\nexport interface KeplerErrorOptions {\n statusCode?: number;\n response?: unknown;\n}\n\n/** Base class for every error raised by the SDK. */\nexport class KeplerError extends Error {\n public readonly code: string;\n public readonly statusCode?: number;\n public readonly response?: unknown;\n\n constructor(code: string, message: string = \"\", opts: KeplerErrorOptions = {}) {\n const rendered = message ? `[${code}] ${message}` : `[${code}]`;\n super(rendered);\n this.name = new.target.name;\n this.code = code;\n if (opts.statusCode !== undefined) this.statusCode = opts.statusCode;\n if (opts.response !== undefined) this.response = opts.response;\n // V8 stack trace cleanup\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(this, new.target);\n }\n }\n}\n\n// ── 4xx — caller errors ───────────────────────────────────────────────────\n\n/** 401: missing, invalid, or revoked API key. */\nexport class AuthError extends KeplerError {}\n\n/** 403: live key on Free tier attempted a real-domain score. */\nexport class FreeTierSandboxOnly extends KeplerError {}\n\n/** 403: catch-all forbidden (e.g. polling someone else's job_id). */\nexport class Forbidden extends KeplerError {}\n\n/** 404: domain has no score on file, or job_id expired/unknown. */\nexport class NotFound extends KeplerError {}\n\n/** 400: malformed request (bad domain, unsupported window, etc.). */\nexport class ValidationError extends KeplerError {}\n\n/** 429: rate-limited. `retryAfter` carries the Retry-After header in seconds. */\nexport class RateLimitError extends KeplerError {\n public readonly retryAfter?: number;\n\n constructor(\n code: string,\n message: string = \"\",\n opts: KeplerErrorOptions & { retryAfter?: number } = {},\n ) {\n super(code, message, opts);\n if (opts.retryAfter !== undefined) this.retryAfter = opts.retryAfter;\n }\n}\n\n/** 429 cold_budget_exhausted: monthly cold-call cap hit. `retryAfter` points at the next monthly reset (UTC). */\nexport class ColdBudgetExhausted extends RateLimitError {}\n\n// ── 5xx — server / pipeline errors ────────────────────────────────────────\n\n/** 5xx: server-side error. Retry once; if persistent, contact support. */\nexport class ServerError extends KeplerError {}\n\n/** 504: cold scoring exceeded sync budget. Poll GET /v1/score/{domain} in ~30s, or use startScore for async. */\nexport class ScoringTimeout extends ServerError {}\n\n// ── Client-side errors (no HTTP status) ───────────────────────────────────\n\n/** `Job.wait()` exceeded the caller's timeout while the job was still pending. */\nexport class JobTimeout extends KeplerError {}\n\n/** Async scoring job ended in `failed`. `code` carries the failure_reason. */\nexport class JobFailed extends KeplerError {}\n","export const VERSION = \"1.1.0\";\n","/**\n * Internal HTTP layer for the Kepler SDK.\n *\n * Responsibilities:\n * - Wrap fetch with auth + user-agent headers.\n * - Retry on 5xx and network errors with exponential backoff.\n * - Map responses → typed exception classes from `errors.ts`.\n *\n * Not part of the public API.\n */\n\nimport {\n AuthError,\n ColdBudgetExhausted,\n Forbidden,\n FreeTierSandboxOnly,\n KeplerError,\n NotFound,\n RateLimitError,\n ScoringTimeout,\n ServerError,\n ValidationError,\n} from \"./errors.js\";\nimport { VERSION } from \"./version.js\";\n\nexport interface TransportOptions {\n apiKey: string;\n baseUrl: string;\n timeoutMs?: number;\n retries?: number;\n fetchImpl?: typeof fetch;\n}\n\nconst DEFAULT_TIMEOUT_MS = 70_000;\nconst DEFAULT_RETRIES = 3;\nconst BACKOFF_BASE_MS = 500;\n\nconst RATE_LIMIT_CODES = new Set([\"cold_budget_exhausted\"]);\nconst FREE_TIER_CODES = new Set([\"free_tier_sandbox_only\"]);\n\ninterface ErrorBody {\n error?: string;\n message?: string;\n reason?: string;\n [k: string]: unknown;\n}\n\nexport class Transport {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly timeoutMs: number;\n private readonly retries: number;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: TransportOptions) {\n if (!opts.apiKey) {\n throw new AuthError(\"missing_api_key\", \"Set apiKey when creating Kepler()\");\n }\n this.apiKey = opts.apiKey;\n this.baseUrl = opts.baseUrl.replace(/\\/$/, \"\");\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.retries = Math.max(0, opts.retries ?? DEFAULT_RETRIES);\n this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);\n\n if (typeof this.fetchImpl !== \"function\") {\n throw new ServerError(\n \"fetch_unavailable\",\n \"globalThis.fetch is not defined. Use Node 18+ or pass fetchImpl.\",\n );\n }\n }\n\n async get<T>(path: string, params?: Record<string, string | number>): Promise<T> {\n return this.request<T>(\"GET\", path, { params });\n }\n\n async post<T>(\n path: string,\n body?: Record<string, unknown>,\n params?: Record<string, string | number>,\n ): Promise<T> {\n return this.request<T>(\"POST\", path, { body, params });\n }\n\n private async request<T>(\n method: string,\n path: string,\n opts: { body?: Record<string, unknown>; params?: Record<string, string | number> },\n ): Promise<T> {\n const url = this.buildUrl(path, opts.params);\n let lastErr: unknown = null;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers: this.buildHeaders(opts.body !== undefined),\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n lastErr = err;\n if (attempt < this.retries) {\n await sleep(BACKOFF_BASE_MS * 2 ** attempt);\n continue;\n }\n throw new ServerError(\n \"network_error\",\n `HTTP request failed after ${this.retries + 1} attempts: ${stringifyError(err)}`,\n );\n }\n clearTimeout(timer);\n\n if (response.status >= 500 && attempt < this.retries) {\n await sleep(BACKOFF_BASE_MS * 2 ** attempt);\n continue;\n }\n\n return this.handle<T>(response);\n }\n\n throw new ServerError(\"internal\", `exhausted retries: ${stringifyError(lastErr)}`);\n }\n\n private buildUrl(path: string, params?: Record<string, string | number>): string {\n const url = new URL(path.startsWith(\"/\") ? path : `/${path}`, this.baseUrl);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n }\n\n private buildHeaders(hasBody: boolean): Record<string, string> {\n const h: Record<string, string> = {\n \"X-API-Key\": this.apiKey,\n \"User-Agent\": `kepler-insights-typescript/${VERSION}`,\n \"Accept\": \"application/json\",\n };\n if (hasBody) h[\"Content-Type\"] = \"application/json\";\n return h;\n }\n\n private async handle<T>(response: Response): Promise<T> {\n const body = await safeJson(response);\n\n if (response.status >= 200 && response.status < 300) {\n return (body ?? {}) as T;\n }\n\n const errBody = (body ?? {}) as ErrorBody;\n const code = (errBody.error ?? \"\").trim();\n const message = (errBody.message ?? \"\").trim();\n const status = response.status;\n\n if (status === 401) {\n throw new AuthError(code || \"unauthorized\", message, { statusCode: status, response: body });\n }\n if (status === 403) {\n const Cls = FREE_TIER_CODES.has(code) ? FreeTierSandboxOnly : Forbidden;\n throw new Cls(code || \"forbidden\", message, { statusCode: status, response: body });\n }\n if (status === 404) {\n throw new NotFound(code || \"not_found\", message, { statusCode: status, response: body });\n }\n if (status === 429) {\n const retryAfter = parseRetryAfter(response);\n const Cls = RATE_LIMIT_CODES.has(code) ? ColdBudgetExhausted : RateLimitError;\n throw new Cls(code || \"rate_limited\", message, {\n statusCode: status,\n response: body,\n retryAfter,\n });\n }\n if (status === 504) {\n throw new ScoringTimeout(code || \"scoring_timeout\", message, {\n statusCode: status, response: body,\n });\n }\n if (status >= 400 && status < 500) {\n throw new ValidationError(code || `http_${status}`, message, {\n statusCode: status, response: body,\n });\n }\n throw new ServerError(code || `http_${status}`, message, {\n statusCode: status, response: body,\n });\n }\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\nasync function safeJson(response: Response): Promise<unknown | null> {\n try {\n const text = await response.text();\n return text ? JSON.parse(text) : null;\n } catch {\n return null;\n }\n}\n\nfunction parseRetryAfter(response: Response): number | undefined {\n const raw = response.headers.get(\"Retry-After\") ?? response.headers.get(\"retry-after\");\n if (!raw) return undefined;\n const n = parseInt(raw, 10);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction stringifyError(err: unknown): string {\n if (err instanceof KeplerError) return err.message;\n if (err instanceof Error) return err.message;\n return String(err);\n}\n","/**\n * High-level Kepler Insights API client.\n *\n * Usage\n * -----\n *\n * import { Kepler } from \"@kepler-insights/sdk\";\n * const client = new Kepler({ apiKey: \"ki_live_...\" });\n * const score = await client.score(\"stripe.com\");\n * console.log(score.ki_rating, score.composite_score);\n *\n * Async cold scoring\n * ------------------\n *\n * const job = await client.startScore(\"stripe.com\");\n * const score = await job.wait({ timeoutMs: 180_000 });\n */\n\nimport { JobFailed, JobTimeout } from \"./errors.js\";\nimport { Transport, TransportOptions } from \"./http.js\";\nimport type {\n Cohort,\n Confidence,\n Distribution,\n HistoryPage,\n HistoryRecord,\n JobResponse,\n Movers,\n Score,\n SignalsManifest,\n StartAsyncResponse,\n Usage,\n Window,\n} from \"./types.js\";\n\nexport interface KeplerOptions {\n apiKey: string;\n baseUrl?: string;\n timeoutMs?: number;\n retries?: number;\n /** Inject a custom fetch (e.g. for proxies, custom TLS). Defaults to globalThis.fetch. */\n fetchImpl?: typeof fetch;\n}\n\nexport interface JobWaitOptions {\n /** Total wait budget in milliseconds. Default 180_000 (3 min). */\n timeoutMs?: number;\n /** Poll interval in milliseconds. Default 5_000. */\n intervalMs?: number;\n}\n\nconst DEFAULT_BASE_URL = \"https://api.keplerinsights.us\";\nconst DEFAULT_JOB_INTERVAL_MS = 5_000;\nconst DEFAULT_JOB_TIMEOUT_MS = 180_000;\n\n\nexport class Kepler {\n private readonly transport: Transport;\n\n constructor(opts: KeplerOptions) {\n const transportOpts: TransportOptions = {\n apiKey: opts.apiKey,\n baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,\n timeoutMs: opts.timeoutMs ?? 70_000,\n retries: opts.retries ?? 3,\n };\n if (opts.fetchImpl) transportOpts.fetchImpl = opts.fetchImpl;\n this.transport = new Transport(transportOpts);\n }\n\n // ── Scoring ──────────────────────────────────────────────────────────\n\n /**\n * Score a company. Blocks until the score is available.\n *\n * - Cached path (fresh record exists): returns inline in <1s.\n * - Cold path: server returns 202 + job_id; this method internally polls\n * until the job settles. Cold scoring runs typically 25-90 seconds.\n *\n * Pass `{ timeoutMs }` to bound the cold-wait (default 180_000 ms = 3 min).\n * Throws {@link JobTimeout} if the cold job hasn't settled before the\n * timeout; the job continues server-side and can be recovered via\n * {@link getJob} using the job_id from the error payload.\n *\n * For non-blocking access, use {@link startScore} for a Job handle.\n */\n async score(\n domain: string,\n opts: { forceFresh?: boolean; timeoutMs?: number } = {},\n ): Promise<Score> {\n const body: Record<string, unknown> = { domain };\n if (opts.forceFresh) body.force_fresh = true;\n const raw = await this.transport.post<StartAsyncResponse | Score>(\n \"/v1/score\",\n body,\n );\n // Cached-fresh: 200 with a score body.\n if (!(\"job_id\" in raw) && \"composite_score\" in raw) {\n return raw as Score;\n }\n // Cold path: 202 with a job body — auto-poll until terminal.\n const start = raw as StartAsyncResponse;\n const job = new Job(this, {\n job_id: start.job_id,\n status: start.status,\n domain: start.domain,\n });\n return job.wait({ timeoutMs: opts.timeoutMs ?? 180_000 });\n }\n\n /**\n * Read the latest cached score. Never triggers a cold run.\n * Throws {@link NotFound} if the domain has never been scored.\n */\n async getScore(domain: string): Promise<Score> {\n return this.transport.get<Score>(`/v1/score/${encodeURIComponent(domain)}`);\n }\n\n /**\n * Start an async cold-scoring job (Growth+ tiers). Returns a Job handle.\n * Use {@link Job.wait} to block until completion.\n */\n async startScore(domain: string, opts: { forceFresh?: boolean } = {}): Promise<Job> {\n const body: Record<string, unknown> = { domain, wait: false };\n if (opts.forceFresh) body.force_fresh = true;\n const raw = await this.transport.post<StartAsyncResponse | Score>(\n \"/v1/score\",\n body,\n { wait: \"false\" },\n );\n\n // Cached-fresh short-circuit: server returned a sync 200 score because\n // no cold work was needed. Wrap as a Job already in `complete` state.\n if (!(\"job_id\" in raw) && \"composite_score\" in raw) {\n return Job._fromCachedScore(this, raw as Score);\n }\n const start = raw as StartAsyncResponse;\n return new Job(this, {\n job_id: start.job_id,\n status: start.status,\n domain: start.domain,\n });\n }\n\n /** Single poll of an async scoring job. */\n async getJob(jobId: string): Promise<JobResponse> {\n return this.transport.get<JobResponse>(`/v1/jobs/${encodeURIComponent(jobId)}`);\n }\n\n // ── History / cohort / confidence ────────────────────────────────────\n\n async history(\n domain: string,\n opts: { limit?: number; cursor?: string } = {},\n ): Promise<HistoryPage> {\n const params: Record<string, string | number> = { limit: opts.limit ?? 100 };\n if (opts.cursor) params.cursor = opts.cursor;\n return this.transport.get<HistoryPage>(\n `/v1/score/${encodeURIComponent(domain)}/history`,\n params,\n );\n }\n\n /** Auto-paginating async iterator over every history record. */\n async *iterHistory(\n domain: string,\n opts: { pageSize?: number; maxRecords?: number } = {},\n ): AsyncIterable<HistoryRecord> {\n const pageSize = opts.pageSize ?? 100;\n let cursor: string | undefined;\n let seen = 0;\n for (;;) {\n const pageOpts: { limit: number; cursor?: string } = { limit: pageSize };\n if (cursor !== undefined) pageOpts.cursor = cursor;\n const page = await this.history(domain, pageOpts);\n for (const rec of page.records) {\n if (opts.maxRecords !== undefined && seen >= opts.maxRecords) return;\n yield rec;\n seen += 1;\n }\n if (!page.next_cursor) return;\n cursor = page.next_cursor;\n }\n }\n\n async cohort(domain: string): Promise<Cohort> {\n return this.transport.get<Cohort>(`/v1/company/${encodeURIComponent(domain)}/cohort`);\n }\n\n async confidence(domain: string): Promise<Confidence> {\n return this.transport.get<Confidence>(\n `/v1/company/${encodeURIComponent(domain)}/confidence`,\n );\n }\n\n // ── Universe ─────────────────────────────────────────────────────────\n\n async distribution(): Promise<Distribution> {\n return this.transport.get<Distribution>(\"/v1/distribution\");\n }\n\n async movers(window: Window = \"30d\"): Promise<Movers> {\n return this.transport.get<Movers>(\"/v1/movers\", { window });\n }\n\n // ── Meta ─────────────────────────────────────────────────────────────\n\n async signals(): Promise<SignalsManifest> {\n return this.transport.get<SignalsManifest>(\"/v1/signals\");\n }\n\n async usage(): Promise<Usage> {\n return this.transport.get<Usage>(\"/v1/usage\");\n }\n}\n\n\n/** Handle to an async scoring job started via {@link Kepler.startScore}. */\nexport class Job {\n private response: JobResponse;\n private readonly client: Kepler;\n /** Set when the API short-circuits to a sync 200 (no cold work needed). */\n private cachedScore: Score | null = null;\n\n constructor(client: Kepler, response: JobResponse) {\n this.client = client;\n this.response = response;\n }\n\n /** Internal: wrap a sync-200 cached score response as a Job in `complete` state. */\n static _fromCachedScore(client: Kepler, score: Score): Job {\n const synthetic: JobResponse = {\n job_id: \"cached-fresh\",\n status: \"complete\",\n domain: score.domain,\n completed_at: score.scored_at,\n result_ref: { domain: score.domain, scored_at: score.scored_at },\n score_url: `/v1/score/${score.domain}`,\n };\n const job = new Job(client, synthetic);\n job.cachedScore = score;\n return job;\n }\n\n get id(): string {\n return this.response.job_id;\n }\n\n get status(): string {\n return this.response.status;\n }\n\n get domain(): string {\n return this.response.domain;\n }\n\n get raw(): JobResponse {\n return this.response;\n }\n\n /** One-shot poll. Updates the cached `raw` in place. */\n async refresh(): Promise<JobResponse> {\n if (this.id === \"cached-fresh\") return this.response;\n this.response = await this.client.getJob(this.id);\n return this.response;\n }\n\n /**\n * Poll until the job settles, then return the resulting {@link Score}.\n * Throws {@link JobFailed} on a `failed` status, or {@link JobTimeout}\n * if the job is still `pending` after `timeoutMs`.\n */\n async wait(opts: JobWaitOptions = {}): Promise<Score> {\n if (this.status === \"complete\" && this.cachedScore !== null) {\n return this.cachedScore;\n }\n\n const timeoutMs = opts.timeoutMs ?? DEFAULT_JOB_TIMEOUT_MS;\n const intervalMs = opts.intervalMs ?? DEFAULT_JOB_INTERVAL_MS;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n await this.refresh();\n if (this.response.status === \"complete\") {\n if (!this.response.result_ref) {\n throw new JobFailed(\n \"scoring_completed_no_record\",\n \"Job complete but result_ref missing\",\n );\n }\n return this.client.getScore(this.response.result_ref.domain);\n }\n if (this.response.status === \"failed\") {\n throw new JobFailed(\n this.response.failure_reason ?? \"sfn_failed\",\n `Job ${this.id} ended in failed state`,\n );\n }\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n\n throw new JobTimeout(\n \"job_timeout\",\n `Job ${this.id} did not settle within ${timeoutMs}ms`,\n );\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kepler-insights/sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Official TypeScript SDK for the Kepler Insights API — curated company-scoring intelligence over a 67-signal engine.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Kepler Insights <noah@keplerinsights.us>",
|