sermon-js 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +2 -1
  2. package/dist/api/index.d.cts +4 -4
  3. package/dist/api/index.d.ts +4 -4
  4. package/dist/{chunk-PARE6EUZ.cjs → chunk-NZTKXXW2.cjs} +7 -3
  5. package/dist/chunk-NZTKXXW2.cjs.map +1 -0
  6. package/dist/{chunk-2M4UBCDM.js → chunk-R7BDAQOM.js} +7 -3
  7. package/dist/chunk-R7BDAQOM.js.map +1 -0
  8. package/dist/{config-BEbP-uLf.d.cts → config-gro29syt.d.cts} +1 -1
  9. package/dist/{config-w1tm1bdu.d.ts → config-iY18j9IA.d.ts} +1 -1
  10. package/dist/{generic-lmrGxMDC.d.cts → generic-BUiaKpNp.d.cts} +2 -2
  11. package/dist/{generic-BJmlgtUM.d.ts → generic-CV2O4aNH.d.ts} +2 -2
  12. package/dist/index.cjs +6 -6
  13. package/dist/index.d.cts +8 -8
  14. package/dist/index.d.ts +8 -8
  15. package/dist/index.js +2 -2
  16. package/dist/presets/index.cjs +407 -47
  17. package/dist/presets/index.cjs.map +1 -1
  18. package/dist/presets/index.d.cts +173 -14
  19. package/dist/presets/index.d.ts +173 -14
  20. package/dist/presets/index.js +402 -48
  21. package/dist/presets/index.js.map +1 -1
  22. package/dist/react/heroui/index.cjs +27 -18
  23. package/dist/react/heroui/index.cjs.map +1 -1
  24. package/dist/react/heroui/index.d.cts +7 -2
  25. package/dist/react/heroui/index.d.ts +7 -2
  26. package/dist/react/heroui/index.js +13 -4
  27. package/dist/react/heroui/index.js.map +1 -1
  28. package/dist/react/index.d.cts +2 -2
  29. package/dist/react/index.d.ts +2 -2
  30. package/dist/{status-DsWzgb9Q.d.cts → status-BExBb08T.d.cts} +3 -3
  31. package/dist/{status-zd04ZQ98.d.ts → status-DmRhwvVC.d.ts} +3 -3
  32. package/dist/{store-_GuzSP0z.d.ts → store-BfKP7CjW.d.ts} +1 -1
  33. package/dist/{store-DybhDphS.d.cts → store-CAIB7Esp.d.cts} +1 -1
  34. package/dist/stores/mongodb.d.cts +2 -2
  35. package/dist/stores/mongodb.d.ts +2 -2
  36. package/dist/stores/redis.d.cts +2 -2
  37. package/dist/stores/redis.d.ts +2 -2
  38. package/dist/stores/sql.d.cts +2 -2
  39. package/dist/stores/sql.d.ts +2 -2
  40. package/dist/stores/upstash.d.cts +2 -2
  41. package/dist/stores/upstash.d.ts +2 -2
  42. package/dist/testing/index.cjs +3 -3
  43. package/dist/testing/index.d.cts +3 -3
  44. package/dist/testing/index.d.ts +3 -3
  45. package/dist/testing/index.js +1 -1
  46. package/dist/{tree-BXbXfjF1.d.cts → tree-J3riUyI9.d.cts} +9 -0
  47. package/dist/{tree-BXbXfjF1.d.ts → tree-J3riUyI9.d.ts} +9 -0
  48. package/dist/{types-CctvUAs2.d.cts → types-BVa6vIKk.d.cts} +9 -0
  49. package/dist/{types-CctvUAs2.d.ts → types-BVa6vIKk.d.ts} +9 -0
  50. package/package.json +1 -1
  51. package/dist/chunk-2M4UBCDM.js.map +0 -1
  52. package/dist/chunk-PARE6EUZ.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/presets/fly.ts","../../src/google-auth.ts","../../src/presets/gcp.ts","../../src/presets/aws.ts","../../src/presets/databases.ts","../../src/presets/providers/shared.ts","../../src/presets/providers/ai.ts","../../src/presets/providers/translation.ts","../../src/presets/providers/media.ts","../../src/presets/providers/services.ts","../../src/presets/providers/pusher.ts","../../src/presets/providers/vercel.ts"],"names":["status","error","instance","res"],"mappings":"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","file":"index.js","sourcesContent":["import { definePreset, type PresetOptions } from \"../config\";\nimport type { CheckOutcome, Instance, OutcomeStatus } from \"../types\";\n\nexport type FlyAppOptions = PresetOptions & {\n /** The Fly app name, e.g. \"my-api\" */\n app: string;\n secrets: {\n /** A Fly API token. A read-only one is enough: `fly tokens create readonly` */\n token: string | undefined;\n };\n track?: {\n /**\n * Health path probed on each machine that is already running (default \"/\").\n * Pass `false` to only read machine states. `anyStatus` accepts any HTTP answer,\n * e.g. for servers that answer 404 on their root.\n */\n health?: string | false | { path?: string; anyStatus?: boolean };\n /** Report every machine individually (default true) */\n machines?: boolean;\n };\n};\n\ntype FlyMachineEvent = {\n type?: string;\n timestamp?: number;\n request?: { exit_event?: { exit_code?: number; oom_killed?: boolean; requested_stop?: boolean } };\n};\n\ntype FlyMachine = {\n id: string;\n state: string;\n region?: string;\n checks?: Array<{ name: string; status: string }>;\n events?: FlyMachineEvent[];\n};\n\nconst MACHINES_API = \"https://api.machines.dev/v1\";\nconst GONE_STATES = new Set([\"destroyed\", \"destroying\"]);\n/** Asleep on purpose (scale to zero), or getting there, or waking up: never probed */\nconst RESTING_STATES = new Set([\"stopped\", \"suspended\", \"stopping\", \"suspending\", \"starting\", \"created\"]);\n\n/** Last exit of a stopped machine, if it was a crash rather than a scale-to-zero stop */\nexport function crashReason(machine: { events?: FlyMachineEvent[] }): string | undefined {\n const exit = [...(machine.events ?? [])]\n .filter((event) => event.type === \"exit\")\n .sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0))[0]?.request?.exit_event;\n if (!exit || exit.requested_stop) return undefined;\n if (exit.oom_killed) return \"Out of memory\";\n if (exit.exit_code !== undefined && exit.exit_code !== 0) return `Crashed (exit code ${exit.exit_code})`;\n return undefined;\n}\n\n/** Region code as key, suffixed (#2, #3…) when a region runs several machines */\nfunction withKeys(machines: FlyMachine[]) {\n const seen = new Map<string, number>();\n return [...machines]\n .sort((a, b) => (a.region ?? \"\").localeCompare(b.region ?? \"\") || a.id.localeCompare(b.id))\n .map((machine) => {\n const region = machine.region ?? \"unknown\";\n const count = (seen.get(region) ?? 0) + 1;\n seen.set(region, count);\n return { machine, region, key: count === 1 ? region : `${region}#${count}` };\n });\n}\n\nfunction median(values: number[]) {\n if (!values.length) return undefined;\n const sorted = [...values].sort((a, b) => a - b);\n return sorted[Math.floor((sorted.length - 1) / 2)];\n}\n\n/**\n * A Fly.io app, checked without ever waking it:\n * 1. Machine states come from the Machines API (control plane: it never starts anything).\n * 2. Each machine that is already `started` gets its health path probed, pinned to that\n * machine with `fly-force-instance-id`, so the Fly proxy never starts another one.\n * 3. A stopped machine whose last exit was a crash or an out-of-memory kill is down, not asleep.\n *\n * | Status | When |\n * |---|---|\n * | up | every running machine is healthy |\n * | sleeping | all machines are stopped or suspended, without a crash |\n * | degraded | some machines are down, a Fly health check fails, one is slow, or the Machines API can't be read |\n * | down | no machines, the app doesn't exist, or every machine is down |\n *\n * Reports `metrics.machines` (\"2/5 running\") and one `instances` row per machine.\n */\nconst app = definePreset<FlyAppOptions>()({\n kind: \"fly.app\",\n requiredFields: [\"app\"],\n requiredSecrets: [\"token\"],\n defaults: { slowMs: 1500 },\n derive: (options) => ({\n name: options.app,\n identity: `fly.app:${options.app}`,\n description: `Fly app \"${options.app}\": machine states, then health on running machines only`,\n }),\n check: async ({ options, secrets, http, slowMs }): Promise<CheckOutcome> => {\n const health = options.track?.health ?? \"/\";\n const healthPath = health === false ? undefined : typeof health === \"string\" ? health : (health.path ?? \"/\");\n const anyStatus = typeof health === \"object\" && !!health.anyStatus;\n\n const list = await http(`${MACHINES_API}/apps/${encodeURIComponent(options.app)}/machines`, {\n headers: { Authorization: `Bearer ${secrets.token}` },\n });\n if (list.status === 404) {\n return { status: \"down\", probed: false, httpStatus: 404, error: `App \"${options.app}\" not found on Fly` };\n }\n if (!list.ok || !Array.isArray(list.json)) {\n // Our view of Fly is broken, not necessarily the app\n return {\n status: \"degraded\",\n probed: false,\n httpStatus: list.status,\n error: list.status\n ? `Fly Machines API HTTP ${list.status}`\n : `Fly Machines API unreachable: ${list.outcome.error ?? \"no response\"}`,\n };\n }\n\n const machines = (list.json as FlyMachine[]).filter((machine) => !GONE_STATES.has(machine.state));\n if (machines.length === 0) {\n return { status: \"down\", probed: false, error: \"No machines: the app has no capacity at all\" };\n }\n\n const instances: Instance[] = await Promise.all(\n withKeys(machines).map(async ({ machine, region, key }): Promise<Instance> => {\n const base = { key, region, id: machine.id, state: machine.state };\n\n if (machine.state === \"failed\") return { ...base, status: \"down\", error: \"Machine failed\" };\n if (machine.state !== \"started\") {\n const crash = machine.state === \"stopped\" ? crashReason(machine) : undefined;\n if (crash) return { ...base, status: \"down\", error: crash };\n return { ...base, status: RESTING_STATES.has(machine.state) ? \"sleeping\" : \"degraded\" };\n }\n\n const failingChecks = (machine.checks ?? []).filter((c) => c.status !== \"passing\").map((c) => c.name);\n const checksError = failingChecks.length ? `Fly health checks failing: ${failingChecks.join(\", \")}` : undefined;\n if (!healthPath) {\n return { ...base, status: checksError ? \"degraded\" : \"up\", error: checksError };\n }\n\n const probe = await http(`https://${options.app}.fly.dev${healthPath}`, {\n headers: { \"fly-force-instance-id\": machine.id },\n okStatuses: anyStatus ? [400, 401, 403, 404, 405, 421] : undefined,\n });\n let status: OutcomeStatus = probe.outcome.status;\n let error = probe.outcome.error;\n if (status === \"up\" && checksError) {\n status = \"degraded\";\n error = checksError;\n } else if (status === \"up\" && probe.latencyMs > slowMs) {\n status = \"degraded\";\n error = `Slow response: ${probe.latencyMs} ms`;\n }\n return {\n ...base,\n status,\n latencyMs: probe.status === undefined ? undefined : probe.latencyMs,\n httpStatus: probe.status,\n error,\n };\n })\n );\n\n const down = instances.filter((instance) => instance.status === \"down\");\n const degraded = instances.filter((instance) => instance.status === \"degraded\");\n const awake = instances.filter((instance) => instance.status === \"up\" || instance.status === \"degraded\");\n const keysOf = (items: Instance[]) => items.map((instance) => instance.key).join(\", \");\n\n let status: OutcomeStatus;\n let error: string | undefined;\n if (down.length === instances.length) {\n status = \"down\";\n error = `All ${instances.length} machine(s) down`;\n } else if (down.length > 0) {\n status = \"degraded\";\n error = `${down.length}/${instances.length} machine(s) down: ${keysOf(down)}`;\n } else if (degraded.length > 0) {\n status = \"degraded\";\n error = `Degraded in ${keysOf(degraded)}`;\n } else {\n status = awake.length ? \"up\" : \"sleeping\";\n }\n\n const probed = instances.some((instance) => instance.httpStatus !== undefined || instance.latencyMs !== undefined);\n return {\n status,\n probed,\n // Median of the machines we probed; each machine keeps its own latency\n latencyMs: median(instances.map((i) => i.latencyMs).filter((l): l is number => l !== undefined)),\n error,\n metrics: { machines: `${awake.length}/${instances.length} running` },\n instances: options.track?.machines === false ? undefined : instances,\n };\n },\n});\n\n/** Presets for Fly.io */\nexport const fly = { app };\n","import type { ProbeHelpers } from \"./types\";\n\nexport type GoogleServiceAccount = { client_email: string; private_key: string; project_id?: string };\n\n/** Parse a service-account JSON key; undefined when it isn't one */\nexport function parseServiceAccount(json: string | undefined): GoogleServiceAccount | undefined {\n if (!json) return undefined;\n try {\n const parsed = JSON.parse(json) as Partial<GoogleServiceAccount>;\n return parsed.client_email && parsed.private_key ? (parsed as GoogleServiceAccount) : undefined;\n } catch {\n return undefined;\n }\n}\n\nconst base64url = (bytes: Uint8Array) => {\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n};\nconst encodeJson = (value: unknown) => base64url(new TextEncoder().encode(JSON.stringify(value)));\n\nfunction pemToPkcs8(pem: string) {\n const body = pem\n // Keys pasted into environment variables often carry escaped newlines\n .replace(/\\\\n/g, \"\\n\")\n .replace(/-----BEGIN [^-]+-----|-----END [^-]+-----|\\s+/g, \"\");\n const binary = atob(body);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/** A signed JWT assertion for Google's OAuth token endpoint (RS256, Web Crypto) */\nexport async function signGoogleAssertion({\n account,\n scope,\n now = Date.now(),\n}: {\n account: GoogleServiceAccount;\n scope: string;\n now?: number;\n}) {\n const issuedAt = Math.floor(now / 1000);\n const unsigned = `${encodeJson({ alg: \"RS256\", typ: \"JWT\" })}.${encodeJson({\n iss: account.client_email,\n scope,\n aud: \"https://oauth2.googleapis.com/token\",\n iat: issuedAt,\n exp: issuedAt + 3600,\n })}`;\n const key = await crypto.subtle.importKey(\n \"pkcs8\",\n pemToPkcs8(account.private_key),\n { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" },\n false,\n [\"sign\"]\n );\n const signature = await crypto.subtle.sign(\"RSASSA-PKCS1-v1_5\", key, new TextEncoder().encode(unsigned));\n return `${unsigned}.${base64url(new Uint8Array(signature))}`;\n}\n\n// Tokens live in memory only: they are credentials, so they are never written to the store.\n// Each process (or serverless instance) signs in once and reuses its token until it expires.\nconst tokens = new Map<string, { token: string; expiresAt: number }>();\n\n/** Forget cached tokens (for tests) */\nexport function clearGoogleTokens() {\n tokens.clear();\n}\n\n/**\n * An OAuth access token for a Google service account, without any Google library: it only\n * needs `fetch` and Web Crypto, so it works on edge runtimes. Tokens are kept in memory until\n * shortly before they expire.\n */\nexport async function googleServiceAccountToken({\n account,\n scope,\n http,\n now = Date.now(),\n}: {\n account: GoogleServiceAccount;\n scope: string;\n http: ProbeHelpers[\"http\"];\n now?: number;\n}): Promise<string> {\n // The tail of the key tells apart two keys of the same account (after a rotation)\n const cacheKey = `${account.client_email}:${scope}:${account.private_key.length}:${account.private_key.slice(-48)}`;\n const cached = tokens.get(cacheKey);\n if (cached && cached.expiresAt > now) return cached.token;\n\n const assertion = await signGoogleAssertion({ account, scope, now });\n const response = await http(\"https://oauth2.googleapis.com/token\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:jwt-bearer\",\n assertion,\n }).toString(),\n });\n const body = response.json as { access_token?: string; expires_in?: number; error_description?: string; error?: string };\n if (!response.ok || !body?.access_token) {\n throw new Error(\n `Google auth failed: ${body?.error_description ?? body?.error ?? response.outcome.error ?? \"no access token\"}`\n );\n }\n // Keep a margin so a token never expires mid-check\n const ttlMs = Math.max(60_000, ((body.expires_in ?? 3600) - 300) * 1000);\n tokens.set(cacheKey, { token: body.access_token, expiresAt: now + ttlMs });\n return body.access_token;\n}\n","import { definePreset, type PresetOptions } from \"../config\";\nimport { googleServiceAccountToken, parseServiceAccount } from \"../google-auth\";\nimport type { CheckOutcome } from \"../types\";\n\nexport { clearGoogleTokens, googleServiceAccountToken, parseServiceAccount, signGoogleAssertion } from \"../google-auth\";\nexport type { GoogleServiceAccount } from \"../google-auth\";\n\nexport type GcpInstanceOptions = PresetOptions & {\n /** The Compute Engine instance name */\n instance: string | undefined;\n /** Its zone, e.g. \"europe-west1-b\" */\n zone: string | undefined;\n /** The project ID (default: the one in the service-account key) */\n project?: string;\n secrets: {\n /** Service-account JSON key allowed to read instances (e.g. Compute Viewer) */\n serviceAccount: string | undefined;\n };\n track?: {\n /** URL probed only while the VM is RUNNING. Any HTTP answer counts as healthy. */\n health?: string | false;\n };\n};\n\nconst SLEEP_STATES = new Set([\"TERMINATED\", \"STOPPED\", \"SUSPENDED\", \"STOPPING\", \"SUSPENDING\"]);\nconst BOOTING_STATES = new Set([\"PROVISIONING\", \"STAGING\"]);\n\n/**\n * A Compute Engine VM, checked without ever starting it: the instance status comes from the\n * Compute API, and the optional health URL is only called while the VM is RUNNING.\n * - up: RUNNING (and the health URL answers)\n * - sleeping: TERMINATED, STOPPED or SUSPENDED\n * - degraded: PROVISIONING / STAGING, or slow\n * - down: the Compute API fails, the health URL fails, or the state is unexpected\n *\n * Reports `metrics.vm` and `metrics.zone`.\n */\nconst instance = definePreset<GcpInstanceOptions>()({\n kind: \"gcp.instance\",\n requiredFields: [\"instance\", \"zone\"],\n requiredSecrets: [\"serviceAccount\"],\n defaults: { slowMs: 1500 },\n derive: (options) => ({\n name: options.instance ?? \"\",\n identity: `gcp.instance:${options.project ?? \"\"}/${options.zone ?? \"\"}/${options.instance ?? \"\"}`,\n description: `Google Cloud VM \"${options.instance}\": status, then health only when running`,\n }),\n check: async ({ options, secrets, http, now }): Promise<CheckOutcome> => {\n const account = parseServiceAccount(secrets.serviceAccount);\n const project = options.project ?? account?.project_id;\n if (!account || !project) {\n return { status: \"down\", probed: false, error: \"The service account secret is not a service-account JSON key\" };\n }\n\n let token: string;\n try {\n token = await googleServiceAccountToken({\n account,\n scope: \"https://www.googleapis.com/auth/compute.readonly\",\n http,\n now,\n });\n } catch (error) {\n return { status: \"down\", probed: false, error: error instanceof Error ? error.message : String(error) };\n }\n\n const info = await http(\n `https://compute.googleapis.com/compute/v1/projects/${project}/zones/${options.zone}/instances/${options.instance}`,\n { headers: { Authorization: `Bearer ${token}` } }\n );\n const state = (info.json as { status?: string })?.status;\n if (!info.ok || !state) {\n return {\n status: \"down\",\n probed: false,\n httpStatus: info.status,\n error: `Compute API: ${info.outcome.error ?? \"no instance status\"}`,\n };\n }\n\n const metrics = { vm: state, zone: options.zone as string };\n if (SLEEP_STATES.has(state)) return { status: \"sleeping\", probed: false, metrics };\n if (BOOTING_STATES.has(state)) return { status: \"degraded\", probed: false, metrics, error: `VM is ${state}` };\n if (state !== \"RUNNING\") return { status: \"down\", probed: false, metrics, error: `VM is ${state}` };\n\n const health = options.track?.health;\n if (!health) return { status: \"up\", probed: false, metrics };\n // Any HTTP answer means the host is serving\n const probe = await http(health, { okStatuses: [400, 401, 403, 404, 405] });\n return { ...probe.outcome, metrics };\n },\n});\n\n/** Presets for Google Cloud */\nexport const gcp = { instance };\n","import { AwsClient } from \"aws4fetch\";\nimport { definePreset, type PresetOptions } from \"../config\";\nimport type { ProbeHelpers } from \"../types\";\n\ntype AwsSecrets = { accessKeyId: string | undefined; secretAccessKey: string | undefined };\n\n/** Sign with SigV4, then send through the check's timed `http` helper */\nasync function signedCall({\n http,\n secrets,\n service,\n region,\n url,\n init,\n}: {\n http: ProbeHelpers[\"http\"];\n secrets: { accessKeyId: string; secretAccessKey: string };\n service: string;\n region: string;\n url: string;\n init: { method: string; headers?: Record<string, string>; body?: string };\n}) {\n const client = new AwsClient({ ...secrets, service, region });\n const request = await client.sign(url, init);\n return http(request.url, {\n method: init.method,\n headers: Object.fromEntries(request.headers.entries()),\n body: init.body,\n });\n}\n\nexport type AwsCredentialsOptions = PresetOptions & {\n /** How to call it: these credentials usually belong to one AWS service you use */\n name: string;\n secrets: AwsSecrets;\n};\n\n/**\n * AWS credentials, validated with STS `GetCallerIdentity` (free, needs no permission).\n * It only proves the credentials work, not that a particular AWS service is healthy:\n * use it for services with no cheap probe of their own (e.g. Transcribe streaming).\n */\nconst credentials = definePreset<AwsCredentialsOptions>()({\n kind: \"aws.credentials\",\n requiredSecrets: [\"accessKeyId\", \"secretAccessKey\"],\n derive: (options) => ({\n name: options.name,\n description: \"Validates the credentials only (STS GetCallerIdentity)\",\n }),\n check: async ({ secrets, http }) => {\n const body = \"Action=GetCallerIdentity&Version=2011-06-15\";\n const response = await signedCall({\n http,\n secrets,\n service: \"sts\",\n region: \"us-east-1\",\n url: \"https://sts.amazonaws.com/\",\n init: { method: \"POST\", headers: { \"content-type\": \"application/x-www-form-urlencoded\" }, body },\n });\n return response.outcome;\n },\n});\n\nexport type S3BucketOptions = PresetOptions & {\n bucket: string | undefined;\n /** S3-compatible endpoint (Tigris, R2, MinIO…). Default: AWS S3 in `region`. */\n endpoint?: string;\n /** Region (default \"us-east-1\"; S3-compatible services often use \"auto\") */\n region?: string;\n secrets: AwsSecrets;\n};\n\n/**\n * An S3 bucket, on AWS or any S3-compatible storage (Tigris, Cloudflare R2, MinIO…).\n * Sends `HeadBucket`: up when the bucket is reachable with these credentials, down when it is\n * missing or access is denied.\n */\nconst s3Bucket = definePreset<S3BucketOptions>()({\n kind: \"aws.s3-bucket\",\n requiredFields: [\"bucket\"],\n requiredSecrets: [\"accessKeyId\", \"secretAccessKey\"],\n defaults: { slowMs: 1500 },\n derive: (options) => ({\n name: options.bucket ?? \"\",\n description: \"S3 HeadBucket on the storage endpoint\",\n }),\n check: async ({ options, secrets, http }) => {\n const region = options.region ?? \"us-east-1\";\n const endpoint = (options.endpoint ?? `https://s3.${region}.amazonaws.com`).replace(/\\/+$/, \"\");\n const response = await signedCall({\n http,\n secrets,\n service: \"s3\",\n region,\n url: `${endpoint}/${options.bucket}`,\n init: { method: \"HEAD\" },\n });\n return response.outcome;\n },\n});\n\n/** Presets for AWS and S3-compatible storage */\nexport const aws = { credentials, s3Bucket };\n","import { definePreset, type PresetOptions } from \"../config\";\n\n// These presets take a client you created, so the library never imports a database driver:\n// nothing extra to install, and the presets entry stays usable on edge runtimes.\n\ntype MongoDatabase = { command(command: Record<string, unknown>): Promise<unknown> };\ntype MongoLike = MongoDatabase | { db(name?: string): MongoDatabase };\n\nexport type MongoPingOptions = PresetOptions & {\n /**\n * Your `MongoClient` (or a `Db`). The driver connects on first use, so there is nothing to\n * await. When undefined the service is \"not configured\".\n */\n client: MongoLike | undefined;\n /** Optional: the connection string, only so it is redacted from public errors */\n secrets?: { url?: string };\n};\n\n/**\n * MongoDB, through your own client. Sends the `ping` command.\n * - up: the server replies\n * - down: it can't be reached, or rejects the credentials\n *\n * ```ts\n * mongodb.ping({ client: new MongoClient(url, { serverSelectionTimeoutMS: 8000 }) })\n * ```\n */\nconst mongoPing = definePreset<MongoPingOptions>()({\n kind: \"mongodb.ping\",\n requiredFields: [\"client\"],\n defaults: { slowMs: 500 },\n derive: () => ({ name: \"MongoDB\", description: \"`ping` command on the database\" }),\n check: ({ options, measure }) =>\n measure(async () => {\n const client = options.client as MongoLike;\n const database = \"command\" in client ? client : client.db();\n await database.command({ ping: 1 });\n }),\n});\n\n/** Presets for MongoDB */\nexport const mongodb = { ping: mongoPing };\n\ntype RedisLike =\n | { ping: () => Promise<unknown> }\n | { call: (command: string, ...args: string[]) => Promise<unknown> }\n | { sendCommand: (args: string[]) => Promise<unknown> };\n\nexport type RedisPingOptions = PresetOptions & {\n /** A connected ioredis or node-redis client. When undefined the service is \"not configured\". */\n client: RedisLike | undefined;\n};\n\n/**\n * Any Redis server, through your own client. Sends `PING`; up on PONG.\n * (For Upstash or Vercel KV over REST, use `upstashRedis`, which needs no client.)\n */\nconst redisPing = definePreset<RedisPingOptions>()({\n kind: \"redis.ping\",\n requiredFields: [\"client\"],\n defaults: { slowMs: 300 },\n derive: () => ({ name: \"Redis\", description: \"PING\" }),\n check: ({ options, measure }) =>\n measure(async () => {\n const client = options.client as RedisLike;\n const reply =\n \"ping\" in client\n ? await client.ping()\n : \"call\" in client\n ? await client.call(\"PING\")\n : await client.sendCommand([\"PING\"]);\n return String(reply).toUpperCase() === \"PONG\" ? true : { status: \"down\", error: `Unexpected reply: ${String(reply)}` };\n }),\n});\n\n/** Presets for Redis servers reached with a client library */\nexport const redis = { ping: redisPing };\n\nexport type PostgresPingOptions = PresetOptions & {\n /**\n * Runs one statement with the driver you already use (pg, postgres.js, Neon…). When\n * undefined the service is \"not configured\".\n */\n query: ((sql: string) => Promise<unknown>) | undefined;\n /** Optional: the connection string, only so it is redacted from public errors */\n secrets?: { url?: string };\n};\n\n/**\n * PostgreSQL, through your own driver. Runs `select 1`.\n * - up: the server answers\n * - down: it can't be reached, or rejects the credentials\n *\n * ```ts\n * postgres.ping({ query: (sql) => pool.query(sql) })\n * ```\n */\nconst postgresPing = definePreset<PostgresPingOptions>()({\n kind: \"postgres.ping\",\n requiredFields: [\"query\"],\n defaults: { slowMs: 1000 },\n derive: () => ({ name: \"PostgreSQL\", description: \"Runs `select 1`\" }),\n check: ({ options, measure }) =>\n measure(async () => {\n await (options.query as (sql: string) => Promise<unknown>)(\"select 1\");\n }),\n});\n\n/** Presets for PostgreSQL servers reached with a client library */\nexport const postgres = { ping: postgresPing };\n","import { normalizeReturn } from \"../../probe\";\nimport type { CheckOutcome, CheckReturn, HttpInit, HttpResult, ProbeHelpers } from \"../../types\";\n\nexport const bearer = (token: string) => ({ Authorization: `Bearer ${token}` });\n\nexport const round = (value: number, digits = 1) => Math.round(value * 10 ** digits) / 10 ** digits;\n\n/** Base64 of a UTF-8 string, without Node's Buffer */\nexport function base64(text: string) {\n const bytes = new TextEncoder().encode(text);\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\n/**\n * One API call: its outcome when it fails, otherwise the outcome refined by `refine`\n * (metrics, usage, a warning…). Most provider presets are exactly this.\n */\nexport async function call(\n http: ProbeHelpers[\"http\"],\n url: string,\n init?: HttpInit,\n refine?: (response: HttpResult) => CheckReturn\n): Promise<CheckOutcome> {\n const response = await http(url, init);\n if (!response.ok || !refine) return response.outcome;\n return { ...response.outcome, ...normalizeReturn(refine(response)) };\n}\n\n/** A used/limit pair with the threshold from which it becomes a warning */\nexport function quota({\n label,\n used,\n limit,\n unit,\n resetsAt,\n warnAbovePct,\n warning,\n}: {\n label: string;\n used: number;\n limit: number;\n unit?: string;\n resetsAt?: number;\n warnAbovePct: number;\n warning: string;\n}): CheckOutcome {\n const pct = limit > 0 ? (used / limit) * 100 : 0;\n const over = pct >= warnAbovePct;\n return {\n status: over ? \"degraded\" : \"up\",\n error: over ? warning : undefined,\n usage: [{ label, used, limit, unit, resetsAt }],\n };\n}\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome } from \"../../types\";\nimport { bearer, call, quota, round } from \"./shared\";\n\ntype ApiKey = { secrets: { apiKey: string | undefined } };\n\nexport type DeepgramOptions = PresetOptions &\n ApiKey & {\n track?: {\n /** Warn when the prepaid balance drops below this amount (default 20). `false` skips the balance. */\n balance?: { warnBelow?: number } | false;\n };\n };\n\n/**\n * Deepgram. Lists projects, then reads the balance of the first one.\n * - up: the key works\n * - degraded: balance below `track.balance.warnBelow`, or the key sees no project\n * - down: the API rejects the key or errors\n *\n * Reports `metrics.balance`. Keys without billing scope still count as up.\n */\nexport const deepgram = definePreset<DeepgramOptions>()({\n kind: \"deepgram\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Deepgram\", identity: \"deepgram\", description: \"Lists projects, then reads the account balance\" }),\n check: async ({ options, secrets, http }): Promise<CheckOutcome> => {\n const headers = { Authorization: `Token ${secrets.apiKey}` };\n const projects = await http(\"https://api.deepgram.com/v1/projects\", { headers });\n if (!projects.ok) return projects.outcome;\n const projectId = (projects.json as { projects?: Array<{ project_id: string }> })?.projects?.[0]?.project_id;\n if (!projectId) return { ...projects.outcome, status: \"degraded\", error: \"No project visible to this key\" };\n if (options.track?.balance === false) return projects.outcome;\n\n const warnBelow = options.track?.balance?.warnBelow ?? 20;\n const balances = await http(`https://api.deepgram.com/v1/projects/${projectId}/balances`, { headers });\n const balance = (balances.json as { balances?: Array<{ amount: number; units: string }> })?.balances?.[0];\n // The balance is informative: a key that can't read it is still a working key\n if (!balances.ok || !balance) return projects.outcome;\n const low = balance.amount < warnBelow;\n return {\n ...projects.outcome,\n latencyMs: Math.max(projects.latencyMs, balances.latencyMs),\n status: low ? \"degraded\" : \"up\",\n error: low ? \"Low balance\" : undefined,\n metrics: { balance: `${round(balance.amount, 2)} ${balance.units}` },\n };\n },\n});\n\n/** Gladia. Lists live sessions (limit 1). up when the key works; down when rejected. */\nexport const gladia = definePreset<PresetOptions & ApiKey>()({\n kind: \"gladia\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Gladia\", identity: \"gladia\", description: \"Lists live sessions (limit 1)\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://api.gladia.io/v2/live?limit=1\", { headers: { \"x-gladia-key\": secrets.apiKey } }),\n});\n\nexport type SpeechmaticsOptions = PresetOptions &\n ApiKey & {\n /** API base URL, e.g. the EU endpoint (default \"https://asr.api.speechmatics.com\") */\n baseUrl?: string;\n };\n\n/** Speechmatics. Lists batch jobs (limit 1), which validates the API key. */\nexport const speechmatics = definePreset<SpeechmaticsOptions>()({\n kind: \"speechmatics\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({\n name: \"Speechmatics\",\n identity: \"speechmatics\",\n description: \"Lists batch jobs (limit 1), validating the API key\",\n }),\n check: ({ options, secrets, http }) =>\n call(http, `${(options.baseUrl ?? \"https://asr.api.speechmatics.com\").replace(/\\/+$/, \"\")}/v2/jobs?limit=1`, {\n headers: bearer(secrets.apiKey),\n }),\n});\n\nexport type OpenAIOptions = PresetOptions &\n ApiKey & {\n /** Sent as the `OpenAI-Organization` header */\n organization?: string;\n track?: {\n /** Also check that the key can use this model (`GET /v1/models/{model}`) */\n model?: string;\n };\n };\n\n/**\n * OpenAI. Lists models, or reads one model when `track.model` is set (both free).\n * It proves the key works; it can't see billing problems, which only show on real requests.\n */\nexport const openai = definePreset<OpenAIOptions>()({\n kind: \"openai\",\n requiredSecrets: [\"apiKey\"],\n derive: (options) => ({\n name: \"OpenAI\",\n identity: \"openai\",\n description: options.track?.model ? `Checks access to ${options.track.model}` : \"Lists models\",\n }),\n check: ({ options, secrets, http }) =>\n call(\n http,\n options.track?.model\n ? `https://api.openai.com/v1/models/${encodeURIComponent(options.track.model)}`\n : \"https://api.openai.com/v1/models\",\n {\n headers: {\n ...bearer(secrets.apiKey),\n ...(options.organization ? { \"OpenAI-Organization\": options.organization } : {}),\n },\n }\n ),\n});\n\n/** Anthropic. Lists models (limit 1). up when the key works; down when rejected. */\nexport const anthropic = definePreset<PresetOptions & ApiKey>()({\n kind: \"anthropic\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Anthropic\", identity: \"anthropic\", description: \"Lists models\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://api.anthropic.com/v1/models?limit=1\", {\n headers: { \"x-api-key\": secrets.apiKey, \"anthropic-version\": \"2023-06-01\" },\n }),\n});\n\n/** Google Gemini. Lists models (page size 1). */\nexport const gemini = definePreset<PresetOptions & ApiKey>()({\n kind: \"gemini\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Google Gemini\", identity: \"gemini\", description: \"Lists models\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://generativelanguage.googleapis.com/v1beta/models?pageSize=1\", {\n headers: { \"x-goog-api-key\": secrets.apiKey },\n }),\n});\n\n/** CAMB.AI. Lists source languages. */\nexport const cambai = definePreset<PresetOptions & ApiKey>()({\n kind: \"cambai\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"CAMB.AI\", identity: \"cambai\", description: \"Lists source languages\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://client.camb.ai/apis/source-languages\", { headers: { \"x-api-key\": secrets.apiKey } }),\n});\n\nexport type ElevenLabsOptions = PresetOptions &\n ApiKey & {\n track?: {\n /** Warn when less than this share of the period's credits is left (default 10) */\n quota?: { warnBelowPct?: number };\n };\n };\n\n/**\n * ElevenLabs. Reads the subscription, which validates the API key.\n * - up: the key works. A key without the user scope is refused with `missing_permissions`,\n * which still proves it is valid.\n * - degraded: less than `track.quota.warnBelowPct` of the credits left\n * - down: the API rejects the key or errors\n *\n * Reports a `usage` bar (credits used this period, with the reset time) and `metrics.tier`.\n */\nexport const elevenlabs = definePreset<ElevenLabsOptions>()({\n kind: \"elevenlabs\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"ElevenLabs\", identity: \"elevenlabs\", description: \"Reads the subscription\" }),\n check: async ({ options, secrets, http }): Promise<CheckOutcome> => {\n const res = await http(\"https://api.elevenlabs.io/v1/user/subscription\", {\n headers: { \"xi-api-key\": secrets.apiKey },\n });\n const body =\n (res.json as {\n detail?: { status?: string };\n tier?: string;\n character_count?: number;\n character_limit?: number;\n next_character_count_reset_unix?: number;\n }) ?? {};\n if (res.status === 401 && body.detail?.status === \"missing_permissions\") {\n return { status: \"up\", latencyMs: res.latencyMs, httpStatus: 401, metrics: { key: \"restricted\" } };\n }\n if (!res.ok) return res.outcome;\n const metrics = body.tier ? { tier: body.tier } : undefined;\n const { character_count: used, character_limit: limit } = body;\n if (typeof used !== \"number\" || !limit) return { ...res.outcome, metrics };\n return {\n ...res.outcome,\n ...quota({\n label: \"Credits\",\n used,\n limit,\n unit: \"credits\",\n // ElevenLabs gives the reset as epoch seconds\n resetsAt: body.next_character_count_reset_unix ? body.next_character_count_reset_unix * 1000 : undefined,\n warnAbovePct: 100 - (options.track?.quota?.warnBelowPct ?? 10),\n warning: \"Credits almost exhausted\",\n }),\n metrics,\n };\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport { googleServiceAccountToken, parseServiceAccount } from \"../../google-auth\";\nimport type { CheckOutcome } from \"../../types\";\nimport { bearer, call, quota } from \"./shared\";\n\nexport type DeepLOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n track?: {\n /** Warn when this share of the character quota is used (default 90) */\n quota?: { warnAbovePct?: number };\n };\n};\n\n/**\n * DeepL. Reads `/v2/usage` (free and paid keys are detected from the key).\n * - up: quota available\n * - degraded: usage at or above `track.quota.warnAbovePct`\n * - down: the API rejects the key or errors\n *\n * Reports a `usage` bar: characters used of the limit.\n */\nexport const deepl = definePreset<DeepLOptions>()({\n kind: \"deepl\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"DeepL\", identity: \"deepl\", description: \"Reads character usage for the billing period\" }),\n check: ({ options, secrets, http }) => {\n const host = secrets.apiKey.endsWith(\":fx\") ? \"api-free.deepl.com\" : \"api.deepl.com\";\n return call(http, `https://${host}/v2/usage`, { headers: { Authorization: `DeepL-Auth-Key ${secrets.apiKey}` } }, (res) => {\n const { character_count: used, character_limit: limit } =\n (res.json as { character_count?: number; character_limit?: number }) ?? {};\n if (typeof used !== \"number\" || !limit) return undefined;\n return quota({\n label: \"Characters\",\n used,\n limit,\n unit: \"characters\",\n warnAbovePct: options.track?.quota?.warnAbovePct ?? 90,\n warning: \"Character quota almost exhausted\",\n });\n });\n },\n});\n\nexport type AzureTranslatorOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n /** Region of the Translator resource (default \"westeurope\") */\n region?: string;\n};\n\n/** Azure Translator. Translates a single character, which proves the key and region work. */\nexport const azureTranslator = definePreset<AzureTranslatorOptions>()({\n kind: \"azure.translator\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Azure Translator\", identity: \"azure.translator\", description: \"Translates a single character\" }),\n check: ({ options, secrets, http }) =>\n call(http, \"https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=fr\", {\n method: \"POST\",\n headers: {\n \"Ocp-Apim-Subscription-Key\": secrets.apiKey,\n \"Ocp-Apim-Subscription-Region\": options.region ?? \"westeurope\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify([{ Text: \"a\" }]),\n }),\n});\n\nexport type GoogleTranslateOptions = PresetOptions & {\n secrets: {\n /** The service-account JSON key (the whole file content), not an API key */\n serviceAccount: string | undefined;\n };\n /** Translation location (default \"global\") */\n location?: string;\n};\n\n/**\n * Google Cloud Translation v3, with a service account. Gets a token, then lists supported\n * languages (free: Google bills by characters translated).\n * - up: languages returned\n * - down: the key isn't valid JSON, or auth or the API fails\n *\n * Reports `metrics.languages`.\n */\nexport const googleTranslate = definePreset<GoogleTranslateOptions>()({\n kind: \"google.translate\",\n requiredSecrets: [\"serviceAccount\"],\n derive: () => ({\n name: \"Google Translate\",\n identity: \"google.translate\",\n description: \"Lists supported languages with Cloud Translation v3\",\n }),\n check: async ({ options, secrets, http, now }): Promise<CheckOutcome> => {\n const account = parseServiceAccount(secrets.serviceAccount);\n if (!account?.project_id) {\n return { status: \"down\", probed: false, error: \"The service account secret is not a service-account JSON key\" };\n }\n const token = await googleServiceAccountToken({\n account,\n scope: \"https://www.googleapis.com/auth/cloud-translation\",\n http,\n now,\n });\n return call(\n http,\n `https://translation.googleapis.com/v3/projects/${account.project_id}/locations/${options.location ?? \"global\"}/supportedLanguages`,\n { headers: bearer(token) },\n (res) => {\n const languages = (res.json as { languages?: unknown[] })?.languages;\n return languages ? { status: \"up\", metrics: { languages: languages.length } } : undefined;\n }\n );\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome } from \"../../types\";\nimport { base64, bearer, call, quota } from \"./shared\";\n\nexport type MuxOptions = PresetOptions & {\n secrets: { tokenId: string | undefined; tokenSecret: string | undefined };\n};\n\n/** Mux Video. Lists live streams (limit 1). up when the token works; down when rejected. */\nexport const mux = definePreset<MuxOptions>()({\n kind: \"mux\",\n requiredSecrets: [\"tokenId\", \"tokenSecret\"],\n derive: () => ({ name: \"Mux\", identity: \"mux\", description: \"Lists live streams (limit 1)\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://api.mux.com/video/v1/live-streams?limit=1\", {\n headers: { Authorization: `Basic ${base64(`${secrets.tokenId}:${secrets.tokenSecret}`)}` },\n }),\n});\n\nexport type CloudflareStreamOptions = PresetOptions & {\n /** The Cloudflare account ID */\n accountId: string | undefined;\n secrets: { token: string | undefined };\n track?: {\n /** Warn when this share of the storage plan is used (default 90). `false` skips storage. */\n storage?: { warnAbovePct?: number } | false;\n };\n};\n\n/**\n * Cloudflare Stream. Lists videos (limit 1) and reads storage usage, in parallel.\n * - up: both calls work\n * - degraded: storage at or above `track.storage.warnAbovePct`\n * - down: either call fails\n *\n * Reports a `usage` bar (storage minutes) and `metrics.videos`.\n */\nexport const cloudflareStream = definePreset<CloudflareStreamOptions>()({\n kind: \"cloudflare.stream\",\n requiredFields: [\"accountId\"],\n requiredSecrets: [\"token\"],\n derive: () => ({\n name: \"Cloudflare Stream\",\n identity: \"cloudflare.stream\",\n description: \"Lists videos (limit 1) and reads storage usage against the plan limit\",\n }),\n check: async ({ options, secrets, http, combine }): Promise<CheckOutcome> => {\n const base = `https://api.cloudflare.com/client/v4/accounts/${options.accountId}/stream`;\n const init = { headers: bearer(secrets.token) };\n const rejected = (json: unknown): CheckOutcome | undefined =>\n (json as { success?: boolean })?.success === false\n ? { status: \"down\", error: \"Cloudflare API reported success=false\" }\n : undefined;\n\n const videos = call(http, `${base}?limit=1`, init, (res) => rejected(res.json));\n if (options.track?.storage === false) return videos;\n\n const warnAbovePct = options.track?.storage?.warnAbovePct ?? 90;\n const storage = call(http, `${base}/storage-usage`, init, (res) => {\n const failed = rejected(res.json);\n if (failed) return failed;\n const usage = (\n res.json as {\n result?: { videoCount?: number; totalStorageMinutes?: number; totalStorageMinutesLimit?: number };\n }\n )?.result;\n if (!usage?.totalStorageMinutesLimit) return undefined;\n return {\n ...quota({\n label: \"Video storage\",\n used: Math.round(usage.totalStorageMinutes ?? 0),\n limit: usage.totalStorageMinutesLimit,\n unit: \"min\",\n warnAbovePct,\n warning: \"Stream storage almost full\",\n }),\n metrics: { videos: usage.videoCount ?? 0 },\n };\n });\n return combine(await Promise.all([videos, storage]));\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome } from \"../../types\";\nimport { bearer, call, quota } from \"./shared\";\n\nexport type MailerSendOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n track?: {\n /** Warn when less than this share of the API quota is left (default 10) */\n quota?: { warnBelowPct?: number };\n };\n};\n\n/**\n * MailerSend. Reads `/v1/api-quota`.\n * - up: quota available\n * - degraded: less than `track.quota.warnBelowPct` of the requests left\n * - down: the API rejects the key or errors\n *\n * Reports a `usage` bar: API requests used, with the reset time.\n */\nexport const mailersend = definePreset<MailerSendOptions>()({\n kind: \"mailersend\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"MailerSend\", identity: \"mailersend\", description: \"Reads the API quota\" }),\n check: ({ options, secrets, http }) =>\n call(http, \"https://api.mailersend.com/v1/api-quota\", { headers: bearer(secrets.apiKey) }, (res) => {\n const { quota: limit, remaining, reset } =\n (res.json as { quota?: number; remaining?: number; reset?: string }) ?? {};\n if (!limit || typeof remaining !== \"number\") return undefined;\n const resetsAt = reset ? Date.parse(reset) : NaN;\n return quota({\n label: \"API requests\",\n used: limit - remaining,\n limit,\n unit: \"requests\",\n resetsAt: Number.isNaN(resetsAt) ? undefined : resetsAt,\n warnAbovePct: 100 - (options.track?.quota?.warnBelowPct ?? 10),\n warning: \"API quota almost exhausted\",\n });\n }),\n});\n\nexport type GitHubOptions = PresetOptions & {\n secrets: { token: string | undefined };\n track?: {\n /** Also check that the token can read this repository's releases, e.g. \"owner/name\" */\n repo?: string;\n /** Warn when less than this share of the hourly rate limit is left (default 10) */\n rateLimit?: { warnBelowPct?: number };\n };\n};\n\n/**\n * GitHub. Reads `/rate_limit` (free: it doesn't count against the limit), and optionally\n * checks access to a repository's releases.\n * - up: the token works (and can read the repository)\n * - degraded: less than `track.rateLimit.warnBelowPct` of the hourly requests left\n * - down: bad credentials, or the repository can't be read\n *\n * Reports a `usage` bar: requests this hour, with the reset time.\n */\nexport const github = definePreset<GitHubOptions>()({\n kind: \"github\",\n requiredSecrets: [\"token\"],\n derive: (options) => ({\n name: \"GitHub\",\n identity: options.track?.repo ? `github:${options.track.repo}` : \"github\",\n description: options.track?.repo\n ? `Reads the API rate limit and the releases of ${options.track.repo}`\n : \"Reads the API rate limit\",\n }),\n check: async ({ options, secrets, http, combine }): Promise<CheckOutcome> => {\n const headers = { ...bearer(secrets.token), \"user-agent\": \"sermon-js\", accept: \"application/vnd.github+json\" };\n const limit = call(http, \"https://api.github.com/rate_limit\", { headers }, (res) => {\n const core = (res.json as { resources?: { core?: { limit: number; remaining: number; reset: number } } })\n ?.resources?.core;\n if (!core) return undefined;\n return quota({\n label: \"API requests this hour\",\n used: core.limit - core.remaining,\n limit: core.limit,\n unit: \"requests\",\n // GitHub gives the reset as epoch seconds\n resetsAt: core.reset * 1000,\n warnAbovePct: 100 - (options.track?.rateLimit?.warnBelowPct ?? 10),\n warning: \"Rate limit almost exhausted\",\n });\n });\n if (!options.track?.repo) return limit;\n const repo = call(http, `https://api.github.com/repos/${options.track.repo}/releases?per_page=1`, { headers });\n return combine(await Promise.all([limit, repo]));\n },\n});\n\nexport type RevolutOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n /** Which Merchant API to call (default \"production\") */\n environment?: \"production\" | \"sandbox\";\n};\n\n/** Revolut Merchant. Lists orders (limit 1). up when the secret key works; down when rejected. */\nexport const revolut = definePreset<RevolutOptions>()({\n kind: \"revolut\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Revolut Merchant\", identity: \"revolut\", description: \"Lists orders (limit 1)\" }),\n check: ({ options, secrets, http }) => {\n const host = options.environment === \"sandbox\" ? \"sandbox-merchant.revolut.com\" : \"merchant.revolut.com\";\n // Order listing only exists on the legacy 1.0 path\n return call(http, `https://${host}/api/1.0/orders?limit=1`, {\n headers: { ...bearer(secrets.apiKey), \"Revolut-Api-Version\": \"2023-09-01\" },\n });\n },\n});\n\nexport type AttendeeOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n /** API base URL (default \"https://app.attendee.dev\") */\n baseUrl?: string;\n};\n\n/** Attendee (meeting bots). Lists bots (page size 1). */\nexport const attendee = definePreset<AttendeeOptions>()({\n kind: \"attendee\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Attendee\", identity: \"attendee\", description: \"Lists bots\" }),\n check: ({ options, secrets, http }) =>\n call(http, `${(options.baseUrl || \"https://app.attendee.dev\").replace(/\\/+$/, \"\")}/api/v1/bots?page_size=1`, {\n headers: { Authorization: `Token ${secrets.apiKey}` },\n }),\n});\n\nexport type AxiomOptions = PresetOptions & {\n /** The dataset logs are sent to */\n dataset: string | undefined;\n /** Regional edge domain for ingestion, e.g. \"eu-central-1.aws.edge.axiom.co\" */\n edge?: string;\n secrets: { token: string | undefined };\n};\n\n/** Axiom. Ingests an empty batch into the dataset: it writes nothing and proves token and dataset. */\nexport const axiom = definePreset<AxiomOptions>()({\n kind: \"axiom\",\n requiredFields: [\"dataset\"],\n requiredSecrets: [\"token\"],\n derive: () => ({ name: \"Axiom\", identity: \"axiom\", description: \"Ingests an empty batch into the logs dataset\" }),\n check: ({ options, secrets, http }) =>\n call(\n http,\n options.edge\n ? `https://${options.edge}/v1/ingest/${options.dataset}`\n : `https://api.axiom.co/v1/datasets/${options.dataset}/ingest`,\n { method: \"POST\", headers: { ...bearer(secrets.token), \"content-type\": \"application/json\" }, body: \"[]\" }\n ),\n});\n\nexport type UpstashRedisOptions = PresetOptions & {\n /** REST URL of the database */\n url: string | undefined;\n secrets: { token: string | undefined };\n};\n\n/**\n * Upstash Redis / Vercel KV, over REST. Sends `PING` as a regular command (which compatible\n * servers such as serverless-redis-http also accept). up on PONG.\n */\nexport const upstashRedis = definePreset<UpstashRedisOptions>()({\n kind: \"upstash.redis\",\n requiredFields: [\"url\"],\n requiredSecrets: [\"token\"],\n defaults: { slowMs: 500 },\n derive: () => ({ name: \"Redis\", description: \"PING through the REST API\" }),\n check: ({ options, secrets, http }) =>\n call(\n http,\n (options.url as string).replace(/\\/+$/, \"\"),\n {\n method: \"POST\",\n headers: { ...bearer(secrets.token), \"content-type\": \"application/json\" },\n body: '[\"PING\"]',\n },\n (res) =>\n (res.json as { result?: string })?.result === \"PONG\"\n ? undefined\n : { status: \"down\", error: \"Unexpected reply to PING\" }\n ),\n});\n\nexport type StatuspageOptions = PresetOptions & {\n /** The status page, e.g. \"https://status.flyio.net\" */\n url: string;\n};\n\n/**\n * Any provider that publishes an Atlassian Statuspage (Fly.io, Vercel, Cloudflare, GitHub…).\n * Reads `/api/v2/status.json`.\n * - up: the provider reports no incident\n * - degraded: a minor incident\n * - down: a major or critical incident\n *\n * The provider's own description becomes the error text.\n */\nexport const statuspage = definePreset<StatuspageOptions>()({\n kind: \"statuspage\",\n requiredFields: [\"url\"],\n derive: (options) => {\n let host = options.url;\n try {\n host = new URL(options.url).host;\n } catch {\n // Keep the raw value: the check will report the bad URL\n }\n return {\n name: host,\n identity: `statuspage:${host}`,\n description: \"Status reported by the provider's public status page\",\n };\n },\n check: ({ options, http }) =>\n call(http, `${options.url.replace(/\\/+$/, \"\")}/api/v2/status.json`, undefined, (res) => {\n const { indicator, description } =\n (res.json as { status?: { indicator?: string; description?: string } })?.status ?? {};\n if (!indicator) return { status: \"degraded\", error: \"Not a Statuspage answer\" };\n const status = indicator === \"none\" ? \"up\" : indicator === \"minor\" ? \"degraded\" : \"down\";\n return { status, error: status === \"up\" ? undefined : description };\n }),\n});\n\nexport type ResendOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n};\n\n/**\n * Resend. Lists domains, which validates the API key.\n * - up: the key works. A sending-only key is refused with `restricted_api_key`, which still\n * proves it is valid.\n * - degraded: domains exist, but none is verified\n * - down: the API rejects the key or errors\n *\n * Reports `metrics.domains` and `metrics.verified` for full-access keys.\n */\nexport const resend = definePreset<ResendOptions>()({\n kind: \"resend\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Resend\", identity: \"resend\", description: \"Lists domains\" }),\n check: async ({ secrets, http }): Promise<CheckOutcome> => {\n const res = await http(\"https://api.resend.com/domains\", { headers: bearer(secrets.apiKey) });\n const body = (res.json as { name?: string; data?: Array<{ status?: string }> }) ?? {};\n if (res.status === 401 && body.name === \"restricted_api_key\") {\n return { status: \"up\", latencyMs: res.latencyMs, httpStatus: 401, metrics: { key: \"sending only\" } };\n }\n if (!res.ok || !Array.isArray(body.data)) return res.outcome;\n const verified = body.data.filter((domain) => domain.status === \"verified\").length;\n const unverified = body.data.length > 0 && verified === 0;\n return {\n ...res.outcome,\n status: unverified ? \"degraded\" : \"up\",\n error: unverified ? \"No verified domain\" : undefined,\n metrics: { domains: body.data.length, verified },\n };\n },\n});\n\nexport type MeilisearchOptions = PresetOptions & {\n /** The server, e.g. \"https://search.example.com\" */\n host: string | undefined;\n /** Also require this index, and report its document count */\n index?: string;\n secrets: { apiKey: string | undefined };\n};\n\n/**\n * Meilisearch. Reads `/health`, then the index (or the list of indexes), which validates the key.\n * - up: the server is available and the key works\n * - degraded: the index does not exist\n * - down: the server is unavailable, or rejects the key\n *\n * Reports `metrics.documents`, and `metrics.indexing` while a batch is running, when the key\n * may read statistics; scoped keys often may not, and that is not held against them.\n */\nexport const meilisearch = definePreset<MeilisearchOptions>()({\n kind: \"meilisearch\",\n requiredFields: [\"host\"],\n requiredSecrets: [\"apiKey\"],\n derive: (options) => ({\n name: \"Meilisearch\",\n identity: options.index ? `meilisearch:${options.index}` : \"meilisearch\",\n description: options.index\n ? `Reads the health and the ${options.index} index`\n : \"Reads the health and lists indexes\",\n }),\n check: async ({ options, secrets, http, combine }) => {\n const host = (options.host as string).replace(/\\/+$/, \"\");\n const headers = bearer(secrets.apiKey);\n const index = options.index ? `/indexes/${encodeURIComponent(options.index)}` : undefined;\n\n const health = call(http, `${host}/health`, undefined, (res) =>\n (res.json as { status?: string })?.status === \"available\" ? undefined : { status: \"down\", error: \"Not available\" }\n );\n const access = http(`${host}${index ?? \"/indexes?limit=1\"}`, { headers }).then((res): CheckOutcome => {\n if (res.status !== 404 || !options.index) return res.outcome;\n return {\n status: \"degraded\",\n latencyMs: res.latencyMs,\n httpStatus: 404,\n error: `Index ${options.index} not found`,\n };\n });\n const stats = http(`${host}${index ?? \"\"}/stats`, { headers });\n\n const outcome = combine(await Promise.all([health, access]));\n const res = await stats;\n // Statistics are informative: a key that can't read them is still a working key\n if (!res.ok) return outcome;\n const body =\n (res.json as {\n numberOfDocuments?: number;\n isIndexing?: boolean;\n indexes?: Record<string, { numberOfDocuments?: number }>;\n }) ?? {};\n const documents =\n body.numberOfDocuments ??\n Object.values(body.indexes ?? {}).reduce((sum, entry) => sum + (entry.numberOfDocuments ?? 0), 0);\n return { ...outcome, metrics: { ...outcome.metrics, documents, ...(body.isIndexing ? { indexing: \"yes\" } : {}) } };\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome, Metrics, Usage } from \"../../types\";\n\nexport type PusherOptions = PresetOptions & {\n appId: string | undefined;\n /** Pusher cluster, e.g. \"eu\" (default \"mt1\"). Ignored when `host` is set. */\n cluster?: string;\n /** Custom host, for Pusher-compatible servers such as Soketi */\n host?: string;\n port?: string | number;\n /** Use HTTPS (default: true unless a non-443 port is given) */\n tls?: boolean;\n secrets: { key: string | undefined; secret: string | undefined };\n track?: {\n connections?: {\n /** Your plan's maximum concurrent connections: turns the counts into usage bars */\n max?: number;\n /** Warn when today's peak reaches this share of `max` (default 90) */\n warnAbovePct?: number;\n };\n };\n};\n\n/** Max channels queried one by one for their subscription count, per check */\nconst MAX_CHANNELS = 500;\nconst CONCURRENCY = 10;\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nasync function hmacSha256Hex(secret: string, message: string) {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\"raw\", encoder.encode(secret), { name: \"HMAC\", hash: \"SHA-256\" }, false, [\n \"sign\",\n ]);\n const signature = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(message));\n return [...new Uint8Array(signature)].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/** Path and signed query of a GET to the Pusher HTTP API */\nexport async function signPusherRequest({\n appId,\n key,\n secret,\n path,\n params = {},\n timestamp = Math.floor(Date.now() / 1000),\n}: {\n appId: string;\n key: string;\n secret: string;\n path: string;\n params?: Record<string, string>;\n timestamp?: number;\n}) {\n const fullPath = `/apps/${appId}${path}`;\n const search = new URLSearchParams({\n ...params,\n auth_key: key,\n auth_timestamp: String(timestamp),\n auth_version: \"1.0\",\n });\n search.sort();\n const query = decodeURIComponent(search.toString());\n const signature = await hmacSha256Hex(secret, [\"GET\", fullPath, query].join(\"\\n\"));\n return `${fullPath}?${query}&auth_signature=${signature}`;\n}\n\nfunction baseUrl(options: PusherOptions) {\n const host = options.host || `api-${options.cluster || \"mt1\"}.pusher.com`;\n const port = options.port === undefined || options.port === \"\" ? undefined : String(options.port);\n const tls = options.tls ?? (!port || port === \"443\");\n const defaultPort = tls ? \"443\" : \"80\";\n return `${tls ? \"https\" : \"http\"}://${host}${port && port !== defaultPort ? `:${port}` : \"\"}`;\n}\n\nasync function mapLimit<T, R>(items: T[], limit: number, fn: (item: T) => Promise<R>) {\n const results: R[] = new Array(items.length);\n let next = 0;\n await Promise.all(\n Array.from({ length: Math.min(limit, items.length) }, async () => {\n while (next < items.length) {\n const index = next++;\n results[index] = await fn(items[index] as T);\n }\n })\n );\n return results;\n}\n\nconst utcDay = (now: number) => new Date(now).toISOString().slice(0, 10);\n\n/**\n * Pusher Channels (and compatible servers). Lists occupied channels, then reads each one's\n * `subscription_count` to estimate concurrent connections. Pusher has no usage API, so this is\n * an estimate: clients subscribed to several channels make it run slightly high.\n * Requires \"subscription counting\" enabled in the app settings.\n * - up: the API answers\n * - degraded: today's peak at or above `warnAbovePct` of `track.connections.max`, or subscription counting is off\n * - down: the API rejects the credentials or errors\n *\n * Reports `metrics.channels` and `metrics.signedInUsers`; with `max`, two `usage` bars\n * (connections now, peak today), otherwise the counts as metrics. The daily peak (UTC) is kept\n * in the store's cache.\n */\nexport const pusher = definePreset<PusherOptions>()({\n kind: \"pusher\",\n requiredFields: [\"appId\"],\n requiredSecrets: [\"key\", \"secret\"],\n defaults: { slowMs: 1000 },\n derive: (options) => ({\n name: \"Pusher\",\n identity: `pusher:${options.appId ?? \"\"}`,\n description: \"Lists occupied channels and estimates connections from their subscription counts\",\n }),\n check: async ({ options, secrets, http, cache, now }): Promise<CheckOutcome> => {\n const get = async (path: string, params?: Record<string, string>) =>\n http(\n `${baseUrl(options)}${await signPusherRequest({\n appId: options.appId as string,\n key: secrets.key,\n secret: secrets.secret,\n path,\n params,\n timestamp: Math.floor(now / 1000),\n })}`\n );\n\n const list = await get(\"/channels\");\n if (!list.ok) return list.outcome;\n const names = Object.keys((list.json as { channels?: Record<string, unknown> })?.channels ?? {});\n const queried = names.slice(0, MAX_CHANNELS);\n\n let failed = 0;\n let countingDisabled = false;\n const counts = await mapLimit(queried, CONCURRENCY, async (name) => {\n // Names can contain \"#\" (`#server-to-user-…`), which would otherwise start a URL fragment\n const res = await get(`/channels/${encodeURIComponent(name)}`, { info: \"subscription_count\" });\n const count = (res.json as { subscription_count?: number })?.subscription_count;\n if (!res.ok) failed += 1;\n else if (typeof count !== \"number\") countingDisabled = true;\n return typeof count === \"number\" ? count : 0;\n });\n const connections = counts.reduce((sum, count) => sum + count, 0);\n // One per signed-in connection (pusher.signin()); those usually also subscribe to other\n // channels, so the total errs on the high side: safer for quota alerts\n const signedInUsers = queried.reduce(\n (sum, name, index) => (name.startsWith(\"#server-to-user-\") ? sum + (counts[index] ?? 0) : sum),\n 0\n );\n\n const peakKey = `peak:${utcDay(now)}`;\n const peak = Math.max(connections, Number(await cache.get(peakKey)) || 0);\n await cache.set(peakKey, String(peak), 8 * DAY_MS);\n\n const metrics: Metrics = { channels: names.length, signedInUsers };\n if (names.length > MAX_CHANNELS) metrics.channelsCounted = MAX_CHANNELS;\n\n const max = options.track?.connections?.max;\n const warnAbovePct = options.track?.connections?.warnAbovePct ?? 90;\n const usage: Usage[] = [];\n if (max) {\n usage.push(\n { label: \"Connections now (estimate)\", used: connections, limit: max, unit: \"connections\" },\n {\n label: \"Peak connections today (UTC)\",\n used: peak,\n limit: max,\n unit: \"connections\",\n resetsAt: Date.parse(`${utcDay(now)}T00:00:00Z`) + DAY_MS,\n }\n );\n } else {\n metrics.connections = connections;\n metrics.peakToday = peak;\n }\n\n const warnings: string[] = [];\n if (max && (peak / max) * 100 >= warnAbovePct) warnings.push(\"Connections close to the plan limit\");\n if (countingDisabled) warnings.push(\"Subscription counting is disabled in the Pusher app settings\");\n const notes = failed > 0 ? [`${failed} channel(s) could not be counted`] : [];\n\n return {\n status: warnings.length ? \"degraded\" : \"up\",\n latencyMs: list.latencyMs,\n httpStatus: list.status,\n error: [...warnings, ...notes].join(\"; \") || undefined,\n metrics,\n usage: usage.length ? usage : undefined,\n };\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome } from \"../../types\";\nimport { bearer, call, round } from \"./shared\";\n\nexport type VercelAiGatewayOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n track?: {\n /** Warn when the credit balance drops below this amount in USD (default 5). `false` skips the balance. */\n credits?: { warnBelow?: number } | false;\n };\n};\n\n/**\n * Vercel AI Gateway. Reads the credit balance, which validates the key.\n * - up: the key works\n * - degraded: balance below `track.credits.warnBelow`\n * - down: the gateway rejects the key or errors\n *\n * Reports `metrics.balance` and `metrics.used`. With `track.credits: false` it lists models\n * instead, which only proves the gateway is reachable: that route needs no key.\n */\nconst aiGateway = definePreset<VercelAiGatewayOptions>()({\n kind: \"vercel.aiGateway\",\n requiredSecrets: [\"apiKey\"],\n derive: (options) => ({\n name: \"Vercel AI Gateway\",\n identity: \"vercel.aiGateway\",\n description: options.track?.credits === false ? \"Lists models\" : \"Reads the credit balance\",\n }),\n check: ({ options, secrets, http }) => {\n const headers = bearer(secrets.apiKey);\n if (options.track?.credits === false) return call(http, \"https://ai-gateway.vercel.sh/v1/models\", { headers });\n const warnBelow = options.track?.credits?.warnBelow ?? 5;\n return call(http, \"https://ai-gateway.vercel.sh/v1/credits\", { headers }, (res): CheckOutcome | undefined => {\n const body = (res.json as { balance?: string | number; total_used?: string | number }) ?? {};\n // The gateway gives amounts as strings\n const balance = Number(body.balance);\n if (body.balance === undefined || !Number.isFinite(balance)) return undefined;\n const used = Number(body.total_used);\n const low = balance < warnBelow;\n return {\n status: low ? \"degraded\" : \"up\",\n error: low ? \"Low credit balance\" : undefined,\n metrics: {\n balance: `${round(balance, 2)} USD`,\n ...(body.total_used !== undefined && Number.isFinite(used) ? { used: `${round(used, 2)} USD` } : {}),\n },\n };\n });\n },\n});\n\nexport type VercelBlobOptions = PresetOptions & {\n secrets: { token: string | undefined };\n};\n\n/** Vercel Blob. Lists one blob of the store, which validates the read-write token. */\nconst blob = definePreset<VercelBlobOptions>()({\n kind: \"vercel.blob\",\n requiredSecrets: [\"token\"],\n derive: () => ({ name: \"Vercel Blob\", identity: \"vercel.blob\", description: \"Lists one blob of the store\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://vercel.com/api/blob?limit=1\", {\n headers: { ...bearer(secrets.token), \"x-api-version\": \"12\" },\n }),\n});\n\n/** Presets for Vercel products */\nexport const vercel = { aiGateway, blob };\n"]}
