@kepler-insights/sdk 1.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kepler Insights
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,154 @@
1
+ # Kepler Insights — TypeScript SDK
2
+
3
+ Official TypeScript / JavaScript SDK for the [Kepler Insights API](https://api.keplerinsights.us) — curated company-scoring intelligence over a 67-signal engine.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @kepler-insights/sdk
9
+ # or
10
+ pnpm add @kepler-insights/sdk
11
+ # or
12
+ yarn add @kepler-insights/sdk
13
+ ```
14
+
15
+ Requires Node 18+. Native `fetch` is the only network dep — no axios, no `node-fetch` polyfill needed. Works in Node, Deno, Bun, and Cloudflare Workers.
16
+
17
+ ## Quickstart
18
+
19
+ ```ts
20
+ import { Kepler } from "@kepler-insights/sdk";
21
+
22
+ const client = new Kepler({ apiKey: "ki_live_..." });
23
+
24
+ const score = await client.score("stripe.com");
25
+ console.log(`${score.domain}: ${score.ki_rating} (${score.composite_score.toFixed(1)})`);
26
+ console.log(` team: ${score.buckets.team_structure.toFixed(1)}`);
27
+ console.log(` market: ${score.buckets.market_position.toFixed(1)}`);
28
+ ```
29
+
30
+ Sandbox keys (`ki_test_...`) accept only the 4 canned domains — `acme.test`, `unicorn.test`, `struggling.test`, `cohort.test`. See the [Sandbox guide](https://docs.keplerinsights.us/sandbox).
31
+
32
+ ## API surface
33
+
34
+ | Method | Endpoint | Returns |
35
+ |---|---|---|
36
+ | `client.score(domain)` | POST `/v1/score` | `Score` |
37
+ | `client.getScore(domain)` | GET `/v1/score/{domain}` | `Score` |
38
+ | `client.startScore(domain)` | POST `/v1/score?wait=false` | `Job` (Growth+) |
39
+ | `client.getJob(jobId)` | GET `/v1/jobs/{job_id}` | `JobResponse` |
40
+ | `client.history(domain, { limit, cursor })` | GET `/v1/score/{domain}/history` | `HistoryPage` |
41
+ | `client.iterHistory(domain, { maxRecords })` | (auto-paginates) | `AsyncIterable<HistoryRecord>` |
42
+ | `client.cohort(domain)` | GET `/v1/company/{domain}/cohort` | `Cohort` |
43
+ | `client.confidence(domain)` | GET `/v1/company/{domain}/confidence` | `Confidence` |
44
+ | `client.distribution()` | GET `/v1/distribution` | `Distribution` |
45
+ | `client.movers(window)` | GET `/v1/movers` | `Movers` |
46
+ | `client.signals()` | GET `/v1/signals` | `SignalsManifest` |
47
+ | `client.usage()` | GET `/v1/usage` | `Usage` |
48
+
49
+ Every response shape is exported as a TypeScript type from the package root.
50
+
51
+ ## Async cold scoring
52
+
53
+ Cold scoring takes 30–60 seconds. On Growth and above, you can start a job and poll without holding an HTTP connection open:
54
+
55
+ ```ts
56
+ const job = await client.startScore("stripe.com");
57
+ const score = await job.wait({ timeoutMs: 180_000 });
58
+ console.log(score.composite_score);
59
+ ```
60
+
61
+ If the API short-circuits to a cached-fresh response (no cold work needed), `startScore` returns a `Job` already in the `complete` state — `wait()` returns instantly. This mirrors Stripe's `payment_intent` "no action needed" pattern.
62
+
63
+ ## Error handling
64
+
65
+ Every error inherits from `KeplerError`. Branch with `instanceof`:
66
+
67
+ ```ts
68
+ import {
69
+ Kepler,
70
+ AuthError,
71
+ ColdBudgetExhausted,
72
+ FreeTierSandboxOnly,
73
+ NotFound,
74
+ RateLimitError,
75
+ ScoringTimeout,
76
+ } from "@kepler-insights/sdk";
77
+
78
+ try {
79
+ const score = await client.score("stripe.com");
80
+ } catch (err) {
81
+ if (err instanceof FreeTierSandboxOnly) {
82
+ console.log("Upgrade to Starter for live scoring.");
83
+ } else if (err instanceof ColdBudgetExhausted) {
84
+ console.log(`Monthly cap hit. Resets in ${err.retryAfter}s.`);
85
+ } else if (err instanceof RateLimitError) {
86
+ console.log(`Rate limited. Retry in ${err.retryAfter}s.`);
87
+ } else if (err instanceof ScoringTimeout) {
88
+ console.log("Cold scoring exceeded sync budget — use startScore() for async.");
89
+ } else if (err instanceof NotFound) {
90
+ console.log("Never scored. Trigger one with score(domain).");
91
+ } else if (err instanceof AuthError) {
92
+ console.log("Invalid or revoked API key.");
93
+ } else {
94
+ throw err;
95
+ }
96
+ }
97
+ ```
98
+
99
+ The SDK auto-retries 5xx and network errors with exponential backoff (3 attempts default). It never retries 4xx — those are caller errors.
100
+
101
+ ## Configuration
102
+
103
+ ```ts
104
+ const client = new Kepler({
105
+ apiKey: "ki_live_...",
106
+ baseUrl: "https://api.keplerinsights.us", // override only for testing
107
+ timeoutMs: 70_000, // per-request timeout
108
+ retries: 3, // 5xx retry attempts
109
+ });
110
+ ```
111
+
112
+ For custom transports (proxies, mTLS, etc.) pass your own `fetch`:
113
+
114
+ ```ts
115
+ import { Kepler } from "@kepler-insights/sdk";
116
+ import { ProxyAgent } from "undici";
117
+
118
+ const dispatcher = new ProxyAgent("http://proxy.local:8080");
119
+ const customFetch: typeof fetch = (input, init) =>
120
+ fetch(input, { ...init, dispatcher } as RequestInit);
121
+
122
+ const client = new Kepler({ apiKey: "ki_live_...", fetchImpl: customFetch });
123
+ ```
124
+
125
+ ## Module compatibility
126
+
127
+ Dual ESM + CJS published. Use whichever your project prefers:
128
+
129
+ ```ts
130
+ // ESM
131
+ import { Kepler } from "@kepler-insights/sdk";
132
+ ```
133
+
134
+ ```js
135
+ // CommonJS
136
+ const { Kepler } = require("@kepler-insights/sdk");
137
+ ```
138
+
139
+ TypeScript declarations ship in both flavors (`.d.ts` and `.d.cts`).
140
+
141
+ ## Development
142
+
143
+ ```bash
144
+ git clone <repo>
145
+ cd Ki_dev/sdk-typescript
146
+ npm install
147
+ npm test # vitest
148
+ npm run typecheck # tsc --noEmit
149
+ npm run build # tsup → dist/
150
+ ```
151
+
152
+ ## License
153
+
154
+ MIT. The API itself is proprietary; the SDK wrapper is MIT-licensed so you can vendor it freely.
package/dist/index.cjs ADDED
@@ -0,0 +1,411 @@
1
+ 'use strict';
2
+
3
+ // src/errors.ts
4
+ var KeplerError = class extends Error {
5
+ code;
6
+ statusCode;
7
+ response;
8
+ constructor(code, message = "", opts = {}) {
9
+ const rendered = message ? `[${code}] ${message}` : `[${code}]`;
10
+ super(rendered);
11
+ this.name = new.target.name;
12
+ this.code = code;
13
+ if (opts.statusCode !== void 0) this.statusCode = opts.statusCode;
14
+ if (opts.response !== void 0) this.response = opts.response;
15
+ if (typeof Error.captureStackTrace === "function") {
16
+ Error.captureStackTrace(this, new.target);
17
+ }
18
+ }
19
+ };
20
+ var AuthError = class extends KeplerError {
21
+ };
22
+ var FreeTierSandboxOnly = class extends KeplerError {
23
+ };
24
+ var Forbidden = class extends KeplerError {
25
+ };
26
+ var NotFound = class extends KeplerError {
27
+ };
28
+ var ValidationError = class extends KeplerError {
29
+ };
30
+ var RateLimitError = class extends KeplerError {
31
+ retryAfter;
32
+ constructor(code, message = "", opts = {}) {
33
+ super(code, message, opts);
34
+ if (opts.retryAfter !== void 0) this.retryAfter = opts.retryAfter;
35
+ }
36
+ };
37
+ var ColdBudgetExhausted = class extends RateLimitError {
38
+ };
39
+ var ServerError = class extends KeplerError {
40
+ };
41
+ var ScoringTimeout = class extends ServerError {
42
+ };
43
+ var JobTimeout = class extends KeplerError {
44
+ };
45
+ var JobFailed = class extends KeplerError {
46
+ };
47
+
48
+ // src/version.ts
49
+ var VERSION = "1.0.0";
50
+
51
+ // src/http.ts
52
+ var DEFAULT_TIMEOUT_MS = 7e4;
53
+ var DEFAULT_RETRIES = 3;
54
+ var BACKOFF_BASE_MS = 500;
55
+ var RATE_LIMIT_CODES = /* @__PURE__ */ new Set(["cold_budget_exhausted"]);
56
+ var FREE_TIER_CODES = /* @__PURE__ */ new Set(["free_tier_sandbox_only"]);
57
+ var Transport = class {
58
+ apiKey;
59
+ baseUrl;
60
+ timeoutMs;
61
+ retries;
62
+ fetchImpl;
63
+ constructor(opts) {
64
+ if (!opts.apiKey) {
65
+ throw new AuthError("missing_api_key", "Set apiKey when creating Kepler()");
66
+ }
67
+ this.apiKey = opts.apiKey;
68
+ this.baseUrl = opts.baseUrl.replace(/\/$/, "");
69
+ this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
70
+ this.retries = Math.max(0, opts.retries ?? DEFAULT_RETRIES);
71
+ this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);
72
+ if (typeof this.fetchImpl !== "function") {
73
+ throw new ServerError(
74
+ "fetch_unavailable",
75
+ "globalThis.fetch is not defined. Use Node 18+ or pass fetchImpl."
76
+ );
77
+ }
78
+ }
79
+ async get(path, params) {
80
+ return this.request("GET", path, { params });
81
+ }
82
+ async post(path, body, params) {
83
+ return this.request("POST", path, { body, params });
84
+ }
85
+ async request(method, path, opts) {
86
+ const url = this.buildUrl(path, opts.params);
87
+ let lastErr = null;
88
+ for (let attempt = 0; attempt <= this.retries; attempt++) {
89
+ const controller = new AbortController();
90
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
91
+ let response;
92
+ try {
93
+ response = await this.fetchImpl(url, {
94
+ method,
95
+ headers: this.buildHeaders(opts.body !== void 0),
96
+ body: opts.body !== void 0 ? JSON.stringify(opts.body) : void 0,
97
+ signal: controller.signal
98
+ });
99
+ } catch (err) {
100
+ clearTimeout(timer);
101
+ lastErr = err;
102
+ if (attempt < this.retries) {
103
+ await sleep(BACKOFF_BASE_MS * 2 ** attempt);
104
+ continue;
105
+ }
106
+ throw new ServerError(
107
+ "network_error",
108
+ `HTTP request failed after ${this.retries + 1} attempts: ${stringifyError(err)}`
109
+ );
110
+ }
111
+ clearTimeout(timer);
112
+ if (response.status >= 500 && attempt < this.retries) {
113
+ await sleep(BACKOFF_BASE_MS * 2 ** attempt);
114
+ continue;
115
+ }
116
+ return this.handle(response);
117
+ }
118
+ throw new ServerError("internal", `exhausted retries: ${stringifyError(lastErr)}`);
119
+ }
120
+ buildUrl(path, params) {
121
+ const url = new URL(path.startsWith("/") ? path : `/${path}`, this.baseUrl);
122
+ if (params) {
123
+ for (const [k, v] of Object.entries(params)) {
124
+ url.searchParams.set(k, String(v));
125
+ }
126
+ }
127
+ return url.toString();
128
+ }
129
+ buildHeaders(hasBody) {
130
+ const h = {
131
+ "X-API-Key": this.apiKey,
132
+ "User-Agent": `kepler-insights-typescript/${VERSION}`,
133
+ "Accept": "application/json"
134
+ };
135
+ if (hasBody) h["Content-Type"] = "application/json";
136
+ return h;
137
+ }
138
+ async handle(response) {
139
+ const body = await safeJson(response);
140
+ if (response.status >= 200 && response.status < 300) {
141
+ return body ?? {};
142
+ }
143
+ const errBody = body ?? {};
144
+ const code = (errBody.error ?? "").trim();
145
+ const message = (errBody.message ?? "").trim();
146
+ const status = response.status;
147
+ if (status === 401) {
148
+ throw new AuthError(code || "unauthorized", message, { statusCode: status, response: body });
149
+ }
150
+ if (status === 403) {
151
+ const Cls = FREE_TIER_CODES.has(code) ? FreeTierSandboxOnly : Forbidden;
152
+ throw new Cls(code || "forbidden", message, { statusCode: status, response: body });
153
+ }
154
+ if (status === 404) {
155
+ throw new NotFound(code || "not_found", message, { statusCode: status, response: body });
156
+ }
157
+ if (status === 429) {
158
+ const retryAfter = parseRetryAfter(response);
159
+ const Cls = RATE_LIMIT_CODES.has(code) ? ColdBudgetExhausted : RateLimitError;
160
+ throw new Cls(code || "rate_limited", message, {
161
+ statusCode: status,
162
+ response: body,
163
+ retryAfter
164
+ });
165
+ }
166
+ if (status === 504) {
167
+ throw new ScoringTimeout(code || "scoring_timeout", message, {
168
+ statusCode: status,
169
+ response: body
170
+ });
171
+ }
172
+ if (status >= 400 && status < 500) {
173
+ throw new ValidationError(code || `http_${status}`, message, {
174
+ statusCode: status,
175
+ response: body
176
+ });
177
+ }
178
+ throw new ServerError(code || `http_${status}`, message, {
179
+ statusCode: status,
180
+ response: body
181
+ });
182
+ }
183
+ };
184
+ async function safeJson(response) {
185
+ try {
186
+ const text = await response.text();
187
+ return text ? JSON.parse(text) : null;
188
+ } catch {
189
+ return null;
190
+ }
191
+ }
192
+ function parseRetryAfter(response) {
193
+ const raw = response.headers.get("Retry-After") ?? response.headers.get("retry-after");
194
+ if (!raw) return void 0;
195
+ const n = parseInt(raw, 10);
196
+ return Number.isFinite(n) ? n : void 0;
197
+ }
198
+ function sleep(ms) {
199
+ return new Promise((r) => setTimeout(r, ms));
200
+ }
201
+ function stringifyError(err) {
202
+ if (err instanceof KeplerError) return err.message;
203
+ if (err instanceof Error) return err.message;
204
+ return String(err);
205
+ }
206
+
207
+ // src/client.ts
208
+ var DEFAULT_BASE_URL = "https://api.keplerinsights.us";
209
+ var DEFAULT_JOB_INTERVAL_MS = 5e3;
210
+ var DEFAULT_JOB_TIMEOUT_MS = 18e4;
211
+ var Kepler = class {
212
+ transport;
213
+ constructor(opts) {
214
+ const transportOpts = {
215
+ apiKey: opts.apiKey,
216
+ baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,
217
+ timeoutMs: opts.timeoutMs ?? 7e4,
218
+ retries: opts.retries ?? 3
219
+ };
220
+ if (opts.fetchImpl) transportOpts.fetchImpl = opts.fetchImpl;
221
+ this.transport = new Transport(transportOpts);
222
+ }
223
+ // ── Scoring ──────────────────────────────────────────────────────────
224
+ /**
225
+ * Score a company. Blocks up to ~70s on cold scoring.
226
+ * Returns a cached record if one exists within the tier's freshness window.
227
+ */
228
+ async score(domain, opts = {}) {
229
+ const body = { domain };
230
+ if (opts.forceFresh) body.force_fresh = true;
231
+ return this.transport.post("/v1/score", body);
232
+ }
233
+ /**
234
+ * Read the latest cached score. Never triggers a cold run.
235
+ * Throws {@link NotFound} if the domain has never been scored.
236
+ */
237
+ async getScore(domain) {
238
+ return this.transport.get(`/v1/score/${encodeURIComponent(domain)}`);
239
+ }
240
+ /**
241
+ * Start an async cold-scoring job (Growth+ tiers). Returns a Job handle.
242
+ * Use {@link Job.wait} to block until completion.
243
+ */
244
+ async startScore(domain, opts = {}) {
245
+ const body = { domain, wait: false };
246
+ if (opts.forceFresh) body.force_fresh = true;
247
+ const raw = await this.transport.post(
248
+ "/v1/score",
249
+ body,
250
+ { wait: "false" }
251
+ );
252
+ if (!("job_id" in raw) && "composite_score" in raw) {
253
+ return Job._fromCachedScore(this, raw);
254
+ }
255
+ const start = raw;
256
+ return new Job(this, {
257
+ job_id: start.job_id,
258
+ status: start.status,
259
+ domain: start.domain
260
+ });
261
+ }
262
+ /** Single poll of an async scoring job. */
263
+ async getJob(jobId) {
264
+ return this.transport.get(`/v1/jobs/${encodeURIComponent(jobId)}`);
265
+ }
266
+ // ── History / cohort / confidence ────────────────────────────────────
267
+ async history(domain, opts = {}) {
268
+ const params = { limit: opts.limit ?? 100 };
269
+ if (opts.cursor) params.cursor = opts.cursor;
270
+ return this.transport.get(
271
+ `/v1/score/${encodeURIComponent(domain)}/history`,
272
+ params
273
+ );
274
+ }
275
+ /** Auto-paginating async iterator over every history record. */
276
+ async *iterHistory(domain, opts = {}) {
277
+ const pageSize = opts.pageSize ?? 100;
278
+ let cursor;
279
+ let seen = 0;
280
+ for (; ; ) {
281
+ const pageOpts = { limit: pageSize };
282
+ if (cursor !== void 0) pageOpts.cursor = cursor;
283
+ const page = await this.history(domain, pageOpts);
284
+ for (const rec of page.records) {
285
+ if (opts.maxRecords !== void 0 && seen >= opts.maxRecords) return;
286
+ yield rec;
287
+ seen += 1;
288
+ }
289
+ if (!page.next_cursor) return;
290
+ cursor = page.next_cursor;
291
+ }
292
+ }
293
+ async cohort(domain) {
294
+ return this.transport.get(`/v1/company/${encodeURIComponent(domain)}/cohort`);
295
+ }
296
+ async confidence(domain) {
297
+ return this.transport.get(
298
+ `/v1/company/${encodeURIComponent(domain)}/confidence`
299
+ );
300
+ }
301
+ // ── Universe ─────────────────────────────────────────────────────────
302
+ async distribution() {
303
+ return this.transport.get("/v1/distribution");
304
+ }
305
+ async movers(window = "30d") {
306
+ return this.transport.get("/v1/movers", { window });
307
+ }
308
+ // ── Meta ─────────────────────────────────────────────────────────────
309
+ async signals() {
310
+ return this.transport.get("/v1/signals");
311
+ }
312
+ async usage() {
313
+ return this.transport.get("/v1/usage");
314
+ }
315
+ };
316
+ var Job = class _Job {
317
+ response;
318
+ client;
319
+ /** Set when the API short-circuits to a sync 200 (no cold work needed). */
320
+ cachedScore = null;
321
+ constructor(client, response) {
322
+ this.client = client;
323
+ this.response = response;
324
+ }
325
+ /** Internal: wrap a sync-200 cached score response as a Job in `complete` state. */
326
+ static _fromCachedScore(client, score) {
327
+ const synthetic = {
328
+ job_id: "cached-fresh",
329
+ status: "complete",
330
+ domain: score.domain,
331
+ completed_at: score.scored_at,
332
+ result_ref: { domain: score.domain, scored_at: score.scored_at },
333
+ score_url: `/v1/score/${score.domain}`
334
+ };
335
+ const job = new _Job(client, synthetic);
336
+ job.cachedScore = score;
337
+ return job;
338
+ }
339
+ get id() {
340
+ return this.response.job_id;
341
+ }
342
+ get status() {
343
+ return this.response.status;
344
+ }
345
+ get domain() {
346
+ return this.response.domain;
347
+ }
348
+ get raw() {
349
+ return this.response;
350
+ }
351
+ /** One-shot poll. Updates the cached `raw` in place. */
352
+ async refresh() {
353
+ if (this.id === "cached-fresh") return this.response;
354
+ this.response = await this.client.getJob(this.id);
355
+ return this.response;
356
+ }
357
+ /**
358
+ * Poll until the job settles, then return the resulting {@link Score}.
359
+ * Throws {@link JobFailed} on a `failed` status, or {@link JobTimeout}
360
+ * if the job is still `pending` after `timeoutMs`.
361
+ */
362
+ async wait(opts = {}) {
363
+ if (this.status === "complete" && this.cachedScore !== null) {
364
+ return this.cachedScore;
365
+ }
366
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_JOB_TIMEOUT_MS;
367
+ const intervalMs = opts.intervalMs ?? DEFAULT_JOB_INTERVAL_MS;
368
+ const deadline = Date.now() + timeoutMs;
369
+ while (Date.now() < deadline) {
370
+ await this.refresh();
371
+ if (this.response.status === "complete") {
372
+ if (!this.response.result_ref) {
373
+ throw new JobFailed(
374
+ "scoring_completed_no_record",
375
+ "Job complete but result_ref missing"
376
+ );
377
+ }
378
+ return this.client.getScore(this.response.result_ref.domain);
379
+ }
380
+ if (this.response.status === "failed") {
381
+ throw new JobFailed(
382
+ this.response.failure_reason ?? "sfn_failed",
383
+ `Job ${this.id} ended in failed state`
384
+ );
385
+ }
386
+ await new Promise((r) => setTimeout(r, intervalMs));
387
+ }
388
+ throw new JobTimeout(
389
+ "job_timeout",
390
+ `Job ${this.id} did not settle within ${timeoutMs}ms`
391
+ );
392
+ }
393
+ };
394
+
395
+ exports.AuthError = AuthError;
396
+ exports.ColdBudgetExhausted = ColdBudgetExhausted;
397
+ exports.Forbidden = Forbidden;
398
+ exports.FreeTierSandboxOnly = FreeTierSandboxOnly;
399
+ exports.Job = Job;
400
+ exports.JobFailed = JobFailed;
401
+ exports.JobTimeout = JobTimeout;
402
+ exports.Kepler = Kepler;
403
+ exports.KeplerError = KeplerError;
404
+ exports.NotFound = NotFound;
405
+ exports.RateLimitError = RateLimitError;
406
+ exports.ScoringTimeout = ScoringTimeout;
407
+ exports.ServerError = ServerError;
408
+ exports.VERSION = VERSION;
409
+ exports.ValidationError = ValidationError;
410
+ //# sourceMappingURL=index.cjs.map
411
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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"]}