@datacline/langos-sdk-node 0.2.0-alpha.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/errors.ts","../src/core/retry.ts","../src/core/idempotency.ts","../src/core/version.ts","../src/core/request.ts","../src/resources/base.ts","../src/core/transform.ts","../src/resources/account.ts","../src/core/pagination.ts","../src/resources/assessments.ts","../src/resources/candidates.ts","../src/resources/sessions.ts","../src/resources/webhooks.ts","../src/core/logger.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["// Error hierarchy for the Langos SDK. All non-network errors thrown by the\n// client extend `LangosError`. Partners should catch the most specific subclass\n// they care about and let the rest bubble.\n\n/**\n * Structured details merged into the 402 `quota_exceeded` error body. The\n * server emits these as top-level fields alongside the standard problem+json\n * envelope; partners can render an upgrade prompt without parsing free-form\n * text.\n */\nexport interface QuotaExceededDetails {\n sessions_used: number;\n sessions_limit: number;\n /** ISO timestamp when the quota window resets. */\n reset_at: string;\n /** Absolute URL to the upgrade page; `null` if the server can't build one. */\n upgrade_url: string | null;\n /** The plan tier that hit the cap (e.g. `mid_tier`, `growth`). */\n plan_tier: string;\n}\n\n/**\n * Structured details merged into the 403 `feature_not_available` error body.\n * Returned when an integration calls a feature its plan tier does not include\n * (e.g. asking for replay on `starter`).\n */\nexport interface FeatureNotAvailableDetails {\n /** The plan-features key that is gated off (e.g. `replay`, `ai_assistance`). */\n feature: string;\n /** Absolute URL to the upgrade page; `null` if the server can't build one. */\n upgrade_url: string | null;\n}\n\nexport interface LangosErrorBody {\n type?: string;\n title?: string;\n status?: number;\n detail?: string;\n code?: string;\n request_id?: string;\n errors?: Array<{ field: string; message: string; code?: string }>;\n // Loose extras: the server merges code-specific fields (quota details,\n // feature-gate details) at the top level of the problem+json body. Use\n // {@link LangosAPIError.quotaDetails} / `featureDetails` to access them\n // type-safely instead of reaching into `body` directly.\n [extra: string]: unknown;\n}\n\nexport class LangosError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'LangosError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when an HTTP response is received and indicates an error (>= 400). */\nexport class LangosAPIError extends LangosError {\n readonly status: number;\n readonly code: string | undefined;\n readonly requestId: string | undefined;\n readonly headers: Headers;\n readonly body: LangosErrorBody | undefined;\n readonly errors: LangosErrorBody['errors'] | undefined;\n\n constructor(\n status: number,\n body: LangosErrorBody | undefined,\n headers: Headers,\n fallbackMessage: string,\n ) {\n super(body?.detail || body?.title || fallbackMessage);\n this.name = 'LangosAPIError';\n this.status = status;\n this.code = body?.code;\n this.requestId = body?.request_id || headers.get('x-request-id') || undefined;\n this.headers = headers;\n this.body = body;\n this.errors = body?.errors;\n }\n\n /**\n * Typed accessor for 402 `quota_exceeded` errors. Returns the structured\n * details payload (sessions used/limit, reset timestamp, upgrade URL, plan\n * tier) when the error matches; otherwise `null`.\n *\n * Use this instead of reaching into `err.body` to render upgrade prompts.\n */\n get quotaDetails(): QuotaExceededDetails | null {\n if (this.status !== 402 || this.code !== 'quota_exceeded' || !this.body) return null;\n const b = this.body as Record<string, unknown>;\n if (typeof b.sessions_used !== 'number' || typeof b.sessions_limit !== 'number') return null;\n return {\n sessions_used: b.sessions_used,\n sessions_limit: b.sessions_limit,\n reset_at: typeof b.reset_at === 'string' ? b.reset_at : '',\n upgrade_url: typeof b.upgrade_url === 'string' ? b.upgrade_url : null,\n plan_tier: typeof b.plan_tier === 'string' ? b.plan_tier : '',\n };\n }\n\n /**\n * Typed accessor for 403 `feature_not_available` errors. Returns the gated\n * feature key and an upgrade URL; otherwise `null`.\n */\n get featureDetails(): FeatureNotAvailableDetails | null {\n if (this.status !== 403 || this.code !== 'feature_not_available' || !this.body) return null;\n const b = this.body as Record<string, unknown>;\n if (typeof b.feature !== 'string') return null;\n return {\n feature: b.feature,\n upgrade_url: typeof b.upgrade_url === 'string' ? b.upgrade_url : null,\n };\n }\n\n static from(status: number, body: unknown, headers: Headers): LangosAPIError {\n const parsed: LangosErrorBody | undefined =\n body && typeof body === 'object' ? (body as LangosErrorBody) : undefined;\n switch (status) {\n case 400:\n return new LangosBadRequestError(status, parsed, headers, 'Bad Request');\n case 401:\n return new LangosAuthenticationError(status, parsed, headers, 'Unauthorized');\n case 403:\n return new LangosForbiddenError(status, parsed, headers, 'Forbidden');\n case 404:\n return new LangosNotFoundError(status, parsed, headers, 'Not Found');\n case 409:\n return new LangosConflictError(status, parsed, headers, 'Conflict');\n case 422:\n return new LangosBadRequestError(status, parsed, headers, 'Unprocessable Entity');\n case 429: {\n const retryAfterRaw = headers.get('retry-after');\n const retryAfter = retryAfterRaw ? parseInt(retryAfterRaw, 10) : undefined;\n return new LangosRateLimitError(\n status,\n parsed,\n headers,\n 'Rate limit exceeded',\n Number.isFinite(retryAfter) ? (retryAfter as number) : undefined,\n );\n }\n default:\n if (status >= 500) {\n return new LangosServerError(status, parsed, headers, 'Server Error');\n }\n return new LangosAPIError(status, parsed, headers, `HTTP ${status}`);\n }\n }\n}\n\nfunction tagged<T extends new (...args: any[]) => Error>(Cls: T, tag: string) {\n return class extends Cls {\n constructor(...args: any[]) {\n super(...args);\n this.name = tag;\n }\n };\n}\n\nexport const LangosAuthenticationError = tagged(LangosAPIError, 'LangosAuthenticationError');\nexport const LangosForbiddenError = tagged(LangosAPIError, 'LangosForbiddenError');\nexport const LangosNotFoundError = tagged(LangosAPIError, 'LangosNotFoundError');\nexport const LangosBadRequestError = tagged(LangosAPIError, 'LangosBadRequestError');\nexport const LangosConflictError = tagged(LangosAPIError, 'LangosConflictError');\nexport const LangosServerError = tagged(LangosAPIError, 'LangosServerError');\n\nexport type LangosAuthenticationError = LangosAPIError;\nexport type LangosForbiddenError = LangosAPIError;\nexport type LangosNotFoundError = LangosAPIError;\nexport type LangosBadRequestError = LangosAPIError;\nexport type LangosConflictError = LangosAPIError;\nexport type LangosServerError = LangosAPIError;\n\nexport class LangosRateLimitError extends LangosAPIError {\n readonly retryAfter: number | undefined;\n\n constructor(\n status: number,\n body: LangosErrorBody | undefined,\n headers: Headers,\n fallback: string,\n retryAfter: number | undefined,\n ) {\n super(status, body, headers, fallback);\n this.name = 'LangosRateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\n/** Thrown when the underlying fetch fails (DNS, TCP, TLS). */\nexport class LangosConnectionError extends LangosError {\n readonly cause: unknown;\n constructor(message: string, cause: unknown) {\n super(message);\n this.name = 'LangosConnectionError';\n this.cause = cause;\n }\n}\n\n/** Thrown when a request exceeds the configured timeout. */\nexport class LangosTimeoutError extends LangosError {\n readonly timeoutMs: number;\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms`);\n this.name = 'LangosTimeoutError';\n this.timeoutMs = timeoutMs;\n }\n}\n\n/** Thrown by `Langos.webhooks.constructEvent` when signature verification fails. */\nexport class LangosSignatureVerificationError extends LangosError {\n constructor(reason: string) {\n super(`Webhook signature verification failed: ${reason}`);\n this.name = 'LangosSignatureVerificationError';\n }\n}\n","// Exponential backoff with full jitter, honoring Retry-After.\n\nconst INITIAL_MS = 500;\nconst MAX_MS = 8_000;\n\nexport function shouldRetry(status: number | null, isNetworkError: boolean): boolean {\n if (isNetworkError) return true;\n if (status === null) return false;\n // 409 Conflict is intentionally NOT retried. It signals a non-idempotent\n // failure mode (duplicate email, version conflict, race against a parallel\n // mutation) where retrying just burns the partner's rate-limit budget and\n // amplifies the conflict. Partners should surface 409 to their caller and\n // resolve the conflict explicitly.\n if (status === 408 || status === 429) return true;\n if (status >= 500 && status !== 501) return true;\n return false;\n}\n\nexport function backoffDelay(attempt: number, retryAfterSeconds?: number): number {\n if (retryAfterSeconds && retryAfterSeconds > 0) {\n return Math.min(retryAfterSeconds * 1000, MAX_MS * 4);\n }\n const base = Math.min(INITIAL_MS * Math.pow(2, attempt), MAX_MS);\n return Math.floor(base * (0.5 + Math.random() * 0.5));\n}\n\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(abortError());\n const t = setTimeout(resolve, ms);\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(t);\n reject(abortError());\n },\n { once: true },\n );\n });\n}\n\nfunction abortError(): Error {\n const e = new Error('Aborted');\n e.name = 'AbortError';\n return e;\n}\n","import { randomUUID } from 'node:crypto';\n\nconst UNSAFE = new Set(['POST', 'PATCH', 'DELETE', 'PUT']);\n\nexport function shouldAddIdempotencyKey(method: string, hasUserKey: boolean): boolean {\n if (hasUserKey) return false;\n return UNSAFE.has(method.toUpperCase());\n}\n\n/** Generate a fresh idempotency key. Caller is responsible for reusing it across retries. */\nexport function newIdempotencyKey(): string {\n return randomUUID();\n}\n","// Single source of truth for the SDK version, bumped at release. Kept as a\n// hand-edited constant so it survives bundling without an extra build step.\nexport const version = '0.2.0-alpha.1';\n","import {\n LangosAPIError,\n LangosConnectionError,\n LangosTimeoutError,\n} from './errors.js';\nimport { shouldRetry, backoffDelay, sleep } from './retry.js';\nimport { shouldAddIdempotencyKey, newIdempotencyKey } from './idempotency.js';\nimport { noopLogger } from './logger.js';\nimport type { Logger, RequestOptions } from '../types.js';\nimport { version } from './version.js';\n\nexport interface ResolvedClientConfig {\n apiKey: string;\n baseUrl: string;\n timeout: number;\n maxRetries: number;\n fetchImpl: typeof fetch;\n logger: Logger;\n appName: string | undefined;\n telemetry: boolean;\n}\n\nexport interface InternalRequest {\n method: string;\n path: string;\n query?: Record<string, string | number | undefined | null>;\n body?: unknown;\n options?: RequestOptions;\n}\n\nexport async function makeRequest<T>(\n cfg: ResolvedClientConfig,\n req: InternalRequest,\n): Promise<T> {\n const url = buildUrl(cfg.baseUrl, req.path, req.query);\n const headers = buildHeaders(cfg, req);\n\n const userMaxRetries = req.options?.maxRetries ?? cfg.maxRetries;\n const userTimeout = req.options?.timeout ?? cfg.timeout;\n const userSignal = req.options?.signal;\n\n const bodyJson = req.body !== undefined ? JSON.stringify(req.body) : undefined;\n\n let attempt = 0;\n let lastError: unknown;\n\n while (true) {\n const ac = new AbortController();\n const onUserAbort = () => ac.abort();\n if (userSignal) {\n if (userSignal.aborted) ac.abort();\n else userSignal.addEventListener('abort', onUserAbort, { once: true });\n }\n const timer = setTimeout(() => ac.abort(), userTimeout);\n\n let response: Response | null = null;\n let networkError: unknown = null;\n\n cfg.logger.debug({ method: req.method, url, attempt }, 'langos request');\n\n try {\n response = await cfg.fetchImpl(url, {\n method: req.method,\n headers,\n body: bodyJson,\n signal: ac.signal,\n });\n } catch (err) {\n networkError = err;\n } finally {\n clearTimeout(timer);\n if (userSignal) userSignal.removeEventListener('abort', onUserAbort);\n }\n\n if (networkError) {\n // Distinguish timeout from connection error.\n const isTimeout =\n ac.signal.aborted &&\n !userSignal?.aborted &&\n (networkError as { name?: string })?.name === 'AbortError';\n if (userSignal?.aborted) throw networkError;\n if (attempt < userMaxRetries && shouldRetry(null, true)) {\n const delay = backoffDelay(attempt);\n cfg.logger.debug({ delay, err: String(networkError) }, 'langos retry (network)');\n await sleep(delay);\n attempt++;\n lastError = networkError;\n continue;\n }\n if (isTimeout) throw new LangosTimeoutError(userTimeout);\n throw new LangosConnectionError(\n `Network error: ${(networkError as Error)?.message || String(networkError)}`,\n networkError,\n );\n }\n\n // We have a response.\n const status = response!.status;\n if (status >= 400) {\n const retryAfterRaw = response!.headers.get('retry-after');\n const retryAfter = retryAfterRaw ? parseInt(retryAfterRaw, 10) : undefined;\n const body = await safeReadJson(response!);\n\n if (attempt < userMaxRetries && shouldRetry(status, false)) {\n const delay = backoffDelay(\n attempt,\n Number.isFinite(retryAfter) ? (retryAfter as number) : undefined,\n );\n cfg.logger.debug({ delay, status }, 'langos retry (status)');\n await sleep(delay);\n attempt++;\n lastError = LangosAPIError.from(status, body, response!.headers);\n continue;\n }\n\n throw LangosAPIError.from(status, body, response!.headers);\n }\n\n if (status === 204) return undefined as unknown as T;\n\n const data = await safeReadJson(response!);\n return data as T;\n }\n}\n\nfunction buildUrl(\n baseUrl: string,\n path: string,\n query: InternalRequest['query'],\n): string {\n const trimmed = baseUrl.replace(/\\/$/, '');\n const url = new URL(`${trimmed}${path.startsWith('/') ? path : `/${path}`}`);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null && v !== '') url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\nfunction buildHeaders(cfg: ResolvedClientConfig, req: InternalRequest): Headers {\n const headers = new Headers();\n headers.set('Authorization', `Bearer ${cfg.apiKey}`);\n headers.set('Accept', 'application/json');\n if (req.body !== undefined) headers.set('Content-Type', 'application/json');\n headers.set('User-Agent', buildUserAgent(cfg));\n if (cfg.telemetry !== false) {\n // `process.platform` and `process.version` are runtime-controlled (set by\n // Node itself), not partner-controlled, so they don't carry the same\n // CRLF-injection risk as `cfg.appName`. We still funnel them through\n // `JSON.stringify` defensively: stringify never emits a raw `\\r` or `\\n`\n // (control chars are escaped to `\\\\u000d` / `\\\\u000a`), so the result is\n // always safe to set as a header value.\n headers.set(\n 'X-Langos-Client-Telemetry',\n JSON.stringify({\n lang: 'node',\n sdkVersion: version,\n runtime: typeof process !== 'undefined' ? `${process.platform}/${process.version}` : 'unknown',\n }),\n );\n }\n if (\n req.options?.idempotencyKey ||\n shouldAddIdempotencyKey(req.method, !!req.options?.idempotencyKey)\n ) {\n headers.set('Idempotency-Key', req.options?.idempotencyKey ?? newIdempotencyKey());\n }\n for (const [k, v] of Object.entries(req.options?.headers ?? {})) {\n headers.set(k, v);\n }\n return headers;\n}\n\nfunction buildUserAgent(cfg: ResolvedClientConfig): string {\n const base = `langos-node/${version}`;\n return cfg.appName ? `${base} ${cfg.appName}` : base;\n}\n\nasync function safeReadJson(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","import type { ResolvedClientConfig } from '../core/request.js';\nimport { makeRequest } from '../core/request.js';\nimport type { RequestOptions } from '../types.js';\n\nexport class APIResource {\n protected readonly cfg: ResolvedClientConfig;\n\n constructor(cfg: ResolvedClientConfig) {\n this.cfg = cfg;\n }\n\n protected get<T>(\n path: string,\n query?: Record<string, string | number | undefined | null>,\n options?: RequestOptions,\n ): Promise<T> {\n return makeRequest<T>(this.cfg, { method: 'GET', path, query, options });\n }\n\n protected post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return makeRequest<T>(this.cfg, { method: 'POST', path, body, options });\n }\n\n protected delete<T>(path: string, options?: RequestOptions): Promise<T> {\n return makeRequest<T>(this.cfg, { method: 'DELETE', path, options });\n }\n\n protected patch<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return makeRequest<T>(this.cfg, { method: 'PATCH', path, body, options });\n }\n}\n","// Snake_case <-> camelCase mapping, applied per-resource (explicit, not a deep\n// generic walk). Keeps `metadata` and similar opaque blobs un-touched.\n\nimport type {\n Account,\n Assessment,\n Candidate,\n Session,\n SessionAnalytics,\n SessionSubmission,\n SessionFeedback,\n CandidateCreateParams,\n WebhookEndpoint,\n WebhookEndpointParams,\n} from '../types.js';\n\n/* ------------------------- assessment ------------------------- */\n\nexport function assessmentFromWire(w: any): Assessment {\n return {\n id: String(w.id),\n object: 'assessment',\n name: String(w.name),\n description: w.description ?? null,\n challengeCount: Number(w.challenge_count ?? 0),\n createdAt: String(w.created_at),\n updatedAt: String(w.updated_at),\n };\n}\n\n/* ------------------------- candidate ------------------------- */\n\nexport function candidateFromWire(w: any): Candidate {\n return {\n id: String(w.id),\n object: 'candidate',\n email: String(w.email),\n name: w.name ?? null,\n assessmentId: String(w.assessment_id),\n externalId: w.external_id ?? null,\n status: w.status,\n invitationUrl: w.invitation_url ?? null,\n invitedAt: w.invited_at ?? null,\n startedAt: w.started_at ?? null,\n completedAt: w.completed_at ?? null,\n cancelledAt: w.cancelled_at ?? null,\n expiresAt: w.expires_at ?? null,\n latestSessionId: w.latest_session_id ?? null,\n score: w.score === null || w.score === undefined ? null : Number(w.score),\n metadata: w.metadata ?? null,\n createdAt: String(w.created_at),\n updatedAt: String(w.updated_at),\n };\n}\n\nexport function candidateCreateToWire(p: CandidateCreateParams): Record<string, unknown> {\n const expires =\n p.expiresAt instanceof Date ? p.expiresAt.toISOString() : p.expiresAt ?? null;\n return {\n email: p.email,\n assessment_id: p.assessmentId,\n name: p.name ?? null,\n external_id: p.externalId ?? null,\n expires_at: expires,\n metadata: p.metadata ?? null,\n };\n}\n\n/* ------------------------- session ------------------------- */\n\nfunction submissionFromWire(w: any): SessionSubmission | null {\n if (!w) return null;\n return {\n language: w.language ?? null,\n finalCode: w.final_code ?? null,\n diff: w.diff ?? null,\n commitSha: w.commit_sha ?? null,\n previewUrl: w.preview_url ?? null,\n };\n}\n\nfunction feedbackFromWire(w: any): SessionFeedback | null {\n if (!w) return null;\n return {\n notes: w.notes ?? null,\n problemSolvingScore:\n w.problem_solving_score === null || w.problem_solving_score === undefined\n ? null\n : Number(w.problem_solving_score),\n codeQualityScore:\n w.code_quality_score === null || w.code_quality_score === undefined\n ? null\n : Number(w.code_quality_score),\n };\n}\n\nfunction analyticsFromWire(w: any): SessionAnalytics {\n const a = w || {};\n return {\n editorEventCount: Number(a.editor_event_count ?? 0),\n runEventCount: Number(a.run_event_count ?? 0),\n testEventCount: Number(a.test_event_count ?? 0),\n aiEventCount: Number(a.ai_event_count ?? 0),\n pasteEventCount: Number(a.paste_event_count ?? 0),\n activeSeconds: Number(a.active_seconds ?? 0),\n idleSeconds: Number(a.idle_seconds ?? 0),\n codingSeconds: Number(a.coding_seconds ?? 0),\n };\n}\n\nexport function sessionFromWire(w: any): Session {\n return {\n id: String(w.id),\n object: 'session',\n candidateId: String(w.candidate_id),\n assessmentId: String(w.assessment_id),\n status: w.status,\n attempt: Number(w.attempt ?? 1),\n startedAt: w.started_at ?? null,\n completedAt: w.completed_at ?? null,\n durationSeconds: w.duration_seconds ?? null,\n score: w.score === null || w.score === undefined ? null : Number(w.score),\n passed: typeof w.passed === 'boolean' ? w.passed : null,\n reportUrl: w.report_url ?? null,\n submission: submissionFromWire(w.submission),\n analytics: analyticsFromWire(w.analytics),\n insights: insightsFromWire(w.insights),\n feedback: feedbackFromWire(w.feedback),\n createdAt: String(w.created_at),\n updatedAt: String(w.updated_at),\n };\n}\n\n/* ------------------------- account ------------------------- */\n\nimport type { PlanTier } from '../types.js';\n\nconst PLAN_TIERS: ReadonlyArray<PlanTier> = ['free', 'starter', 'mid_tier', 'growth', 'custom'];\n\n/**\n * Normalize the wire `plan_tier` to a known {@link PlanTier}. Falls back to\n * `'free'` if the server returns a tier the SDK doesn't recognize — this is a\n * deploy-skew safeguard (older SDK + newer server tier) and gets logged\n * implicitly via the unknown value never matching upgrade-prompt branches.\n */\nfunction planTierFromWire(raw: unknown): PlanTier {\n return typeof raw === 'string' && (PLAN_TIERS as ReadonlyArray<string>).includes(raw)\n ? (raw as PlanTier)\n : 'free';\n}\n\nexport function accountFromWire(w: any): Account {\n return {\n id: String(w.id),\n object: 'account',\n name: String(w.name),\n slug: String(w.slug ?? ''),\n planTier: planTierFromWire(w.plan_tier),\n billingCycle: String(w.billing_cycle),\n status: String(w.status),\n sessionsUsed: Number(w.sessions_used ?? 0),\n sessionsLimit:\n w.sessions_limit === null || w.sessions_limit === undefined\n ? null\n : Number(w.sessions_limit),\n sessionsRemaining:\n w.sessions_remaining === null || w.sessions_remaining === undefined\n ? null\n : Number(w.sessions_remaining),\n trialEndsAt: w.trial_ends_at ?? null,\n features: {\n webIdeEnabled: !!w.features?.web_ide_enabled,\n replayEnabled: !!w.features?.replay_enabled,\n aiAssistanceEnabled: !!w.features?.ai_assistance_enabled,\n },\n planCaps: w.plan_caps\n ? {\n label: String(w.plan_caps.label ?? ''),\n priceMonthly:\n w.plan_caps.price_monthly === null || w.plan_caps.price_monthly === undefined\n ? null\n : Number(w.plan_caps.price_monthly),\n billing: 'monthly',\n currency: 'USD',\n sessionLimit:\n w.plan_caps.session_limit === null || w.plan_caps.session_limit === undefined\n ? null\n : Number(w.plan_caps.session_limit),\n readyMadeChallenges:\n w.plan_caps.ready_made_challenges === null || w.plan_caps.ready_made_challenges === undefined\n ? null\n : Number(w.plan_caps.ready_made_challenges),\n customChallengesMax:\n w.plan_caps.custom_challenges_max === null || w.plan_caps.custom_challenges_max === undefined\n ? null\n : Number(w.plan_caps.custom_challenges_max),\n features: w.plan_caps.features ?? {},\n support: String(w.plan_caps.support ?? ''),\n popular: w.plan_caps.popular === true,\n contactSales: w.plan_caps.contact_sales === true,\n }\n : null,\n integration: {\n provider: String(w.integration?.provider ?? ''),\n apiKeyPrefix: String(w.integration?.api_key_prefix ?? ''),\n scopes: Array.isArray(w.integration?.scopes) ? w.integration.scopes.map(String) : [],\n rateLimitPerMinute:\n w.integration?.rate_limit_per_minute === null ||\n w.integration?.rate_limit_per_minute === undefined\n ? null\n : Number(w.integration.rate_limit_per_minute),\n webhookUrl: w.integration?.webhook_url ?? null,\n },\n };\n}\n\n/* ------------------------- webhook endpoint ------------------------- */\n\nexport function webhookEndpointFromWire(w: any): WebhookEndpoint {\n return {\n object: 'webhook_endpoint',\n webhookUrl: w.webhook_url ?? null,\n signingSecret: w.signing_secret ?? null,\n };\n}\n\nexport function webhookEndpointParamsToWire(p: WebhookEndpointParams): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (p.webhookUrl !== undefined) out.webhook_url = p.webhookUrl;\n if (p.rotateSigningSecret !== undefined) out.rotate_signing_secret = p.rotateSigningSecret;\n return out;\n}\n\nfunction insightsFromWire(w: any): Session['insights'] {\n if (!w) return null;\n return {\n aiUsagePercent:\n w.ai_usage_percent === null || w.ai_usage_percent === undefined\n ? null\n : Number(w.ai_usage_percent),\n testPassRate:\n w.test_pass_rate === null || w.test_pass_rate === undefined\n ? null\n : Number(w.test_pass_rate),\n codeQuality: w.code_quality ?? null,\n ...passthroughExtras(w, ['ai_usage_percent', 'test_pass_rate', 'code_quality']),\n };\n}\n\nfunction passthroughExtras(o: Record<string, unknown>, known: string[]) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(o)) {\n if (!known.includes(k)) out[k] = v;\n }\n return out;\n}\n","import { APIResource } from './base.js';\nimport {\n accountFromWire,\n webhookEndpointFromWire,\n webhookEndpointParamsToWire,\n} from '../core/transform.js';\nimport type {\n Account,\n RequestOptions,\n WebhookEndpoint,\n WebhookEndpointParams,\n} from '../types.js';\n\n/**\n * `client.account` — read the company info that owns this integration, and\n * manage the outbound webhook endpoint.\n *\n * Typical usage:\n *\n * ```ts\n * const account = await client.account.retrieve();\n * if (account.sessionsRemaining === 0) {\n * showUpgradePrompt();\n * }\n *\n * await client.account.setWebhookEndpoint({\n * webhookUrl: 'https://greenhouse.example.com/webhooks/langos',\n * rotateSigningSecret: true,\n * });\n * ```\n */\nexport class AccountResource extends APIResource {\n /**\n * Read the calling integration's account.\n *\n * Includes plan, quota, feature flags, and integration metadata\n * (key prefix, scopes, rate limit, webhook URL).\n *\n * @returns {Promise<Account>}\n */\n async retrieve(options?: RequestOptions): Promise<Account> {\n const w = await this.get<any>('/account', undefined, options);\n return accountFromWire(w);\n }\n\n /**\n * Set or clear the outbound webhook URL, and optionally rotate the signing\n * secret.\n *\n * When `rotateSigningSecret: true`, the response includes the new secret in\n * `signingSecret`. Store it — the secret cannot be re-fetched. Subsequent\n * reads return `signingSecret: null`.\n *\n * @param {WebhookEndpointParams} params\n */\n async setWebhookEndpoint(\n params: WebhookEndpointParams,\n options?: RequestOptions,\n ): Promise<WebhookEndpoint> {\n const body = webhookEndpointParamsToWire(params);\n const w = await this.patch<any>('/account/webhook-endpoint', body, options);\n return webhookEndpointFromWire(w);\n }\n}\n","import type { AsyncIterablePage, Page } from '../types.js';\n\ninterface WirePage<TWire> {\n object: 'list';\n data: TWire[];\n has_more: boolean;\n next_cursor: string | null;\n}\n\nexport async function fetchPage<TWire, TOut>(\n fetcher: (cursor: string | undefined) => Promise<WirePage<TWire>>,\n mapItem: (w: TWire) => TOut,\n initialCursor?: string,\n): Promise<AsyncIterablePage<TOut>> {\n const wire = await fetcher(initialCursor);\n return wrapPage(wire, mapItem, fetcher);\n}\n\nfunction wrapPage<TWire, TOut>(\n wire: WirePage<TWire>,\n mapItem: (w: TWire) => TOut,\n fetcher: (cursor: string | undefined) => Promise<WirePage<TWire>>,\n): AsyncIterablePage<TOut> {\n const data = wire.data.map(mapItem);\n\n const page: Page<TOut> = {\n data,\n hasMore: !!wire.has_more,\n nextCursor: wire.next_cursor ?? null,\n async getNextPage() {\n if (!wire.has_more || !wire.next_cursor) return null;\n const next = await fetcher(wire.next_cursor);\n return wrapPage(next, mapItem, fetcher);\n },\n };\n\n const iter: AsyncIterable<TOut> = {\n async *[Symbol.asyncIterator]() {\n let current: Page<TOut> | null = page;\n while (current) {\n for (const item of current.data) yield item;\n current = await current.getNextPage();\n }\n },\n };\n\n return Object.assign({}, page, iter, {\n [Symbol.asyncIterator]: iter[Symbol.asyncIterator].bind(iter),\n }) as AsyncIterablePage<TOut>;\n}\n","import { APIResource } from './base.js';\nimport { fetchPage } from '../core/pagination.js';\nimport { assessmentFromWire } from '../core/transform.js';\nimport type {\n Assessment,\n AssessmentListParams,\n AsyncIterablePage,\n RequestOptions,\n} from '../types.js';\n\nexport class AssessmentsResource extends APIResource {\n list(\n params: AssessmentListParams = {},\n options?: RequestOptions,\n ): Promise<AsyncIterablePage<Assessment>> {\n return fetchPage(\n cursor =>\n this.get<{ object: 'list'; data: any[]; has_more: boolean; next_cursor: string | null }>(\n '/assessments',\n { limit: params.limit, cursor: cursor ?? params.cursor },\n options,\n ),\n assessmentFromWire,\n );\n }\n\n async retrieve(id: string, options?: RequestOptions): Promise<Assessment> {\n const w = await this.get<any>(`/assessments/${encodeURIComponent(id)}`, undefined, options);\n return assessmentFromWire(w);\n }\n}\n","import { APIResource } from './base.js';\nimport { fetchPage } from '../core/pagination.js';\nimport { candidateCreateToWire, candidateFromWire } from '../core/transform.js';\nimport type {\n AsyncIterablePage,\n Candidate,\n CandidateCreateParams,\n CandidateListParams,\n RequestOptions,\n} from '../types.js';\n\nexport class CandidatesResource extends APIResource {\n list(\n params: CandidateListParams = {},\n options?: RequestOptions,\n ): Promise<AsyncIterablePage<Candidate>> {\n return fetchPage(\n cursor =>\n this.get('/candidates', {\n limit: params.limit,\n cursor: cursor ?? params.cursor,\n status: params.status,\n assessment_id: params.assessmentId,\n }, options),\n candidateFromWire,\n );\n }\n\n async retrieve(id: string, options?: RequestOptions): Promise<Candidate> {\n const w = await this.get<any>(`/candidates/${encodeURIComponent(id)}`, undefined, options);\n return candidateFromWire(w);\n }\n\n async create(params: CandidateCreateParams, options?: RequestOptions): Promise<Candidate> {\n const w = await this.post<any>('/candidates', candidateCreateToWire(params), options);\n return candidateFromWire(w);\n }\n\n /** Idempotent — calling twice on a cancelled candidate returns the same record. */\n async cancel(id: string, options?: RequestOptions): Promise<Candidate> {\n const w = await this.delete<any>(`/candidates/${encodeURIComponent(id)}`, options);\n return candidateFromWire(w);\n }\n}\n","import { APIResource } from './base.js';\nimport { fetchPage } from '../core/pagination.js';\nimport { sessionFromWire } from '../core/transform.js';\nimport type {\n AsyncIterablePage,\n RequestOptions,\n Session,\n SessionListParams,\n} from '../types.js';\n\nexport class SessionsResource extends APIResource {\n async retrieve(id: string, options?: RequestOptions): Promise<Session> {\n const w = await this.get<any>(`/sessions/${encodeURIComponent(id)}`, undefined, options);\n return sessionFromWire(w);\n }\n\n listForCandidate(\n candidateId: string,\n params: SessionListParams = {},\n options?: RequestOptions,\n ): Promise<AsyncIterablePage<Session>> {\n return fetchPage(\n cursor =>\n this.get(\n `/candidates/${encodeURIComponent(candidateId)}/sessions`,\n { limit: params.limit, cursor: cursor ?? params.cursor },\n options,\n ),\n sessionFromWire,\n );\n }\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto';\nimport { LangosSignatureVerificationError } from '../core/errors.js';\nimport type { WebhookEvent } from '../types.js';\n\nconst DEFAULT_TOLERANCE_SECONDS = 300;\n// Minimum acceptable signing-secret length. The server mints `whsec_…` secrets\n// with at least 32 random bytes, so anything shorter is either a misconfigured\n// integration or an attacker probing for a missing-secret default. Rejecting\n// short secrets explicitly avoids the \"partner forgot to set\n// LANGOS_WEBHOOK_SECRET, attacker forges events HMAC'd with empty string\"\n// failure mode.\nconst MIN_SECRET_LENGTH = 16;\n// Reject absurd-future timestamps (year 2106-ish, the unix-epoch overflow\n// boundary). A negative or zero `t=` in the signature header is also a tampered\n// header — real servers always emit a positive epoch second.\nconst MAX_TIMESTAMP_SECONDS = 2 ** 32;\n\n/**\n * Webhook helpers. v1.0 ships verification only — outbound delivery from Langos\n * is on the roadmap. Partners can wire `constructEvent` against the planned\n * signature header today; the SDK contract will not change when delivery lands.\n *\n * Pattern matches Stripe's `stripe.webhooks.constructEvent` so partners with\n * existing handlers re-use the same shape.\n */\nexport const Webhooks = {\n constructEvent<T = unknown>(\n payload: string | Buffer,\n signatureHeader: string | string[] | undefined | null,\n secret: string,\n tolerance: number = DEFAULT_TOLERANCE_SECONDS,\n ): WebhookEvent<T> {\n // Validate the signing secret BEFORE inspecting any partner-controlled\n // input. If the partner forgot to set LANGOS_WEBHOOK_SECRET we must NOT\n // fall through to HMAC'ing with the empty string — an attacker who knows\n // this could forge events that pass verification.\n if (typeof secret !== 'string' || secret.length < MIN_SECRET_LENGTH) {\n throw new LangosSignatureVerificationError(\n `Signing secret missing or too short (need at least ${MIN_SECRET_LENGTH} chars). ` +\n 'Set the secret returned by `client.account.rotateSigningSecret()`.',\n );\n }\n if (!signatureHeader) {\n throw new LangosSignatureVerificationError('Missing Langos-Signature header');\n }\n const sigHeader = Array.isArray(signatureHeader) ? signatureHeader[0]! : signatureHeader;\n\n const parsed = parseSignatureHeader(sigHeader);\n if (parsed.timestamp === null || parsed.signatures.length === 0) {\n throw new LangosSignatureVerificationError(\n 'Malformed signature header (expected t=...,v1=...)',\n );\n }\n\n const nowSec = Math.floor(Date.now() / 1000);\n if (Math.abs(nowSec - parsed.timestamp) > tolerance) {\n throw new LangosSignatureVerificationError(\n `Timestamp outside the tolerance window (${tolerance}s)`,\n );\n }\n\n const rawBody = typeof payload === 'string' ? payload : payload.toString('utf-8');\n const expected = computeSignature(secret, parsed.timestamp, rawBody);\n const ok = parsed.signatures.some(s => safeEquals(s, expected));\n if (!ok) {\n throw new LangosSignatureVerificationError('No signatures matched');\n }\n\n let event: WebhookEvent<T>;\n try {\n event = JSON.parse(rawBody) as WebhookEvent<T>;\n } catch {\n throw new LangosSignatureVerificationError('Payload is not valid JSON');\n }\n\n return event;\n },\n};\n\nfunction parseSignatureHeader(header: string): { timestamp: number | null; signatures: string[] } {\n let timestamp: number | null = null;\n const signatures: string[] = [];\n for (const part of header.split(',')) {\n const [k, v] = part.trim().split('=');\n if (k === 't' && v) {\n const n = parseInt(v, 10);\n // Only accept a finite, positive, sane epoch second. Rejects:\n // - `t=abc` → NaN\n // - `t=0`, `t=-1` → non-positive (real servers never emit this)\n // - `t=999999999999` → past the year-2106 unix overflow boundary,\n // either tampered or absurd clock drift\n // The downstream tolerance check would also catch `t=0`, but failing\n // fast here keeps the malformed-header error message clear.\n if (Number.isFinite(n) && n > 0 && n < MAX_TIMESTAMP_SECONDS) {\n timestamp = n;\n }\n }\n if (k === 'v1' && v) signatures.push(v);\n }\n return { timestamp, signatures };\n}\n\nfunction computeSignature(secret: string, timestamp: number, body: string): string {\n return createHmac('sha256', secret).update(`${timestamp}.${body}`).digest('hex');\n}\n\nfunction safeEquals(a: string, b: string): boolean {\n const ab = Buffer.from(a, 'hex');\n const bb = Buffer.from(b, 'hex');\n if (ab.length !== bb.length || ab.length === 0) return false;\n try {\n return timingSafeEqual(ab, bb);\n } catch {\n return false;\n }\n}\n","import type { Logger } from '../types.js';\n\nexport const noopLogger: Logger = {\n debug() {},\n info() {},\n warn() {},\n error() {},\n};\n","import { AccountResource } from './resources/account.js';\nimport { AssessmentsResource } from './resources/assessments.js';\nimport { CandidatesResource } from './resources/candidates.js';\nimport { SessionsResource } from './resources/sessions.js';\nimport { Webhooks } from './resources/webhooks.js';\nimport { noopLogger } from './core/logger.js';\nimport type { ResolvedClientConfig } from './core/request.js';\nimport type { LangosOptions } from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://app.langos.io/api/v1';\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\n\nexport class Langos {\n readonly account: AccountResource;\n readonly assessments: AssessmentsResource;\n readonly candidates: CandidatesResource;\n readonly sessions: SessionsResource;\n\n /**\n * Webhook signature helpers (`Langos.webhooks.constructEvent`). Static-style:\n * does not need the client instance, since signing is independent of API\n * calls. Exposed both as a class member and as `Langos.webhooks` for parity\n * with Stripe's `stripe.webhooks` style.\n */\n readonly webhooks = Webhooks;\n static readonly webhooks = Webhooks;\n\n private readonly cfg: ResolvedClientConfig;\n\n constructor(options: LangosOptions) {\n if (!options.apiKey) {\n throw new Error(\n 'Langos: missing apiKey. Pass via constructor or set LANGOS_API_KEY environment variable and read it.',\n );\n }\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (!fetchImpl) {\n throw new Error(\n 'Langos: no fetch implementation found. Use Node 18+ or pass `fetch` via the options.',\n );\n }\n if (options.appName !== undefined) {\n assertHeaderSafe('appName', options.appName);\n }\n if (options.apiKey !== undefined) {\n // apiKey is also reflected into a header (Authorization: Bearer …) — same\n // CRLF-injection class applies. Belt-and-braces: even though most callers\n // pull this from env, validate once here.\n assertHeaderSafe('apiKey', options.apiKey);\n }\n this.cfg = {\n apiKey: options.apiKey,\n baseUrl: (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, ''),\n timeout: options.timeout ?? DEFAULT_TIMEOUT_MS,\n maxRetries: options.maxRetries ?? DEFAULT_MAX_RETRIES,\n fetchImpl,\n logger: options.logger ?? noopLogger,\n appName: options.appName,\n telemetry: options.telemetry !== false,\n };\n\n this.account = new AccountResource(this.cfg);\n this.assessments = new AssessmentsResource(this.cfg);\n this.candidates = new CandidatesResource(this.cfg);\n this.sessions = new SessionsResource(this.cfg);\n }\n}\n\n// CRLF / null-byte / C0-control characters in a partner-supplied string that\n// lands in an HTTP header enables header-injection (e.g. an attacker who can\n// control `appName` could splice in `\\r\\nX-Spoofed: yes`). Reject at construct\n// time with a clear error rather than relying on the underlying fetch impl,\n// which on some runtimes silently truncates or normalizes invalid headers.\nconst HEADER_UNSAFE = /[\\r\\n\\0\\x00-\\x1f\\x7f]/;\n\nfunction assertHeaderSafe(field: string, value: string): void {\n if (typeof value !== 'string') {\n throw new TypeError(`Langos: ${field} must be a string`);\n }\n if (HEADER_UNSAFE.test(value)) {\n throw new TypeError(\n `Langos: ${field} contains control characters (\\\\r, \\\\n, \\\\0, or other C0). ` +\n 'These are not allowed in HTTP headers and would enable header injection.',\n );\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@datacline/langos-sdk-node",
3
+ "version": "0.2.0-alpha.1",
4
+ "description": "Official Node.js / TypeScript SDK for the Langos API.",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./package.json": "./package.json"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md",
20
+ "CHANGELOG.md",
21
+ "LICENSE"
22
+ ],
23
+ "sideEffects": false,
24
+ "engines": {
25
+ "node": ">=18.17"
26
+ },
27
+ "packageManager": "pnpm@10.32.0",
28
+ "scripts": {
29
+ "build": "tsup",
30
+ "dev": "tsup --watch",
31
+ "test": "vitest run",
32
+ "test:watch": "vitest",
33
+ "test:integration": "vitest run --config vitest.integration.config.ts",
34
+ "lint": "tsc --noEmit",
35
+ "generate": "openapi-typescript ./openapi/v1-openapi.yaml -o src/generated/paths.d.ts",
36
+ "vendor:openapi": "cp -v ../langos-ide/codestream-app/server/docs/v1-openapi.yaml ./openapi/v1-openapi.yaml"
37
+ },
38
+ "keywords": [
39
+ "langos",
40
+ "ats",
41
+ "coding-interview",
42
+ "assessment",
43
+ "api",
44
+ "sdk"
45
+ ],
46
+ "author": "Datacline Limited",
47
+ "license": "MIT",
48
+ "homepage": "https://github.com/datacline/langos-sdk-node",
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "https://github.com/datacline/langos-sdk-node.git"
52
+ },
53
+ "bugs": {
54
+ "url": "https://github.com/datacline/langos-sdk-node/issues"
55
+ },
56
+ "devDependencies": {
57
+ "@types/node": "^20",
58
+ "msw": "^2.6.0",
59
+ "openapi-typescript": "^7",
60
+ "tsup": "^8",
61
+ "typescript": "^5",
62
+ "vitest": "^1"
63
+ }
64
+ }