1
+ {"version":3,"sources":["../../src/presets/fly.ts","../../src/google-auth.ts","../../src/presets/gcp.ts","../../src/presets/providers/shared.ts","../../src/presets/aws.ts","../../src/presets/neon.ts","../../src/presets/databases.ts","../../src/presets/providers/ai.ts","../../src/presets/providers/translation.ts","../../src/presets/providers/media.ts","../../src/presets/providers/services.ts","../../src/presets/providers/pusher.ts","../../src/presets/providers/vercel.ts","../../src/presets/providers/stripe.ts","../../src/presets/providers/search.ts"],"names":["count","status","error","instance","project","withKeys","API","res"],"mappings":"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","file":"index.js","sourcesContent":["import { definePreset, type PresetOptions } from \"../config\";\nimport type { CheckOutcome, Instance, OutcomeStatus } from \"../types\";\n\nexport type FlyAppOptions = PresetOptions & {\n /** The Fly app name, e.g. \"my-api\" */\n app: string;\n secrets: {\n /** A Fly API token. A read-only one is enough: `fly tokens create readonly` */\n token: string | undefined;\n };\n track?: {\n /**\n * Health path probed on each machine that is already running (default \"/\").\n * Pass `false` to only read machine states. `anyStatus` accepts any HTTP answer,\n * e.g. for servers that answer 404 on their root.\n */\n health?: string | false | { path?: string; anyStatus?: boolean };\n /** Report every machine individually (default true) */\n machines?: boolean;\n };\n};\n\ntype FlyMachineEvent = {\n type?: string;\n timestamp?: number;\n request?: { exit_event?: { exit_code?: number; oom_killed?: boolean; requested_stop?: boolean } };\n};\n\ntype FlyMachine = {\n id: string;\n state: string;\n region?: string;\n checks?: Array<{ name: string; status: string }>;\n events?: FlyMachineEvent[];\n};\n\nconst MACHINES_API = \"https://api.machines.dev/v1\";\nconst GONE_STATES = new Set([\"destroyed\", \"destroying\"]);\n/** Asleep on purpose (scale to zero), or getting there, or waking up: never probed */\nconst RESTING_STATES = new Set([\"stopped\", \"suspended\", \"stopping\", \"suspending\", \"starting\", \"created\"]);\n\n/** Last exit of a stopped machine, if it was a crash rather than a scale-to-zero stop */\nexport function crashReason(machine: { events?: FlyMachineEvent[] }): string | undefined {\n const exit = [...(machine.events ?? [])]\n .filter((event) => event.type === \"exit\")\n .sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0))[0]?.request?.exit_event;\n if (!exit || exit.requested_stop) return undefined;\n if (exit.oom_killed) return \"Out of memory\";\n if (exit.exit_code !== undefined && exit.exit_code !== 0) return `Crashed (exit code ${exit.exit_code})`;\n return undefined;\n}\n\n/** Region code as key, suffixed (#2, #3…) when a region runs several machines */\nfunction withKeys(machines: FlyMachine[]) {\n const seen = new Map<string, number>();\n return [...machines]\n .sort((a, b) => (a.region ?? \"\").localeCompare(b.region ?? \"\") || a.id.localeCompare(b.id))\n .map((machine) => {\n const region = machine.region ?? \"unknown\";\n const count = (seen.get(region) ?? 0) + 1;\n seen.set(region, count);\n return { machine, region, key: count === 1 ? region : `${region}#${count}` };\n });\n}\n\nfunction median(values: number[]) {\n if (!values.length) return undefined;\n const sorted = [...values].sort((a, b) => a - b);\n return sorted[Math.floor((sorted.length - 1) / 2)];\n}\n\n/**\n * A Fly.io app, checked without ever waking it:\n * 1. Machine states come from the Machines API (control plane: it never starts anything).\n * 2. Each machine that is already `started` gets its health path probed, pinned to that\n * machine with `fly-force-instance-id`, so the Fly proxy never starts another one.\n * 3. A stopped machine whose last exit was a crash or an out-of-memory kill is down, not asleep.\n *\n * | Status | When |\n * |---|---|\n * | up | every running machine is healthy |\n * | sleeping | all machines are stopped or suspended, without a crash |\n * | degraded | some machines are down, a Fly health check fails, one is slow, or the Machines API can't be read |\n * | down | no machines, the app doesn't exist, or every machine is down |\n *\n * Reports `metrics.machines` (\"2/5 running\") and one `instances` row per machine.\n */\nconst app = definePreset<FlyAppOptions>()({\n kind: \"fly.app\",\n requiredFields: [\"app\"],\n requiredSecrets: [\"token\"],\n defaults: { slowMs: 1500 },\n derive: (options) => ({\n name: options.app,\n identity: `fly.app:${options.app}`,\n description: `Fly app \"${options.app}\": machine states, then health on running machines only`,\n }),\n check: async ({ options, secrets, http, slowMs }): Promise<CheckOutcome> => {\n const health = options.track?.health ?? \"/\";\n const healthPath = health === false ? undefined : typeof health === \"string\" ? health : (health.path ?? \"/\");\n const anyStatus = typeof health === \"object\" && !!health.anyStatus;\n\n const list = await http(`${MACHINES_API}/apps/${encodeURIComponent(options.app)}/machines`, {\n headers: { Authorization: `Bearer ${secrets.token}` },\n });\n if (list.status === 404) {\n return { status: \"down\", probed: false, httpStatus: 404, error: `App \"${options.app}\" not found on Fly` };\n }\n if (!list.ok || !Array.isArray(list.json)) {\n // Our view of Fly is broken, not necessarily the app\n return {\n status: \"degraded\",\n probed: false,\n httpStatus: list.status,\n error: list.status\n ? `Fly Machines API HTTP ${list.status}`\n : `Fly Machines API unreachable: ${list.outcome.error ?? \"no response\"}`,\n };\n }\n\n const machines = (list.json as FlyMachine[]).filter((machine) => !GONE_STATES.has(machine.state));\n if (machines.length === 0) {\n return { status: \"down\", probed: false, error: \"No machines: the app has no capacity at all\" };\n }\n\n const instances: Instance[] = await Promise.all(\n withKeys(machines).map(async ({ machine, region, key }): Promise<Instance> => {\n const base = { key, region, id: machine.id, state: machine.state };\n\n if (machine.state === \"failed\") return { ...base, status: \"down\", error: \"Machine failed\" };\n if (machine.state !== \"started\") {\n const crash = machine.state === \"stopped\" ? crashReason(machine) : undefined;\n if (crash) return { ...base, status: \"down\", error: crash };\n return { ...base, status: RESTING_STATES.has(machine.state) ? \"sleeping\" : \"degraded\" };\n }\n\n const failingChecks = (machine.checks ?? []).filter((c) => c.status !== \"passing\").map((c) => c.name);\n const checksError = failingChecks.length ? `Fly health checks failing: ${failingChecks.join(\", \")}` : undefined;\n if (!healthPath) {\n return { ...base, status: checksError ? \"degraded\" : \"up\", error: checksError };\n }\n\n const probe = await http(`https://${options.app}.fly.dev${healthPath}`, {\n headers: { \"fly-force-instance-id\": machine.id },\n okStatuses: anyStatus ? [400, 401, 403, 404, 405, 421] : undefined,\n });\n let status: OutcomeStatus = probe.outcome.status;\n let error = probe.outcome.error;\n if (status === \"up\" && checksError) {\n status = \"degraded\";\n error = checksError;\n } else if (status === \"up\" && probe.latencyMs > slowMs) {\n status = \"degraded\";\n error = `Slow response: ${probe.latencyMs} ms`;\n }\n return {\n ...base,\n status,\n latencyMs: probe.status === undefined ? undefined : probe.latencyMs,\n httpStatus: probe.status,\n error,\n };\n })\n );\n\n const down = instances.filter((instance) => instance.status === \"down\");\n const degraded = instances.filter((instance) => instance.status === \"degraded\");\n const awake = instances.filter((instance) => instance.status === \"up\" || instance.status === \"degraded\");\n const keysOf = (items: Instance[]) => items.map((instance) => instance.key).join(\", \");\n\n let status: OutcomeStatus;\n let error: string | undefined;\n if (down.length === instances.length) {\n status = \"down\";\n error = `All ${instances.length} machine(s) down`;\n } else if (down.length > 0) {\n status = \"degraded\";\n error = `${down.length}/${instances.length} machine(s) down: ${keysOf(down)}`;\n } else if (degraded.length > 0) {\n status = \"degraded\";\n error = `Degraded in ${keysOf(degraded)}`;\n } else {\n status = awake.length ? \"up\" : \"sleeping\";\n }\n\n const probed = instances.some((instance) => instance.httpStatus !== undefined || instance.latencyMs !== undefined);\n return {\n status,\n probed,\n // Median of the machines we probed; each machine keeps its own latency\n latencyMs: median(instances.map((i) => i.latencyMs).filter((l): l is number => l !== undefined)),\n error,\n metrics: { machines: `${awake.length}/${instances.length} running` },\n instances: options.track?.machines === false ? undefined : instances,\n };\n },\n});\n\n/** Presets for Fly.io */\nexport const fly = { app };\n","import type { ProbeHelpers } from \"./types\";\n\nexport type GoogleServiceAccount = { client_email: string; private_key: string; project_id?: string };\n\n/** Parse a service-account JSON key; undefined when it isn't one */\nexport function parseServiceAccount(json: string | undefined): GoogleServiceAccount | undefined {\n if (!json) return undefined;\n try {\n const parsed = JSON.parse(json) as Partial<GoogleServiceAccount>;\n return parsed.client_email && parsed.private_key ? (parsed as GoogleServiceAccount) : undefined;\n } catch {\n return undefined;\n }\n}\n\nconst base64url = (bytes: Uint8Array) => {\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n};\nconst encodeJson = (value: unknown) => base64url(new TextEncoder().encode(JSON.stringify(value)));\n\nfunction pemToPkcs8(pem: string) {\n const body = pem\n // Keys pasted into environment variables often carry escaped newlines\n .replace(/\\\\n/g, \"\\n\")\n .replace(/-----BEGIN [^-]+-----|-----END [^-]+-----|\\s+/g, \"\");\n const binary = atob(body);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n\n/** A signed JWT assertion for Google's OAuth token endpoint (RS256, Web Crypto) */\nexport async function signGoogleAssertion({\n account,\n scope,\n now = Date.now(),\n}: {\n account: GoogleServiceAccount;\n scope: string;\n now?: number;\n}) {\n const issuedAt = Math.floor(now / 1000);\n const unsigned = `${encodeJson({ alg: \"RS256\", typ: \"JWT\" })}.${encodeJson({\n iss: account.client_email,\n scope,\n aud: \"https://oauth2.googleapis.com/token\",\n iat: issuedAt,\n exp: issuedAt + 3600,\n })}`;\n const key = await crypto.subtle.importKey(\n \"pkcs8\",\n pemToPkcs8(account.private_key),\n { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" },\n false,\n [\"sign\"]\n );\n const signature = await crypto.subtle.sign(\"RSASSA-PKCS1-v1_5\", key, new TextEncoder().encode(unsigned));\n return `${unsigned}.${base64url(new Uint8Array(signature))}`;\n}\n\n// Tokens live in memory only: they are credentials, so they are never written to the store.\n// Each process (or serverless instance) signs in once and reuses its token until it expires.\nconst tokens = new Map<string, { token: string; expiresAt: number }>();\n\n/** Forget cached tokens (for tests) */\nexport function clearGoogleTokens() {\n tokens.clear();\n}\n\n/**\n * An OAuth access token for a Google service account, without any Google library: it only\n * needs `fetch` and Web Crypto, so it works on edge runtimes. Tokens are kept in memory until\n * shortly before they expire.\n */\nexport async function googleServiceAccountToken({\n account,\n scope,\n http,\n now = Date.now(),\n}: {\n account: GoogleServiceAccount;\n scope: string;\n http: ProbeHelpers[\"http\"];\n now?: number;\n}): Promise<string> {\n // The tail of the key tells apart two keys of the same account (after a rotation)\n const cacheKey = `${account.client_email}:${scope}:${account.private_key.length}:${account.private_key.slice(-48)}`;\n const cached = tokens.get(cacheKey);\n if (cached && cached.expiresAt > now) return cached.token;\n\n const assertion = await signGoogleAssertion({ account, scope, now });\n const response = await http(\"https://oauth2.googleapis.com/token\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:jwt-bearer\",\n assertion,\n }).toString(),\n });\n const body = response.json as { access_token?: string; expires_in?: number; error_description?: string; error?: string };\n if (!response.ok || !body?.access_token) {\n throw new Error(\n `Google auth failed: ${body?.error_description ?? body?.error ?? response.outcome.error ?? \"no access token\"}`\n );\n }\n // Keep a margin so a token never expires mid-check\n const ttlMs = Math.max(60_000, ((body.expires_in ?? 3600) - 300) * 1000);\n tokens.set(cacheKey, { token: body.access_token, expiresAt: now + ttlMs });\n return body.access_token;\n}\n","import { definePreset, type PresetOptions } from \"../config\";\nimport { googleServiceAccountToken, parseServiceAccount } from \"../google-auth\";\nimport type { CheckOutcome } from \"../types\";\n\nexport { clearGoogleTokens, googleServiceAccountToken, parseServiceAccount, signGoogleAssertion } from \"../google-auth\";\nexport type { GoogleServiceAccount } from \"../google-auth\";\n\nexport type GcpInstanceOptions = PresetOptions & {\n /** The Compute Engine instance name */\n instance: string | undefined;\n /** Its zone, e.g. \"europe-west1-b\" */\n zone: string | undefined;\n /** The project ID (default: the one in the service-account key) */\n project?: string;\n secrets: {\n /** Service-account JSON key allowed to read instances (e.g. Compute Viewer) */\n serviceAccount: string | undefined;\n };\n track?: {\n /** URL probed only while the VM is RUNNING. Any HTTP answer counts as healthy. */\n health?: string | false;\n };\n};\n\nconst SLEEP_STATES = new Set([\"TERMINATED\", \"STOPPED\", \"SUSPENDED\", \"STOPPING\", \"SUSPENDING\"]);\nconst BOOTING_STATES = new Set([\"PROVISIONING\", \"STAGING\"]);\n\n/**\n * A Compute Engine VM, checked without ever starting it: the instance status comes from the\n * Compute API, and the optional health URL is only called while the VM is RUNNING.\n * - up: RUNNING (and the health URL answers)\n * - sleeping: TERMINATED, STOPPED or SUSPENDED\n * - degraded: PROVISIONING / STAGING, or slow\n * - down: the Compute API fails, the health URL fails, or the state is unexpected\n *\n * Reports `metrics.vm` and `metrics.zone`.\n */\nconst instance = definePreset<GcpInstanceOptions>()({\n kind: \"gcp.instance\",\n requiredFields: [\"instance\", \"zone\"],\n requiredSecrets: [\"serviceAccount\"],\n defaults: { slowMs: 1500 },\n derive: (options) => ({\n name: options.instance ?? \"\",\n identity: `gcp.instance:${options.project ?? \"\"}/${options.zone ?? \"\"}/${options.instance ?? \"\"}`,\n description: `Google Cloud VM \"${options.instance}\": status, then health only when running`,\n }),\n check: async ({ options, secrets, http, now }): Promise<CheckOutcome> => {\n const account = parseServiceAccount(secrets.serviceAccount);\n const project = options.project ?? account?.project_id;\n if (!account || !project) {\n return { status: \"down\", probed: false, error: \"The service account secret is not a service-account JSON key\" };\n }\n\n let token: string;\n try {\n token = await googleServiceAccountToken({\n account,\n scope: \"https://www.googleapis.com/auth/compute.readonly\",\n http,\n now,\n });\n } catch (error) {\n return { status: \"down\", probed: false, error: error instanceof Error ? error.message : String(error) };\n }\n\n const info = await http(\n `https://compute.googleapis.com/compute/v1/projects/${project}/zones/${options.zone}/instances/${options.instance}`,\n { headers: { Authorization: `Bearer ${token}` } }\n );\n const state = (info.json as { status?: string })?.status;\n if (!info.ok || !state) {\n return {\n status: \"down\",\n probed: false,\n httpStatus: info.status,\n error: `Compute API: ${info.outcome.error ?? \"no instance status\"}`,\n };\n }\n\n const metrics = { vm: state, zone: options.zone as string };\n if (SLEEP_STATES.has(state)) return { status: \"sleeping\", probed: false, metrics };\n if (BOOTING_STATES.has(state)) return { status: \"degraded\", probed: false, metrics, error: `VM is ${state}` };\n if (state !== \"RUNNING\") return { status: \"down\", probed: false, metrics, error: `VM is ${state}` };\n\n const health = options.track?.health;\n if (!health) return { status: \"up\", probed: false, metrics };\n // Any HTTP answer means the host is serving\n const probe = await http(health, { okStatuses: [400, 401, 403, 404, 405] });\n return { ...probe.outcome, metrics };\n },\n});\n\n/** Presets for Google Cloud */\nexport const gcp = { instance };\n","import { normalizeReturn } from \"../../probe\";\nimport type { CheckOutcome, CheckReturn, HttpInit, HttpResult, Instance, ProbeHelpers } from \"../../types\";\n\nexport const bearer = (token: string) => ({ Authorization: `Bearer ${token}` });\n\nexport const round = (value: number, digits = 1) => Math.round(value * 10 ** digits) / 10 ** digits;\n\n/** Base64 of a UTF-8 string, without Node's Buffer */\nexport function base64(text: string) {\n const bytes = new TextEncoder().encode(text);\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\n/**\n * One API call: its outcome when it fails, otherwise the outcome refined by `refine`\n * (metrics, usage, a warning…). Most provider presets are exactly this.\n */\nexport async function call(\n http: ProbeHelpers[\"http\"],\n url: string,\n init?: HttpInit,\n refine?: (response: HttpResult) => CheckReturn\n): Promise<CheckOutcome> {\n const response = await http(url, init);\n if (!response.ok || !refine) return response.outcome;\n return { ...response.outcome, ...normalizeReturn(refine(response)) };\n}\n\n/** A used/limit pair with the threshold from which it becomes a warning */\nexport function quota({\n label,\n used,\n limit,\n unit,\n resetsAt,\n warnAbovePct,\n warning,\n}: {\n label: string;\n used: number;\n limit: number;\n unit?: string;\n resetsAt?: number;\n warnAbovePct: number;\n warning: string;\n}): CheckOutcome {\n const pct = limit > 0 ? (used / limit) * 100 : 0;\n const over = pct >= warnAbovePct;\n return {\n status: over ? \"degraded\" : \"up\",\n error: over ? warning : undefined,\n usage: [{ label, used, limit, unit, resetsAt }],\n };\n}\n\n/**\n * The status of a service made of instances (models, endpoints…), with the same rule as\n * `fly.app`: all failing is down, some failing or degraded is degraded, all resting is sleeping.\n */\nexport function summarize(instances: Instance[], noun: string): Pick<CheckOutcome, \"status\" | \"error\" | \"latencyMs\"> {\n const down = instances.filter((instance) => instance.status === \"down\");\n const degraded = instances.filter((instance) => instance.status === \"degraded\");\n const awake = instances.filter((instance) => instance.status === \"up\" || instance.status === \"degraded\");\n const keysOf = (items: Instance[]) => items.map((instance) => instance.key).join(\", \");\n const latencies = instances.map((instance) => instance.latencyMs).filter((l): l is number => l !== undefined);\n const latencyMs = latencies.length ? Math.max(...latencies) : undefined;\n\n if (instances.length > 0 && down.length === instances.length) {\n return { status: \"down\", latencyMs, error: `All ${instances.length} ${noun}(s) failing` };\n }\n if (down.length > 0) {\n return { status: \"degraded\", latencyMs, error: `${down.length}/${instances.length} ${noun}(s) failing: ${keysOf(down)}` };\n }\n if (degraded.length > 0) return { status: \"degraded\", latencyMs, error: `Degraded: ${keysOf(degraded)}` };\n return { status: awake.length || instances.length === 0 ? \"up\" : \"sleeping\", latencyMs };\n}\n\n/**\n * For APIs with no free read call: an empty request is refused for validation, which only\n * happens after the key was accepted. Nothing is searched, so nothing is billed.\n */\nexport function keyAccepted(res: HttpResult): CheckOutcome {\n if (res.status === 400 || res.status === 422) return { status: \"up\", latencyMs: res.latencyMs, httpStatus: res.status };\n if (res.status === 402) {\n return { status: \"degraded\", latencyMs: res.latencyMs, httpStatus: 402, error: \"Out of credits, or payment required\" };\n }\n return res.outcome;\n}\n\nexport const emptyPost = (headers: Record<string, string>) => ({\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...headers },\n body: \"{}\",\n});\n","import { AwsClient } from \"aws4fetch\";\nimport { definePreset, type PresetOptions, type ServiceDefinition } from \"../config\";\nimport type { CheckOutcome, Instance, ProbeHelpers } from \"../types\";\nimport { bearer, summarize } from \"./providers/shared\";\n\ntype AwsSecrets = { accessKeyId: string | undefined; secretAccessKey: string | undefined };\n\n/** Sign with SigV4, then send through the check's timed `http` helper */\nasync function signedCall({\n http,\n secrets,\n service,\n region,\n url,\n init,\n}: {\n http: ProbeHelpers[\"http\"];\n secrets: { accessKeyId: string; secretAccessKey: string };\n service: string;\n region: string;\n url: string;\n init: { method: string; headers?: Record<string, string>; body?: string };\n}) {\n const client = new AwsClient({ ...secrets, service, region });\n const request = await client.sign(url, init);\n return http(request.url, {\n method: init.method,\n headers: Object.fromEntries(request.headers.entries()),\n body: init.body,\n });\n}\n\nexport type AwsCredentialsOptions = PresetOptions & {\n /** How to call it: these credentials usually belong to one AWS service you use */\n name: string;\n secrets: AwsSecrets;\n};\n\n/**\n * AWS credentials, validated with STS `GetCallerIdentity` (free, needs no permission).\n * It only proves the credentials work, not that a particular AWS service is healthy:\n * use it for services with no cheap probe of their own (e.g. Transcribe streaming).\n */\nconst credentials = definePreset<AwsCredentialsOptions>()({\n kind: \"aws.credentials\",\n requiredSecrets: [\"accessKeyId\", \"secretAccessKey\"],\n derive: (options) => ({\n name: options.name,\n description: \"Validates the credentials only (STS GetCallerIdentity)\",\n }),\n check: async ({ secrets, http }) => {\n const body = \"Action=GetCallerIdentity&Version=2011-06-15\";\n const response = await signedCall({\n http,\n secrets,\n service: \"sts\",\n region: \"us-east-1\",\n url: \"https://sts.amazonaws.com/\",\n init: { method: \"POST\", headers: { \"content-type\": \"application/x-www-form-urlencoded\" }, body },\n });\n return response.outcome;\n },\n});\n\nexport type S3BucketOptions = PresetOptions & {\n bucket: string | undefined;\n /** S3-compatible endpoint (Tigris, R2, MinIO…). Default: AWS S3 in `region`. */\n endpoint?: string;\n /** Region (default \"us-east-1\"; S3-compatible services often use \"auto\") */\n region?: string;\n secrets: AwsSecrets;\n};\n\n/**\n * An S3 bucket, on AWS or any S3-compatible storage (Tigris, Cloudflare R2, MinIO…).\n * Sends `HeadBucket`: up when the bucket is reachable with these credentials, down when it is\n * missing or access is denied.\n */\nconst s3Bucket = definePreset<S3BucketOptions>()({\n kind: \"aws.s3-bucket\",\n requiredFields: [\"bucket\"],\n requiredSecrets: [\"accessKeyId\", \"secretAccessKey\"],\n defaults: { slowMs: 1500 },\n derive: (options) => ({\n name: options.bucket ?? \"\",\n description: \"S3 HeadBucket on the storage endpoint\",\n }),\n check: async ({ options, secrets, http }) => {\n const region = options.region ?? \"us-east-1\";\n const endpoint = (options.endpoint ?? `https://s3.${region}.amazonaws.com`).replace(/\\/+$/, \"\");\n const response = await signedCall({\n http,\n secrets,\n service: \"s3\",\n region,\n url: `${endpoint}/${options.bucket}`,\n init: { method: \"HEAD\" },\n });\n return response.outcome;\n },\n});\n\nexport type BedrockOptions = PresetOptions & {\n /** AWS region of the Bedrock runtime, e.g. \"eu-west-1\" */\n region: string | undefined;\n /**\n * The models you invoke, as the runtime expects them: a model ID or an inference profile\n * ID (\"eu.anthropic.claude-haiku-4-5-20251001-v1:0\"). Each one is reported on its own row.\n */\n models: string[];\n /** A Bedrock API key (`bearerToken`), or an access key pair */\n secrets: {\n bearerToken?: string | undefined;\n accessKeyId?: string | undefined;\n secretAccessKey?: string | undefined;\n };\n};\n\n/** The smallest request each model family accepts */\nfunction pingBody(model: string) {\n if (/(^|\\.)cohere\\.embed/.test(model)) return { texts: [\"ping\"], input_type: \"search_query\" };\n return { anthropic_version: \"bedrock-2023-05-31\", max_tokens: 1, messages: [{ role: \"user\", content: \"ping\" }] };\n}\n\nconst bedrockPreset = definePreset<BedrockOptions>()({\n kind: \"aws.bedrock\",\n requiredFields: [\"region\"],\n requiredSecrets: \"all\",\n defaults: { slowMs: 5000, timeoutMs: 20_000 },\n derive: () => ({\n name: \"Amazon Bedrock\",\n identity: \"aws.bedrock\",\n description: \"Invokes each monitored model with one token\",\n }),\n check: async ({ options, secrets, http }): Promise<CheckOutcome> => {\n const signer =\n secrets.accessKeyId && secrets.secretAccessKey\n ? new AwsClient({\n accessKeyId: secrets.accessKeyId,\n secretAccessKey: secrets.secretAccessKey,\n service: \"bedrock\",\n region: options.region,\n })\n : undefined;\n\n const invoke = async (model: string) => {\n const url = `https://bedrock-runtime.${options.region}.amazonaws.com/model/${encodeURIComponent(model)}/invoke`;\n const init = {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"application/json\" },\n body: JSON.stringify(pingBody(model)),\n };\n if (!signer) return http(url, { ...init, headers: { ...init.headers, ...bearer(secrets.bearerToken ?? \"\") } });\n const signed = await signer.sign(url, init);\n return http(signed.url, { ...init, headers: Object.fromEntries(signed.headers.entries()) });\n };\n\n const instances = await Promise.all(\n [...new Set(options.models)].map(async (model): Promise<Instance> => {\n const res = await invoke(model);\n return {\n key: model,\n status: res.outcome.status,\n latencyMs: res.status === undefined ? undefined : res.latencyMs,\n httpStatus: res.status,\n error: res.outcome.error,\n };\n })\n );\n return { ...summarize(instances, \"model\"), instances, instanceLabels: { key: \"Model\" } };\n },\n});\n\n/**\n * Amazon Bedrock. Invokes each model in `models` with a one-token request (the runtime has\n * no free call that proves a model can be invoked).\n * - up: every model answers\n * - degraded: some models fail, or one is throttled (HTTP 429)\n * - down: every model fails (wrong credentials, no access, wrong region)\n *\n * Reports one `instances` row per model. Authenticates with a Bedrock API key when\n * `secrets.bearerToken` is given, otherwise signs with the access key pair (SigV4).\n */\nfunction bedrock(options: BedrockOptions): ServiceDefinition {\n const { bearerToken, accessKeyId, secretAccessKey } = options.secrets;\n // Only the credentials in use are required: the other kind may stay unset\n return bedrockPreset({ ...options, secrets: bearerToken ? { bearerToken } : { accessKeyId, secretAccessKey } });\n}\n\n/** Presets for AWS and S3-compatible storage */\nexport const aws = { credentials, s3Bucket, bedrock };\n","import { definePreset, type PresetOptions } from \"../config\";\nimport type { CheckOutcome, Instance, Usage } from \"../types\";\nimport { bearer, round } from \"./providers/shared\";\n\nexport type NeonProjectOptions = PresetOptions & {\n projectId: string | undefined;\n /** A Neon API key (account, organization or project-scoped) */\n secrets: { apiKey: string | undefined };\n /**\n * Runs one statement with the driver you already use, e.g. `(sql) => pool.query(sql)`.\n * `select 1` is only sent while the compute is active, so a check never wakes the database.\n */\n query?: (sql: string) => Promise<unknown>;\n /**\n * The compute `query` connects to: the `ep-…` part of the connection host.\n * Default: the read-write compute of the default branch.\n */\n endpoint?: string;\n track?: {\n /** Your plan's compute allowance for the billing period, in CU-hours: adds a usage bar */\n compute?: { maxHours: number; warnAbovePct?: number };\n /** Your plan's storage allowance in GB: adds a usage bar (sum of the branches' logical sizes) */\n storage?: { maxGb: number; warnAbovePct?: number };\n };\n};\n\ntype NeonEndpoint = {\n id: string;\n branch_id: string;\n region_id?: string;\n type: \"read_write\" | \"read_only\";\n current_state: \"init\" | \"active\" | \"idle\";\n disabled?: boolean;\n};\ntype NeonBranch = { id: string; name: string; default?: boolean; logical_size?: number };\ntype NeonProject = {\n pg_version?: number;\n region_id?: string;\n compute_time_seconds?: number;\n consumption_period_end?: string;\n};\n\nconst API = \"https://console.neon.tech/api/v2\";\nconst GB = 1024 ** 3;\n\n/** One key per compute, stable across restarts: the branch name, suffixed for replicas */\nfunction withKeys(endpoints: NeonEndpoint[], branches: Map<string, NeonBranch>) {\n const seen = new Map<string, number>();\n return endpoints.map((endpoint) => {\n const name = branches.get(endpoint.branch_id)?.name ?? endpoint.branch_id;\n const count = (seen.get(name) ?? 0) + 1;\n seen.set(name, count);\n return { endpoint, key: count === 1 ? name : `${name}#${count}` };\n });\n}\n\n/**\n * A Neon project, checked **without ever waking a compute**: states come from the Neon API\n * (control plane), and `query` only runs while its compute is already active.\n * - up: the compute is active (and answers `select 1` when `query` is given)\n * - sleeping: the compute is suspended (scale to zero)\n * - degraded: a compute is starting, a usage bar is near its limit, or the Neon API can't be read\n * - down: the project doesn't exist, it has no compute, or an active compute doesn't answer\n *\n * Reports one `instances` row per compute (branch, region, state), `metrics.postgres`,\n * `metrics.region`, `metrics.branches`, `metrics.computes`, and `usage` bars for the\n * allowances given in `track`.\n */\nconst project = definePreset<NeonProjectOptions>()({\n kind: \"neon.project\",\n requiredFields: [\"projectId\"],\n requiredSecrets: [\"apiKey\"],\n defaults: { slowMs: 1000 },\n derive: (options) => ({\n name: \"Neon\",\n identity: `neon.project:${options.projectId ?? \"\"}`,\n description: \"Compute states from the Neon API, then `select 1` on an active compute only\",\n }),\n check: async ({ options, secrets, http, measure }): Promise<CheckOutcome> => {\n const base = `${API}/projects/${encodeURIComponent(options.projectId as string)}`;\n const headers = { ...bearer(secrets.apiKey), accept: \"application/json\" };\n const [list, info, branchList] = await Promise.all([\n http(`${base}/endpoints`, { headers }),\n http(base, { headers }),\n http(`${base}/branches`, { headers }),\n ]);\n\n if (list.status === 404) {\n return { status: \"down\", probed: false, httpStatus: 404, error: `Project \"${options.projectId}\" not found on Neon` };\n }\n const endpoints = (list.json as { endpoints?: NeonEndpoint[] })?.endpoints;\n if (!list.ok || !Array.isArray(endpoints)) {\n // Our view of Neon is broken, not necessarily the database\n return {\n status: \"degraded\",\n probed: false,\n httpStatus: list.status,\n error: list.status ? `Neon API HTTP ${list.status}` : `Neon API unreachable: ${list.outcome.error ?? \"no response\"}`,\n };\n }\n if (endpoints.length === 0) return { status: \"down\", probed: false, error: \"No compute: nothing can connect\" };\n\n // Informative only: a key that can't read them still gives the compute states\n const branches = ((branchList.json as { branches?: NeonBranch[] })?.branches ?? []) as NeonBranch[];\n const details = (info.json as { project?: NeonProject })?.project;\n const byId = new Map(branches.map((branch) => [branch.id, branch]));\n const defaultBranch = branches.find((branch) => branch.default)?.id;\n\n const keyed = withKeys(endpoints, byId);\n const target =\n keyed.find(({ endpoint }) => endpoint.id === options.endpoint) ??\n (options.endpoint\n ? undefined\n : (keyed.find(({ endpoint }) => endpoint.type === \"read_write\" && endpoint.branch_id === defaultBranch) ??\n keyed.find(({ endpoint }) => endpoint.type === \"read_write\")));\n\n const ping =\n options.query && target?.endpoint.current_state === \"active\" && !target.endpoint.disabled\n ? await measure(async () => void (await (options.query as (sql: string) => Promise<unknown>)(\"select 1\")))\n : undefined;\n\n const instances = keyed.map(({ endpoint, key }): Instance => {\n const row = { key, region: endpoint.region_id, id: endpoint.id };\n if (endpoint.disabled) return { ...row, state: \"disabled\", status: \"sleeping\" };\n if (endpoint.current_state === \"idle\") return { ...row, state: \"idle\", status: \"sleeping\" };\n if (endpoint.current_state !== \"active\") return { ...row, state: endpoint.current_state, status: \"degraded\" };\n if (ping && endpoint.id === target?.endpoint.id) {\n return { ...row, state: \"active\", status: ping.status, latencyMs: ping.latencyMs, error: ping.error };\n }\n return { ...row, state: \"active\", status: \"up\" };\n });\n\n const usage: Usage[] = [];\n const warnings: string[] = [];\n const bar = (entry: Usage, warnAbovePct = 90) => {\n usage.push(entry);\n if (entry.limit > 0 && (entry.used / entry.limit) * 100 >= warnAbovePct) warnings.push(`${entry.label} close to the plan limit`);\n };\n const compute = options.track?.compute;\n if (compute && typeof details?.compute_time_seconds === \"number\") {\n bar(\n {\n label: \"Compute this period\",\n used: round(details.compute_time_seconds / 3600),\n limit: compute.maxHours,\n unit: \"CU-hours\",\n resetsAt: details.consumption_period_end ? Date.parse(details.consumption_period_end) || undefined : undefined,\n },\n compute.warnAbovePct\n );\n }\n const storage = options.track?.storage;\n if (storage && branches.length > 0) {\n const bytes = branches.reduce((sum, branch) => sum + (branch.logical_size ?? 0), 0);\n bar({ label: \"Storage\", used: round(bytes / GB, 2), limit: storage.maxGb, unit: \"GB\" }, storage.warnAbovePct);\n }\n\n // The compute applications connect to decides; the others only show on their rows\n const main = instances.find((instance) => instance.id === target?.endpoint.id) ?? instances[0]!;\n const active = instances.filter((instance) => instance.state === \"active\").length;\n let status = main.status;\n let error = main.error;\n if (status === \"degraded\" && !error) error = `Compute is ${main.state}`;\n if ((status === \"up\" || status === \"sleeping\") && warnings.length) {\n status = \"degraded\";\n error = warnings.join(\"; \");\n }\n\n return {\n status,\n probed: !!ping,\n latencyMs: ping?.latencyMs ?? list.latencyMs,\n error,\n metrics: {\n ...(details?.pg_version ? { postgres: details.pg_version } : {}),\n ...(details?.region_id ? { region: details.region_id } : {}),\n ...(branches.length ? { branches: branches.length } : {}),\n computes: `${active}/${instances.length} active`,\n },\n usage: usage.length ? usage : undefined,\n instances,\n instanceLabels: { key: \"Compute\", detail: \"Endpoint\" },\n };\n },\n});\n\n/** Presets for Neon */\nexport const neon = { project };\n","import { definePreset, type PresetOptions } from \"../config\";\n\n// These presets take a client you created, so the library never imports a database driver:\n// nothing extra to install, and the presets entry stays usable on edge runtimes.\n\ntype MongoDatabase = { command(command: Record<string, unknown>): Promise<unknown> };\ntype MongoLike = MongoDatabase | { db(name?: string): MongoDatabase };\n\nexport type MongoPingOptions = PresetOptions & {\n /**\n * Your `MongoClient` (or a `Db`). The driver connects on first use, so there is nothing to\n * await. When undefined the service is \"not configured\".\n */\n client: MongoLike | undefined;\n /** Optional: the connection string, only so it is redacted from public errors */\n secrets?: { url?: string };\n};\n\n/**\n * MongoDB, through your own client. Sends the `ping` command.\n * - up: the server replies\n * - down: it can't be reached, or rejects the credentials\n *\n * ```ts\n * mongodb.ping({ client: new MongoClient(url, { serverSelectionTimeoutMS: 8000 }) })\n * ```\n */\nconst mongoPing = definePreset<MongoPingOptions>()({\n kind: \"mongodb.ping\",\n requiredFields: [\"client\"],\n defaults: { slowMs: 500 },\n derive: () => ({ name: \"MongoDB\", description: \"`ping` command on the database\" }),\n check: ({ options, measure }) =>\n measure(async () => {\n const client = options.client as MongoLike;\n const database = \"command\" in client ? client : client.db();\n await database.command({ ping: 1 });\n }),\n});\n\n/** Presets for MongoDB */\nexport const mongodb = { ping: mongoPing };\n\ntype RedisLike =\n | { ping: () => Promise<unknown> }\n | { call: (command: string, ...args: string[]) => Promise<unknown> }\n | { sendCommand: (args: string[]) => Promise<unknown> };\n\nexport type RedisPingOptions = PresetOptions & {\n /** A connected ioredis or node-redis client. When undefined the service is \"not configured\". */\n client: RedisLike | undefined;\n};\n\n/**\n * Any Redis server, through your own client. Sends `PING`; up on PONG.\n * (For Upstash or Vercel KV over REST, use `upstashRedis`, which needs no client.)\n */\nconst redisPing = definePreset<RedisPingOptions>()({\n kind: \"redis.ping\",\n requiredFields: [\"client\"],\n defaults: { slowMs: 300 },\n derive: () => ({ name: \"Redis\", description: \"PING\" }),\n check: ({ options, measure }) =>\n measure(async () => {\n const client = options.client as RedisLike;\n const reply =\n \"ping\" in client\n ? await client.ping()\n : \"call\" in client\n ? await client.call(\"PING\")\n : await client.sendCommand([\"PING\"]);\n return String(reply).toUpperCase() === \"PONG\" ? true : { status: \"down\", error: `Unexpected reply: ${String(reply)}` };\n }),\n});\n\n/** Presets for Redis servers reached with a client library */\nexport const redis = { ping: redisPing };\n\nexport type PostgresPingOptions = PresetOptions & {\n /**\n * Runs one statement with the driver you already use (pg, postgres.js, Neon…). When\n * undefined the service is \"not configured\".\n */\n query: ((sql: string) => Promise<unknown>) | undefined;\n /** Optional: the connection string, only so it is redacted from public errors */\n secrets?: { url?: string };\n};\n\n/**\n * PostgreSQL, through your own driver. Runs `select 1`.\n * - up: the server answers\n * - down: it can't be reached, or rejects the credentials\n *\n * ```ts\n * postgres.ping({ query: (sql) => pool.query(sql) })\n * ```\n */\nconst postgresPing = definePreset<PostgresPingOptions>()({\n kind: \"postgres.ping\",\n requiredFields: [\"query\"],\n defaults: { slowMs: 1000 },\n derive: () => ({ name: \"PostgreSQL\", description: \"Runs `select 1`\" }),\n check: ({ options, measure }) =>\n measure(async () => {\n await (options.query as (sql: string) => Promise<unknown>)(\"select 1\");\n }),\n});\n\n/** Presets for PostgreSQL servers reached with a client library */\nexport const postgres = { ping: postgresPing };\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome, Instance } from \"../../types\";\nimport { bearer, call, quota, round, summarize } from \"./shared\";\n\ntype ApiKey = { secrets: { apiKey: string | undefined } };\n\nexport type DeepgramOptions = PresetOptions &\n ApiKey & {\n track?: {\n /** Warn when the prepaid balance drops below this amount (default 20). `false` skips the balance. */\n balance?: { warnBelow?: number } | false;\n };\n };\n\n/**\n * Deepgram. Lists projects, then reads the balance of the first one.\n * - up: the key works\n * - degraded: balance below `track.balance.warnBelow`, or the key sees no project\n * - down: the API rejects the key or errors\n *\n * Reports `metrics.balance`. Keys without billing scope still count as up.\n */\nexport const deepgram = definePreset<DeepgramOptions>()({\n kind: \"deepgram\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Deepgram\", identity: \"deepgram\", description: \"Lists projects, then reads the account balance\" }),\n check: async ({ options, secrets, http }): Promise<CheckOutcome> => {\n const headers = { Authorization: `Token ${secrets.apiKey}` };\n const projects = await http(\"https://api.deepgram.com/v1/projects\", { headers });\n if (!projects.ok) return projects.outcome;\n const projectId = (projects.json as { projects?: Array<{ project_id: string }> })?.projects?.[0]?.project_id;\n if (!projectId) return { ...projects.outcome, status: \"degraded\", error: \"No project visible to this key\" };\n if (options.track?.balance === false) return projects.outcome;\n\n const warnBelow = options.track?.balance?.warnBelow ?? 20;\n const balances = await http(`https://api.deepgram.com/v1/projects/${projectId}/balances`, { headers });\n const balance = (balances.json as { balances?: Array<{ amount: number; units: string }> })?.balances?.[0];\n // The balance is informative: a key that can't read it is still a working key\n if (!balances.ok || !balance) return projects.outcome;\n const low = balance.amount < warnBelow;\n return {\n ...projects.outcome,\n latencyMs: Math.max(projects.latencyMs, balances.latencyMs),\n status: low ? \"degraded\" : \"up\",\n error: low ? \"Low balance\" : undefined,\n metrics: { balance: `${round(balance.amount, 2)} ${balance.units}` },\n };\n },\n});\n\n/** Gladia. Lists live sessions (limit 1). up when the key works; down when rejected. */\nexport const gladia = definePreset<PresetOptions & ApiKey>()({\n kind: \"gladia\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Gladia\", identity: \"gladia\", description: \"Lists live sessions (limit 1)\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://api.gladia.io/v2/live?limit=1\", { headers: { \"x-gladia-key\": secrets.apiKey } }),\n});\n\nexport type SpeechmaticsOptions = PresetOptions &\n ApiKey & {\n /** API base URL, e.g. the EU endpoint (default \"https://asr.api.speechmatics.com\") */\n baseUrl?: string;\n };\n\n/** Speechmatics. Lists batch jobs (limit 1), which validates the API key. */\nexport const speechmatics = definePreset<SpeechmaticsOptions>()({\n kind: \"speechmatics\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({\n name: \"Speechmatics\",\n identity: \"speechmatics\",\n description: \"Lists batch jobs (limit 1), validating the API key\",\n }),\n check: ({ options, secrets, http }) =>\n call(http, `${(options.baseUrl ?? \"https://asr.api.speechmatics.com\").replace(/\\/+$/, \"\")}/v2/jobs?limit=1`, {\n headers: bearer(secrets.apiKey),\n }),\n});\n\nexport type OpenAIOptions = PresetOptions &\n ApiKey & {\n /** Sent as the `OpenAI-Organization` header */\n organization?: string;\n track?: {\n /** Also check that the key can use this model (`GET /v1/models/{model}`) */\n model?: string;\n };\n };\n\n/**\n * OpenAI. Lists models, or reads one model when `track.model` is set (both free).\n * It proves the key works; it can't see billing problems, which only show on real requests.\n */\nexport const openai = definePreset<OpenAIOptions>()({\n kind: \"openai\",\n requiredSecrets: [\"apiKey\"],\n derive: (options) => ({\n name: \"OpenAI\",\n identity: \"openai\",\n description: options.track?.model ? `Checks access to ${options.track.model}` : \"Lists models\",\n }),\n check: ({ options, secrets, http }) =>\n call(\n http,\n options.track?.model\n ? `https://api.openai.com/v1/models/${encodeURIComponent(options.track.model)}`\n : \"https://api.openai.com/v1/models\",\n {\n headers: {\n ...bearer(secrets.apiKey),\n ...(options.organization ? { \"OpenAI-Organization\": options.organization } : {}),\n },\n }\n ),\n});\n\nexport type AnthropicOptions = PresetOptions &\n ApiKey & {\n track?: {\n /**\n * The models you depend on (IDs or aliases, e.g. \"claude-sonnet-4-6\"). Each one is\n * reported on its own row. Without a list, only the key is validated.\n */\n models?: string[];\n };\n};\n\nconst API = \"https://api.anthropic.com/v1/models\";\n\n/**\n * Anthropic. Reads each model in `track.models` (free, no tokens), or lists models when\n * there is no list.\n * - up: the key works and every listed model is available to it\n * - degraded: some models are missing or retired, or the API is rate limited or overloaded\n * - down: the API rejects the key, errors, or none of the listed models is available\n *\n * Reports one `instances` row per model, so each keeps its own uptime and response time.\n * It proves a model exists for this key; it can't see capacity problems on real requests.\n */\nexport const anthropic = definePreset<AnthropicOptions>()({\n kind: \"anthropic\",\n requiredSecrets: [\"apiKey\"],\n derive: (options) => ({\n name: \"Anthropic\",\n identity: \"anthropic\",\n description: options.track?.models?.length ? \"Reads each monitored model\" : \"Lists models\",\n }),\n check: async ({ options, secrets, http }): Promise<CheckOutcome> => {\n const headers = { \"x-api-key\": secrets.apiKey, \"anthropic-version\": \"2023-06-01\" };\n const models = [...new Set(options.track?.models ?? [])];\n if (models.length === 0) return (await http(`${API}?limit=1`, { headers })).outcome;\n\n const responses = await Promise.all(\n models.map(async (model) => ({ model, res: await http(`${API}/${encodeURIComponent(model)}`, { headers }) }))\n );\n // A rejected key fails every model the same way: report it once, as the key's problem\n const rejected = responses.find(({ res }) => res.status === 401 || res.status === 403);\n if (rejected) return rejected.res.outcome;\n\n const instances = responses.map(({ model, res }): Instance => {\n const base = { key: model, latencyMs: res.status === undefined ? undefined : res.latencyMs, httpStatus: res.status };\n if (res.ok) return { ...base, status: \"up\" };\n if (res.status === 404) return { ...base, status: \"down\", error: \"Model not found: retired, or not available to this key\" };\n // 529: Anthropic is overloaded, which passes\n if (res.status === 529) return { ...base, status: \"degraded\", error: \"Overloaded\" };\n return { ...base, status: res.outcome.status, error: res.outcome.error };\n });\n return { ...summarize(instances, \"model\"), instances, instanceLabels: { key: \"Model\" } };\n },\n});\n\n/** Google Gemini. Lists models (page size 1). */\nexport const gemini = definePreset<PresetOptions & ApiKey>()({\n kind: \"gemini\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Google Gemini\", identity: \"gemini\", description: \"Lists models\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://generativelanguage.googleapis.com/v1beta/models?pageSize=1\", {\n headers: { \"x-goog-api-key\": secrets.apiKey },\n }),\n});\n\n/** CAMB.AI. Lists source languages. */\nexport const cambai = definePreset<PresetOptions & ApiKey>()({\n kind: \"cambai\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"CAMB.AI\", identity: \"cambai\", description: \"Lists source languages\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://client.camb.ai/apis/source-languages\", { headers: { \"x-api-key\": secrets.apiKey } }),\n});\n\nexport type ElevenLabsOptions = PresetOptions &\n ApiKey & {\n track?: {\n /** Warn when less than this share of the period's credits is left (default 10) */\n quota?: { warnBelowPct?: number };\n };\n };\n\n/**\n * ElevenLabs. Reads the subscription, which validates the API key.\n * - up: the key works. A key without the user scope is refused with `missing_permissions`,\n * which still proves it is valid.\n * - degraded: less than `track.quota.warnBelowPct` of the credits left\n * - down: the API rejects the key or errors\n *\n * Reports a `usage` bar (credits used this period, with the reset time) and `metrics.tier`.\n */\nexport const elevenlabs = definePreset<ElevenLabsOptions>()({\n kind: \"elevenlabs\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"ElevenLabs\", identity: \"elevenlabs\", description: \"Reads the subscription\" }),\n check: async ({ options, secrets, http }): Promise<CheckOutcome> => {\n const res = await http(\"https://api.elevenlabs.io/v1/user/subscription\", {\n headers: { \"xi-api-key\": secrets.apiKey },\n });\n const body =\n (res.json as {\n detail?: { status?: string };\n tier?: string;\n character_count?: number;\n character_limit?: number;\n next_character_count_reset_unix?: number;\n }) ?? {};\n if (res.status === 401 && body.detail?.status === \"missing_permissions\") {\n return { status: \"up\", latencyMs: res.latencyMs, httpStatus: 401, metrics: { key: \"restricted\" } };\n }\n if (!res.ok) return res.outcome;\n const metrics = body.tier ? { tier: body.tier } : undefined;\n const { character_count: used, character_limit: limit } = body;\n if (typeof used !== \"number\" || !limit) return { ...res.outcome, metrics };\n return {\n ...res.outcome,\n ...quota({\n label: \"Credits\",\n used,\n limit,\n unit: \"credits\",\n // ElevenLabs gives the reset as epoch seconds\n resetsAt: body.next_character_count_reset_unix ? body.next_character_count_reset_unix * 1000 : undefined,\n warnAbovePct: 100 - (options.track?.quota?.warnBelowPct ?? 10),\n warning: \"Credits almost exhausted\",\n }),\n metrics,\n };\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport { googleServiceAccountToken, parseServiceAccount } from \"../../google-auth\";\nimport type { CheckOutcome } from \"../../types\";\nimport { bearer, call, quota } from \"./shared\";\n\nexport type DeepLOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n track?: {\n /** Warn when this share of the character quota is used (default 90) */\n quota?: { warnAbovePct?: number };\n };\n};\n\n/**\n * DeepL. Reads `/v2/usage` (free and paid keys are detected from the key).\n * - up: quota available\n * - degraded: usage at or above `track.quota.warnAbovePct`\n * - down: the API rejects the key or errors\n *\n * Reports a `usage` bar: characters used of the limit.\n */\nexport const deepl = definePreset<DeepLOptions>()({\n kind: \"deepl\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"DeepL\", identity: \"deepl\", description: \"Reads character usage for the billing period\" }),\n check: ({ options, secrets, http }) => {\n const host = secrets.apiKey.endsWith(\":fx\") ? \"api-free.deepl.com\" : \"api.deepl.com\";\n return call(http, `https://${host}/v2/usage`, { headers: { Authorization: `DeepL-Auth-Key ${secrets.apiKey}` } }, (res) => {\n const { character_count: used, character_limit: limit } =\n (res.json as { character_count?: number; character_limit?: number }) ?? {};\n if (typeof used !== \"number\" || !limit) return undefined;\n return quota({\n label: \"Characters\",\n used,\n limit,\n unit: \"characters\",\n warnAbovePct: options.track?.quota?.warnAbovePct ?? 90,\n warning: \"Character quota almost exhausted\",\n });\n });\n },\n});\n\nexport type AzureTranslatorOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n /** Region of the Translator resource (default \"westeurope\") */\n region?: string;\n};\n\n/** Azure Translator. Translates a single character, which proves the key and region work. */\nexport const azureTranslator = definePreset<AzureTranslatorOptions>()({\n kind: \"azure.translator\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Azure Translator\", identity: \"azure.translator\", description: \"Translates a single character\" }),\n check: ({ options, secrets, http }) =>\n call(http, \"https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to=fr\", {\n method: \"POST\",\n headers: {\n \"Ocp-Apim-Subscription-Key\": secrets.apiKey,\n \"Ocp-Apim-Subscription-Region\": options.region ?? \"westeurope\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify([{ Text: \"a\" }]),\n }),\n});\n\nexport type GoogleTranslateOptions = PresetOptions & {\n secrets: {\n /** The service-account JSON key (the whole file content), not an API key */\n serviceAccount: string | undefined;\n };\n /** Translation location (default \"global\") */\n location?: string;\n};\n\n/**\n * Google Cloud Translation v3, with a service account. Gets a token, then lists supported\n * languages (free: Google bills by characters translated).\n * - up: languages returned\n * - down: the key isn't valid JSON, or auth or the API fails\n *\n * Reports `metrics.languages`.\n */\nexport const googleTranslate = definePreset<GoogleTranslateOptions>()({\n kind: \"google.translate\",\n requiredSecrets: [\"serviceAccount\"],\n derive: () => ({\n name: \"Google Translate\",\n identity: \"google.translate\",\n description: \"Lists supported languages with Cloud Translation v3\",\n }),\n check: async ({ options, secrets, http, now }): Promise<CheckOutcome> => {\n const account = parseServiceAccount(secrets.serviceAccount);\n if (!account?.project_id) {\n return { status: \"down\", probed: false, error: \"The service account secret is not a service-account JSON key\" };\n }\n const token = await googleServiceAccountToken({\n account,\n scope: \"https://www.googleapis.com/auth/cloud-translation\",\n http,\n now,\n });\n return call(\n http,\n `https://translation.googleapis.com/v3/projects/${account.project_id}/locations/${options.location ?? \"global\"}/supportedLanguages`,\n { headers: bearer(token) },\n (res) => {\n const languages = (res.json as { languages?: unknown[] })?.languages;\n return languages ? { status: \"up\", metrics: { languages: languages.length } } : undefined;\n }\n );\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome } from \"../../types\";\nimport { base64, bearer, call, quota } from \"./shared\";\n\nexport type MuxOptions = PresetOptions & {\n secrets: { tokenId: string | undefined; tokenSecret: string | undefined };\n};\n\n/** Mux Video. Lists live streams (limit 1). up when the token works; down when rejected. */\nexport const mux = definePreset<MuxOptions>()({\n kind: \"mux\",\n requiredSecrets: [\"tokenId\", \"tokenSecret\"],\n derive: () => ({ name: \"Mux\", identity: \"mux\", description: \"Lists live streams (limit 1)\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://api.mux.com/video/v1/live-streams?limit=1\", {\n headers: { Authorization: `Basic ${base64(`${secrets.tokenId}:${secrets.tokenSecret}`)}` },\n }),\n});\n\nexport type CloudflareStreamOptions = PresetOptions & {\n /** The Cloudflare account ID */\n accountId: string | undefined;\n secrets: { token: string | undefined };\n track?: {\n /** Warn when this share of the storage plan is used (default 90). `false` skips storage. */\n storage?: { warnAbovePct?: number } | false;\n };\n};\n\n/**\n * Cloudflare Stream. Lists videos (limit 1) and reads storage usage, in parallel.\n * - up: both calls work\n * - degraded: storage at or above `track.storage.warnAbovePct`\n * - down: either call fails\n *\n * Reports a `usage` bar (storage minutes) and `metrics.videos`.\n */\nexport const cloudflareStream = definePreset<CloudflareStreamOptions>()({\n kind: \"cloudflare.stream\",\n requiredFields: [\"accountId\"],\n requiredSecrets: [\"token\"],\n derive: () => ({\n name: \"Cloudflare Stream\",\n identity: \"cloudflare.stream\",\n description: \"Lists videos (limit 1) and reads storage usage against the plan limit\",\n }),\n check: async ({ options, secrets, http, combine }): Promise<CheckOutcome> => {\n const base = `https://api.cloudflare.com/client/v4/accounts/${options.accountId}/stream`;\n const init = { headers: bearer(secrets.token) };\n const rejected = (json: unknown): CheckOutcome | undefined =>\n (json as { success?: boolean })?.success === false\n ? { status: \"down\", error: \"Cloudflare API reported success=false\" }\n : undefined;\n\n const videos = call(http, `${base}?limit=1`, init, (res) => rejected(res.json));\n if (options.track?.storage === false) return videos;\n\n const warnAbovePct = options.track?.storage?.warnAbovePct ?? 90;\n const storage = call(http, `${base}/storage-usage`, init, (res) => {\n const failed = rejected(res.json);\n if (failed) return failed;\n const usage = (\n res.json as {\n result?: { videoCount?: number; totalStorageMinutes?: number; totalStorageMinutesLimit?: number };\n }\n )?.result;\n if (!usage?.totalStorageMinutesLimit) return undefined;\n return {\n ...quota({\n label: \"Video storage\",\n used: Math.round(usage.totalStorageMinutes ?? 0),\n limit: usage.totalStorageMinutesLimit,\n unit: \"min\",\n warnAbovePct,\n warning: \"Stream storage almost full\",\n }),\n metrics: { videos: usage.videoCount ?? 0 },\n };\n });\n return combine(await Promise.all([videos, storage]));\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome } from \"../../types\";\nimport { bearer, call, quota } from \"./shared\";\n\nexport type MailerSendOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n track?: {\n /** Warn when less than this share of the API quota is left (default 10) */\n quota?: { warnBelowPct?: number };\n };\n};\n\n/**\n * MailerSend. Reads `/v1/api-quota`.\n * - up: quota available\n * - degraded: less than `track.quota.warnBelowPct` of the requests left\n * - down: the API rejects the key or errors\n *\n * Reports a `usage` bar: API requests used, with the reset time.\n */\nexport const mailersend = definePreset<MailerSendOptions>()({\n kind: \"mailersend\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"MailerSend\", identity: \"mailersend\", description: \"Reads the API quota\" }),\n check: ({ options, secrets, http }) =>\n call(http, \"https://api.mailersend.com/v1/api-quota\", { headers: bearer(secrets.apiKey) }, (res) => {\n const { quota: limit, remaining, reset } =\n (res.json as { quota?: number; remaining?: number; reset?: string }) ?? {};\n if (!limit || typeof remaining !== \"number\") return undefined;\n const resetsAt = reset ? Date.parse(reset) : NaN;\n return quota({\n label: \"API requests\",\n used: limit - remaining,\n limit,\n unit: \"requests\",\n resetsAt: Number.isNaN(resetsAt) ? undefined : resetsAt,\n warnAbovePct: 100 - (options.track?.quota?.warnBelowPct ?? 10),\n warning: \"API quota almost exhausted\",\n });\n }),\n});\n\nexport type GitHubOptions = PresetOptions & {\n secrets: { token: string | undefined };\n track?: {\n /** Also check that the token can read this repository's releases, e.g. \"owner/name\" */\n repo?: string;\n /** Warn when less than this share of the hourly rate limit is left (default 10) */\n rateLimit?: { warnBelowPct?: number };\n };\n};\n\n/**\n * GitHub. Reads `/rate_limit` (free: it doesn't count against the limit), and optionally\n * checks access to a repository's releases.\n * - up: the token works (and can read the repository)\n * - degraded: less than `track.rateLimit.warnBelowPct` of the hourly requests left\n * - down: bad credentials, or the repository can't be read\n *\n * Reports a `usage` bar: requests this hour, with the reset time.\n */\nexport const github = definePreset<GitHubOptions>()({\n kind: \"github\",\n requiredSecrets: [\"token\"],\n derive: (options) => ({\n name: \"GitHub\",\n identity: options.track?.repo ? `github:${options.track.repo}` : \"github\",\n description: options.track?.repo\n ? `Reads the API rate limit and the releases of ${options.track.repo}`\n : \"Reads the API rate limit\",\n }),\n check: async ({ options, secrets, http, combine }): Promise<CheckOutcome> => {\n const headers = { ...bearer(secrets.token), \"user-agent\": \"sermon-js\", accept: \"application/vnd.github+json\" };\n const limit = call(http, \"https://api.github.com/rate_limit\", { headers }, (res) => {\n const core = (res.json as { resources?: { core?: { limit: number; remaining: number; reset: number } } })\n ?.resources?.core;\n if (!core) return undefined;\n return quota({\n label: \"API requests this hour\",\n used: core.limit - core.remaining,\n limit: core.limit,\n unit: \"requests\",\n // GitHub gives the reset as epoch seconds\n resetsAt: core.reset * 1000,\n warnAbovePct: 100 - (options.track?.rateLimit?.warnBelowPct ?? 10),\n warning: \"Rate limit almost exhausted\",\n });\n });\n if (!options.track?.repo) return limit;\n const repo = call(http, `https://api.github.com/repos/${options.track.repo}/releases?per_page=1`, { headers });\n return combine(await Promise.all([limit, repo]));\n },\n});\n\nexport type RevolutOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n /** Which Merchant API to call (default \"production\") */\n environment?: \"production\" | \"sandbox\";\n};\n\n/** Revolut Merchant. Lists orders (limit 1). up when the secret key works; down when rejected. */\nexport const revolut = definePreset<RevolutOptions>()({\n kind: \"revolut\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Revolut Merchant\", identity: \"revolut\", description: \"Lists orders (limit 1)\" }),\n check: ({ options, secrets, http }) => {\n const host = options.environment === \"sandbox\" ? \"sandbox-merchant.revolut.com\" : \"merchant.revolut.com\";\n // Order listing only exists on the legacy 1.0 path\n return call(http, `https://${host}/api/1.0/orders?limit=1`, {\n headers: { ...bearer(secrets.apiKey), \"Revolut-Api-Version\": \"2023-09-01\" },\n });\n },\n});\n\nexport type AttendeeOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n /** API base URL (default \"https://app.attendee.dev\") */\n baseUrl?: string;\n};\n\n/** Attendee (meeting bots). Lists bots (page size 1). */\nexport const attendee = definePreset<AttendeeOptions>()({\n kind: \"attendee\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Attendee\", identity: \"attendee\", description: \"Lists bots\" }),\n check: ({ options, secrets, http }) =>\n call(http, `${(options.baseUrl || \"https://app.attendee.dev\").replace(/\\/+$/, \"\")}/api/v1/bots?page_size=1`, {\n headers: { Authorization: `Token ${secrets.apiKey}` },\n }),\n});\n\nexport type AxiomOptions = PresetOptions & {\n /** The dataset logs are sent to */\n dataset: string | undefined;\n /** Regional edge domain for ingestion, e.g. \"eu-central-1.aws.edge.axiom.co\" */\n edge?: string;\n secrets: { token: string | undefined };\n};\n\n/** Axiom. Ingests an empty batch into the dataset: it writes nothing and proves token and dataset. */\nexport const axiom = definePreset<AxiomOptions>()({\n kind: \"axiom\",\n requiredFields: [\"dataset\"],\n requiredSecrets: [\"token\"],\n derive: () => ({ name: \"Axiom\", identity: \"axiom\", description: \"Ingests an empty batch into the logs dataset\" }),\n check: ({ options, secrets, http }) =>\n call(\n http,\n options.edge\n ? `https://${options.edge}/v1/ingest/${options.dataset}`\n : `https://api.axiom.co/v1/datasets/${options.dataset}/ingest`,\n { method: \"POST\", headers: { ...bearer(secrets.token), \"content-type\": \"application/json\" }, body: \"[]\" }\n ),\n});\n\nexport type UpstashRedisOptions = PresetOptions & {\n /** REST URL of the database */\n url: string | undefined;\n secrets: { token: string | undefined };\n};\n\n/**\n * Upstash Redis / Vercel KV, over REST. Sends `PING` as a regular command (which compatible\n * servers such as serverless-redis-http also accept). up on PONG.\n */\nexport const upstashRedis = definePreset<UpstashRedisOptions>()({\n kind: \"upstash.redis\",\n requiredFields: [\"url\"],\n requiredSecrets: [\"token\"],\n defaults: { slowMs: 500 },\n derive: () => ({ name: \"Redis\", description: \"PING through the REST API\" }),\n check: ({ options, secrets, http }) =>\n call(\n http,\n (options.url as string).replace(/\\/+$/, \"\"),\n {\n method: \"POST\",\n headers: { ...bearer(secrets.token), \"content-type\": \"application/json\" },\n body: '[\"PING\"]',\n },\n (res) =>\n (res.json as { result?: string })?.result === \"PONG\"\n ? undefined\n : { status: \"down\", error: \"Unexpected reply to PING\" }\n ),\n});\n\nexport type StatuspageOptions = PresetOptions & {\n /** The status page, e.g. \"https://status.flyio.net\" */\n url: string;\n};\n\n/**\n * Any provider that publishes an Atlassian Statuspage (Fly.io, Vercel, Cloudflare, GitHub…).\n * Reads `/api/v2/status.json`.\n * - up: the provider reports no incident\n * - degraded: a minor incident\n * - down: a major or critical incident\n *\n * The provider's own description becomes the error text.\n */\nexport const statuspage = definePreset<StatuspageOptions>()({\n kind: \"statuspage\",\n requiredFields: [\"url\"],\n derive: (options) => {\n let host = options.url;\n try {\n host = new URL(options.url).host;\n } catch {\n // Keep the raw value: the check will report the bad URL\n }\n return {\n name: host,\n identity: `statuspage:${host}`,\n description: \"Status reported by the provider's public status page\",\n };\n },\n check: ({ options, http }) =>\n call(http, `${options.url.replace(/\\/+$/, \"\")}/api/v2/status.json`, undefined, (res) => {\n const { indicator, description } =\n (res.json as { status?: { indicator?: string; description?: string } })?.status ?? {};\n if (!indicator) return { status: \"degraded\", error: \"Not a Statuspage answer\" };\n const status = indicator === \"none\" ? \"up\" : indicator === \"minor\" ? \"degraded\" : \"down\";\n return { status, error: status === \"up\" ? undefined : description };\n }),\n});\n\nexport type ResendOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n};\n\n/**\n * Resend. Lists domains, which validates the API key.\n * - up: the key works. A sending-only key is refused with `restricted_api_key`, which still\n * proves it is valid.\n * - degraded: domains exist, but none is verified\n * - down: the API rejects the key or errors\n *\n * Reports `metrics.domains` and `metrics.verified` for full-access keys.\n */\nexport const resend = definePreset<ResendOptions>()({\n kind: \"resend\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Resend\", identity: \"resend\", description: \"Lists domains\" }),\n check: async ({ secrets, http }): Promise<CheckOutcome> => {\n const res = await http(\"https://api.resend.com/domains\", { headers: bearer(secrets.apiKey) });\n const body = (res.json as { name?: string; data?: Array<{ status?: string }> }) ?? {};\n if (res.status === 401 && body.name === \"restricted_api_key\") {\n return { status: \"up\", latencyMs: res.latencyMs, httpStatus: 401, metrics: { key: \"sending only\" } };\n }\n if (!res.ok || !Array.isArray(body.data)) return res.outcome;\n const verified = body.data.filter((domain) => domain.status === \"verified\").length;\n const unverified = body.data.length > 0 && verified === 0;\n return {\n ...res.outcome,\n status: unverified ? \"degraded\" : \"up\",\n error: unverified ? \"No verified domain\" : undefined,\n metrics: { domains: body.data.length, verified },\n };\n },\n});\n\nexport type MeilisearchOptions = PresetOptions & {\n /** The server, e.g. \"https://search.example.com\" */\n host: string | undefined;\n /** Also require this index, and report its document count */\n index?: string;\n secrets: { apiKey: string | undefined };\n};\n\n/**\n * Meilisearch. Reads `/health`, then the index (or the list of indexes), which validates the key.\n * - up: the server is available and the key works\n * - degraded: the index does not exist\n * - down: the server is unavailable, or rejects the key\n *\n * Reports `metrics.documents`, and `metrics.indexing` while a batch is running, when the key\n * may read statistics; scoped keys often may not, and that is not held against them.\n */\nexport const meilisearch = definePreset<MeilisearchOptions>()({\n kind: \"meilisearch\",\n requiredFields: [\"host\"],\n requiredSecrets: [\"apiKey\"],\n derive: (options) => ({\n name: \"Meilisearch\",\n identity: options.index ? `meilisearch:${options.index}` : \"meilisearch\",\n description: options.index\n ? `Reads the health and the ${options.index} index`\n : \"Reads the health and lists indexes\",\n }),\n check: async ({ options, secrets, http, combine }) => {\n const host = (options.host as string).replace(/\\/+$/, \"\");\n const headers = bearer(secrets.apiKey);\n const index = options.index ? `/indexes/${encodeURIComponent(options.index)}` : undefined;\n\n const health = call(http, `${host}/health`, undefined, (res) =>\n (res.json as { status?: string })?.status === \"available\" ? undefined : { status: \"down\", error: \"Not available\" }\n );\n const access = http(`${host}${index ?? \"/indexes?limit=1\"}`, { headers }).then((res): CheckOutcome => {\n if (res.status !== 404 || !options.index) return res.outcome;\n return {\n status: \"degraded\",\n latencyMs: res.latencyMs,\n httpStatus: 404,\n error: `Index ${options.index} not found`,\n };\n });\n const stats = http(`${host}${index ?? \"\"}/stats`, { headers });\n\n const outcome = combine(await Promise.all([health, access]));\n const res = await stats;\n // Statistics are informative: a key that can't read them is still a working key\n if (!res.ok) return outcome;\n const body =\n (res.json as {\n numberOfDocuments?: number;\n isIndexing?: boolean;\n indexes?: Record<string, { numberOfDocuments?: number }>;\n }) ?? {};\n const documents =\n body.numberOfDocuments ??\n Object.values(body.indexes ?? {}).reduce((sum, entry) => sum + (entry.numberOfDocuments ?? 0), 0);\n return { ...outcome, metrics: { ...outcome.metrics, documents, ...(body.isIndexing ? { indexing: \"yes\" } : {}) } };\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome, Metrics, Usage } from \"../../types\";\n\nexport type PusherOptions = PresetOptions & {\n appId: string | undefined;\n /** Pusher cluster, e.g. \"eu\" (default \"mt1\"). Ignored when `host` is set. */\n cluster?: string;\n /** Custom host, for Pusher-compatible servers such as Soketi */\n host?: string;\n port?: string | number;\n /** Use HTTPS (default: true unless a non-443 port is given) */\n tls?: boolean;\n secrets: { key: string | undefined; secret: string | undefined };\n track?: {\n connections?: {\n /** Your plan's maximum concurrent connections: turns the counts into usage bars */\n max?: number;\n /** Warn when today's peak reaches this share of `max` (default 90) */\n warnAbovePct?: number;\n };\n };\n};\n\n/** Max channels queried one by one for their subscription count, per check */\nconst MAX_CHANNELS = 500;\nconst CONCURRENCY = 10;\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nasync function hmacSha256Hex(secret: string, message: string) {\n const encoder = new TextEncoder();\n const key = await crypto.subtle.importKey(\"raw\", encoder.encode(secret), { name: \"HMAC\", hash: \"SHA-256\" }, false, [\n \"sign\",\n ]);\n const signature = await crypto.subtle.sign(\"HMAC\", key, encoder.encode(message));\n return [...new Uint8Array(signature)].map((byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/** Path and signed query of a GET to the Pusher HTTP API */\nexport async function signPusherRequest({\n appId,\n key,\n secret,\n path,\n params = {},\n timestamp = Math.floor(Date.now() / 1000),\n}: {\n appId: string;\n key: string;\n secret: string;\n path: string;\n params?: Record<string, string>;\n timestamp?: number;\n}) {\n const fullPath = `/apps/${appId}${path}`;\n const search = new URLSearchParams({\n ...params,\n auth_key: key,\n auth_timestamp: String(timestamp),\n auth_version: \"1.0\",\n });\n search.sort();\n const query = decodeURIComponent(search.toString());\n const signature = await hmacSha256Hex(secret, [\"GET\", fullPath, query].join(\"\\n\"));\n return `${fullPath}?${query}&auth_signature=${signature}`;\n}\n\nfunction baseUrl(options: PusherOptions) {\n const host = options.host || `api-${options.cluster || \"mt1\"}.pusher.com`;\n const port = options.port === undefined || options.port === \"\" ? undefined : String(options.port);\n const tls = options.tls ?? (!port || port === \"443\");\n const defaultPort = tls ? \"443\" : \"80\";\n return `${tls ? \"https\" : \"http\"}://${host}${port && port !== defaultPort ? `:${port}` : \"\"}`;\n}\n\nasync function mapLimit<T, R>(items: T[], limit: number, fn: (item: T) => Promise<R>) {\n const results: R[] = new Array(items.length);\n let next = 0;\n await Promise.all(\n Array.from({ length: Math.min(limit, items.length) }, async () => {\n while (next < items.length) {\n const index = next++;\n results[index] = await fn(items[index] as T);\n }\n })\n );\n return results;\n}\n\nconst utcDay = (now: number) => new Date(now).toISOString().slice(0, 10);\n\n/**\n * Pusher Channels (and compatible servers). Lists occupied channels, then reads each one's\n * `subscription_count` to estimate concurrent connections. Pusher has no usage API, so this is\n * an estimate: clients subscribed to several channels make it run slightly high.\n * Requires \"subscription counting\" enabled in the app settings.\n * - up: the API answers\n * - degraded: today's peak at or above `warnAbovePct` of `track.connections.max`, or subscription counting is off\n * - down: the API rejects the credentials or errors\n *\n * Reports `metrics.channels` and `metrics.signedInUsers`; with `max`, two `usage` bars\n * (connections now, peak today), otherwise the counts as metrics. The daily peak (UTC) is kept\n * in the store's cache.\n */\nexport const pusher = definePreset<PusherOptions>()({\n kind: \"pusher\",\n requiredFields: [\"appId\"],\n requiredSecrets: [\"key\", \"secret\"],\n defaults: { slowMs: 1000 },\n derive: (options) => ({\n name: \"Pusher\",\n identity: `pusher:${options.appId ?? \"\"}`,\n description: \"Lists occupied channels and estimates connections from their subscription counts\",\n }),\n check: async ({ options, secrets, http, cache, now }): Promise<CheckOutcome> => {\n const get = async (path: string, params?: Record<string, string>) =>\n http(\n `${baseUrl(options)}${await signPusherRequest({\n appId: options.appId as string,\n key: secrets.key,\n secret: secrets.secret,\n path,\n params,\n timestamp: Math.floor(now / 1000),\n })}`\n );\n\n const list = await get(\"/channels\");\n if (!list.ok) return list.outcome;\n const names = Object.keys((list.json as { channels?: Record<string, unknown> })?.channels ?? {});\n const queried = names.slice(0, MAX_CHANNELS);\n\n let failed = 0;\n let countingDisabled = false;\n const counts = await mapLimit(queried, CONCURRENCY, async (name) => {\n // Names can contain \"#\" (`#server-to-user-…`), which would otherwise start a URL fragment\n const res = await get(`/channels/${encodeURIComponent(name)}`, { info: \"subscription_count\" });\n const count = (res.json as { subscription_count?: number })?.subscription_count;\n if (!res.ok) failed += 1;\n else if (typeof count !== \"number\") countingDisabled = true;\n return typeof count === \"number\" ? count : 0;\n });\n const connections = counts.reduce((sum, count) => sum + count, 0);\n // One per signed-in connection (pusher.signin()); those usually also subscribe to other\n // channels, so the total errs on the high side: safer for quota alerts\n const signedInUsers = queried.reduce(\n (sum, name, index) => (name.startsWith(\"#server-to-user-\") ? sum + (counts[index] ?? 0) : sum),\n 0\n );\n\n const peakKey = `peak:${utcDay(now)}`;\n const peak = Math.max(connections, Number(await cache.get(peakKey)) || 0);\n await cache.set(peakKey, String(peak), 8 * DAY_MS);\n\n const metrics: Metrics = { channels: names.length, signedInUsers };\n if (names.length > MAX_CHANNELS) metrics.channelsCounted = MAX_CHANNELS;\n\n const max = options.track?.connections?.max;\n const warnAbovePct = options.track?.connections?.warnAbovePct ?? 90;\n const usage: Usage[] = [];\n if (max) {\n usage.push(\n { label: \"Connections now (estimate)\", used: connections, limit: max, unit: \"connections\" },\n {\n label: \"Peak connections today (UTC)\",\n used: peak,\n limit: max,\n unit: \"connections\",\n resetsAt: Date.parse(`${utcDay(now)}T00:00:00Z`) + DAY_MS,\n }\n );\n } else {\n metrics.connections = connections;\n metrics.peakToday = peak;\n }\n\n const warnings: string[] = [];\n if (max && (peak / max) * 100 >= warnAbovePct) warnings.push(\"Connections close to the plan limit\");\n if (countingDisabled) warnings.push(\"Subscription counting is disabled in the Pusher app settings\");\n const notes = failed > 0 ? [`${failed} channel(s) could not be counted`] : [];\n\n return {\n status: warnings.length ? \"degraded\" : \"up\",\n latencyMs: list.latencyMs,\n httpStatus: list.status,\n error: [...warnings, ...notes].join(\"; \") || undefined,\n metrics,\n usage: usage.length ? usage : undefined,\n };\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome } from \"../../types\";\nimport { bearer, call, round } from \"./shared\";\n\nexport type VercelAiGatewayOptions = PresetOptions & {\n secrets: { apiKey: string | undefined };\n track?: {\n /** Warn when the credit balance drops below this amount in USD (default 5). `false` skips the balance. */\n credits?: { warnBelow?: number } | false;\n };\n};\n\n/**\n * Vercel AI Gateway. Reads the credit balance, which validates the key.\n * - up: the key works\n * - degraded: balance below `track.credits.warnBelow`\n * - down: the gateway rejects the key or errors\n *\n * Reports `metrics.balance` and `metrics.used`. With `track.credits: false` it lists models\n * instead, which only proves the gateway is reachable: that route needs no key.\n */\nconst aiGateway = definePreset<VercelAiGatewayOptions>()({\n kind: \"vercel.aiGateway\",\n requiredSecrets: [\"apiKey\"],\n derive: (options) => ({\n name: \"Vercel AI Gateway\",\n identity: \"vercel.aiGateway\",\n description: options.track?.credits === false ? \"Lists models\" : \"Reads the credit balance\",\n }),\n check: ({ options, secrets, http }) => {\n const headers = bearer(secrets.apiKey);\n if (options.track?.credits === false) return call(http, \"https://ai-gateway.vercel.sh/v1/models\", { headers });\n const warnBelow = options.track?.credits?.warnBelow ?? 5;\n return call(http, \"https://ai-gateway.vercel.sh/v1/credits\", { headers }, (res): CheckOutcome | undefined => {\n const body = (res.json as { balance?: string | number; total_used?: string | number }) ?? {};\n // The gateway gives amounts as strings\n const balance = Number(body.balance);\n if (body.balance === undefined || !Number.isFinite(balance)) return undefined;\n const used = Number(body.total_used);\n const low = balance < warnBelow;\n return {\n status: low ? \"degraded\" : \"up\",\n error: low ? \"Low credit balance\" : undefined,\n metrics: {\n balance: `${round(balance, 2)} USD`,\n ...(body.total_used !== undefined && Number.isFinite(used) ? { used: `${round(used, 2)} USD` } : {}),\n },\n };\n });\n },\n});\n\nexport type VercelBlobOptions = PresetOptions & {\n secrets: { token: string | undefined };\n};\n\n/** Vercel Blob. Lists one blob of the store, which validates the read-write token. */\nconst blob = definePreset<VercelBlobOptions>()({\n kind: \"vercel.blob\",\n requiredSecrets: [\"token\"],\n derive: () => ({ name: \"Vercel Blob\", identity: \"vercel.blob\", description: \"Lists one blob of the store\" }),\n check: ({ secrets, http }) =>\n call(http, \"https://vercel.com/api/blob?limit=1\", {\n headers: { ...bearer(secrets.token), \"x-api-version\": \"12\" },\n }),\n});\n\n/** Presets for Vercel products */\nexport const vercel = { aiGateway, blob };\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome, Instance, Metrics } from \"../../types\";\nimport { bearer } from \"./shared\";\n\nexport type StripeOptions = PresetOptions & {\n /** A secret or restricted key. Restricted keys need read access to what you track. */\n secrets: { apiKey: string | undefined };\n track?: {\n /** Warn when a live account can't take charges or payouts, or has overdue requirements (default true) */\n account?: boolean;\n /** Report each webhook endpoint, and events Stripe could not deliver in the last 24 h (default true) */\n webhooks?: boolean;\n /** Count disputes awaiting your response (default true) */\n disputes?: boolean;\n };\n};\n\ntype Money = { amount: number; currency: string };\ntype Balance = { livemode?: boolean; available?: Money[]; pending?: Money[] };\ntype Account = {\n charges_enabled?: boolean;\n payouts_enabled?: boolean;\n requirements?: { past_due?: string[]; disabled_reason?: string | null };\n};\ntype List<T> = { data?: T[]; has_more?: boolean };\n\nconst API = \"https://api.stripe.com/v1\";\nconst DAY_S = 24 * 60 * 60;\nconst ZERO_DECIMAL = new Set([\"bif\", \"clp\", \"djf\", \"gnf\", \"jpy\", \"kmf\", \"krw\", \"mga\", \"pyg\", \"rwf\", \"ugx\", \"vnd\", \"vuv\", \"xaf\", \"xof\", \"xpf\"]);\n\nfunction money(amounts: Money[] | undefined) {\n return (amounts ?? [])\n .slice(0, 3)\n .map(({ amount, currency }) => {\n const value = ZERO_DECIMAL.has(currency) ? String(amount) : (amount / 100).toFixed(2);\n return `${value} ${currency.toUpperCase()}`;\n })\n .join(\", \");\n}\n\n/** Host and path identify an endpoint across re-creations, without its query string */\nfunction endpointKey(url: string) {\n try {\n const { host, pathname } = new URL(url);\n return `${host}${pathname}`;\n } catch {\n return \"endpoint\";\n }\n}\n\nconst count = (list: List<unknown>) => `${list.data?.length ?? 0}${list.has_more ? \"+\" : \"\"}`;\n\n/**\n * Stripe. Reads the balance, which validates the key, then what `track` asks for. All calls\n * are free and read-only.\n * - up: the key works\n * - degraded: a webhook endpoint is disabled, Stripe could not deliver events in the last\n * 24 h, or a live account can't take charges or payouts or has overdue requirements\n * - down: the API rejects the key or errors\n *\n * Reports `metrics.mode` (live/test), `metrics.available`, `metrics.pending`,\n * `metrics.undelivered24h`, `metrics.openDisputes`, and one `instances` row per webhook\n * endpoint. What a restricted key may not read is left out, never counted as a failure.\n */\nexport const stripe = definePreset<StripeOptions>()({\n kind: \"stripe\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Stripe\", identity: \"stripe\", description: \"Reads the balance, account and webhook endpoints\" }),\n check: async ({ options, secrets, http, now }): Promise<CheckOutcome> => {\n const { account = true, webhooks = true, disputes = true } = options.track ?? {};\n const get = (path: string) => http(`${API}${path}`, { headers: bearer(secrets.apiKey) });\n const skip = Promise.resolve(undefined);\n\n const [balance, accountRes, endpoints, undelivered, disputeList] = await Promise.all([\n get(\"/balance\"),\n account ? get(\"/account\") : skip,\n webhooks ? get(\"/webhook_endpoints?limit=100\") : skip,\n webhooks ? get(`/events?delivery_success=false&limit=100&created[gte]=${Math.floor(now / 1000) - DAY_S}`) : skip,\n disputes ? get(\"/disputes?limit=100\") : skip,\n ]);\n\n // 403: a restricted key without balance access is still a working key\n if (!balance.ok && balance.status !== 403) return balance.outcome;\n const metrics: Metrics = {};\n const warnings: string[] = [];\n const funds = balance.ok ? (balance.json as Balance) : undefined;\n if (funds) {\n metrics.mode = funds.livemode ? \"live\" : \"test\";\n if (funds.available?.length) metrics.available = money(funds.available);\n if (funds.pending?.length) metrics.pending = money(funds.pending);\n } else {\n metrics.key = \"restricted\";\n }\n\n // Test-mode accounts are often not activated: only a live account is held to these\n if (accountRes?.ok && funds?.livemode) {\n const body = accountRes.json as Account;\n if (body.charges_enabled === false) warnings.push(\"Charges are disabled\");\n if (body.payouts_enabled === false) warnings.push(\"Payouts are disabled\");\n const overdue = body.requirements?.past_due?.length ?? 0;\n if (overdue > 0) warnings.push(`${overdue} account requirement(s) past due`);\n }\n\n let instances: Instance[] | undefined;\n if (endpoints?.ok) {\n const list = (endpoints.json as List<{ id: string; url: string; status: string }>).data ?? [];\n const seen = new Set<string>();\n instances = list.map((endpoint) => {\n let key = endpointKey(endpoint.url);\n for (let n = 2; seen.has(key); n++) key = `${endpointKey(endpoint.url)}#${n}`;\n seen.add(key);\n const enabled = endpoint.status === \"enabled\";\n return { key, id: endpoint.id, state: endpoint.status, status: enabled ? \"up\" : \"down\", error: enabled ? undefined : \"Endpoint disabled\" };\n });\n metrics.webhookEndpoints = list.length;\n const disabled = instances.filter((instance) => instance.status === \"down\").length;\n if (disabled > 0) warnings.push(`${disabled} webhook endpoint(s) disabled`);\n }\n if (undelivered?.ok) {\n const list = undelivered.json as List<unknown>;\n metrics.undelivered24h = count(list);\n if (list.data?.length) warnings.push(`${count(list)} event(s) not delivered in the last 24 h`);\n }\n if (disputeList?.ok) {\n const open = ((disputeList.json as List<{ status: string }>).data ?? []).filter((dispute) =>\n dispute.status.endsWith(\"needs_response\")\n );\n metrics.openDisputes = open.length;\n }\n\n return {\n status: warnings.length ? \"degraded\" : \"up\",\n latencyMs: balance.latencyMs,\n httpStatus: balance.status,\n error: warnings.join(\"; \") || undefined,\n metrics,\n instances: instances?.length ? instances : undefined,\n instanceLabels: { key: \"Webhook endpoint\", detail: \"ID\" },\n };\n },\n});\n","import { definePreset, type PresetOptions } from \"../../config\";\nimport type { CheckOutcome } from \"../../types\";\nimport { bearer, emptyPost, keyAccepted, quota } from \"./shared\";\n\ntype ApiKey = { secrets: { apiKey: string | undefined } };\n\n/**\n * Exa. Sends an empty search, which Exa refuses for validation once the key is accepted:\n * nothing is searched or billed.\n * - up: the key is accepted\n * - degraded: rate limited, or out of credits (HTTP 402)\n * - down: the API rejects the key or errors\n */\nexport const exa = definePreset<PresetOptions & ApiKey>()({\n kind: \"exa\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Exa\", identity: \"exa\", description: \"Validates the API key (no search is run)\" }),\n check: async ({ secrets, http }) =>\n keyAccepted(await http(\"https://api.exa.ai/search\", emptyPost({ \"x-api-key\": secrets.apiKey }))),\n});\n\n/**\n * Nimble. Sends an empty search, which Nimble refuses for validation once the key is\n * accepted: nothing is searched or billed.\n * - up: the key is accepted\n * - degraded: rate limited, or out of credits (HTTP 402)\n * - down: the API rejects the key or errors\n */\nexport const nimble = definePreset<PresetOptions & ApiKey>()({\n kind: \"nimble\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Nimble\", identity: \"nimble\", description: \"Validates the API key (no search is run)\" }),\n check: async ({ secrets, http }) =>\n keyAccepted(await http(\"https://sdk.nimbleway.com/v1/search\", emptyPost(bearer(secrets.apiKey)))),\n});\n\nexport type TavilyOptions = PresetOptions &\n ApiKey & {\n track?: {\n /** Warn when this share of the credits is used (default 90) */\n quota?: { warnAbovePct?: number };\n };\n };\n\ntype TavilyUsage = {\n key?: { usage?: number; limit?: number | null };\n account?: { current_plan?: string; plan_usage?: number; plan_limit?: number | null };\n};\n\n/**\n * Tavily. Reads `/usage`, which validates the API key.\n * - up: the key works\n * - degraded: `track.quota.warnAbovePct` of the credits are used\n * - down: the API rejects the key or errors\n *\n * Reports a `usage` bar (the key's own limit when it has one, otherwise the plan's) and\n * `metrics.plan`.\n */\nexport const tavily = definePreset<TavilyOptions>()({\n kind: \"tavily\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Tavily\", identity: \"tavily\", description: \"Reads the credits used this period\" }),\n check: async ({ options, secrets, http }): Promise<CheckOutcome> => {\n const res = await http(\"https://api.tavily.com/usage\", { headers: bearer(secrets.apiKey) });\n if (!res.ok) return res.outcome;\n const { key, account } = (res.json as TavilyUsage) ?? {};\n const metrics = account?.current_plan ? { plan: account.current_plan } : undefined;\n const [used, limit] = key?.limit ? [key.usage, key.limit] : [account?.plan_usage, account?.plan_limit];\n if (typeof used !== \"number\" || !limit) return { ...res.outcome, metrics };\n return {\n ...res.outcome,\n ...quota({\n label: \"Credits\",\n used,\n limit,\n unit: \"credits\",\n warnAbovePct: options.track?.quota?.warnAbovePct ?? 90,\n warning: \"Credits almost exhausted\",\n }),\n metrics,\n };\n },\n});\n\nexport type EmeliaOptions = PresetOptions &\n ApiKey & {\n /** API base URL (default \"https://api.emelia.io\") */\n baseUrl?: string;\n };\n\n/**\n * Emelia. Sends an empty email-finder request, which Emelia refuses for validation once the\n * key is accepted: nothing is looked up or billed.\n * - up: the key is accepted\n * - degraded: rate limited, or out of credits (HTTP 402)\n * - down: the API rejects the key or errors\n */\nexport const emelia = definePreset<EmeliaOptions>()({\n kind: \"emelia\",\n requiredSecrets: [\"apiKey\"],\n derive: () => ({ name: \"Emelia\", identity: \"emelia\", description: \"Validates the API key (no lookup is run)\" }),\n check: async ({ options, secrets, http }) =>\n keyAccepted(\n await http(\n `${(options.baseUrl ?? \"https://api.emelia.io\").replace(/\\/+$/, \"\")}/tools/find/email`,\n // Emelia takes the bare key, without a scheme\n emptyPost({ Authorization: secrets.apiKey })\n )\n ),\n});\n"]}