@usewind/node 0.1.0 → 0.1.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/internal.ts","../src/http.ts","../src/tokens.ts","../src/oauth.ts","../src/client.ts","../src/webhooks.ts","../src/adapters/express.ts","../src/adapters/fetch.ts","../src/index.ts"],"names":["createHmac","timingSafeEqual","tx","parseCookies"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error hierarchy for `@usewind/node`.\n *\n * This module is fully implemented (the skeleton stubs live elsewhere). The\n * mapping mirrors `apps/docs/src/content/docs/errors-and-types.mdx`.\n */\n\nexport interface WindErrorEnvelope {\n error?: {\n code?: string\n message?: string\n type?: string\n connection_id?: string | null\n increase_url?: string | null\n }\n}\n\nexport interface WindErrorInit {\n status?: number\n code?: string\n type?: string\n connectionId?: string | null\n requestId?: string | null\n raw?: unknown\n cause?: unknown\n}\n\n/** Base class for everything this SDK throws. */\nexport class WindError extends Error {\n readonly status?: number\n readonly code?: string\n readonly type?: string\n readonly connectionId?: string | null\n readonly requestId?: string | null\n readonly raw?: unknown\n\n constructor(message: string, init: WindErrorInit = {}) {\n super(message, init.cause !== undefined ? { cause: init.cause } : undefined)\n this.name = new.target.name\n this.status = init.status\n this.code = init.code\n this.type = init.type\n this.connectionId = init.connectionId ?? null\n this.requestId = init.requestId ?? null\n this.raw = init.raw\n Object.setPrototypeOf(this, new.target.prototype)\n }\n\n /**\n * Build the right subclass from an HTTP response. Matches on the envelope's\n * `error.code` first, then falls back to `status`.\n */\n static fromResponse(\n status: number,\n body: WindErrorEnvelope | undefined,\n extra: { requestId?: string | null; retryAfterMs?: number } = {},\n ): WindError {\n const e = body?.error ?? {}\n const message = e.message || `Wind API error (${status})`\n const init: WindErrorInit = {\n status,\n code: e.code,\n type: e.type,\n connectionId: e.connection_id ?? null,\n requestId: extra.requestId ?? null,\n raw: body,\n }\n\n switch (e.code) {\n case 'allocation_exhausted':\n return new AllocationExhaustedError(message, { ...init, increaseUrl: e.increase_url ?? null })\n case 'feature_cost_exceeded':\n return new FeatureCostExceededError(message, init)\n case 'feature_model_not_configured':\n return new FeatureModelNotConfiguredError(message, init)\n case 'connection_revoked':\n case 'invalid_grant':\n return new ConnectionRevokedError(message, init)\n case 'connection_frozen':\n return new ConnectionFrozenError(message, init)\n case 'model_not_allowed':\n return new ModelNotAllowedError(message, init)\n case 'app_suspended':\n return new AppSuspendedError(message, init)\n case 'rate_limited':\n case 'daily_limit_reached':\n case 'app_spend_limited':\n case 'sandbox_live_cost_limited':\n return new RateLimitedError(message, { ...init, retryAfterMs: extra.retryAfterMs })\n case 'risk_throttled':\n return new RiskThrottledError(message, { ...init, retryAfterMs: extra.retryAfterMs })\n case 'provider_error':\n return new ProviderError(message, init)\n case 'token_expired':\n return new TokenExpiredError(message, init)\n case 'idempotency_key_reused':\n return new IdempotencyKeyReusedError(message, init)\n }\n\n // No recognised code — fall back to status.\n switch (status) {\n case 401:\n return new TokenExpiredError(message, init)\n case 402:\n return new AllocationExhaustedError(message, init)\n case 403:\n return new ConnectionRevokedError(message, init)\n case 409:\n return new IdempotencyKeyReusedError(message, init)\n case 429:\n return new RateLimitedError(message, { ...init, retryAfterMs: extra.retryAfterMs })\n case 502:\n return new ProviderError(message, init)\n default:\n return new WindApiError(message, init)\n }\n }\n}\n\n// ─── Config / lifecycle ──────────────────────────────────────────────────────\n\n/** Missing or invalid configuration. Thrown at `configure()` or first use. */\nexport class WindConfigError extends WindError {}\n\n/** `grantStore.get(userId)` returned null — the user has no Wind connection yet. */\nexport class WindNotConnectedError extends WindError {}\n\n/** Webhook HMAC mismatch, malformed signature header, or stale timestamp. */\nexport class WindSignatureError extends WindError {}\n\n/** Marks an unimplemented skeleton path. Remove as bodies land. */\nexport class WindNotImplementedError extends WindError {\n constructor(what: string) {\n super(`${what} is not implemented yet (@usewind/node is a skeleton).`)\n }\n}\n\n// ─── API errors ──────────────────────────────────────────────────────────────\n\n/** Any non-2xx not classified below. */\nexport class WindApiError extends WindError {}\n\n/** 402 `allocation_exhausted` — connection spent its reserved cap. */\nexport class AllocationExhaustedError extends WindApiError {\n readonly increaseUrl: string | null\n constructor(message: string, init: WindErrorInit & { increaseUrl?: string | null } = {}) {\n super(message, init)\n this.increaseUrl = init.increaseUrl ?? null\n }\n}\n\n/** 402 `feature_cost_exceeded` — one call blew a per-feature guardrail. Not billed. */\nexport class FeatureCostExceededError extends WindApiError {}\n\n/** 400 `feature_model_not_configured` — the feature has no `default_model` set. Config bug, not runtime-retryable. */\nexport class FeatureModelNotConfiguredError extends WindApiError {}\n\n/** 403 `connection_revoked` (or refresh `invalid_grant`). Terminal — clear stored grant, prompt reconnect. */\nexport class ConnectionRevokedError extends WindApiError {}\n\n/**\n * 403 `connection_frozen` — Wind's own platform risk layer, not user\n * revocation, froze this connection on an abnormal spend pattern. Unlike\n * `ConnectionRevokedError`, do NOT delete the stored grant — the same\n * connection reactivates once the user goes through the connect flow again.\n */\nexport class ConnectionFrozenError extends WindApiError {}\n\n/**\n * 403 `app_suspended` — the app itself is switched off, by Wind or by you.\n * Every connection is affected, so stop calling and surface it; don't clear\n * any grants — they work again once the app is unsuspended.\n */\nexport class AppSuspendedError extends WindApiError {}\n\n/** 403 `model_not_allowed` — model is outside the app's allowlist. Integration bug. */\nexport class ModelNotAllowedError extends WindApiError {}\n\n/**\n * 429 — a spend or request limit, not an error in the call. `code` says which:\n * `rate_limited` (Feature.rate_limit), `daily_limit_reached` (the connection's\n * 24h limit), `app_spend_limited` (the app's daily limit on its tier) or\n * `sandbox_live_cost_limited` (the daily live-model allowance in sandbox).\n * The SDK does not auto-sleep; back off using `retryAfterMs`.\n */\nexport class RateLimitedError extends WindApiError {\n readonly retryAfterMs: number | null\n constructor(message: string, init: WindErrorInit & { retryAfterMs?: number } = {}) {\n super(message, init)\n this.retryAfterMs = init.retryAfterMs ?? null\n }\n}\n\n/** 429 `risk_throttled` — Wind's platform risk layer, not the per-feature rate limit. Same shape as `RateLimitedError`, distinct so callers can tell the two apart. */\nexport class RiskThrottledError extends WindApiError {\n readonly retryAfterMs: number | null\n constructor(message: string, init: WindErrorInit & { retryAfterMs?: number } = {}) {\n super(message, init)\n this.retryAfterMs = init.retryAfterMs ?? null\n }\n}\n\n/** 502 `provider_error` — upstream provider failed. Retried internally with the same idempotency key; not billed. */\nexport class ProviderError extends WindApiError {}\n\n/** 401 `token_expired` — internal; surfaces only if a refresh also fails. */\nexport class TokenExpiredError extends WindApiError {}\n\n/** 409 `idempotency_key_reused` — the same Idempotency-Key was sent with a different request body. Integration bug (or a genuine UUID collision, practically never). */\nexport class IdempotencyKeyReusedError extends WindApiError {}\n","/**\n * Configuration resolution and validation. Explicit args beat environment\n * variables; env is only consulted for the three credential fields.\n */\n\nimport { WindConfigError } from './errors.js'\nimport type { Grant } from './types.js'\n\n/**\n * The one persistence abstraction the SDK relies on for correctness.\n *\n * Refresh tokens rotate on every use, so `set` is called both after first\n * connect and after every refresh, and the SDK **awaits it before using the new\n * tokens** — a throw from `set` aborts the operation rather than stranding a\n * rotated refresh token. Implement `set` so it commits in the same transaction\n * as whatever work triggered the refresh.\n *\n * `delete` is called when a connection is revoked (terminal).\n *\n * Any Map-shaped store works; for production back it with your database.\n */\nexport interface GrantStore {\n get(userId: string): Promise<Grant | null> | Grant | null\n set(userId: string, grant: Grant): Promise<void> | void\n delete(userId: string): Promise<void> | void\n}\n\n/**\n * An in-memory `GrantStore` backed by a `Map`. **Dev/test only** — grants\n * vanish on restart and are not shared across instances, so a multi-instance\n * or restart-prone deployment will spuriously \"disconnect\" users. Back\n * production with your database instead.\n */\nexport function memoryGrantStore(): GrantStore {\n const grants = new Map<string, Grant>()\n return {\n get: (userId) => grants.get(userId) ?? null,\n set: (userId, grant) => {\n grants.set(userId, grant)\n },\n delete: (userId) => {\n grants.delete(userId)\n },\n }\n}\n\nexport interface WindConfig {\n clientId: string\n clientSecret: string\n /** Must exactly match a registered redirect URI and the callback route's URL. */\n redirectUri: string\n\n baseUrl?: string // default 'https://api.usewind.app'\n accountsUrl?: string // default 'https://accounts.usewind.app'\n webhookSecret?: string // enables wind.verify()\n\n /** Injectable for tests; defaults to the global `fetch`. */\n fetch?: typeof fetch\n /** Injectable for tests; defaults to `Date.now`. */\n clock?: () => number\n\n /**\n * Where per-user grants are persisted. Required for every user-scoped path\n * (`wind.routes()`, `wind.handler()`, `wind.connection()`); those throw\n * `WindConfigError` without it. Not needed for client-credentials-only use\n * (`wind.connections.*`, `wind.account()`, `wind.raw`).\n */\n grantStore?: GrantStore\n\n /**\n * Optional notification — fires once, after a user first connects. Runs after\n * `grantStore.set` has committed. Not correctness-critical: a throw here is\n * caught and ignored. Use it for audit logs, analytics, welcome emails.\n */\n onConnected?: (userId: string, grant: Grant) => Promise<void> | void\n /**\n * Optional notification — fires after every refresh-token rotation, once\n * `grantStore.set` has committed. Errors are caught and ignored.\n */\n onGrantRotated?: (userId: string, grant: Grant) => Promise<void> | void\n}\n\nexport interface ResolvedConfig\n extends Required<Omit<WindConfig, 'webhookSecret' | 'grantStore' | 'onConnected' | 'onGrantRotated'>> {\n webhookSecret?: string\n grantStore?: GrantStore\n onConnected?: WindConfig['onConnected']\n onGrantRotated?: WindConfig['onGrantRotated']\n}\n\nconst DEFAULT_BASE_URL = 'https://api.usewind.app'\nconst DEFAULT_ACCOUNTS_URL = 'https://accounts.usewind.app'\n\n/**\n * Merge partial config with `process.env` and defaults, then validate the\n * required credential triple. Throws `WindConfigError` if incomplete.\n */\nexport function resolveConfig(partial: Partial<WindConfig> = {}): ResolvedConfig {\n const env = typeof process !== 'undefined' ? process.env : ({} as NodeJS.ProcessEnv)\n\n const clientId = partial.clientId ?? env.WIND_CLIENT_ID\n const clientSecret = partial.clientSecret ?? env.WIND_CLIENT_SECRET\n const redirectUri = partial.redirectUri ?? env.WIND_REDIRECT_URI\n\n const missing = [\n !clientId && 'clientId (WIND_CLIENT_ID)',\n !clientSecret && 'clientSecret (WIND_CLIENT_SECRET)',\n !redirectUri && 'redirectUri (WIND_REDIRECT_URI)',\n ].filter(Boolean)\n\n if (missing.length) {\n throw new WindConfigError(\n `@usewind/node is not configured. Missing: ${missing.join(', ')}. ` +\n `Call wind.configure({ … }) at boot or set the environment variables.`,\n )\n }\n\n const fetchImpl = partial.fetch ?? globalThis.fetch\n if (typeof fetchImpl !== 'function') {\n throw new WindConfigError(\n 'No fetch implementation available. Use Node 18+ or pass config.fetch.',\n )\n }\n\n return {\n clientId: clientId!,\n clientSecret: clientSecret!,\n redirectUri: redirectUri!,\n baseUrl: (partial.baseUrl ?? env.WIND_BASE_URL ?? DEFAULT_BASE_URL).replace(/\\/$/, ''),\n accountsUrl: (partial.accountsUrl ?? env.WIND_ACCOUNTS_URL ?? DEFAULT_ACCOUNTS_URL).replace(/\\/$/, ''),\n fetch: fetchImpl,\n clock: partial.clock ?? Date.now,\n webhookSecret: partial.webhookSecret ?? env.WIND_WEBHOOK_SECRET,\n grantStore: partial.grantStore,\n onConnected: partial.onConnected,\n onGrantRotated: partial.onGrantRotated,\n }\n}\n","/** Small shared helpers used across the SDK's transport and crypto paths. */\n\nimport { createHash, randomBytes } from 'node:crypto'\nimport { WindNotImplementedError } from './errors.js'\n\nexport function notImplemented(what: string): never {\n throw new WindNotImplementedError(what)\n}\n\n/** URL-safe base64, no padding. */\nexport function b64url(input: Buffer | string): string {\n return Buffer.from(input).toString('base64url')\n}\n\nexport interface Pkce {\n verifier: string\n challenge: string\n method: 'S256'\n}\n\n/** RFC 7636 PKCE pair. */\nexport function pkce(): Pkce {\n const verifier = b64url(randomBytes(48))\n const challenge = b64url(createHash('sha256').update(verifier).digest())\n return { verifier, challenge, method: 'S256' }\n}\n\n/** Opaque CSRF `state` value. */\nexport function stateToken(): string {\n return b64url(randomBytes(24))\n}\n\n/** `Authorization: Basic base64(client_id:client_secret)`. */\nexport function basicAuth(clientId: string, clientSecret: string): string {\n return 'Basic ' + Buffer.from(`${clientId}:${clientSecret}`).toString('base64')\n}\n\n/** Parse a `Retry-After` header (seconds or HTTP-date) to milliseconds. */\nexport function retryAfterMs(header: string | null, now = Date.now()): number | undefined {\n if (!header) return undefined\n const secs = Number(header)\n if (Number.isFinite(secs)) return Math.max(0, secs * 1000)\n const date = Date.parse(header)\n return Number.isFinite(date) ? Math.max(0, date - now) : undefined\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","/**\n * RawClient — one method per openapi.yaml path, no ergonomics. The escape hatch\n * behind `wind.raw`, and the transport every higher-level module builds on.\n */\n\nimport type { ResolvedConfig } from './config.js'\nimport { WindError } from './errors.js'\nimport { basicAuth } from './internal.js'\nimport type {\n Account,\n AllocationRequest,\n Connection,\n Feature,\n RevokeResult,\n TokenResponse,\n} from './types.js'\n\nexport interface RawRequest {\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE'\n path: string\n /** `application/json` body; omit for GET. */\n body?: unknown\n headers?: Record<string, string>\n /** `Authorization: Bearer` value — mutually exclusive with `basic`. */\n bearer?: string\n /** Use HTTP Basic client credentials for `Authorization`. */\n basic?: boolean\n signal?: AbortSignal\n}\n\nexport interface RawResponse<T = unknown> {\n status: number\n headers: Headers\n body: T\n requestId: string | null\n}\n\nexport class RawClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n /** Low-level: perform one request, parse JSON, never throw on non-2xx (returns the response). */\n async request<T = unknown>(req: RawRequest): Promise<RawResponse<T>> {\n const url = `${this.config.baseUrl}${req.path}`\n const headers: Record<string, string> = { Accept: 'application/json', ...req.headers }\n\n if (req.bearer) headers.Authorization = `Bearer ${req.bearer}`\n else if (req.basic) headers.Authorization = basicAuth(this.config.clientId, this.config.clientSecret)\n\n let body: string | undefined\n if (req.body !== undefined) {\n headers['Content-Type'] = 'application/json'\n body = JSON.stringify(req.body)\n }\n\n const res = await this.config.fetch(url, {\n method: req.method,\n headers,\n body,\n signal: req.signal,\n })\n\n const requestId = res.headers.get('x-request-id')\n let parsed: unknown = undefined\n const text = await res.text()\n if (text) {\n try {\n parsed = JSON.parse(text)\n } catch {\n parsed = text\n }\n }\n\n return { status: res.status, headers: res.headers, body: parsed as T, requestId }\n }\n\n // ── OAuth ──────────────────────────────────────────────────────────────────\n\n /** `POST /oauth/token` — `grant_type=authorization_code`. */\n async exchangeCode(args: { code: string; redirectUri: string; codeVerifier: string }): Promise<TokenResponse> {\n return this.postToken({\n grant_type: 'authorization_code',\n code: args.code,\n redirect_uri: args.redirectUri,\n code_verifier: args.codeVerifier,\n })\n }\n\n /** `POST /oauth/token` — `grant_type=refresh_token`. */\n async refresh(refreshToken: string): Promise<TokenResponse> {\n return this.postToken({ grant_type: 'refresh_token', refresh_token: refreshToken })\n }\n\n private async postToken(form: Record<string, string>): Promise<TokenResponse> {\n const url = `${this.config.baseUrl}/oauth/token`\n const res = await this.config.fetch(url, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: basicAuth(this.config.clientId, this.config.clientSecret),\n },\n body: new URLSearchParams(form).toString(),\n })\n\n const text = await res.text()\n const parsed = text ? JSON.parse(text) : undefined\n\n if (!res.ok) {\n throw WindError.fromResponse(res.status, parsed, { requestId: res.headers.get('x-request-id') })\n }\n return parsed as TokenResponse\n }\n\n // ── Inference ──────────────────────────────────────────────────────────────\n\n /** `POST /v1/ai/{model}`. Returns the raw response so callers can branch on status/headers. */\n inference(args: {\n model: string\n accessToken: string\n idempotencyKey: string\n feature?: string\n body: unknown\n signal?: AbortSignal\n }): Promise<RawResponse> {\n const headers: Record<string, string> = { 'Idempotency-Key': args.idempotencyKey }\n if (args.feature) headers['X-Wind-Feature'] = args.feature\n return this.request({\n method: 'POST',\n path: `/v1/ai/${encodeURIComponent(args.model)}`,\n bearer: args.accessToken,\n headers,\n body: args.body,\n signal: args.signal,\n })\n }\n\n /** `POST /v1/ai/features/{slug}`. */\n inferenceFeature(args: {\n slug: string\n accessToken: string\n idempotencyKey: string\n body: unknown\n signal?: AbortSignal\n }): Promise<RawResponse> {\n return this.request({\n method: 'POST',\n path: `/v1/ai/features/${encodeURIComponent(args.slug)}`,\n bearer: args.accessToken,\n headers: { 'Idempotency-Key': args.idempotencyKey },\n body: args.body,\n signal: args.signal,\n })\n }\n\n // ── Management (client-credentials) ────────────────────────────────────────\n\n async listConnections(): Promise<Connection[]> {\n const res = await this.request<Connection[]>({ method: 'GET', path: '/v1/connections', basic: true })\n return this.unwrap(res)\n }\n async getConnection(id: string): Promise<Connection> {\n const res = await this.request<Connection>({ method: 'GET', path: `/v1/connections/${encodeURIComponent(id)}`, basic: true })\n return this.unwrap(res)\n }\n async revokeConnection(id: string): Promise<RevokeResult> {\n const res = await this.request<RevokeResult>({ method: 'POST', path: `/v1/connections/${encodeURIComponent(id)}/revoke`, basic: true })\n return this.unwrap(res)\n }\n async createAllocationRequest(id: string, body: { target_allocation_mc: number; reason?: string }): Promise<AllocationRequest> {\n const res = await this.request<AllocationRequest>({\n method: 'POST',\n path: `/v1/connections/${encodeURIComponent(id)}/allocation-requests`,\n basic: true,\n body,\n })\n return this.unwrap(res)\n }\n async getAccount(): Promise<Account> {\n const res = await this.request<Account>({ method: 'GET', path: '/v1/account', basic: true })\n return this.unwrap(res)\n }\n async listFeatures(appId: string): Promise<Feature[]> {\n const res = await this.request<Feature[]>({ method: 'GET', path: `/v1/apps/${encodeURIComponent(appId)}/features`, basic: true })\n return this.unwrap(res)\n }\n async registerFeature(appId: string, feature: Feature): Promise<Feature> {\n const res = await this.request<Feature>({\n method: 'POST',\n path: `/v1/apps/${encodeURIComponent(appId)}/features`,\n basic: true,\n body: feature,\n })\n return this.unwrap(res)\n }\n async updateFeature(appId: string, slug: string, patch: Partial<Feature>): Promise<Feature> {\n const res = await this.request<Feature>({\n method: 'PATCH',\n path: `/v1/apps/${encodeURIComponent(appId)}/features/${encodeURIComponent(slug)}`,\n basic: true,\n body: patch,\n })\n return this.unwrap(res)\n }\n\n private unwrap<T>(res: RawResponse<T>): T {\n if (res.status >= 200 && res.status < 300) return res.body\n throw WindError.fromResponse(res.status, res.body as any, { requestId: res.requestId })\n }\n\n // Convenience verbs for `wind.raw.get(...)` / `.post(...)`.\n get<T = unknown>(path: string, init?: Omit<RawRequest, 'method' | 'path' | 'body'>): Promise<RawResponse<T>> {\n return this.request<T>({ method: 'GET', path, ...init })\n }\n post<T = unknown>(path: string, init?: Omit<RawRequest, 'method' | 'path'>): Promise<RawResponse<T>> {\n return this.request<T>({ method: 'POST', path, ...init })\n }\n}\n","/**\n * Access-token cache + atomic refresh-token rotation.\n *\n * The one rule: after a refresh, the rotated grant is written via\n * `grantStore.set(userId, next)` and **awaited before** the caller may use the\n * new access token. A crash between \"got new refresh token\" and \"persisted it\"\n * kills the connection, so the SDK never proceeds past an unpersisted rotation.\n * The optional `onGrantRotated` hook fires afterward and its errors are ignored.\n */\n\nimport { WindConfigError, ConnectionRevokedError } from './errors.js'\nimport type { ResolvedConfig } from './config.js'\nimport type { RawClient } from './http.js'\nimport type { Grant } from './types.js'\n\n/** Skew applied when deciding whether a cached access token is \"still fresh\". */\nexport const ACCESS_TOKEN_SKEW_MS = 60_000\n\nexport class TokenManager {\n constructor(\n private readonly config: ResolvedConfig,\n private readonly raw: RawClient,\n ) {}\n\n /** True if the grant's cached access token is present and outside the skew window. */\n isFresh(grant: Grant): boolean {\n if (!grant.accessToken || grant.accessTokenExpiresAt === undefined) return false\n return grant.accessTokenExpiresAt - ACCESS_TOKEN_SKEW_MS > this.config.clock()\n }\n\n /**\n * Return a grant guaranteed to have a usable access token. If a refresh was\n * needed, `grantStore.set(userId, next)` has already been awaited before this\n * resolves (then `onGrantRotated` fired). Refresh failure (`invalid_grant`)\n * throws `ConnectionRevokedError` — the caller then clears the store entry.\n */\n async ensureAccessToken(userId: string, grant: Grant): Promise<Grant> {\n if (this.isFresh(grant)) return grant\n return this.forceRefresh(userId, grant)\n }\n\n /** Force a refresh regardless of cache state (used on a 401 retry). */\n async forceRefresh(userId: string, grant: Grant): Promise<Grant> {\n const grantStore = this.config.grantStore\n if (!grantStore) {\n throw new WindConfigError('grantStore is required to refresh a connection but was not configured.')\n }\n\n let token\n try {\n token = await this.raw.refresh(grant.refreshToken)\n } catch (err) {\n // `error.code: invalid_grant` on the refresh grant type maps to\n // ConnectionRevokedError in WindError.fromResponse — the refresh token\n // is permanently dead, so clear the store rather than retry.\n if (err instanceof ConnectionRevokedError) {\n await grantStore.delete(userId)\n }\n throw err\n }\n\n const next = grantFromToken(token, this.config.clock())\n\n // Awaited before the new access token may be used — a throw here aborts\n // the call rather than stranding a rotated refresh token.\n await grantStore.set(userId, next)\n\n if (this.config.onGrantRotated) {\n try {\n await this.config.onGrantRotated(userId, next)\n } catch {\n // Notification errors are caught and ignored — not correctness-critical.\n }\n }\n\n return next\n }\n}\n\n/** Build a `Grant` from a token response + the id of the user it belongs to. */\nexport function grantFromToken(\n token: { access_token: string; refresh_token: string; connection_id: string; expires_in: number },\n now: number,\n): Grant {\n return {\n connectionId: token.connection_id,\n refreshToken: token.refresh_token,\n accessToken: token.access_token,\n accessTokenExpiresAt: now + token.expires_in * 1000,\n }\n}\n","/**\n * The connect flow, framework-neutral. Adapters (Express, fetch-handler) call\n * into `OAuthFlow`; they own request/response plumbing, this owns the protocol.\n */\n\nimport { createHmac, timingSafeEqual } from 'node:crypto'\nimport type { GrantStore, ResolvedConfig } from './config.js'\nimport { WindConfigError } from './errors.js'\nimport type { RawClient } from './http.js'\nimport { b64url, pkce, stateToken } from './internal.js'\nimport { grantFromToken } from './tokens.js'\nimport type { Grant } from './types.js'\n\n/** The short-lived value stashed between `/wind/start` and `/wind/callback`. */\nexport interface ConnectTransaction {\n verifier: string // PKCE code_verifier\n state: string // CSRF token\n createdAt: number\n}\n\n/** Pluggable storage for the transaction. Default is a signed cookie (see adapters). */\nexport interface TransactionStore {\n put(id: string, tx: ConnectTransaction): Promise<void> | void\n take(id: string): Promise<ConnectTransaction | null> | ConnectTransaction | null\n}\n\nexport interface RoutesOptions {\n startPath?: string // default '/wind/start'\n callbackPath?: string // default '/wind/callback'\n /** REQUIRED — Wind is not your login. Identify the signed-in user of your app. */\n currentUser: (req: unknown) => string | null | undefined | Promise<string | null | undefined>\n /** Override the config's `grantStore` for these routes. Falls back to config. */\n grantStore?: GrantStore\n /** Optional post-connect notification (see `WindConfig.onConnected`). */\n onConnected?: (userId: string, grant: Grant) => Promise<void> | void\n /** Pre-fill the consent screen's spend cap (micro-cents). */\n requestedAllocationMc?: number\n /** Feature slugs → the consent \"what for\" line. */\n features?: string[]\n session?: 'cookie' | TransactionStore\n successRedirect?: string // default '/?wind=connected'\n onError?: (err: unknown, req: unknown, res: unknown) => void\n}\n\nexport const DEFAULT_START_PATH = '/wind/start'\nexport const DEFAULT_CALLBACK_PATH = '/wind/callback'\nexport const TRANSACTION_TTL_MS = 10 * 60_000\n\n/** Default cookie name for the signed, self-contained transaction (session: 'cookie', the default). */\nexport const TX_COOKIE_NAME = '__wind_tx'\n/** Cookie name carrying the lookup id when a custom `TransactionStore` is supplied. */\nexport const TX_ID_COOKIE_NAME = '__wind_tx_id'\n\n/**\n * Sign a transaction into a single opaque cookie value: `base64url(json).hex(hmac)`.\n * Keyed on `clientSecret` — already a server-held secret, and rotating it\n * naturally invalidates any in-flight transactions, which is the right\n * behavior. No separate `session`/`state` field needed since `state` already\n * lives inside `tx` and is checked against the callback's `state` query param.\n */\nexport function signTransactionCookie(tx: ConnectTransaction, clientSecret: string): string {\n const payload = b64url(JSON.stringify(tx))\n const sig = createHmac('sha256', clientSecret).update(payload).digest('hex')\n return `${payload}.${sig}`\n}\n\n/** Verify + decode a cookie produced by `signTransactionCookie`. Returns `null` on any mismatch. */\nexport function verifyTransactionCookie(value: string | undefined | null, clientSecret: string): ConnectTransaction | null {\n if (!value) return null\n const dot = value.lastIndexOf('.')\n if (dot < 0) return null\n const payload = value.slice(0, dot)\n const providedHex = value.slice(dot + 1)\n\n const expectedHex = createHmac('sha256', clientSecret).update(payload).digest('hex')\n const provided = Buffer.from(providedHex, 'hex')\n const expected = Buffer.from(expectedHex, 'hex')\n if (provided.length !== expected.length || !timingSafeEqual(provided, expected)) return null\n\n try {\n const json = Buffer.from(payload, 'base64url').toString('utf8')\n const tx = JSON.parse(json) as ConnectTransaction\n if (typeof tx?.verifier !== 'string' || typeof tx?.state !== 'string' || typeof tx?.createdAt !== 'number') return null\n return tx\n } catch {\n return null\n }\n}\n\nexport class OAuthFlow {\n constructor(\n readonly config: ResolvedConfig,\n private readonly raw: RawClient,\n ) {}\n\n /**\n * Build the `accounts.usewind.app/oauth/authorize` URL and the transaction to\n * stash. The adapter persists `tx` and issues the redirect.\n */\n buildAuthorizeRedirect(opts: {\n requestedAllocationMc?: number\n features?: string[]\n }): { url: string; tx: ConnectTransaction } {\n const { verifier, challenge, method } = pkce()\n const state = stateToken()\n\n const url = new URL('/oauth/authorize', this.config.accountsUrl)\n url.searchParams.set('response_type', 'code')\n url.searchParams.set('client_id', this.config.clientId)\n url.searchParams.set('redirect_uri', this.config.redirectUri)\n url.searchParams.set('code_challenge', challenge)\n url.searchParams.set('code_challenge_method', method)\n url.searchParams.set('state', state)\n if (opts.requestedAllocationMc !== undefined) {\n url.searchParams.set('requested_allocation_mc', String(opts.requestedAllocationMc))\n }\n if (opts.features?.length) {\n url.searchParams.set('features', opts.features.join(','))\n }\n\n return { url: url.toString(), tx: { verifier, state, createdAt: this.config.clock() } }\n }\n\n /**\n * Given the callback query and the stashed transaction, verify `state`,\n * exchange the `code`, and return the fresh `Grant`. Does not persist — the\n * adapter writes it via `grantStore.set`, then fires the `onConnected` hook.\n */\n async completeCallback(args: {\n query: { code?: string; state?: string; error?: string }\n tx: ConnectTransaction | null\n }): Promise<Grant> {\n const { query, tx } = args\n\n if (query.error) {\n throw new WindConfigError(`Wind connect flow was not completed: ${query.error}`)\n }\n if (!tx) {\n throw new WindConfigError('No pending Wind connect transaction found — it may have expired (10 min TTL) or the cookie was lost.')\n }\n if (this.config.clock() - tx.createdAt > TRANSACTION_TTL_MS) {\n throw new WindConfigError('Wind connect transaction expired. Start the connection again.')\n }\n if (!query.state || query.state !== tx.state) {\n throw new WindConfigError('state mismatch on Wind connect callback — possible CSRF, aborting.')\n }\n if (!query.code) {\n throw new WindConfigError('Missing code on Wind connect callback.')\n }\n\n const token = await this.raw.exchangeCode({\n code: query.code,\n redirectUri: this.config.redirectUri,\n codeVerifier: tx.verifier,\n })\n\n return grantFromToken(token, this.config.clock())\n }\n}\n","/**\n * Billed-call surface: `wind.connection(userId).model('gpt-5').chat(params)`\n * or `wind.connection(userId).feature('summarize').chat(params)`.\n *\n * Model and feature are DELIBERATELY mutually exclusive, no chaining — each\n * hits a different route (`POST /v1/ai/{model}` vs `POST /v1/ai/features/{slug}`)\n * with a different model-resolution rule, and picking one is an explicit,\n * unambiguous choice at the call site rather than something that falls out of\n * which optional param you happened to pass. The one combination this can't\n * express — a specific model AND a feature tag on the same call (`X-Wind-Feature`\n * on `POST /v1/ai/{model}`) — is still reachable via `wind.raw.inference(...)`;\n * \"wrap, don't hide\" means the ergonomic surface enforcing a simpler mental\n * model doesn't have to cost the escape hatch anything.\n */\n\nimport { randomUUID } from 'node:crypto'\nimport type { ResolvedConfig } from './config.js'\nimport { WindError, WindNotConnectedError } from './errors.js'\nimport type { RawClient, RawResponse } from './http.js'\nimport { retryAfterMs, sleep } from './internal.js'\nimport type { TokenManager } from './tokens.js'\nimport type {\n AllocationRequest,\n AllocationRequestParams,\n ChatParams,\n ChatResult,\n ChatStreamChunk,\n Connection,\n Grant,\n RevokeResult,\n} from './types.js'\n\nconst FEATURE_SLUG_RE = /^[a-z0-9-]{1,40}$/\n\nconst PROVIDER_ERROR_RETRIES = 2\nconst PROVIDER_ERROR_BACKOFF_MS = [250, 1000]\n\nexport interface Chattable {\n /** Refresh-and-retry, idempotency key, and error mapping are all handled internally. */\n chat(params: ChatParams): Promise<ChatResult>\n /** Streaming variant — async iterable; the last chunk carries the settled `wind` block. */\n chatStream(params: ChatParams): AsyncIterable<ChatStreamChunk>\n}\n\n/** `POST /v1/ai/{model}` — no feature tag; see the mutual-exclusivity note above. */\nexport class ModelScope implements Chattable {\n constructor(\n private readonly ctx: ScopeContext,\n private readonly userId: string,\n private readonly model: string,\n ) {}\n\n chat(params: ChatParams): Promise<ChatResult> {\n return billedCall(this.ctx, this.userId, params, (accessToken, idempotencyKey, body, signal) =>\n this.ctx.raw.inference({ model: this.model, accessToken, idempotencyKey, body, signal }),\n )\n }\n chatStream(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n return billedStream(this.ctx, this.userId, params, (accessToken, idempotencyKey, body, signal) =>\n this.ctx.raw.inference({ model: this.model, accessToken, idempotencyKey, body, signal }),\n )\n }\n}\n\n/** `POST /v1/ai/features/{slug}` — model resolved server-side from the feature's `default_model`. */\nexport class FeatureScope implements Chattable {\n constructor(\n private readonly ctx: ScopeContext,\n private readonly userId: string,\n private readonly feature: string,\n ) {\n if (!FEATURE_SLUG_RE.test(feature)) {\n throw new TypeError(`Invalid feature slug ${JSON.stringify(feature)} — must match ${FEATURE_SLUG_RE}`)\n }\n }\n\n chat(params: ChatParams): Promise<ChatResult> {\n return billedCall(this.ctx, this.userId, params, (accessToken, idempotencyKey, body, signal) =>\n this.ctx.raw.inferenceFeature({ slug: this.feature, accessToken, idempotencyKey, body, signal }),\n )\n }\n chatStream(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n return billedStream(this.ctx, this.userId, params, (accessToken, idempotencyKey, body, signal) =>\n this.ctx.raw.inferenceFeature({ slug: this.feature, accessToken, idempotencyKey, body, signal }),\n )\n }\n}\n\nexport class ConnectionScope {\n constructor(\n private readonly ctx: ScopeContext,\n private readonly userId: string,\n ) {}\n\n /** `wind.connection(userId).model('gpt-5').chat(...)` — hits `POST /v1/ai/{model}`. */\n model(id: string): ModelScope {\n return new ModelScope(this.ctx, this.userId, id)\n }\n /** `wind.connection(userId).feature('summarize').chat(...)` — hits `POST /v1/ai/features/{slug}`. */\n feature(slug: string): FeatureScope {\n return new FeatureScope(this.ctx, this.userId, slug)\n }\n\n /** `GET /v1/connections/{id}` for this user's connection. Named `.get()`, not `.connection()` — avoids `wind.connection(userId).connection()`. */\n async get(): Promise<Connection> {\n const grant = await requireGrant(this.ctx, this.userId)\n return this.ctx.raw.getConnection(grant.connectionId)\n }\n /** `POST /v1/connections/{id}/revoke`. */\n async revoke(): Promise<RevokeResult> {\n const grant = await requireGrant(this.ctx, this.userId)\n const result = await this.ctx.raw.revokeConnection(grant.connectionId)\n await this.ctx.config.grantStore?.delete(this.userId)\n return result\n }\n /** `POST /v1/connections/{id}/allocation-requests` — returns `{ approvalUrl }`. */\n async requestIncrease(params: AllocationRequestParams): Promise<AllocationRequest> {\n const grant = await requireGrant(this.ctx, this.userId)\n return this.ctx.raw.createAllocationRequest(grant.connectionId, {\n target_allocation_mc: params.targetAllocationMc,\n reason: params.reason,\n })\n }\n}\n\n/** Shared dependencies handed to every scope. */\nexport interface ScopeContext {\n config: ResolvedConfig\n raw: RawClient\n tokens: TokenManager\n}\n\n// ─── shared call machinery ──────────────────────────────────────────────────\n\nasync function requireGrant(ctx: ScopeContext, userId: string): Promise<Grant> {\n if (!ctx.config.grantStore) {\n throw new WindNotConnectedError('grantStore is required for wind.connection(userId) but was not configured.')\n }\n const grant = await ctx.config.grantStore.get(userId)\n if (!grant) {\n throw new WindNotConnectedError(`No Wind connection found for user ${JSON.stringify(userId)}.`)\n }\n return grant\n}\n\nfunction requestBody(params: ChatParams): unknown {\n return {\n messages: params.messages,\n ...(params.max_tokens !== undefined && { max_tokens: params.max_tokens }),\n ...(params.temperature !== undefined && { temperature: params.temperature }),\n ...(params.stream !== undefined && { stream: params.stream }),\n }\n}\n\ntype InferenceCall = (\n accessToken: string,\n idempotencyKey: string,\n body: unknown,\n signal: AbortSignal | undefined,\n) => Promise<RawResponse>\n\n/**\n * Implements DESIGN.md's `.chat()` internals: grant lookup, fresh-token\n * ensure, the request, 401-refresh-retry-once, 502-backoff-retry-twice, and\n * error mapping via `WindError.fromResponse`.\n */\nasync function billedCall(\n ctx: ScopeContext,\n userId: string,\n params: ChatParams,\n call: InferenceCall,\n): Promise<ChatResult> {\n let grant = await requireGrant(ctx, userId)\n grant = await ctx.tokens.ensureAccessToken(userId, grant)\n\n const idempotencyKey = params.idempotencyKey ?? randomUUID()\n const body = requestBody(params)\n\n let res = await call(grant.accessToken!, idempotencyKey, body, params.signal)\n\n if (res.status === 401) {\n grant = await ctx.tokens.forceRefresh(userId, grant)\n res = await call(grant.accessToken!, idempotencyKey, body, params.signal)\n if (res.status === 401) {\n await ctx.config.grantStore?.delete(userId)\n throw WindError.fromResponse(res.status, res.body as any, { requestId: res.requestId })\n }\n }\n\n for (let attempt = 0; res.status === 502 && attempt < PROVIDER_ERROR_RETRIES; attempt++) {\n await sleep(PROVIDER_ERROR_BACKOFF_MS[attempt])\n res = await call(grant.accessToken!, idempotencyKey, body, params.signal)\n }\n if (res.status < 200 || res.status >= 300) {\n throw WindError.fromResponse(res.status, res.body as any, {\n requestId: res.requestId,\n retryAfterMs: retryAfterMs(res.headers.get('retry-after')),\n })\n }\n\n return res.body as ChatResult\n}\n\n/**\n * `.chatStream()`. The gateway accepts `stream: true` on the wire; while the\n * server side settles into full SSE support, this handles both an\n * `text/event-stream` response and a plain buffered JSON 200 the same way a\n * caller would eventually see once streaming ships — one or more `delta`\n * chunks, the last one carrying the settled `wind` block.\n */\nasync function* billedStream(\n ctx: ScopeContext,\n userId: string,\n params: ChatParams,\n call: InferenceCall,\n): AsyncGenerator<ChatStreamChunk> {\n let grant = await requireGrant(ctx, userId)\n grant = await ctx.tokens.ensureAccessToken(userId, grant)\n\n const idempotencyKey = params.idempotencyKey ?? randomUUID()\n const body = requestBody({ ...params, stream: true })\n\n let res = await call(grant.accessToken!, idempotencyKey, body, params.signal)\n\n if (res.status === 401) {\n grant = await ctx.tokens.forceRefresh(userId, grant)\n res = await call(grant.accessToken!, idempotencyKey, body, params.signal)\n if (res.status === 401) {\n await ctx.config.grantStore?.delete(userId)\n throw WindError.fromResponse(res.status, res.body as any, { requestId: res.requestId })\n }\n }\n\n if (res.status < 200 || res.status >= 300) {\n throw WindError.fromResponse(res.status, res.body as any, { requestId: res.requestId })\n }\n\n const contentType = res.headers.get('content-type') ?? ''\n if (!contentType.includes('text/event-stream')) {\n // Buffered fallback: the raw response body is already parsed JSON by\n // RawClient (see http.ts). Surface it as a single terminal chunk.\n const result = res.body as ChatResult\n yield { delta: result, wind: result.wind }\n return\n }\n\n // SSE body — `res.body` from RawClient is pre-parsed JSON, so this branch\n // is unreachable until RawClient grows a raw-stream mode; kept here so the\n // contract (last chunk carries `wind`, others carry `null`) is documented\n // at the type level ahead of server-side streaming support.\n yield { delta: res.body, wind: null }\n}\n","/**\n * Webhook signature verification. Needs the RAW (unparsed) request body.\n *\n * Header: `X-Wind-Signature: t=<unix>,v1=<hex hmac-sha256>`\n * Signed payload: `` `${t}.${rawBody}` `` with `config.webhookSecret`.\n * Rejects timestamps more than `TOLERANCE_S` seconds from now (replay guard).\n */\n\nimport { createHmac, timingSafeEqual } from 'node:crypto'\nimport type { ResolvedConfig } from './config.js'\nimport { WindSignatureError } from './errors.js'\nimport type { WebhookEvent } from './types.js'\n\nexport const SIGNATURE_HEADER = 'x-wind-signature'\nexport const TOLERANCE_S = 300\n\nexport interface VerifyInput {\n /** The raw request body exactly as received — a string or Buffer, never parsed JSON. */\n payload: string | Buffer\n /** The `X-Wind-Signature` header value. */\n signature: string\n}\n\nexport class WebhookVerifier {\n constructor(private readonly config: ResolvedConfig) {}\n\n /**\n * Verify and parse. Throws `WindSignatureError` on any mismatch, malformed\n * header, missing secret, or stale timestamp. Returns the typed event.\n */\n verify(input: VerifyInput): WebhookEvent {\n if (!this.verifySignature(input)) {\n throw new WindSignatureError('Wind webhook signature verification failed.')\n }\n\n const text = typeof input.payload === 'string' ? input.payload : input.payload.toString('utf8')\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n } catch (cause) {\n throw new WindSignatureError('Wind webhook payload is not valid JSON.', { cause })\n }\n\n const event = parsed as Partial<WebhookEvent>\n if (!event || typeof event.id !== 'string' || typeof event.type !== 'string') {\n throw new WindSignatureError('Wind webhook payload is missing required fields (id, type).')\n }\n\n return event as WebhookEvent\n }\n\n /** Constant-time HMAC check only — no parsing. Implement this first. */\n verifySignature(input: VerifyInput, now: number = this.config.clock()): boolean {\n if (!this.config.webhookSecret) {\n throw new WindSignatureError('webhookSecret is not configured — cannot verify Wind webhooks.')\n }\n\n const match = /^t=(\\d+),v1=([0-9a-f]+)$/i.exec(input.signature?.trim() ?? '')\n if (!match) return false\n\n const [, timestampStr, providedHex] = match\n const timestamp = Number(timestampStr)\n if (!Number.isFinite(timestamp)) return false\n if (Math.abs(now / 1000 - timestamp) > TOLERANCE_S) return false\n\n const payload = typeof input.payload === 'string' ? Buffer.from(input.payload, 'utf8') : input.payload\n const signedContent = Buffer.concat([Buffer.from(`${timestampStr}.`, 'utf8'), payload])\n const expected = createHmac('sha256', this.config.webhookSecret).update(signedContent).digest()\n\n let provided: Buffer\n try {\n provided = Buffer.from(providedHex, 'hex')\n } catch {\n return false\n }\n\n return provided.length === expected.length && timingSafeEqual(provided, expected)\n }\n}\n","/**\n * Express adapter. `wind.routes(opts)` returns a middleware that owns\n * `startPath` + `callbackPath`; every other request falls through to `next()`.\n *\n * Express is detected structurally (duck-typed req/res) and never imported, so\n * this package has no Express dependency.\n */\n\nimport {\n DEFAULT_CALLBACK_PATH,\n DEFAULT_START_PATH,\n OAuthFlow,\n TX_COOKIE_NAME,\n TX_ID_COOKIE_NAME,\n TRANSACTION_TTL_MS,\n signTransactionCookie,\n verifyTransactionCookie,\n type ConnectTransaction,\n type RoutesOptions,\n} from '../oauth.js'\nimport { WindConfigError, WindError } from '../errors.js'\nimport { stateToken } from '../internal.js'\n\n/** Minimal shape this adapter relies on — a subset of Express req/res. */\nexport interface ExpressLikeRequest {\n method?: string\n url?: string\n path?: string\n query?: Record<string, unknown>\n headers: Record<string, string | string[] | undefined>\n}\nexport interface ExpressLikeResponse {\n statusCode: number\n setHeader(name: string, value: string): void\n redirect(url: string): void\n status(code: number): ExpressLikeResponse\n send(body?: unknown): void\n}\nexport type NextFn = (err?: unknown) => void\n\nexport type ExpressMiddleware = (\n req: ExpressLikeRequest,\n res: ExpressLikeResponse,\n next: NextFn,\n) => void\n\nfunction parseCookies(header: string | string[] | undefined): Record<string, string> {\n const raw = Array.isArray(header) ? header.join('; ') : header\n const out: Record<string, string> = {}\n if (!raw) return out\n for (const part of raw.split(';')) {\n const eq = part.indexOf('=')\n if (eq < 0) continue\n const key = part.slice(0, eq).trim()\n const value = part.slice(eq + 1).trim()\n if (key) out[key] = decodeURIComponent(value)\n }\n return out\n}\n\nfunction setCookie(\n res: ExpressLikeResponse,\n name: string,\n value: string,\n opts: { maxAgeSeconds?: number; clear?: boolean } = {},\n) {\n const attrs = [`${name}=${opts.clear ? '' : encodeURIComponent(value)}`, 'Path=/', 'HttpOnly', 'SameSite=Lax']\n if (process.env.NODE_ENV === 'production') attrs.push('Secure')\n attrs.push(opts.clear ? 'Max-Age=0' : `Max-Age=${opts.maxAgeSeconds ?? Math.floor(TRANSACTION_TTL_MS / 1000)}`)\n res.setHeader('Set-Cookie', attrs.join('; '))\n}\n\nfunction getPath(req: ExpressLikeRequest): string {\n if (req.path) return req.path\n const url = req.url ?? '/'\n const q = url.indexOf('?')\n return q >= 0 ? url.slice(0, q) : url\n}\n\nfunction getQuery(req: ExpressLikeRequest): Record<string, string> {\n if (req.query) {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(req.query)) out[k] = Array.isArray(v) ? String(v[0]) : String(v)\n return out\n }\n const url = req.url ?? '/'\n const q = url.indexOf('?')\n if (q < 0) return {}\n return Object.fromEntries(new URLSearchParams(url.slice(q + 1)))\n}\n\nexport function createExpressRoutes(flow: OAuthFlow, opts: RoutesOptions): ExpressMiddleware {\n const startPath = opts.startPath ?? DEFAULT_START_PATH\n const callbackPath = opts.callbackPath ?? DEFAULT_CALLBACK_PATH\n const grantStore = opts.grantStore ?? flow.config.grantStore\n const onConnected = opts.onConnected ?? flow.config.onConnected\n const successRedirect = opts.successRedirect ?? '/?wind=connected'\n\n function handleError(err: unknown, req: ExpressLikeRequest, res: ExpressLikeResponse) {\n if (opts.onError) {\n opts.onError(err, req, res)\n return\n }\n console.error('[@usewind/node] connect flow error:', err)\n const message = err instanceof WindError ? err.message : 'Wind connect flow failed.'\n res.status(400).send(message)\n }\n\n return (req, res, next) => {\n const path = getPath(req)\n if (path !== startPath && path !== callbackPath) return next()\n if ((req.method ?? 'GET').toUpperCase() !== 'GET') return next()\n\n void (async () => {\n try {\n if (path === startPath) {\n const { url, tx } = flow.buildAuthorizeRedirect({\n requestedAllocationMc: opts.requestedAllocationMc,\n features: opts.features,\n })\n\n if (opts.session && opts.session !== 'cookie') {\n const id = stateToken()\n await opts.session.put(id, tx)\n setCookie(res, TX_ID_COOKIE_NAME, id)\n } else {\n setCookie(res, TX_COOKIE_NAME, signTransactionCookie(tx, flow.config.clientSecret))\n }\n\n res.redirect(url)\n return\n }\n\n // callbackPath\n if (!grantStore) {\n throw new WindConfigError('grantStore is required for wind.routes()/wind.handler() but was not configured.')\n }\n\n const userId = await opts.currentUser(req)\n if (!userId) {\n throw new WindConfigError('currentUser(req) returned no user — Wind is not your login; sign the user in first.')\n }\n\n const cookies = parseCookies(req.headers.cookie)\n let tx: ConnectTransaction | null = null\n if (opts.session && opts.session !== 'cookie') {\n const id = cookies[TX_ID_COOKIE_NAME]\n tx = id ? await opts.session.take(id) : null\n setCookie(res, TX_ID_COOKIE_NAME, '', { clear: true })\n } else {\n tx = verifyTransactionCookie(cookies[TX_COOKIE_NAME], flow.config.clientSecret)\n setCookie(res, TX_COOKIE_NAME, '', { clear: true })\n }\n\n const query = getQuery(req)\n const grant = await flow.completeCallback({ query, tx })\n\n await grantStore.set(userId, grant)\n\n if (onConnected) {\n try {\n await onConnected(userId, grant)\n } catch {\n // Notification errors are caught and ignored — not correctness-critical.\n }\n }\n\n res.redirect(successRedirect)\n } catch (err) {\n handleError(err, req, res)\n }\n })()\n }\n}\n","/**\n * Web-standard adapter. `wind.handler(opts)` returns `(Request) => Promise<Response>`\n * covering both `startPath` and `callbackPath`. Mount under a catch-all route:\n *\n * // Next.js — app/wind/[...wind]/route.ts\n * export const GET = wind.handler({ currentUser: … })\n *\n * Also works for Hono, Bun.serve, Deno, and Remix.\n */\n\nimport {\n DEFAULT_CALLBACK_PATH,\n DEFAULT_START_PATH,\n OAuthFlow,\n TX_COOKIE_NAME,\n TX_ID_COOKIE_NAME,\n TRANSACTION_TTL_MS,\n signTransactionCookie,\n verifyTransactionCookie,\n type ConnectTransaction,\n type RoutesOptions,\n} from '../oauth.js'\nimport { WindConfigError, WindError } from '../errors.js'\nimport { stateToken } from '../internal.js'\n\nexport type FetchHandler = (req: Request) => Promise<Response>\n\nfunction parseCookies(header: string | null): Record<string, string> {\n const out: Record<string, string> = {}\n if (!header) return out\n for (const part of header.split(';')) {\n const eq = part.indexOf('=')\n if (eq < 0) continue\n const key = part.slice(0, eq).trim()\n const value = part.slice(eq + 1).trim()\n if (key) out[key] = decodeURIComponent(value)\n }\n return out\n}\n\nfunction cookieAttrs(opts: { maxAgeSeconds?: number; clear?: boolean } = {}): string {\n const attrs = ['Path=/', 'HttpOnly', 'SameSite=Lax']\n if (process.env.NODE_ENV === 'production') attrs.push('Secure')\n attrs.push(opts.clear ? 'Max-Age=0' : `Max-Age=${opts.maxAgeSeconds ?? Math.floor(TRANSACTION_TTL_MS / 1000)}`)\n return attrs.join('; ')\n}\n\nexport function createFetchHandler(flow: OAuthFlow, opts: RoutesOptions): FetchHandler {\n const startPath = opts.startPath ?? DEFAULT_START_PATH\n const callbackPath = opts.callbackPath ?? DEFAULT_CALLBACK_PATH\n const grantStore = opts.grantStore ?? flow.config.grantStore\n const onConnected = opts.onConnected ?? flow.config.onConnected\n const successRedirect = opts.successRedirect ?? '/?wind=connected'\n\n function errorResponse(err: unknown): Response {\n const message = err instanceof WindError ? err.message : 'Wind connect flow failed.'\n console.error('[@usewind/node] connect flow error:', err)\n return new Response(message, { status: 400 })\n }\n\n return async (req: Request): Promise<Response> => {\n const url = new URL(req.url)\n if (req.method !== 'GET') return new Response('Not found', { status: 404 })\n if (url.pathname !== startPath && url.pathname !== callbackPath) return new Response('Not found', { status: 404 })\n\n try {\n if (url.pathname === startPath) {\n const { url: authorizeUrl, tx } = flow.buildAuthorizeRedirect({\n requestedAllocationMc: opts.requestedAllocationMc,\n features: opts.features,\n })\n\n const headers = new Headers({ Location: authorizeUrl })\n if (opts.session && opts.session !== 'cookie') {\n const id = stateToken()\n await opts.session.put(id, tx)\n headers.append('Set-Cookie', `${TX_ID_COOKIE_NAME}=${encodeURIComponent(id)}; ${cookieAttrs()}`)\n } else {\n const signed = signTransactionCookie(tx, flow.config.clientSecret)\n headers.append('Set-Cookie', `${TX_COOKIE_NAME}=${encodeURIComponent(signed)}; ${cookieAttrs()}`)\n }\n\n return new Response(null, { status: 302, headers })\n }\n\n // callbackPath\n if (!grantStore) {\n throw new WindConfigError('grantStore is required for wind.routes()/wind.handler() but was not configured.')\n }\n\n const userId = await opts.currentUser(req)\n if (!userId) {\n throw new WindConfigError('currentUser(req) returned no user — Wind is not your login; sign the user in first.')\n }\n\n const cookies = parseCookies(req.headers.get('cookie'))\n const clearHeaders = new Headers()\n\n let tx: ConnectTransaction | null = null\n if (opts.session && opts.session !== 'cookie') {\n const id = cookies[TX_ID_COOKIE_NAME]\n tx = id ? await opts.session.take(id) : null\n clearHeaders.append('Set-Cookie', `${TX_ID_COOKIE_NAME}=; ${cookieAttrs({ clear: true })}`)\n } else {\n tx = verifyTransactionCookie(cookies[TX_COOKIE_NAME], flow.config.clientSecret)\n clearHeaders.append('Set-Cookie', `${TX_COOKIE_NAME}=; ${cookieAttrs({ clear: true })}`)\n }\n\n const query = {\n code: url.searchParams.get('code') ?? undefined,\n state: url.searchParams.get('state') ?? undefined,\n error: url.searchParams.get('error') ?? undefined,\n }\n const grant = await flow.completeCallback({ query, tx })\n\n await grantStore.set(userId, grant)\n\n if (onConnected) {\n try {\n await onConnected(userId, grant)\n } catch {\n // Notification errors are caught and ignored — not correctness-critical.\n }\n }\n\n clearHeaders.set('Location', successRedirect)\n return new Response(null, { status: 302, headers: clearHeaders })\n } catch (err) {\n if (opts.onError) opts.onError(err, req, undefined)\n return errorResponse(err)\n }\n }\n}\n","/**\n * @usewind/node — server SDK for Connect with Wind.\n *\n * Two ways in:\n * import { wind } from '@usewind/node' // lazily reads WIND_CLIENT_* from env\n * import { createWind } from '@usewind/node' // explicit instance (tests, multi-tenant)\n *\n * See DESIGN.md for the full surface.\n */\n\nimport { resolveConfig, type ResolvedConfig, type WindConfig } from './config.js'\nimport { RawClient } from './http.js'\nimport { OAuthFlow, type RoutesOptions } from './oauth.js'\nimport { TokenManager } from './tokens.js'\nimport { ConnectionScope, type ScopeContext } from './client.js'\nimport { WebhookVerifier } from './webhooks.js'\nimport { createExpressRoutes, type ExpressMiddleware } from './adapters/express.js'\nimport { createFetchHandler, type FetchHandler } from './adapters/fetch.js'\nimport type {\n Account,\n AllocationRequest,\n Connection,\n Feature,\n RevokeResult,\n WebhookEvent,\n} from './types.js'\n\nexport class Wind {\n #partial: Partial<WindConfig>\n #resolved: ResolvedConfig | null = null\n #raw: RawClient | null = null\n #flow: OAuthFlow | null = null\n #tokens: TokenManager | null = null\n #webhooks: WebhookVerifier | null = null\n\n constructor(config: Partial<WindConfig> = {}) {\n this.#partial = config\n }\n\n /** Set or override configuration. Call once at boot. Resets memoised internals. */\n configure(config: Partial<WindConfig>): this {\n this.#partial = { ...this.#partial, ...config }\n this.#resolved = this.#raw = this.#flow = this.#tokens = this.#webhooks = null\n return this\n }\n\n // ── lazily-built internals ────────────────────────────────────────────────\n\n get #config(): ResolvedConfig {\n return (this.#resolved ??= resolveConfig(this.#partial))\n }\n /** The low-level HTTP client — one method per openapi path. Escape hatch. */\n get raw(): RawClient {\n return (this.#raw ??= new RawClient(this.#config))\n }\n get #oauth(): OAuthFlow {\n return (this.#flow ??= new OAuthFlow(this.#config, this.raw))\n }\n get #tokenManager(): TokenManager {\n return (this.#tokens ??= new TokenManager(this.#config, this.raw))\n }\n get #verifier(): WebhookVerifier {\n return (this.#webhooks ??= new WebhookVerifier(this.#config))\n }\n #scopeContext(): ScopeContext {\n return { config: this.#config, raw: this.raw, tokens: this.#tokenManager }\n }\n\n // ── connect flow ─────────────────────────────────────────────────────────\n\n /** Express middleware owning `startPath` + `callbackPath`. */\n routes(opts: RoutesOptions): ExpressMiddleware {\n return createExpressRoutes(this.#oauth, opts)\n }\n\n /** Web-standard `(Request) => Response` handler for the same two routes. */\n handler(opts: RoutesOptions): FetchHandler {\n return createFetchHandler(this.#oauth, opts)\n }\n\n // ── billed calls ─────────────────────────────────────────────────────────\n\n /**\n * Scope subsequent calls to one user of your app. Loads their grant via\n * `grantStore.get`. Singular, one user's connection — distinct from the\n * plural `wind.connections` below (client-credentials management across\n * every connection).\n */\n connection(userId: string): ConnectionScope {\n return new ConnectionScope(this.#scopeContext(), userId)\n }\n\n // ── management (client-credentials) ──────────────────────────────────────\n\n readonly connections = {\n list: (): Promise<Connection[]> => this.raw.listConnections(),\n get: (id: string): Promise<Connection> => this.raw.getConnection(id),\n revoke: (id: string): Promise<RevokeResult> => this.raw.revokeConnection(id),\n requestIncrease: (id: string, p: { targetAllocationMc: number; reason?: string }): Promise<AllocationRequest> =>\n this.raw.createAllocationRequest(id, { target_allocation_mc: p.targetAllocationMc, reason: p.reason }),\n }\n\n account(): Promise<Account> {\n return this.raw.getAccount()\n }\n\n readonly features = {\n list: (appId: string): Promise<Feature[]> => this.raw.listFeatures(appId),\n register: (appId: string, feature: Feature): Promise<Feature> => this.raw.registerFeature(appId, feature),\n update: (appId: string, slug: string, patch: Partial<Feature>): Promise<Feature> =>\n this.raw.updateFeature(appId, slug, patch),\n }\n\n // ── webhooks ─────────────────────────────────────────────────────────────\n\n /** Verify a webhook's `X-Wind-Signature` and return the typed event. Needs the raw body. */\n verify(input: { payload: string | Buffer; signature: string }): WebhookEvent {\n return this.#verifier.verify(input)\n }\n}\n\n/** An explicit, independent instance. Use for tests or multi-tenant servers. */\nexport function createWind(config: Partial<WindConfig> = {}): Wind {\n return new Wind(config)\n}\n\n/**\n * The default instance. Lazily reads `WIND_CLIENT_ID` / `WIND_CLIENT_SECRET` /\n * `WIND_REDIRECT_URI` on first use; `wind.configure({ … })` overrides.\n */\nexport const wind: Wind = new Wind()\n\n// ── re-exports ─────────────────────────────────────────────────────────────\n\nexport { memoryGrantStore } from './config.js'\nexport type { WindConfig, GrantStore } from './config.js'\nexport type { RoutesOptions, ConnectTransaction, TransactionStore } from './oauth.js'\nexport { ConnectionScope, FeatureScope } from './client.js'\nexport type { Chattable } from './client.js'\nexport * from './types.js'\nexport * from './errors.js'\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/config.ts","../src/internal.ts","../src/http.ts","../src/tokens.ts","../src/oauth.ts","../src/client.ts","../src/webhooks.ts","../src/adapters/express.ts","../src/adapters/fetch.ts","../src/index.ts"],"names":["createHmac","timingSafeEqual","tx","parseCookies"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error hierarchy for `@usewind/node`.\n *\n * This module is fully implemented (the skeleton stubs live elsewhere). The\n * mapping mirrors `apps/docs/src/content/docs/errors-and-types.mdx`.\n */\n\nexport interface WindErrorEnvelope {\n error?: {\n code?: string\n message?: string\n type?: string\n connection_id?: string | null\n increase_url?: string | null\n }\n}\n\nexport interface WindErrorInit {\n status?: number\n code?: string\n type?: string\n connectionId?: string | null\n requestId?: string | null\n raw?: unknown\n cause?: unknown\n}\n\n/** Base class for everything this SDK throws. */\nexport class WindError extends Error {\n readonly status?: number\n readonly code?: string\n readonly type?: string\n readonly connectionId?: string | null\n readonly requestId?: string | null\n readonly raw?: unknown\n\n constructor(message: string, init: WindErrorInit = {}) {\n super(message, init.cause !== undefined ? { cause: init.cause } : undefined)\n this.name = new.target.name\n this.status = init.status\n this.code = init.code\n this.type = init.type\n this.connectionId = init.connectionId ?? null\n this.requestId = init.requestId ?? null\n this.raw = init.raw\n Object.setPrototypeOf(this, new.target.prototype)\n }\n\n /**\n * Build the right subclass from an HTTP response. Matches on the envelope's\n * `error.code` first, then falls back to `status`.\n */\n static fromResponse(\n status: number,\n body: WindErrorEnvelope | undefined,\n extra: { requestId?: string | null; retryAfterMs?: number } = {},\n ): WindError {\n const e = body?.error ?? {}\n const message = e.message || `Wind API error (${status})`\n const init: WindErrorInit = {\n status,\n code: e.code,\n type: e.type,\n connectionId: e.connection_id ?? null,\n requestId: extra.requestId ?? null,\n raw: body,\n }\n\n switch (e.code) {\n case 'allocation_exhausted':\n return new AllocationExhaustedError(message, { ...init, increaseUrl: e.increase_url ?? null })\n case 'feature_cost_exceeded':\n return new FeatureCostExceededError(message, init)\n case 'feature_model_not_configured':\n return new FeatureModelNotConfiguredError(message, init)\n case 'connection_revoked':\n case 'invalid_grant':\n return new ConnectionRevokedError(message, init)\n case 'connection_frozen':\n return new ConnectionFrozenError(message, init)\n case 'model_not_allowed':\n return new ModelNotAllowedError(message, init)\n case 'app_suspended':\n return new AppSuspendedError(message, init)\n case 'rate_limited':\n case 'daily_limit_reached':\n case 'app_spend_limited':\n case 'sandbox_live_cost_limited':\n return new RateLimitedError(message, { ...init, retryAfterMs: extra.retryAfterMs })\n case 'risk_throttled':\n return new RiskThrottledError(message, { ...init, retryAfterMs: extra.retryAfterMs })\n case 'provider_error':\n return new ProviderError(message, init)\n case 'token_expired':\n return new TokenExpiredError(message, init)\n case 'idempotency_key_reused':\n return new IdempotencyKeyReusedError(message, init)\n }\n\n // No recognised code — fall back to status.\n switch (status) {\n case 401:\n return new TokenExpiredError(message, init)\n case 402:\n return new AllocationExhaustedError(message, init)\n case 403:\n return new ConnectionRevokedError(message, init)\n case 409:\n return new IdempotencyKeyReusedError(message, init)\n case 429:\n return new RateLimitedError(message, { ...init, retryAfterMs: extra.retryAfterMs })\n case 502:\n return new ProviderError(message, init)\n default:\n return new WindApiError(message, init)\n }\n }\n}\n\n// ─── Config / lifecycle ──────────────────────────────────────────────────────\n\n/** Missing or invalid configuration. Thrown at `configure()` or first use. */\nexport class WindConfigError extends WindError {}\n\n/** `grantStore.get(userId)` returned null — the user has no Wind connection yet. */\nexport class WindNotConnectedError extends WindError {}\n\n/** Webhook HMAC mismatch, malformed signature header, or stale timestamp. */\nexport class WindSignatureError extends WindError {}\n\n/** Marks an unimplemented skeleton path. Remove as bodies land. */\nexport class WindNotImplementedError extends WindError {\n constructor(what: string) {\n super(`${what} is not implemented yet (@usewind/node is a skeleton).`)\n }\n}\n\n// ─── API errors ──────────────────────────────────────────────────────────────\n\n/** Any non-2xx not classified below. */\nexport class WindApiError extends WindError {}\n\n/** 402 `allocation_exhausted` — connection spent its reserved cap. */\nexport class AllocationExhaustedError extends WindApiError {\n readonly increaseUrl: string | null\n constructor(message: string, init: WindErrorInit & { increaseUrl?: string | null } = {}) {\n super(message, init)\n this.increaseUrl = init.increaseUrl ?? null\n }\n}\n\n/** 402 `feature_cost_exceeded` — one call blew a per-feature guardrail. Not billed. */\nexport class FeatureCostExceededError extends WindApiError {}\n\n/** 400 `feature_model_not_configured` — the feature has no `default_model` set. Config bug, not runtime-retryable. */\nexport class FeatureModelNotConfiguredError extends WindApiError {}\n\n/** 403 `connection_revoked` (or refresh `invalid_grant`). Terminal — clear stored grant, prompt reconnect. */\nexport class ConnectionRevokedError extends WindApiError {}\n\n/**\n * 403 `connection_frozen` — Wind's own platform risk layer, not user\n * revocation, froze this connection on an abnormal spend pattern. Unlike\n * `ConnectionRevokedError`, do NOT delete the stored grant — the same\n * connection reactivates once the user goes through the connect flow again.\n */\nexport class ConnectionFrozenError extends WindApiError {}\n\n/**\n * 403 `app_suspended` — the app itself is switched off, by Wind or by you.\n * Every connection is affected, so stop calling and surface it; don't clear\n * any grants — they work again once the app is unsuspended.\n */\nexport class AppSuspendedError extends WindApiError {}\n\n/** 403 `model_not_allowed` — model is outside the app's allowlist. Integration bug. */\nexport class ModelNotAllowedError extends WindApiError {}\n\n/**\n * 429 — a spend or request limit, not an error in the call. `code` says which:\n * `rate_limited` (Feature.rate_limit), `daily_limit_reached` (the connection's\n * 24h limit), `app_spend_limited` (the app's daily limit on its tier) or\n * `sandbox_live_cost_limited` (the daily live-model allowance in sandbox).\n * The SDK does not auto-sleep; back off using `retryAfterMs`.\n */\nexport class RateLimitedError extends WindApiError {\n readonly retryAfterMs: number | null\n constructor(message: string, init: WindErrorInit & { retryAfterMs?: number } = {}) {\n super(message, init)\n this.retryAfterMs = init.retryAfterMs ?? null\n }\n}\n\n/** 429 `risk_throttled` — Wind's platform risk layer, not the per-feature rate limit. Same shape as `RateLimitedError`, distinct so callers can tell the two apart. */\nexport class RiskThrottledError extends WindApiError {\n readonly retryAfterMs: number | null\n constructor(message: string, init: WindErrorInit & { retryAfterMs?: number } = {}) {\n super(message, init)\n this.retryAfterMs = init.retryAfterMs ?? null\n }\n}\n\n/** 502 `provider_error` — upstream provider failed. Retried internally with the same idempotency key; not billed. */\nexport class ProviderError extends WindApiError {}\n\n/** 401 `token_expired` — internal; surfaces only if a refresh also fails. */\nexport class TokenExpiredError extends WindApiError {}\n\n/** 409 `idempotency_key_reused` — the same Idempotency-Key was sent with a different request body. Integration bug (or a genuine UUID collision, practically never). */\nexport class IdempotencyKeyReusedError extends WindApiError {}\n","/**\n * Configuration resolution and validation. Explicit args beat environment\n * variables; env is only consulted for the three credential fields.\n */\n\nimport { WindConfigError } from './errors.js'\nimport type { Grant } from './types.js'\n\n/**\n * The one persistence abstraction the SDK relies on for correctness.\n *\n * Refresh tokens rotate on every use, so `set` is called both after first\n * connect and after every refresh, and the SDK **awaits it before using the new\n * tokens** — a throw from `set` aborts the operation rather than stranding a\n * rotated refresh token. Implement `set` so it commits in the same transaction\n * as whatever work triggered the refresh.\n *\n * `delete` is called when a connection is revoked (terminal).\n *\n * Any Map-shaped store works; for production back it with your database.\n */\nexport interface GrantStore {\n get(userId: string): Promise<Grant | null> | Grant | null\n set(userId: string, grant: Grant): Promise<void> | void\n delete(userId: string): Promise<void> | void\n}\n\n/**\n * An in-memory `GrantStore` backed by a `Map`. **Dev/test only** — grants\n * vanish on restart and are not shared across instances, so a multi-instance\n * or restart-prone deployment will spuriously \"disconnect\" users. Back\n * production with your database instead.\n */\nexport function memoryGrantStore(): GrantStore {\n const grants = new Map<string, Grant>()\n return {\n get: (userId) => grants.get(userId) ?? null,\n set: (userId, grant) => {\n grants.set(userId, grant)\n },\n delete: (userId) => {\n grants.delete(userId)\n },\n }\n}\n\nexport interface WindConfig {\n clientId: string\n clientSecret: string\n /** Must exactly match a registered redirect URI and the callback route's URL. */\n redirectUri: string\n\n baseUrl?: string // default 'https://api.usewind.app'\n accountsUrl?: string // default 'https://accounts.usewind.app'\n webhookSecret?: string // enables wind.verify()\n\n /** Injectable for tests; defaults to the global `fetch`. */\n fetch?: typeof fetch\n /** Injectable for tests; defaults to `Date.now`. */\n clock?: () => number\n\n /**\n * Where per-user grants are persisted. Required for every user-scoped path\n * (`wind.routes()`, `wind.handler()`, `wind.connection()`); those throw\n * `WindConfigError` without it. Not needed for client-credentials-only use\n * (`wind.connections.*`, `wind.account()`, `wind.raw`).\n */\n grantStore?: GrantStore\n\n /**\n * Optional notification — fires once, after a user first connects. Runs after\n * `grantStore.set` has committed. Not correctness-critical: a throw here is\n * caught and ignored. Use it for audit logs, analytics, welcome emails.\n */\n onConnected?: (userId: string, grant: Grant) => Promise<void> | void\n /**\n * Optional notification — fires after every refresh-token rotation, once\n * `grantStore.set` has committed. Errors are caught and ignored.\n */\n onGrantRotated?: (userId: string, grant: Grant) => Promise<void> | void\n}\n\nexport interface ResolvedConfig\n extends Required<Omit<WindConfig, 'webhookSecret' | 'grantStore' | 'onConnected' | 'onGrantRotated'>> {\n webhookSecret?: string\n grantStore?: GrantStore\n onConnected?: WindConfig['onConnected']\n onGrantRotated?: WindConfig['onGrantRotated']\n}\n\nconst DEFAULT_BASE_URL = 'https://api.usewind.app'\nconst DEFAULT_ACCOUNTS_URL = 'https://accounts.usewind.app'\n\n/**\n * Merge partial config with `process.env` and defaults, then validate the\n * required credential triple. Throws `WindConfigError` if incomplete.\n */\nexport function resolveConfig(partial: Partial<WindConfig> = {}): ResolvedConfig {\n const env = typeof process !== 'undefined' ? process.env : ({} as NodeJS.ProcessEnv)\n\n const clientId = partial.clientId ?? env.WIND_CLIENT_ID\n const clientSecret = partial.clientSecret ?? env.WIND_CLIENT_SECRET\n const redirectUri = partial.redirectUri ?? env.WIND_REDIRECT_URI\n\n const missing = [\n !clientId && 'clientId (WIND_CLIENT_ID)',\n !clientSecret && 'clientSecret (WIND_CLIENT_SECRET)',\n !redirectUri && 'redirectUri (WIND_REDIRECT_URI)',\n ].filter(Boolean)\n\n if (missing.length) {\n throw new WindConfigError(\n `@usewind/node is not configured. Missing: ${missing.join(', ')}. ` +\n `Call wind.configure({ … }) at boot or set the environment variables.`,\n )\n }\n\n const fetchImpl = partial.fetch ?? globalThis.fetch\n if (typeof fetchImpl !== 'function') {\n throw new WindConfigError(\n 'No fetch implementation available. Use Node 18+ or pass config.fetch.',\n )\n }\n\n return {\n clientId: clientId!,\n clientSecret: clientSecret!,\n redirectUri: redirectUri!,\n baseUrl: (partial.baseUrl ?? env.WIND_BASE_URL ?? DEFAULT_BASE_URL).replace(/\\/$/, ''),\n accountsUrl: (partial.accountsUrl ?? env.WIND_ACCOUNTS_URL ?? DEFAULT_ACCOUNTS_URL).replace(/\\/$/, ''),\n fetch: fetchImpl,\n clock: partial.clock ?? Date.now,\n webhookSecret: partial.webhookSecret ?? env.WIND_WEBHOOK_SECRET,\n grantStore: partial.grantStore,\n onConnected: partial.onConnected,\n onGrantRotated: partial.onGrantRotated,\n }\n}\n","/** Small shared helpers used across the SDK's transport and crypto paths. */\n\nimport { createHash, randomBytes } from 'node:crypto'\nimport { WindNotImplementedError } from './errors.js'\n\nexport function notImplemented(what: string): never {\n throw new WindNotImplementedError(what)\n}\n\n/** URL-safe base64, no padding. */\nexport function b64url(input: Buffer | string): string {\n return Buffer.from(input).toString('base64url')\n}\n\nexport interface Pkce {\n verifier: string\n challenge: string\n method: 'S256'\n}\n\n/** RFC 7636 PKCE pair. */\nexport function pkce(): Pkce {\n const verifier = b64url(randomBytes(48))\n const challenge = b64url(createHash('sha256').update(verifier).digest())\n return { verifier, challenge, method: 'S256' }\n}\n\n/** Opaque CSRF `state` value. */\nexport function stateToken(): string {\n return b64url(randomBytes(24))\n}\n\n/** `Authorization: Basic base64(client_id:client_secret)`. */\nexport function basicAuth(clientId: string, clientSecret: string): string {\n return 'Basic ' + Buffer.from(`${clientId}:${clientSecret}`).toString('base64')\n}\n\n/** Parse a `Retry-After` header (seconds or HTTP-date) to milliseconds. */\nexport function retryAfterMs(header: string | null, now = Date.now()): number | undefined {\n if (!header) return undefined\n const secs = Number(header)\n if (Number.isFinite(secs)) return Math.max(0, secs * 1000)\n const date = Date.parse(header)\n return Number.isFinite(date) ? Math.max(0, date - now) : undefined\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","/**\n * RawClient — one method per openapi.yaml path, no ergonomics. The escape hatch\n * behind `wind.raw`, and the transport every higher-level module builds on.\n */\n\nimport type { ResolvedConfig } from './config.js'\nimport { WindError } from './errors.js'\nimport { basicAuth } from './internal.js'\nimport type {\n Account,\n AllocationRequest,\n Connection,\n Feature,\n RevokeResult,\n TokenResponse,\n} from './types.js'\n\nexport interface RawRequest {\n method: 'GET' | 'POST' | 'PATCH' | 'DELETE'\n path: string\n /** `application/json` body; omit for GET. */\n body?: unknown\n headers?: Record<string, string>\n /** `Authorization: Bearer` value — mutually exclusive with `basic`. */\n bearer?: string\n /** Use HTTP Basic client credentials for `Authorization`. */\n basic?: boolean\n signal?: AbortSignal\n /**\n * When the response is a 2xx `text/event-stream`, return its unread\n * `ReadableStream` as `body` instead of buffering it — `.chatStream()`\n * parses the SSE events as they arrive.\n */\n stream?: boolean\n}\n\nexport interface RawResponse<T = unknown> {\n status: number\n headers: Headers\n body: T\n requestId: string | null\n}\n\nexport class RawClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n /** Low-level: perform one request, parse JSON, never throw on non-2xx (returns the response). */\n async request<T = unknown>(req: RawRequest): Promise<RawResponse<T>> {\n const url = `${this.config.baseUrl}${req.path}`\n const headers: Record<string, string> = { Accept: 'application/json', ...req.headers }\n\n if (req.bearer) headers.Authorization = `Bearer ${req.bearer}`\n else if (req.basic) headers.Authorization = basicAuth(this.config.clientId, this.config.clientSecret)\n\n let body: string | undefined\n if (req.body !== undefined) {\n headers['Content-Type'] = 'application/json'\n body = JSON.stringify(req.body)\n }\n\n const res = await this.config.fetch(url, {\n method: req.method,\n headers,\n body,\n signal: req.signal,\n })\n\n const requestId = res.headers.get('x-request-id')\n if (req.stream && res.ok && res.body && (res.headers.get('content-type') ?? '').includes('text/event-stream')) {\n return { status: res.status, headers: res.headers, body: res.body as T, requestId }\n }\n let parsed: unknown = undefined\n const text = await res.text()\n if (text) {\n try {\n parsed = JSON.parse(text)\n } catch {\n parsed = text\n }\n }\n\n return { status: res.status, headers: res.headers, body: parsed as T, requestId }\n }\n\n // ── OAuth ──────────────────────────────────────────────────────────────────\n\n /** `POST /oauth/token` — `grant_type=authorization_code`. */\n async exchangeCode(args: { code: string; redirectUri: string; codeVerifier: string }): Promise<TokenResponse> {\n return this.postToken({\n grant_type: 'authorization_code',\n code: args.code,\n redirect_uri: args.redirectUri,\n code_verifier: args.codeVerifier,\n })\n }\n\n /** `POST /oauth/token` — `grant_type=refresh_token`. */\n async refresh(refreshToken: string): Promise<TokenResponse> {\n return this.postToken({ grant_type: 'refresh_token', refresh_token: refreshToken })\n }\n\n private async postToken(form: Record<string, string>): Promise<TokenResponse> {\n const url = `${this.config.baseUrl}/oauth/token`\n const res = await this.config.fetch(url, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n Authorization: basicAuth(this.config.clientId, this.config.clientSecret),\n },\n body: new URLSearchParams(form).toString(),\n })\n\n const text = await res.text()\n const parsed = text ? JSON.parse(text) : undefined\n\n if (!res.ok) {\n throw WindError.fromResponse(res.status, parsed, { requestId: res.headers.get('x-request-id') })\n }\n return parsed as TokenResponse\n }\n\n // ── Inference ──────────────────────────────────────────────────────────────\n\n /** `POST /v1/ai/{model}`. Returns the raw response so callers can branch on status/headers. */\n inference(args: {\n model: string\n accessToken: string\n idempotencyKey: string\n feature?: string\n body: unknown\n signal?: AbortSignal\n }): Promise<RawResponse> {\n const headers: Record<string, string> = { 'Idempotency-Key': args.idempotencyKey }\n if (args.feature) headers['X-Wind-Feature'] = args.feature\n return this.request({\n method: 'POST',\n path: `/v1/ai/${encodeURIComponent(args.model)}`,\n bearer: args.accessToken,\n headers,\n body: args.body,\n signal: args.signal,\n stream: isStreamBody(args.body),\n })\n }\n\n /** `POST /v1/ai/features/{slug}`. */\n inferenceFeature(args: {\n slug: string\n accessToken: string\n idempotencyKey: string\n body: unknown\n signal?: AbortSignal\n }): Promise<RawResponse> {\n return this.request({\n method: 'POST',\n path: `/v1/ai/features/${encodeURIComponent(args.slug)}`,\n bearer: args.accessToken,\n headers: { 'Idempotency-Key': args.idempotencyKey },\n body: args.body,\n signal: args.signal,\n stream: isStreamBody(args.body),\n })\n }\n\n // ── Management (client-credentials) ────────────────────────────────────────\n\n async listConnections(): Promise<Connection[]> {\n const res = await this.request<Connection[]>({ method: 'GET', path: '/v1/connections', basic: true })\n return this.unwrap(res)\n }\n async getConnection(id: string): Promise<Connection> {\n const res = await this.request<Connection>({ method: 'GET', path: `/v1/connections/${encodeURIComponent(id)}`, basic: true })\n return this.unwrap(res)\n }\n async revokeConnection(id: string): Promise<RevokeResult> {\n const res = await this.request<RevokeResult>({ method: 'POST', path: `/v1/connections/${encodeURIComponent(id)}/revoke`, basic: true })\n return this.unwrap(res)\n }\n async createAllocationRequest(id: string, body: { target_allocation_mc: number; reason?: string }): Promise<AllocationRequest> {\n const res = await this.request<AllocationRequest>({\n method: 'POST',\n path: `/v1/connections/${encodeURIComponent(id)}/allocation-requests`,\n basic: true,\n body,\n })\n return this.unwrap(res)\n }\n async getAccount(): Promise<Account> {\n const res = await this.request<Account>({ method: 'GET', path: '/v1/account', basic: true })\n return this.unwrap(res)\n }\n async listFeatures(appId: string): Promise<Feature[]> {\n const res = await this.request<Feature[]>({ method: 'GET', path: `/v1/apps/${encodeURIComponent(appId)}/features`, basic: true })\n return this.unwrap(res)\n }\n async registerFeature(appId: string, feature: Feature): Promise<Feature> {\n const res = await this.request<Feature>({\n method: 'POST',\n path: `/v1/apps/${encodeURIComponent(appId)}/features`,\n basic: true,\n body: feature,\n })\n return this.unwrap(res)\n }\n async updateFeature(appId: string, slug: string, patch: Partial<Feature>): Promise<Feature> {\n const res = await this.request<Feature>({\n method: 'PATCH',\n path: `/v1/apps/${encodeURIComponent(appId)}/features/${encodeURIComponent(slug)}`,\n basic: true,\n body: patch,\n })\n return this.unwrap(res)\n }\n\n private unwrap<T>(res: RawResponse<T>): T {\n if (res.status >= 200 && res.status < 300) return res.body\n throw WindError.fromResponse(res.status, res.body as any, { requestId: res.requestId })\n }\n\n // Convenience verbs for `wind.raw.get(...)` / `.post(...)`.\n get<T = unknown>(path: string, init?: Omit<RawRequest, 'method' | 'path' | 'body'>): Promise<RawResponse<T>> {\n return this.request<T>({ method: 'GET', path, ...init })\n }\n post<T = unknown>(path: string, init?: Omit<RawRequest, 'method' | 'path'>): Promise<RawResponse<T>> {\n return this.request<T>({ method: 'POST', path, ...init })\n }\n}\n\nfunction isStreamBody(body: unknown): boolean {\n return typeof body === 'object' && body !== null && (body as { stream?: unknown }).stream === true\n}\n","/**\n * Access-token cache + atomic refresh-token rotation.\n *\n * The one rule: after a refresh, the rotated grant is written via\n * `grantStore.set(userId, next)` and **awaited before** the caller may use the\n * new access token. A crash between \"got new refresh token\" and \"persisted it\"\n * kills the connection, so the SDK never proceeds past an unpersisted rotation.\n * The optional `onGrantRotated` hook fires afterward and its errors are ignored.\n */\n\nimport { WindConfigError, ConnectionRevokedError } from './errors.js'\nimport type { ResolvedConfig } from './config.js'\nimport type { RawClient } from './http.js'\nimport type { Grant } from './types.js'\n\n/** Skew applied when deciding whether a cached access token is \"still fresh\". */\nexport const ACCESS_TOKEN_SKEW_MS = 60_000\n\nexport class TokenManager {\n constructor(\n private readonly config: ResolvedConfig,\n private readonly raw: RawClient,\n ) {}\n\n /** True if the grant's cached access token is present and outside the skew window. */\n isFresh(grant: Grant): boolean {\n if (!grant.accessToken || grant.accessTokenExpiresAt === undefined) return false\n return grant.accessTokenExpiresAt - ACCESS_TOKEN_SKEW_MS > this.config.clock()\n }\n\n /**\n * Return a grant guaranteed to have a usable access token. If a refresh was\n * needed, `grantStore.set(userId, next)` has already been awaited before this\n * resolves (then `onGrantRotated` fired). Refresh failure (`invalid_grant`)\n * throws `ConnectionRevokedError` — the caller then clears the store entry.\n */\n async ensureAccessToken(userId: string, grant: Grant): Promise<Grant> {\n if (this.isFresh(grant)) return grant\n return this.forceRefresh(userId, grant)\n }\n\n /** Force a refresh regardless of cache state (used on a 401 retry). */\n async forceRefresh(userId: string, grant: Grant): Promise<Grant> {\n const grantStore = this.config.grantStore\n if (!grantStore) {\n throw new WindConfigError('grantStore is required to refresh a connection but was not configured.')\n }\n\n let token\n try {\n token = await this.raw.refresh(grant.refreshToken)\n } catch (err) {\n // `error.code: invalid_grant` on the refresh grant type maps to\n // ConnectionRevokedError in WindError.fromResponse — the refresh token\n // is permanently dead, so clear the store rather than retry.\n if (err instanceof ConnectionRevokedError) {\n await grantStore.delete(userId)\n }\n throw err\n }\n\n const next = grantFromToken(token, this.config.clock())\n\n // Awaited before the new access token may be used — a throw here aborts\n // the call rather than stranding a rotated refresh token.\n await grantStore.set(userId, next)\n\n if (this.config.onGrantRotated) {\n try {\n await this.config.onGrantRotated(userId, next)\n } catch {\n // Notification errors are caught and ignored — not correctness-critical.\n }\n }\n\n return next\n }\n}\n\n/** Build a `Grant` from a token response + the id of the user it belongs to. */\nexport function grantFromToken(\n token: { access_token: string; refresh_token: string; connection_id: string; expires_in: number },\n now: number,\n): Grant {\n return {\n connectionId: token.connection_id,\n refreshToken: token.refresh_token,\n accessToken: token.access_token,\n accessTokenExpiresAt: now + token.expires_in * 1000,\n }\n}\n","/**\n * The connect flow, framework-neutral. Adapters (Express, fetch-handler) call\n * into `OAuthFlow`; they own request/response plumbing, this owns the protocol.\n */\n\nimport { createHmac, timingSafeEqual } from 'node:crypto'\nimport type { GrantStore, ResolvedConfig } from './config.js'\nimport { WindConfigError } from './errors.js'\nimport type { RawClient } from './http.js'\nimport { b64url, pkce, stateToken } from './internal.js'\nimport { grantFromToken } from './tokens.js'\nimport type { Grant } from './types.js'\n\n/** The short-lived value stashed between `/wind/start` and `/wind/callback`. */\nexport interface ConnectTransaction {\n verifier: string // PKCE code_verifier\n state: string // CSRF token\n createdAt: number\n}\n\n/** Pluggable storage for the transaction. Default is a signed cookie (see adapters). */\nexport interface TransactionStore {\n put(id: string, tx: ConnectTransaction): Promise<void> | void\n take(id: string): Promise<ConnectTransaction | null> | ConnectTransaction | null\n}\n\nexport interface RoutesOptions {\n startPath?: string // default '/wind/start'\n callbackPath?: string // default '/wind/callback'\n /** REQUIRED — Wind is not your login. Identify the signed-in user of your app. */\n currentUser: (req: unknown) => string | null | undefined | Promise<string | null | undefined>\n /** Override the config's `grantStore` for these routes. Falls back to config. */\n grantStore?: GrantStore\n /** Optional post-connect notification (see `WindConfig.onConnected`). */\n onConnected?: (userId: string, grant: Grant) => Promise<void> | void\n /** Pre-fill the consent screen's spend cap (micro-cents). */\n requestedAllocationMc?: number\n /** Feature slugs → the consent \"what for\" line. */\n features?: string[]\n session?: 'cookie' | TransactionStore\n successRedirect?: string // default '/?wind=connected'\n onError?: (err: unknown, req: unknown, res: unknown) => void\n}\n\nexport const DEFAULT_START_PATH = '/wind/start'\nexport const DEFAULT_CALLBACK_PATH = '/wind/callback'\nexport const TRANSACTION_TTL_MS = 10 * 60_000\n\n/** Default cookie name for the signed, self-contained transaction (session: 'cookie', the default). */\nexport const TX_COOKIE_NAME = '__wind_tx'\n/** Cookie name carrying the lookup id when a custom `TransactionStore` is supplied. */\nexport const TX_ID_COOKIE_NAME = '__wind_tx_id'\n\n/**\n * Sign a transaction into a single opaque cookie value: `base64url(json).hex(hmac)`.\n * Keyed on `clientSecret` — already a server-held secret, and rotating it\n * naturally invalidates any in-flight transactions, which is the right\n * behavior. No separate `session`/`state` field needed since `state` already\n * lives inside `tx` and is checked against the callback's `state` query param.\n */\nexport function signTransactionCookie(tx: ConnectTransaction, clientSecret: string): string {\n const payload = b64url(JSON.stringify(tx))\n const sig = createHmac('sha256', clientSecret).update(payload).digest('hex')\n return `${payload}.${sig}`\n}\n\n/** Verify + decode a cookie produced by `signTransactionCookie`. Returns `null` on any mismatch. */\nexport function verifyTransactionCookie(value: string | undefined | null, clientSecret: string): ConnectTransaction | null {\n if (!value) return null\n const dot = value.lastIndexOf('.')\n if (dot < 0) return null\n const payload = value.slice(0, dot)\n const providedHex = value.slice(dot + 1)\n\n const expectedHex = createHmac('sha256', clientSecret).update(payload).digest('hex')\n const provided = Buffer.from(providedHex, 'hex')\n const expected = Buffer.from(expectedHex, 'hex')\n if (provided.length !== expected.length || !timingSafeEqual(provided, expected)) return null\n\n try {\n const json = Buffer.from(payload, 'base64url').toString('utf8')\n const tx = JSON.parse(json) as ConnectTransaction\n if (typeof tx?.verifier !== 'string' || typeof tx?.state !== 'string' || typeof tx?.createdAt !== 'number') return null\n return tx\n } catch {\n return null\n }\n}\n\nexport class OAuthFlow {\n constructor(\n readonly config: ResolvedConfig,\n private readonly raw: RawClient,\n ) {}\n\n /**\n * Build the `accounts.usewind.app/oauth/authorize` URL and the transaction to\n * stash. The adapter persists `tx` and issues the redirect.\n */\n buildAuthorizeRedirect(opts: {\n requestedAllocationMc?: number\n features?: string[]\n }): { url: string; tx: ConnectTransaction } {\n const { verifier, challenge, method } = pkce()\n const state = stateToken()\n\n const url = new URL('/oauth/authorize', this.config.accountsUrl)\n url.searchParams.set('response_type', 'code')\n url.searchParams.set('client_id', this.config.clientId)\n url.searchParams.set('redirect_uri', this.config.redirectUri)\n url.searchParams.set('code_challenge', challenge)\n url.searchParams.set('code_challenge_method', method)\n url.searchParams.set('state', state)\n if (opts.requestedAllocationMc !== undefined) {\n url.searchParams.set('requested_allocation_mc', String(opts.requestedAllocationMc))\n }\n if (opts.features?.length) {\n url.searchParams.set('features', opts.features.join(','))\n }\n\n return { url: url.toString(), tx: { verifier, state, createdAt: this.config.clock() } }\n }\n\n /**\n * Given the callback query and the stashed transaction, verify `state`,\n * exchange the `code`, and return the fresh `Grant`. Does not persist — the\n * adapter writes it via `grantStore.set`, then fires the `onConnected` hook.\n */\n async completeCallback(args: {\n query: { code?: string; state?: string; error?: string }\n tx: ConnectTransaction | null\n }): Promise<Grant> {\n const { query, tx } = args\n\n if (query.error) {\n throw new WindConfigError(`Wind connect flow was not completed: ${query.error}`)\n }\n if (!tx) {\n throw new WindConfigError('No pending Wind connect transaction found — it may have expired (10 min TTL) or the cookie was lost.')\n }\n if (this.config.clock() - tx.createdAt > TRANSACTION_TTL_MS) {\n throw new WindConfigError('Wind connect transaction expired. Start the connection again.')\n }\n if (!query.state || query.state !== tx.state) {\n throw new WindConfigError('state mismatch on Wind connect callback — possible CSRF, aborting.')\n }\n if (!query.code) {\n throw new WindConfigError('Missing code on Wind connect callback.')\n }\n\n const token = await this.raw.exchangeCode({\n code: query.code,\n redirectUri: this.config.redirectUri,\n codeVerifier: tx.verifier,\n })\n\n return grantFromToken(token, this.config.clock())\n }\n}\n","/**\n * Billed-call surface: `wind.connection(userId).model('gpt-5').chat(params)`\n * or `wind.connection(userId).feature('summarize').chat(params)`.\n *\n * Model and feature are DELIBERATELY mutually exclusive, no chaining — each\n * hits a different route (`POST /v1/ai/{model}` vs `POST /v1/ai/features/{slug}`)\n * with a different model-resolution rule, and picking one is an explicit,\n * unambiguous choice at the call site rather than something that falls out of\n * which optional param you happened to pass. The one combination this can't\n * express — a specific model AND a feature tag on the same call (`X-Wind-Feature`\n * on `POST /v1/ai/{model}`) — is still reachable via `wind.raw.inference(...)`;\n * \"wrap, don't hide\" means the ergonomic surface enforcing a simpler mental\n * model doesn't have to cost the escape hatch anything.\n */\n\nimport { randomUUID } from 'node:crypto'\nimport type { ResolvedConfig } from './config.js'\nimport { WindError, WindNotConnectedError } from './errors.js'\nimport type { RawClient, RawResponse } from './http.js'\nimport { retryAfterMs, sleep } from './internal.js'\nimport type { TokenManager } from './tokens.js'\nimport type {\n AllocationRequest,\n AllocationRequestParams,\n ChatParams,\n ChatResult,\n ChatStreamChunk,\n Connection,\n Grant,\n RevokeResult,\n} from './types.js'\n\nconst FEATURE_SLUG_RE = /^[a-z0-9-]{1,40}$/\n\nconst PROVIDER_ERROR_RETRIES = 2\nconst PROVIDER_ERROR_BACKOFF_MS = [250, 1000]\n\nexport interface Chattable {\n /** Refresh-and-retry, idempotency key, and error mapping are all handled internally. */\n chat(params: ChatParams): Promise<ChatResult>\n /** Streaming variant — async iterable; the last chunk carries the settled `wind` block. */\n chatStream(params: ChatParams): AsyncIterable<ChatStreamChunk>\n}\n\n/** `POST /v1/ai/{model}` — no feature tag; see the mutual-exclusivity note above. */\nexport class ModelScope implements Chattable {\n constructor(\n private readonly ctx: ScopeContext,\n private readonly userId: string,\n private readonly model: string,\n ) {}\n\n chat(params: ChatParams): Promise<ChatResult> {\n return billedCall(this.ctx, this.userId, params, (accessToken, idempotencyKey, body, signal) =>\n this.ctx.raw.inference({ model: this.model, accessToken, idempotencyKey, body, signal }),\n )\n }\n chatStream(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n return billedStream(this.ctx, this.userId, params, (accessToken, idempotencyKey, body, signal) =>\n this.ctx.raw.inference({ model: this.model, accessToken, idempotencyKey, body, signal }),\n )\n }\n}\n\n/** `POST /v1/ai/features/{slug}` — model resolved server-side from the feature's `default_model`. */\nexport class FeatureScope implements Chattable {\n constructor(\n private readonly ctx: ScopeContext,\n private readonly userId: string,\n private readonly feature: string,\n ) {\n if (!FEATURE_SLUG_RE.test(feature)) {\n throw new TypeError(`Invalid feature slug ${JSON.stringify(feature)} — must match ${FEATURE_SLUG_RE}`)\n }\n }\n\n chat(params: ChatParams): Promise<ChatResult> {\n return billedCall(this.ctx, this.userId, params, (accessToken, idempotencyKey, body, signal) =>\n this.ctx.raw.inferenceFeature({ slug: this.feature, accessToken, idempotencyKey, body, signal }),\n )\n }\n chatStream(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n return billedStream(this.ctx, this.userId, params, (accessToken, idempotencyKey, body, signal) =>\n this.ctx.raw.inferenceFeature({ slug: this.feature, accessToken, idempotencyKey, body, signal }),\n )\n }\n}\n\nexport class ConnectionScope {\n constructor(\n private readonly ctx: ScopeContext,\n private readonly userId: string,\n ) {}\n\n /** `wind.connection(userId).model('gpt-5').chat(...)` — hits `POST /v1/ai/{model}`. */\n model(id: string): ModelScope {\n return new ModelScope(this.ctx, this.userId, id)\n }\n /** `wind.connection(userId).feature('summarize').chat(...)` — hits `POST /v1/ai/features/{slug}`. */\n feature(slug: string): FeatureScope {\n return new FeatureScope(this.ctx, this.userId, slug)\n }\n\n /** `GET /v1/connections/{id}` for this user's connection. Named `.get()`, not `.connection()` — avoids `wind.connection(userId).connection()`. */\n async get(): Promise<Connection> {\n const grant = await requireGrant(this.ctx, this.userId)\n return this.ctx.raw.getConnection(grant.connectionId)\n }\n /** `POST /v1/connections/{id}/revoke`. */\n async revoke(): Promise<RevokeResult> {\n const grant = await requireGrant(this.ctx, this.userId)\n const result = await this.ctx.raw.revokeConnection(grant.connectionId)\n await this.ctx.config.grantStore?.delete(this.userId)\n return result\n }\n /** `POST /v1/connections/{id}/allocation-requests` — returns `{ approvalUrl }`. */\n async requestIncrease(params: AllocationRequestParams): Promise<AllocationRequest> {\n const grant = await requireGrant(this.ctx, this.userId)\n return this.ctx.raw.createAllocationRequest(grant.connectionId, {\n target_allocation_mc: params.targetAllocationMc,\n reason: params.reason,\n })\n }\n}\n\n/** Shared dependencies handed to every scope. */\nexport interface ScopeContext {\n config: ResolvedConfig\n raw: RawClient\n tokens: TokenManager\n}\n\n// ─── shared call machinery ──────────────────────────────────────────────────\n\nasync function requireGrant(ctx: ScopeContext, userId: string): Promise<Grant> {\n if (!ctx.config.grantStore) {\n throw new WindNotConnectedError('grantStore is required for wind.connection(userId) but was not configured.')\n }\n const grant = await ctx.config.grantStore.get(userId)\n if (!grant) {\n throw new WindNotConnectedError(`No Wind connection found for user ${JSON.stringify(userId)}.`)\n }\n return grant\n}\n\nfunction requestBody(params: ChatParams): unknown {\n return {\n messages: params.messages,\n ...(params.max_tokens !== undefined && { max_tokens: params.max_tokens }),\n ...(params.temperature !== undefined && { temperature: params.temperature }),\n ...(params.tools !== undefined && { tools: params.tools }),\n ...(params.tool_choice !== undefined && { tool_choice: params.tool_choice }),\n ...(params.parallel_tool_calls !== undefined && { parallel_tool_calls: params.parallel_tool_calls }),\n ...(params.stream !== undefined && { stream: params.stream }),\n }\n}\n\ntype InferenceCall = (\n accessToken: string,\n idempotencyKey: string,\n body: unknown,\n signal: AbortSignal | undefined,\n) => Promise<RawResponse>\n\n/**\n * Implements DESIGN.md's `.chat()` internals: grant lookup, fresh-token\n * ensure, the request, 401-refresh-retry-once, 502-backoff-retry-twice, and\n * error mapping via `WindError.fromResponse`.\n */\nasync function billedCall(\n ctx: ScopeContext,\n userId: string,\n params: ChatParams,\n call: InferenceCall,\n): Promise<ChatResult> {\n let grant = await requireGrant(ctx, userId)\n grant = await ctx.tokens.ensureAccessToken(userId, grant)\n\n const idempotencyKey = params.idempotencyKey ?? randomUUID()\n const body = requestBody(params)\n\n let res = await call(grant.accessToken!, idempotencyKey, body, params.signal)\n\n if (res.status === 401) {\n grant = await ctx.tokens.forceRefresh(userId, grant)\n res = await call(grant.accessToken!, idempotencyKey, body, params.signal)\n if (res.status === 401) {\n await ctx.config.grantStore?.delete(userId)\n throw WindError.fromResponse(res.status, res.body as any, { requestId: res.requestId })\n }\n }\n\n for (let attempt = 0; res.status === 502 && attempt < PROVIDER_ERROR_RETRIES; attempt++) {\n await sleep(PROVIDER_ERROR_BACKOFF_MS[attempt])\n res = await call(grant.accessToken!, idempotencyKey, body, params.signal)\n }\n if (res.status < 200 || res.status >= 300) {\n throw WindError.fromResponse(res.status, res.body as any, {\n requestId: res.requestId,\n retryAfterMs: retryAfterMs(res.headers.get('retry-after')),\n })\n }\n\n return res.body as ChatResult\n}\n\n/**\n * `.chatStream()`. The gateway answers `stream: true` with SSE: provider\n * chunks as they arrive, then `data: {\"wind_final\":{usage,wind}}` once the\n * call has settled, then `data: [DONE]`. Each provider chunk is yielded with\n * `wind: null`; the final chunk carries the settled `wind` block. A provider\n * or settlement failure mid-stream arrives as `data: {\"error\":…}` and is\n * thrown as a WindError. A buffered JSON 200 (an idempotent replay of a call\n * that already finished) is surfaced as a single final chunk.\n */\nasync function* billedStream(\n ctx: ScopeContext,\n userId: string,\n params: ChatParams,\n call: InferenceCall,\n): AsyncGenerator<ChatStreamChunk> {\n let grant = await requireGrant(ctx, userId)\n grant = await ctx.tokens.ensureAccessToken(userId, grant)\n\n const idempotencyKey = params.idempotencyKey ?? randomUUID()\n const body = requestBody({ ...params, stream: true })\n\n let res = await call(grant.accessToken!, idempotencyKey, body, params.signal)\n\n if (res.status === 401) {\n grant = await ctx.tokens.forceRefresh(userId, grant)\n res = await call(grant.accessToken!, idempotencyKey, body, params.signal)\n if (res.status === 401) {\n await ctx.config.grantStore?.delete(userId)\n throw WindError.fromResponse(res.status, res.body as any, { requestId: res.requestId })\n }\n }\n\n if (res.status < 200 || res.status >= 300) {\n throw WindError.fromResponse(res.status, res.body as any, { requestId: res.requestId })\n }\n\n if (!(res.body instanceof ReadableStream)) {\n const result = res.body as ChatResult\n yield { delta: result, wind: result.wind ?? null, usage: result.usage }\n return\n }\n\n for await (const event of sseEvents(res.body as ReadableStream<Uint8Array>)) {\n if (event === '[DONE]') return\n let data: any\n try {\n data = JSON.parse(event)\n } catch {\n continue\n }\n if (data?.wind_final) {\n yield { delta: null, wind: data.wind_final.wind ?? null, usage: data.wind_final.usage }\n } else if (data?.error) {\n // Settlement failures nest the API error envelope one level deeper.\n const err = data.error.error ?? data.error\n const status = err.code === 'provider_error' ? 502 : 403\n throw WindError.fromResponse(status, { error: err }, { requestId: res.requestId })\n } else if (data?.streamed && data.wind) {\n // Replay of a stream that already settled: only the final block was kept.\n yield { delta: null, wind: data.wind, usage: data.usage }\n } else {\n yield { delta: data, wind: null }\n }\n }\n}\n\n/** The `data:` payloads of an SSE body, one per event, as they arrive. */\nasync function* sseEvents(stream: ReadableStream<Uint8Array>): AsyncGenerator<string> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n for (const line of lines) {\n if (line.startsWith('data:')) yield line.slice(5).trim()\n }\n }\n if (buffer.startsWith('data:')) yield buffer.slice(5).trim()\n } finally {\n reader.releaseLock()\n }\n}\n","/**\n * Webhook signature verification. Needs the RAW (unparsed) request body.\n *\n * Header: `Wind-Signature: t=<unix>,v1=<hex hmac-sha256>`\n * Signed payload: `` `${t}.${rawBody}` `` with `config.webhookSecret`.\n * Rejects timestamps more than `TOLERANCE_S` seconds from now (replay guard).\n */\n\nimport { createHmac, timingSafeEqual } from 'node:crypto'\nimport type { ResolvedConfig } from './config.js'\nimport { WindSignatureError } from './errors.js'\nimport type { WebhookEvent } from './types.js'\n\nexport const SIGNATURE_HEADER = 'wind-signature'\nexport const TOLERANCE_S = 300\n\nexport interface VerifyInput {\n /** The raw request body exactly as received — a string or Buffer, never parsed JSON. */\n payload: string | Buffer\n /** The `Wind-Signature` header value. */\n signature: string\n}\n\nexport class WebhookVerifier {\n constructor(private readonly config: ResolvedConfig) {}\n\n /**\n * Verify and parse. Throws `WindSignatureError` on any mismatch, malformed\n * header, missing secret, or stale timestamp. Returns the typed event.\n */\n verify(input: VerifyInput): WebhookEvent {\n if (!this.verifySignature(input)) {\n throw new WindSignatureError('Wind webhook signature verification failed.')\n }\n\n const text = typeof input.payload === 'string' ? input.payload : input.payload.toString('utf8')\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n } catch (cause) {\n throw new WindSignatureError('Wind webhook payload is not valid JSON.', { cause })\n }\n\n const event = parsed as Partial<WebhookEvent>\n if (!event || typeof event.id !== 'string' || typeof event.type !== 'string') {\n throw new WindSignatureError('Wind webhook payload is missing required fields (id, type).')\n }\n\n return event as WebhookEvent\n }\n\n /** Constant-time HMAC check only — no parsing. Implement this first. */\n verifySignature(input: VerifyInput, now: number = this.config.clock()): boolean {\n if (!this.config.webhookSecret) {\n throw new WindSignatureError('webhookSecret is not configured — cannot verify Wind webhooks.')\n }\n\n const match = /^t=(\\d+),v1=([0-9a-f]+)$/i.exec(input.signature?.trim() ?? '')\n if (!match) return false\n\n const [, timestampStr, providedHex] = match\n const timestamp = Number(timestampStr)\n if (!Number.isFinite(timestamp)) return false\n if (Math.abs(now / 1000 - timestamp) > TOLERANCE_S) return false\n\n const payload = typeof input.payload === 'string' ? Buffer.from(input.payload, 'utf8') : input.payload\n const signedContent = Buffer.concat([Buffer.from(`${timestampStr}.`, 'utf8'), payload])\n const expected = createHmac('sha256', this.config.webhookSecret).update(signedContent).digest()\n\n let provided: Buffer\n try {\n provided = Buffer.from(providedHex, 'hex')\n } catch {\n return false\n }\n\n return provided.length === expected.length && timingSafeEqual(provided, expected)\n }\n}\n","/**\n * Express adapter. `wind.routes(opts)` returns a middleware that owns\n * `startPath` + `callbackPath`; every other request falls through to `next()`.\n *\n * Express is detected structurally (duck-typed req/res) and never imported, so\n * this package has no Express dependency.\n */\n\nimport {\n DEFAULT_CALLBACK_PATH,\n DEFAULT_START_PATH,\n OAuthFlow,\n TX_COOKIE_NAME,\n TX_ID_COOKIE_NAME,\n TRANSACTION_TTL_MS,\n signTransactionCookie,\n verifyTransactionCookie,\n type ConnectTransaction,\n type RoutesOptions,\n} from '../oauth.js'\nimport { WindConfigError, WindError } from '../errors.js'\nimport { stateToken } from '../internal.js'\n\n/** Minimal shape this adapter relies on — a subset of Express req/res. */\nexport interface ExpressLikeRequest {\n method?: string\n url?: string\n path?: string\n query?: Record<string, unknown>\n headers: Record<string, string | string[] | undefined>\n}\nexport interface ExpressLikeResponse {\n statusCode: number\n setHeader(name: string, value: string): void\n redirect(url: string): void\n status(code: number): ExpressLikeResponse\n send(body?: unknown): void\n}\nexport type NextFn = (err?: unknown) => void\n\nexport type ExpressMiddleware = (\n req: ExpressLikeRequest,\n res: ExpressLikeResponse,\n next: NextFn,\n) => void\n\nfunction parseCookies(header: string | string[] | undefined): Record<string, string> {\n const raw = Array.isArray(header) ? header.join('; ') : header\n const out: Record<string, string> = {}\n if (!raw) return out\n for (const part of raw.split(';')) {\n const eq = part.indexOf('=')\n if (eq < 0) continue\n const key = part.slice(0, eq).trim()\n const value = part.slice(eq + 1).trim()\n if (key) out[key] = decodeURIComponent(value)\n }\n return out\n}\n\nfunction setCookie(\n res: ExpressLikeResponse,\n name: string,\n value: string,\n opts: { maxAgeSeconds?: number; clear?: boolean } = {},\n) {\n const attrs = [`${name}=${opts.clear ? '' : encodeURIComponent(value)}`, 'Path=/', 'HttpOnly', 'SameSite=Lax']\n if (process.env.NODE_ENV === 'production') attrs.push('Secure')\n attrs.push(opts.clear ? 'Max-Age=0' : `Max-Age=${opts.maxAgeSeconds ?? Math.floor(TRANSACTION_TTL_MS / 1000)}`)\n res.setHeader('Set-Cookie', attrs.join('; '))\n}\n\nfunction getPath(req: ExpressLikeRequest): string {\n if (req.path) return req.path\n const url = req.url ?? '/'\n const q = url.indexOf('?')\n return q >= 0 ? url.slice(0, q) : url\n}\n\nfunction getQuery(req: ExpressLikeRequest): Record<string, string> {\n if (req.query) {\n const out: Record<string, string> = {}\n for (const [k, v] of Object.entries(req.query)) out[k] = Array.isArray(v) ? String(v[0]) : String(v)\n return out\n }\n const url = req.url ?? '/'\n const q = url.indexOf('?')\n if (q < 0) return {}\n return Object.fromEntries(new URLSearchParams(url.slice(q + 1)))\n}\n\nexport function createExpressRoutes(flow: OAuthFlow, opts: RoutesOptions): ExpressMiddleware {\n const startPath = opts.startPath ?? DEFAULT_START_PATH\n const callbackPath = opts.callbackPath ?? DEFAULT_CALLBACK_PATH\n const grantStore = opts.grantStore ?? flow.config.grantStore\n const onConnected = opts.onConnected ?? flow.config.onConnected\n const successRedirect = opts.successRedirect ?? '/?wind=connected'\n\n function handleError(err: unknown, req: ExpressLikeRequest, res: ExpressLikeResponse) {\n if (opts.onError) {\n opts.onError(err, req, res)\n return\n }\n console.error('[@usewind/node] connect flow error:', err)\n const message = err instanceof WindError ? err.message : 'Wind connect flow failed.'\n res.status(400).send(message)\n }\n\n return (req, res, next) => {\n const path = getPath(req)\n if (path !== startPath && path !== callbackPath) return next()\n if ((req.method ?? 'GET').toUpperCase() !== 'GET') return next()\n\n void (async () => {\n try {\n if (path === startPath) {\n const { url, tx } = flow.buildAuthorizeRedirect({\n requestedAllocationMc: opts.requestedAllocationMc,\n features: opts.features,\n })\n\n if (opts.session && opts.session !== 'cookie') {\n const id = stateToken()\n await opts.session.put(id, tx)\n setCookie(res, TX_ID_COOKIE_NAME, id)\n } else {\n setCookie(res, TX_COOKIE_NAME, signTransactionCookie(tx, flow.config.clientSecret))\n }\n\n res.redirect(url)\n return\n }\n\n // callbackPath\n if (!grantStore) {\n throw new WindConfigError('grantStore is required for wind.routes()/wind.handler() but was not configured.')\n }\n\n const userId = await opts.currentUser(req)\n if (!userId) {\n throw new WindConfigError('currentUser(req) returned no user — Wind is not your login; sign the user in first.')\n }\n\n const cookies = parseCookies(req.headers.cookie)\n let tx: ConnectTransaction | null = null\n if (opts.session && opts.session !== 'cookie') {\n const id = cookies[TX_ID_COOKIE_NAME]\n tx = id ? await opts.session.take(id) : null\n setCookie(res, TX_ID_COOKIE_NAME, '', { clear: true })\n } else {\n tx = verifyTransactionCookie(cookies[TX_COOKIE_NAME], flow.config.clientSecret)\n setCookie(res, TX_COOKIE_NAME, '', { clear: true })\n }\n\n const query = getQuery(req)\n const grant = await flow.completeCallback({ query, tx })\n\n await grantStore.set(userId, grant)\n\n if (onConnected) {\n try {\n await onConnected(userId, grant)\n } catch {\n // Notification errors are caught and ignored — not correctness-critical.\n }\n }\n\n res.redirect(successRedirect)\n } catch (err) {\n handleError(err, req, res)\n }\n })()\n }\n}\n","/**\n * Web-standard adapter. `wind.handler(opts)` returns `(Request) => Promise<Response>`\n * covering both `startPath` and `callbackPath`. Mount under a catch-all route:\n *\n * // Next.js — app/wind/[...wind]/route.ts\n * export const GET = wind.handler({ currentUser: … })\n *\n * Also works for Hono, Bun.serve, Deno, and Remix.\n */\n\nimport {\n DEFAULT_CALLBACK_PATH,\n DEFAULT_START_PATH,\n OAuthFlow,\n TX_COOKIE_NAME,\n TX_ID_COOKIE_NAME,\n TRANSACTION_TTL_MS,\n signTransactionCookie,\n verifyTransactionCookie,\n type ConnectTransaction,\n type RoutesOptions,\n} from '../oauth.js'\nimport { WindConfigError, WindError } from '../errors.js'\nimport { stateToken } from '../internal.js'\n\nexport type FetchHandler = (req: Request) => Promise<Response>\n\nfunction parseCookies(header: string | null): Record<string, string> {\n const out: Record<string, string> = {}\n if (!header) return out\n for (const part of header.split(';')) {\n const eq = part.indexOf('=')\n if (eq < 0) continue\n const key = part.slice(0, eq).trim()\n const value = part.slice(eq + 1).trim()\n if (key) out[key] = decodeURIComponent(value)\n }\n return out\n}\n\nfunction cookieAttrs(opts: { maxAgeSeconds?: number; clear?: boolean } = {}): string {\n const attrs = ['Path=/', 'HttpOnly', 'SameSite=Lax']\n if (process.env.NODE_ENV === 'production') attrs.push('Secure')\n attrs.push(opts.clear ? 'Max-Age=0' : `Max-Age=${opts.maxAgeSeconds ?? Math.floor(TRANSACTION_TTL_MS / 1000)}`)\n return attrs.join('; ')\n}\n\nexport function createFetchHandler(flow: OAuthFlow, opts: RoutesOptions): FetchHandler {\n const startPath = opts.startPath ?? DEFAULT_START_PATH\n const callbackPath = opts.callbackPath ?? DEFAULT_CALLBACK_PATH\n const grantStore = opts.grantStore ?? flow.config.grantStore\n const onConnected = opts.onConnected ?? flow.config.onConnected\n const successRedirect = opts.successRedirect ?? '/?wind=connected'\n\n function errorResponse(err: unknown): Response {\n const message = err instanceof WindError ? err.message : 'Wind connect flow failed.'\n console.error('[@usewind/node] connect flow error:', err)\n return new Response(message, { status: 400 })\n }\n\n return async (req: Request): Promise<Response> => {\n const url = new URL(req.url)\n if (req.method !== 'GET') return new Response('Not found', { status: 404 })\n if (url.pathname !== startPath && url.pathname !== callbackPath) return new Response('Not found', { status: 404 })\n\n try {\n if (url.pathname === startPath) {\n const { url: authorizeUrl, tx } = flow.buildAuthorizeRedirect({\n requestedAllocationMc: opts.requestedAllocationMc,\n features: opts.features,\n })\n\n const headers = new Headers({ Location: authorizeUrl })\n if (opts.session && opts.session !== 'cookie') {\n const id = stateToken()\n await opts.session.put(id, tx)\n headers.append('Set-Cookie', `${TX_ID_COOKIE_NAME}=${encodeURIComponent(id)}; ${cookieAttrs()}`)\n } else {\n const signed = signTransactionCookie(tx, flow.config.clientSecret)\n headers.append('Set-Cookie', `${TX_COOKIE_NAME}=${encodeURIComponent(signed)}; ${cookieAttrs()}`)\n }\n\n return new Response(null, { status: 302, headers })\n }\n\n // callbackPath\n if (!grantStore) {\n throw new WindConfigError('grantStore is required for wind.routes()/wind.handler() but was not configured.')\n }\n\n const userId = await opts.currentUser(req)\n if (!userId) {\n throw new WindConfigError('currentUser(req) returned no user — Wind is not your login; sign the user in first.')\n }\n\n const cookies = parseCookies(req.headers.get('cookie'))\n const clearHeaders = new Headers()\n\n let tx: ConnectTransaction | null = null\n if (opts.session && opts.session !== 'cookie') {\n const id = cookies[TX_ID_COOKIE_NAME]\n tx = id ? await opts.session.take(id) : null\n clearHeaders.append('Set-Cookie', `${TX_ID_COOKIE_NAME}=; ${cookieAttrs({ clear: true })}`)\n } else {\n tx = verifyTransactionCookie(cookies[TX_COOKIE_NAME], flow.config.clientSecret)\n clearHeaders.append('Set-Cookie', `${TX_COOKIE_NAME}=; ${cookieAttrs({ clear: true })}`)\n }\n\n const query = {\n code: url.searchParams.get('code') ?? undefined,\n state: url.searchParams.get('state') ?? undefined,\n error: url.searchParams.get('error') ?? undefined,\n }\n const grant = await flow.completeCallback({ query, tx })\n\n await grantStore.set(userId, grant)\n\n if (onConnected) {\n try {\n await onConnected(userId, grant)\n } catch {\n // Notification errors are caught and ignored — not correctness-critical.\n }\n }\n\n clearHeaders.set('Location', successRedirect)\n return new Response(null, { status: 302, headers: clearHeaders })\n } catch (err) {\n if (opts.onError) opts.onError(err, req, undefined)\n return errorResponse(err)\n }\n }\n}\n","/**\n * @usewind/node — server SDK for Connect with Wind.\n *\n * Two ways in:\n * import { wind } from '@usewind/node' // lazily reads WIND_CLIENT_* from env\n * import { createWind } from '@usewind/node' // explicit instance (tests, multi-tenant)\n *\n * See DESIGN.md for the full surface.\n */\n\nimport { resolveConfig, type ResolvedConfig, type WindConfig } from './config.js'\nimport { RawClient } from './http.js'\nimport { OAuthFlow, type RoutesOptions } from './oauth.js'\nimport { TokenManager } from './tokens.js'\nimport { ConnectionScope, type ScopeContext } from './client.js'\nimport { WebhookVerifier } from './webhooks.js'\nimport { createExpressRoutes, type ExpressMiddleware } from './adapters/express.js'\nimport { createFetchHandler, type FetchHandler } from './adapters/fetch.js'\nimport type {\n Account,\n AllocationRequest,\n Connection,\n Feature,\n RevokeResult,\n WebhookEvent,\n} from './types.js'\n\nexport class Wind {\n #partial: Partial<WindConfig>\n #resolved: ResolvedConfig | null = null\n #raw: RawClient | null = null\n #flow: OAuthFlow | null = null\n #tokens: TokenManager | null = null\n #webhooks: WebhookVerifier | null = null\n\n constructor(config: Partial<WindConfig> = {}) {\n this.#partial = config\n }\n\n /** Set or override configuration. Call once at boot. Resets memoised internals. */\n configure(config: Partial<WindConfig>): this {\n this.#partial = { ...this.#partial, ...config }\n this.#resolved = this.#raw = this.#flow = this.#tokens = this.#webhooks = null\n return this\n }\n\n // ── lazily-built internals ────────────────────────────────────────────────\n\n get #config(): ResolvedConfig {\n return (this.#resolved ??= resolveConfig(this.#partial))\n }\n /** The low-level HTTP client — one method per openapi path. Escape hatch. */\n get raw(): RawClient {\n return (this.#raw ??= new RawClient(this.#config))\n }\n get #oauth(): OAuthFlow {\n return (this.#flow ??= new OAuthFlow(this.#config, this.raw))\n }\n get #tokenManager(): TokenManager {\n return (this.#tokens ??= new TokenManager(this.#config, this.raw))\n }\n get #verifier(): WebhookVerifier {\n return (this.#webhooks ??= new WebhookVerifier(this.#config))\n }\n #scopeContext(): ScopeContext {\n return { config: this.#config, raw: this.raw, tokens: this.#tokenManager }\n }\n\n // ── connect flow ─────────────────────────────────────────────────────────\n\n /** Express middleware owning `startPath` + `callbackPath`. */\n routes(opts: RoutesOptions): ExpressMiddleware {\n return createExpressRoutes(this.#oauth, opts)\n }\n\n /** Web-standard `(Request) => Response` handler for the same two routes. */\n handler(opts: RoutesOptions): FetchHandler {\n return createFetchHandler(this.#oauth, opts)\n }\n\n // ── billed calls ─────────────────────────────────────────────────────────\n\n /**\n * Scope subsequent calls to one user of your app. Loads their grant via\n * `grantStore.get`. Singular, one user's connection — distinct from the\n * plural `wind.connections` below (client-credentials management across\n * every connection).\n */\n connection(userId: string): ConnectionScope {\n return new ConnectionScope(this.#scopeContext(), userId)\n }\n\n // ── management (client-credentials) ──────────────────────────────────────\n\n readonly connections = {\n list: (): Promise<Connection[]> => this.raw.listConnections(),\n get: (id: string): Promise<Connection> => this.raw.getConnection(id),\n revoke: (id: string): Promise<RevokeResult> => this.raw.revokeConnection(id),\n requestIncrease: (id: string, p: { targetAllocationMc: number; reason?: string }): Promise<AllocationRequest> =>\n this.raw.createAllocationRequest(id, { target_allocation_mc: p.targetAllocationMc, reason: p.reason }),\n }\n\n account(): Promise<Account> {\n return this.raw.getAccount()\n }\n\n readonly features = {\n list: (appId: string): Promise<Feature[]> => this.raw.listFeatures(appId),\n register: (appId: string, feature: Feature): Promise<Feature> => this.raw.registerFeature(appId, feature),\n update: (appId: string, slug: string, patch: Partial<Feature>): Promise<Feature> =>\n this.raw.updateFeature(appId, slug, patch),\n }\n\n // ── webhooks ─────────────────────────────────────────────────────────────\n\n /** Verify a webhook's `Wind-Signature` and return the typed event. Needs the raw body. */\n verify(input: { payload: string | Buffer; signature: string }): WebhookEvent {\n return this.#verifier.verify(input)\n }\n}\n\n/** An explicit, independent instance. Use for tests or multi-tenant servers. */\nexport function createWind(config: Partial<WindConfig> = {}): Wind {\n return new Wind(config)\n}\n\n/**\n * The default instance. Lazily reads `WIND_CLIENT_ID` / `WIND_CLIENT_SECRET` /\n * `WIND_REDIRECT_URI` on first use; `wind.configure({ … })` overrides.\n */\nexport const wind: Wind = new Wind()\n\n// ── re-exports ─────────────────────────────────────────────────────────────\n\nexport { memoryGrantStore } from './config.js'\nexport type { WindConfig, GrantStore } from './config.js'\nexport type { RoutesOptions, ConnectTransaction, TransactionStore } from './oauth.js'\nexport { ConnectionScope, FeatureScope } from './client.js'\nexport type { Chattable } from './client.js'\nexport * from './types.js'\nexport * from './errors.js'\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usewind/node",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Server SDK for Connect with Wind — OAuth connect routes, atomic refresh-token rotation, and billed inference calls.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://docs.usewind.app/connect-button-and-sdk",
@@ -29,6 +29,13 @@
29
29
  "node": ">=18"
30
30
  },
31
31
  "sideEffects": false,
32
+ "scripts": {
33
+ "build": "tsup",
34
+ "dev": "tsup --watch",
35
+ "typecheck": "tsc --noEmit",
36
+ "test": "vitest run",
37
+ "test:watch": "vitest"
38
+ },
32
39
  "keywords": [
33
40
  "wind",
34
41
  "usewind",
@@ -47,12 +54,5 @@
47
54
  "tsup": "^8.3.0",
48
55
  "typescript": "^5.3.3",
49
56
  "vitest": "^1.6.0"
50
- },
51
- "scripts": {
52
- "build": "tsup",
53
- "dev": "tsup --watch",
54
- "typecheck": "tsc --noEmit",
55
- "test": "vitest run",
56
- "test:watch": "vitest"
57
57
  }
58
- }
58
+ }