@kortyx/usage-telemetry 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +86 -4
- package/dist/browser-node.d.ts +11 -3
- package/dist/browser-node.js +432 -23
- package/dist/browser-node.js.map +1 -1
- package/dist/{client-rVwo4XAO.d.ts → client-BPjAx5oh.d.ts} +8 -5
- package/dist/index.d.ts +12 -3
- package/dist/index.js +426 -23
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +10 -4
- package/dist/node.js +445 -24
- package/dist/node.js.map +1 -1
- package/package.json +1 -1
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/node.ts","../src/catalog.ts","../src/client.ts","../src/release.ts","../src/transport.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n createUsageTelemetry,\n type UsageOptions,\n type UsageTelemetry,\n} from \"./client\";\nimport { RELEASE_POSTHOG_HOST, RELEASE_POSTHOG_KEY } from \"./release\";\nimport { createCollectorTransport, createPostHogTransport } from \"./transport\";\n\nexport { scale } from \"./catalog\";\nexport { createUsageTelemetry, type UsageTelemetry } from \"./client\";\n\ntype InstallationIdentity = { id: string; scope: \"installation\" | \"process\" };\nlet identity: Promise<InstallationIdentity> | undefined;\nasync function installationIdentity(): Promise<InstallationIdentity> {\n const supplied = process.env.KORTYX_USAGE_TELEMETRY_ID;\n if (\n supplied &&\n /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(\n supplied,\n )\n )\n return { id: supplied, scope: \"installation\" };\n identity ??= (async () => {\n const directory = join(homedir(), \".config\", \"kortyx\");\n const file = join(directory, \"usage-id\");\n try {\n const existing = (await readFile(file, \"utf8\")).trim();\n if (\n /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(\n existing,\n )\n )\n return { id: existing, scope: \"installation\" };\n } catch {\n /* Read-only and ephemeral hosts use a process identity. */\n }\n const candidate = randomUUID();\n try {\n await mkdir(directory, { recursive: true, mode: 0o700 });\n const handle = await open(file, \"wx\", 0o600);\n try {\n await handle.writeFile(candidate);\n } finally {\n await handle.close();\n }\n return { id: candidate, scope: \"installation\" };\n } catch {\n try {\n const winner = (await readFile(file, \"utf8\")).trim();\n if (\n /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(\n winner,\n )\n )\n return { id: winner, scope: \"installation\" };\n } catch {}\n return { id: candidate, scope: \"process\" };\n }\n })();\n return identity;\n}\n\nexport function usageDisabled(): boolean {\n return (\n [\"1\", \"true\"].includes(process.env.KORTYX_USAGE_TELEMETRY_DISABLED ?? \"\") ||\n process.env.NODE_ENV === \"test\"\n );\n}\nexport function createNodeUsageTelemetry(\n options: Pick<UsageOptions, \"context\"> &\n Partial<Omit<UsageOptions, \"context\">>,\n): UsageTelemetry {\n const env = process.env;\n let transport = options.transport;\n let valid = true;\n if (!transport) {\n try {\n transport = env.KORTYX_USAGE_TELEMETRY_ENDPOINT\n ? createCollectorTransport({\n endpoint: env.KORTYX_USAGE_TELEMETRY_ENDPOINT,\n })\n : createPostHogTransport({\n key: env.KORTYX_USAGE_TELEMETRY_POSTHOG_KEY || RELEASE_POSTHOG_KEY,\n host:\n env.KORTYX_USAGE_TELEMETRY_POSTHOG_HOST || RELEASE_POSTHOG_HOST,\n });\n } catch {\n valid = false;\n transport = async () => {};\n }\n }\n return createUsageTelemetry({\n ...options,\n transport,\n identity: options.identity ?? installationIdentity,\n enabled: () => valid && !usageDisabled() && (options.enabled?.() ?? true),\n debug: () =>\n env.KORTYX_USAGE_TELEMETRY_DEBUG === \"1\" || (options.debug?.() ?? false),\n inspect:\n options.inspect ??\n ((records) => console.error(\"[kortyx:usage]\", JSON.stringify(records))),\n });\n}\n\nconst clients = new Map<string, UsageTelemetry>();\n/** Override a component client in another distribution or in an embedding application. */\nexport function configureUsageTelemetry(\n component: string,\n client: UsageTelemetry,\n): void {\n if (clients.get(component) === client) return;\n clients.get(component)?.dispose();\n clients.set(component, client);\n}\nexport function getUsageTelemetry(\n component: string,\n version = \"unknown\",\n product = \"sdk\",\n): UsageTelemetry {\n let client = clients.get(component);\n if (!client) {\n client = createNodeUsageTelemetry({\n context: {\n product,\n component,\n version,\n environment:\n process.env.KORTYX_USAGE_TELEMETRY_ENVIRONMENT === \"staging\"\n ? \"staging\"\n : \"production\",\n runtimeMode: process.env.CI\n ? \"ci\"\n : process.env.NODE_ENV === \"production\"\n ? \"production\"\n : process.env.NODE_ENV === \"development\"\n ? \"development\"\n : \"unknown\",\n },\n });\n clients.set(component, client);\n }\n return client;\n}\n\n/** Safe browser bootstrap: capture keys are public; no identity or secrets are returned. */\nexport function publicUsageConfiguration() {\n const key =\n process.env.KORTYX_USAGE_TELEMETRY_POSTHOG_KEY || RELEASE_POSTHOG_KEY;\n const host =\n process.env.KORTYX_USAGE_TELEMETRY_POSTHOG_HOST || RELEASE_POSTHOG_HOST;\n const endpoint = process.env.KORTYX_USAGE_TELEMETRY_ENDPOINT;\n let publicHost = RELEASE_POSTHOG_HOST;\n try {\n createPostHogTransport({ key: RELEASE_POSTHOG_KEY, host });\n publicHost = host;\n } catch {}\n let valid = true;\n try {\n if (endpoint) createCollectorTransport({ endpoint });\n else createPostHogTransport({ key, host });\n } catch {\n valid = false;\n }\n return {\n enabled: valid && !usageDisabled(),\n debug: process.env.KORTYX_USAGE_TELEMETRY_DEBUG === \"1\",\n environment:\n process.env.KORTYX_USAGE_TELEMETRY_ENVIRONMENT === \"staging\"\n ? (\"staging\" as const)\n : (\"production\" as const),\n // A mistakenly supplied personal token or credential-bearing URL must never reach HTML.\n key: valid && /^phc_[a-zA-Z0-9]+$/.test(key) ? key : \"\",\n host: publicHost,\n ...(valid && endpoint ? { endpoint } : {}),\n };\n}\n","/** Only public product facts belong here. Other distributions register their own catalog. */\nexport const operations = [\n \"sdk.initialize\",\n \"sdk.registry\",\n \"sdk.execute\",\n \"sdk.resume\",\n \"sdk.chat.admission\",\n \"sdk.execution\",\n \"sdk.response\",\n \"sdk.model\",\n \"sdk.tool\",\n \"sdk.node\",\n \"sdk.parallel\",\n \"sdk.child\",\n \"sdk.structured\",\n \"sdk.complete_response\",\n \"sdk.prompt.resolve\",\n \"sdk.prompt.refresh\",\n \"sdk.eval\",\n \"sdk.mcp.connect\",\n \"sdk.mcp.discover\",\n \"sdk.mcp.close\",\n \"sdk.checkpoint.read\",\n \"sdk.checkpoint.list\",\n \"sdk.checkpoint.fork\",\n \"sdk.checkpoint.rollback\",\n \"sdk.export\",\n \"studio.setup\",\n \"studio.connection\",\n \"studio.read\",\n \"studio.render\",\n \"studio.navigation\",\n \"studio.inspect\",\n \"studio.filter\",\n \"studio.saved_view\",\n \"studio.live\",\n \"studio.prompt\",\n \"studio.eval\",\n \"studio.review\",\n \"studio.settings\",\n \"studio.update\",\n \"studio.ingest\",\n \"cli.topology\",\n \"cli.eval\",\n] as const;\n\nexport type Outcome =\n | \"success\"\n | \"failed\"\n | \"cancelled\"\n | \"suspended\"\n | \"denied\"\n | \"limit_reached\"\n | \"quality_failed\"\n | \"ungraded\";\nexport const outcomes: readonly Outcome[] = [\n \"success\",\n \"failed\",\n \"cancelled\",\n \"suspended\",\n \"denied\",\n \"limit_reached\",\n \"quality_failed\",\n \"ungraded\",\n];\nexport type PropertyRule = \"boolean\" | readonly string[];\nexport interface UsageCatalog {\n products: readonly string[];\n operations: readonly string[];\n properties: Readonly<Record<string, PropertyRule>>;\n errorCodes: readonly string[];\n}\n\nexport const publicCatalog: UsageCatalog = {\n products: [\"sdk\", \"oss_studio\"],\n operations,\n properties: {\n phase: [\n \"admission\",\n \"execution\",\n \"delivery\",\n \"parse\",\n \"network\",\n \"http\",\n \"configuration\",\n \"preflight\",\n \"state\",\n \"pull\",\n \"ports\",\n \"compose\",\n \"rollback\",\n \"backup\",\n \"migration\",\n \"health\",\n ],\n source: [\n \"memory\",\n \"file\",\n \"custom\",\n \"local\",\n \"studio\",\n \"cache\",\n \"fallback\",\n \"eval\",\n \"mcp\",\n \"native\",\n ],\n storage: [\"in-memory\", \"redis\", \"postgres\", \"custom\"],\n calling_mode: [\"direct\", \"model\"],\n provider: [\n \"openai\",\n \"anthropic\",\n \"google\",\n \"mistral\",\n \"groq\",\n \"deepseek\",\n \"openrouter\",\n ],\n transport: [\"stdio\", \"sse\", \"http\", \"custom\"],\n format: [\n \"text\",\n \"json\",\n \"json_schema\",\n \"set\",\n \"append\",\n \"text-delta\",\n \"final\",\n ],\n resource: [\n \"runs\",\n \"sessions\",\n \"interrupts\",\n \"workflows\",\n \"prompts\",\n \"evals\",\n \"diagnostics\",\n \"settings\",\n \"home\",\n ],\n surface: [\n \"runs\",\n \"sessions\",\n \"interrupts\",\n \"workflows\",\n \"prompts\",\n \"evals\",\n \"settings\",\n \"other\",\n ],\n action: [\n \"view\",\n \"select\",\n \"retry\",\n \"first_use\",\n \"observed\",\n \"copy\",\n \"create\",\n \"draft\",\n \"save\",\n \"discard-draft\",\n \"update\",\n \"promote\",\n \"review\",\n \"policy\",\n \"tag-set\",\n \"tag-remove\",\n \"bulk-update\",\n \"category-create\",\n \"category-update\",\n \"category-delete\",\n \"group-create\",\n \"group-update\",\n \"group-delete\",\n \"import\",\n \"export\",\n \"launch\",\n \"cancel\",\n \"compare\",\n \"inspect\",\n \"clear\",\n \"apply\",\n \"delete\",\n \"enable\",\n \"disable\",\n \"manual_refresh\",\n \"fallback_refresh\",\n \"refresh\",\n \"change\",\n ],\n tab: [\n \"overview\",\n \"trace\",\n \"events\",\n \"model-io\",\n \"calls\",\n \"feedback\",\n \"content\",\n \"versions\",\n \"reviews\",\n \"usage\",\n \"diff\",\n \"cases\",\n \"results\",\n \"definition\",\n ],\n origin: [\"foreground\", \"background\", \"server\", \"browser\", \"cli\"],\n status: [\n \"empty\",\n \"nonempty\",\n \"off\",\n \"connecting\",\n \"live\",\n \"reconnecting\",\n \"paused\",\n \"running\",\n \"completed\",\n \"failed\",\n \"interrupted\",\n \"pending\",\n \"expired\",\n ],\n filter: [\n \"search\",\n \"status\",\n \"provider\",\n \"model\",\n \"environment\",\n \"version\",\n \"duration\",\n \"cost\",\n \"tokens\",\n \"time\",\n \"sort\",\n \"other\",\n ],\n scale: [\"1\", \"2-5\", \"6-20\", \"21-100\", \"101+\"],\n error_category: [\n \"configuration\",\n \"provider\",\n \"validation\",\n \"domain\",\n \"workflow\",\n \"persistence\",\n \"request\",\n \"transport\",\n \"internal\",\n \"unknown\",\n ],\n http_status: [\n \"400\",\n \"401\",\n \"403\",\n \"404\",\n \"409\",\n \"413\",\n \"422\",\n \"429\",\n \"500\",\n \"502\",\n \"503\",\n \"504\",\n ],\n prompts: \"boolean\",\n data_reducers: \"boolean\",\n observability: \"boolean\",\n tools: \"boolean\",\n streaming: \"boolean\",\n requested_streaming: \"boolean\",\n executed: \"boolean\",\n cache: \"boolean\",\n reused: \"boolean\",\n continue_on_disconnect: \"boolean\",\n write_available: \"boolean\",\n },\n // Built-in contracts only; application codes and provider response text are excluded.\n errorCodes: [\n \"EXECUTION_FAILED\",\n \"INVALID_REQUEST\",\n \"INVALID_RESUME\",\n \"INVALID_RESPONSE\",\n \"INVALID_SESSION\",\n \"RESUME_MISMATCH\",\n \"RESUME_FAILED\",\n \"CONTRACT_MISMATCH\",\n \"INVALID_INPUT\",\n \"INVALID_OUTPUT\",\n \"MISSING_CONTRACT\",\n \"UNKNOWN_WORKFLOW\",\n \"DOMAIN_ERROR\",\n \"PERSISTENCE_ERROR\",\n \"WORKFLOW_CONTRACT_ERROR\",\n \"WORKFLOW_REDUCER_FAILED\",\n \"PROVIDER_REFUSAL\",\n \"PROVIDER_HTTP_ERROR\",\n \"PROVIDER_INVALID_RESPONSE\",\n \"PROVIDER_TRANSPORT_ERROR\",\n \"PROVIDER_REQUEST_FAILED\",\n \"INVALID_MODEL_JSON\",\n \"MODEL_OUTPUT_SCHEMA\",\n \"OUTPUT_TRUNCATED\",\n \"SCHEMA_VALIDATION\",\n \"PARALLEL_FAILED\",\n \"EVAL_TIMEOUT\",\n \"EVAL_HOOK_FAILED\",\n \"EVAL_INTERRUPT_CLEANUP_FAILED\",\n \"PROMPT_SOURCE_NOT_CONFIGURED\",\n \"PROMPT_REASON_CONFLICT\",\n \"PROMPT_REASON_INVALID\",\n \"REASON_OUTPUT_BUDGET_EXHAUSTED\",\n \"REASON_OUTPUT_CONTRACT_CORRECTION_EXHAUSTED\",\n \"PROMPT_CACHE_INVALID\",\n \"PROMPT_ENVIRONMENT_MISMATCH\",\n \"PROMPT_EVAL_PIN_CONFLICT\",\n \"PROMPT_EVAL_SNAPSHOT_INVALID\",\n \"PROMPT_NOT_ASSIGNED\",\n \"PROMPT_NOT_FOUND\",\n \"PROMPT_NOT_REGISTERED\",\n \"PROMPT_PIN_MISMATCH\",\n \"PROMPT_REFERENCE_DUPLICATE\",\n \"PROMPT_SNAPSHOT_INVALID\",\n \"PROMPT_SNAPSHOT_LIMIT\",\n \"PROMPT_SOURCE_HTTP\",\n \"PROMPT_SOURCE_INVALID\",\n \"PROMPT_TAG_MISMATCH\",\n \"PROMPT_CONTRACT_MISMATCH\",\n \"PROMPT_REFERENCE_INVALID\",\n \"PROMPT_SCHEMA_INVALID\",\n \"PROMPT_VARIABLE_CONFIG_OVERLAP\",\n \"PROMPT_VARIABLE_MISSING\",\n \"PROMPT_VARIABLE_UNKNOWN\",\n \"PROMPT_DEPENDENCY_CYCLE\",\n \"PROMPT_DEPENDENCY_MISMATCH\",\n \"PROMPT_HASH_MISMATCH\",\n \"PROMPT_REFERENCE_LIMIT\",\n \"PROMPT_REFERENCE_MISSING\",\n \"PROMPT_REFERENCE_ROLE\",\n \"STUDIO_PROTOCOL_MISMATCH\",\n ],\n};\n\nexport function scale(value: number): string {\n return value <= 1\n ? \"1\"\n : value <= 5\n ? \"2-5\"\n : value <= 20\n ? \"6-20\"\n : value <= 100\n ? \"21-100\"\n : \"101+\";\n}\n","import {\n type Outcome,\n outcomes,\n publicCatalog,\n type UsageCatalog,\n} from \"./catalog\";\n\nexport type UsageProperties = Readonly<Record<string, unknown>>;\nexport interface UsageContext {\n product: string;\n component: string;\n version: string;\n environment?: \"production\" | \"staging\";\n identityScope?: \"installation\" | \"browser\" | \"process\";\n runtimeMode?: \"development\" | \"production\" | \"ci\" | \"unknown\";\n}\nexport interface UsageRecord {\n schema_version: 1;\n event_id: string;\n timestamp: string;\n event: \"usage.operation\" | \"usage.feature\";\n product: string;\n component: string;\n version: string;\n analytics_environment: \"production\" | \"staging\";\n runtime_mode: string;\n identity_scope: \"installation\" | \"browser\" | \"process\";\n operation: string;\n outcome: Outcome;\n properties: Record<string, string | boolean>;\n count: number;\n duration_total_ms: number;\n duration_buckets: number[];\n}\nexport type UsageTransport = (\n records: readonly UsageRecord[],\n identity: string,\n) => Promise<void>;\nexport interface UsageOptions {\n context: UsageContext;\n catalog?: UsageCatalog;\n enabled?: () => boolean;\n debug?: () => boolean;\n inspect?: (records: readonly UsageRecord[]) => void;\n identity: () =>\n | string\n | { id: string; scope: \"installation\" | \"browser\" | \"process\" }\n | Promise<\n string | { id: string; scope: \"installation\" | \"browser\" | \"process\" }\n >;\n transport: UsageTransport;\n now?: () => number;\n schedule?: (callback: () => void, ms: number) => { cancel(): void };\n flushIntervalMs?: number;\n maxGroups?: number;\n maxRecordsPerHour?: number;\n}\nexport interface UsageOperation {\n end(outcome?: Outcome, properties?: UsageProperties): void;\n fail(error: unknown, properties?: UsageProperties): void;\n}\nexport interface UsageTelemetry {\n start(operation: string, properties?: UsageProperties): UsageOperation;\n feature(operation: string, properties?: UsageProperties): void;\n measure<T>(\n operation: string,\n callback: () => T | Promise<T>,\n properties?: UsageProperties,\n outcome?: (value: T) => Outcome,\n ): Promise<T>;\n flush(): Promise<void>;\n dispose(): void;\n stats(): { pending: number; dropped: number; delivered: number };\n}\n\n/** Do not invoke arbitrary getters while classifying application errors. */\nfunction property(value: unknown, key: string): unknown {\n try {\n if (!value || typeof value !== \"object\") return undefined;\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n return descriptor && \"value\" in descriptor ? descriptor.value : undefined;\n } catch {\n return undefined;\n }\n}\nexport function classifyUsageError(\n error: unknown,\n catalog = publicCatalog,\n): { outcome: Outcome; properties: UsageProperties } {\n const name = property(error, \"name\");\n const code =\n property(error, \"code\") ?? property(property(error, \"failure\"), \"code\");\n if (name === \"AbortError\" || code === \"EXECUTION_CANCELLED\")\n return { outcome: \"cancelled\", properties: {} };\n if (code === \"EXECUTION_LIMIT_REACHED\" || name === \"ExecutionLimitReached\")\n return { outcome: \"limit_reached\", properties: {} };\n if (\n name === \"GraphInterrupt\" ||\n name === \"NodeInterrupt\" ||\n name === \"Interrupt\"\n )\n return { outcome: \"suspended\", properties: {} };\n const known = typeof code === \"string\" && catalog.errorCodes.includes(code);\n const category =\n known && code !== \"EXECUTION_FAILED\"\n ? (property(error, \"category\") ??\n property(property(error, \"failure\"), \"category\") ??\n \"unknown\")\n : \"unknown\";\n const status =\n property(error, \"status\") ?? property(property(error, \"failure\"), \"status\");\n return {\n outcome: \"failed\",\n properties: {\n error_code: known ? code : \"other\",\n error_category: category,\n ...(typeof status === \"number\" ? { http_status: String(status) } : {}),\n },\n };\n}\n\nexport function sanitizeProperties(\n input: UsageProperties,\n catalog = publicCatalog,\n): Record<string, string | boolean> {\n const safe: Record<string, string | boolean> = {};\n for (const [key, rule] of Object.entries(catalog.properties)) {\n const value = property(input, key);\n if (value === undefined) continue;\n if (rule === \"boolean\") {\n if (typeof value === \"boolean\") safe[key] = value;\n } else if (typeof value === \"string\")\n safe[key] = rule.includes(value) ? value : \"other\";\n }\n const code = property(input, \"error_code\");\n if (typeof code === \"string\")\n safe.error_code = catalog.errorCodes.includes(code) ? code : \"other\";\n return safe;\n}\n\nconst durationBounds = [10, 100, 1000, 10000, 60000];\nconst noopOperation: UsageOperation = { end() {}, fail() {} };\nfunction schedule(callback: () => void, ms: number) {\n const timer = setTimeout(callback, ms);\n (timer as unknown as { unref?: () => void }).unref?.();\n return { cancel: () => clearTimeout(timer) };\n}\nexport function createUsageTelemetry(options: UsageOptions): UsageTelemetry {\n const catalog = options.catalog ?? publicCatalog;\n const now = options.now ?? Date.now;\n const pending = new Map<string, UsageRecord>();\n let timer: { cancel(): void } | undefined;\n let flight: Promise<void> | undefined;\n let disposed = false;\n let dropped = 0;\n let delivered = 0;\n let hour = Math.floor(now() / 3_600_000);\n let sent = 0;\n const active = () => {\n try {\n return !disposed && (options.enabled?.() ?? true);\n } catch {\n return false;\n }\n };\n const clear = () => {\n pending.clear();\n try {\n timer?.cancel();\n } catch {}\n timer = undefined;\n };\n const configured =\n catalog.products.includes(options.context.product) &&\n /^[a-z][a-z0-9_]{0,31}$/.test(options.context.component) &&\n /^(?:\\d+\\.\\d+\\.\\d+(?:-[a-z0-9.-]+)?|development|unknown)$/.test(\n options.context.version,\n ) &&\n options.context.version.length <= 64;\n\n const flush = async (): Promise<void> => {\n if (flight) return flight;\n if (!active() || !configured) {\n clear();\n return;\n }\n try {\n timer?.cancel();\n } catch {}\n timer = undefined;\n const records = [...pending.values()];\n pending.clear();\n if (!records.length) return;\n let attempted = records.length;\n flight = (async () => {\n try {\n if (options.debug?.()) {\n options.inspect?.(records);\n return;\n }\n const currentHour = Math.floor(now() / 3_600_000);\n if (hour !== currentHour) {\n hour = currentHour;\n sent = 0;\n }\n const allowance = Math.max(\n 0,\n (options.maxRecordsPerHour ?? 120) - sent,\n );\n const batch = records.slice(0, allowance);\n dropped += records.length - batch.length;\n attempted = batch.length;\n if (!batch.length || !active()) return;\n const identified = await options.identity();\n const identity =\n typeof identified === \"string\" ? identified : identified.id;\n if (typeof identified !== \"string\")\n for (const record of batch) record.identity_scope = identified.scope;\n if (!active() || options.debug?.()) return;\n if (\n !/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(\n identity,\n )\n ) {\n dropped += batch.length;\n return;\n }\n sent += batch.length;\n await options.transport(batch, identity);\n delivered += batch.length;\n } catch {\n dropped += attempted;\n }\n })().finally(() => {\n flight = undefined;\n try {\n if (pending.size && active() && !timer)\n timer = (options.schedule ?? schedule)(\n () => void flush(),\n options.flushIntervalMs ?? 60_000,\n );\n } catch {\n clear();\n }\n });\n return flight;\n };\n\n const record = (\n event: UsageRecord[\"event\"],\n operation: string,\n outcome: Outcome,\n duration: number,\n input: UsageProperties,\n ) => {\n try {\n if (!active()) {\n clear();\n return;\n }\n if (\n !configured ||\n !catalog.operations.includes(operation) ||\n !outcomes.includes(outcome)\n )\n return;\n const properties = sanitizeProperties(input, catalog);\n const key = JSON.stringify([event, operation, outcome, properties]);\n let existing = pending.get(key);\n if (!existing) {\n if (pending.size >= (options.maxGroups ?? 64)) {\n dropped++;\n return;\n }\n existing = {\n schema_version: 1,\n event_id: crypto.randomUUID(),\n timestamp: new Date(now()).toISOString(),\n event,\n product: options.context.product,\n component: options.context.component,\n version: options.context.version,\n analytics_environment: options.context.environment ?? \"production\",\n runtime_mode: options.context.runtimeMode ?? \"unknown\",\n identity_scope: options.context.identityScope ?? \"installation\",\n operation,\n outcome,\n properties,\n count: 0,\n duration_total_ms: 0,\n duration_buckets: [0, 0, 0, 0, 0, 0],\n };\n pending.set(key, existing);\n }\n const elapsed = Math.max(\n 0,\n Math.min(86_400_000, Number.isFinite(duration) ? duration : 0),\n );\n existing.count = Math.min(Number.MAX_SAFE_INTEGER, existing.count + 1);\n existing.duration_total_ms = Math.min(\n Number.MAX_SAFE_INTEGER,\n existing.duration_total_ms + elapsed,\n );\n const index = durationBounds.findIndex((bound) => elapsed <= bound);\n const bucket = index === -1 ? durationBounds.length : index;\n existing.duration_buckets[bucket] =\n (existing.duration_buckets[bucket] ?? 0) + 1;\n if (!timer)\n timer = (options.schedule ?? schedule)(\n () => void flush(),\n options.flushIntervalMs ?? 60_000,\n );\n } catch {\n /* Usage collection cannot participate in product execution. */\n }\n };\n const start = (\n operation: string,\n properties: UsageProperties = {},\n ): UsageOperation => {\n if (!active()) {\n clear();\n return noopOperation;\n }\n try {\n const initial = sanitizeProperties(properties, catalog);\n const began = now();\n let ended = false;\n return {\n end(outcome = \"success\", extra = {}) {\n if (ended) return;\n ended = true;\n try {\n record(\"usage.operation\", operation, outcome, now() - began, {\n ...initial,\n ...sanitizeProperties(extra, catalog),\n });\n } catch {}\n },\n fail(error, extra = {}) {\n if (ended) return;\n try {\n const failure = classifyUsageError(error, catalog);\n this.end(failure.outcome, {\n ...sanitizeProperties(extra, catalog),\n ...failure.properties,\n });\n } catch {}\n },\n };\n } catch {\n return noopOperation;\n }\n };\n return {\n start,\n feature(operation, properties = {}) {\n record(\"usage.feature\", operation, \"success\", 0, properties);\n },\n async measure(operation, callback, properties = {}, outcome) {\n const operationScope = start(operation, properties);\n try {\n const result = await callback();\n let status: Outcome = \"success\";\n try {\n status = outcome?.(result) ?? status;\n } catch {}\n operationScope.end(status);\n return result;\n } catch (error) {\n operationScope.fail(error);\n throw error;\n }\n },\n flush,\n dispose() {\n disposed = true;\n clear();\n },\n stats: () => ({ pending: pending.size, dropped, delivered }),\n };\n}\n","// Public ingestion key only. Personal API tokens must never be bundled.\nexport const RELEASE_POSTHOG_KEY =\n \"phc_xdiyTz8ezvRoCWFVefMELsEoULSWnxts6DnTqkaKiE5E\";\nexport const RELEASE_POSTHOG_HOST = \"https://eu.i.posthog.com\";\n","import type { UsageTransport } from \"./client\";\n\n/** Capture keys are public. This transport never accepts a personal API token. */\nexport function createPostHogTransport(options: {\n key: string;\n host?: string;\n fetch?: typeof fetch;\n timeoutMs?: number;\n}): UsageTransport {\n if (!/^phc_[a-zA-Z0-9]+$/.test(options.key))\n throw new Error(\"Usage telemetry requires a public PostHog capture key.\");\n const host = new URL(options.host ?? \"https://eu.i.posthog.com\");\n if (host.username || host.password || host.search || host.hash)\n throw new Error(\n \"Usage endpoint must not contain credentials or query parameters.\",\n );\n if (\n host.protocol !== \"https:\" &&\n host.hostname !== \"localhost\" &&\n host.hostname !== \"127.0.0.1\"\n )\n throw new Error(\"Usage telemetry requires HTTPS.\");\n return async (records, identity) => {\n const batch = records.map((record) => ({\n event: record.event,\n timestamp: record.timestamp,\n distinct_id: identity,\n uuid: record.event_id,\n properties: {\n ...record.properties,\n schema_version: record.schema_version,\n product: record.product,\n component: record.component,\n version: record.version,\n analytics_environment: record.analytics_environment,\n runtime_mode: record.runtime_mode,\n identity_scope: record.identity_scope,\n operation: record.operation,\n outcome: record.outcome,\n count: record.count,\n duration_total_ms: record.duration_total_ms,\n duration_buckets: record.duration_buckets,\n $process_person_profile: false,\n $geoip_disable: true,\n $ip: null,\n },\n }));\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n options.timeoutMs ?? 2000,\n );\n (timeout as unknown as { unref?: () => void }).unref?.();\n try {\n const response = await (options.fetch ?? globalThis.fetch)(\n new URL(\"/batch/\", host),\n {\n method: \"POST\",\n credentials: \"omit\",\n referrerPolicy: \"no-referrer\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ api_key: options.key, batch }),\n signal: controller.signal,\n },\n );\n await response.body?.cancel();\n if (!response.ok) throw new Error(\"Usage delivery failed.\");\n } finally {\n clearTimeout(timeout);\n }\n };\n}\n\nexport function createCollectorTransport(options: {\n endpoint: string;\n fetch?: typeof fetch;\n}): UsageTransport {\n const endpoint = new URL(options.endpoint);\n if (\n endpoint.username ||\n endpoint.password ||\n endpoint.search ||\n endpoint.hash\n )\n throw new Error(\n \"Usage endpoint must not contain credentials or query parameters.\",\n );\n if (\n endpoint.protocol !== \"https:\" &&\n ![\"localhost\", \"127.0.0.1\"].includes(endpoint.hostname)\n )\n throw new Error(\"Usage telemetry requires HTTPS.\");\n return async (records, identity) => {\n const response = await (options.fetch ?? globalThis.fetch)(endpoint, {\n method: \"POST\",\n credentials: \"omit\",\n referrerPolicy: \"no-referrer\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ identity, records }),\n signal: AbortSignal.timeout(2000),\n });\n await response.body?.cancel();\n if (!response.ok) throw new Error(\"Usage delivery failed.\");\n };\n}\n"],"mappings":"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","names":["identity","record","identity"]}
|
|
1
|
+
{"version":3,"sources":["../src/node.ts","../src/catalog.ts","../src/failure.ts","../src/measurement.ts","../src/client.ts","../src/release.ts","../src/transport.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n createUsageTelemetry,\n type UsageContext,\n type UsageOptions,\n type UsageTelemetry,\n} from \"./client\";\nimport { RELEASE_POSTHOG_HOST, RELEASE_POSTHOG_KEY } from \"./release\";\nimport { createCollectorTransport, createPostHogTransport } from \"./transport\";\n\nexport { scale } from \"./catalog\";\nexport { createUsageTelemetry, type UsageTelemetry } from \"./client\";\n\ntype InstallationIdentity = { id: string; scope: \"installation\" | \"process\" };\nlet identity: Promise<InstallationIdentity> | undefined;\nasync function installationIdentity(): Promise<InstallationIdentity> {\n const supplied = process.env.KORTYX_USAGE_TELEMETRY_ID;\n if (\n supplied &&\n /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(\n supplied,\n )\n )\n return { id: supplied, scope: \"installation\" };\n identity ??= (async () => {\n const directory = join(homedir(), \".config\", \"kortyx\");\n const file = join(directory, \"usage-id\");\n try {\n const existing = (await readFile(file, \"utf8\")).trim();\n if (\n /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(\n existing,\n )\n )\n return { id: existing, scope: \"installation\" };\n } catch {\n /* Read-only and ephemeral hosts use a process identity. */\n }\n const candidate = randomUUID();\n try {\n await mkdir(directory, { recursive: true, mode: 0o700 });\n const handle = await open(file, \"wx\", 0o600);\n try {\n await handle.writeFile(candidate);\n } finally {\n await handle.close();\n }\n return { id: candidate, scope: \"installation\" };\n } catch {\n try {\n const winner = (await readFile(file, \"utf8\")).trim();\n if (\n /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(\n winner,\n )\n )\n return { id: winner, scope: \"installation\" };\n } catch {}\n return { id: candidate, scope: \"process\" };\n }\n })();\n return identity;\n}\n\n/** Deliberate operator labels; unknown does not mean an external customer. */\nexport function runtimeUsageContext(): Required<\n Pick<UsageContext, \"runtimeMode\" | \"trafficSource\">\n> {\n const traffic = process.env.KORTYX_USAGE_TELEMETRY_TRAFFIC_SOURCE;\n return {\n runtimeMode:\n process.env.CI && ![\"0\", \"false\"].includes(process.env.CI.toLowerCase())\n ? (\"ci\" as const)\n : process.env.NODE_ENV === \"production\"\n ? (\"production\" as const)\n : process.env.NODE_ENV === \"development\"\n ? (\"development\" as const)\n : (\"unknown\" as const),\n trafficSource:\n traffic === \"internal\" ||\n traffic === \"synthetic\" ||\n traffic === \"external\"\n ? traffic\n : (\"unknown\" as const),\n };\n}\n\nexport function usageDisabled(): boolean {\n return (\n [\"1\", \"true\"].includes(process.env.KORTYX_USAGE_TELEMETRY_DISABLED ?? \"\") ||\n process.env.NODE_ENV === \"test\"\n );\n}\nexport function createNodeUsageTelemetry(\n options: Pick<UsageOptions, \"context\"> &\n Partial<Omit<UsageOptions, \"context\">>,\n): UsageTelemetry {\n const env = process.env;\n let transport = options.transport;\n let valid = true;\n if (!transport) {\n try {\n transport = env.KORTYX_USAGE_TELEMETRY_ENDPOINT\n ? createCollectorTransport({\n endpoint: env.KORTYX_USAGE_TELEMETRY_ENDPOINT,\n })\n : createPostHogTransport({\n key: env.KORTYX_USAGE_TELEMETRY_POSTHOG_KEY || RELEASE_POSTHOG_KEY,\n host:\n env.KORTYX_USAGE_TELEMETRY_POSTHOG_HOST || RELEASE_POSTHOG_HOST,\n });\n } catch {\n valid = false;\n transport = async () => {};\n }\n }\n return createUsageTelemetry({\n ...options,\n context: {\n ...options.context,\n runtimeMode:\n options.context.runtimeMode ?? runtimeUsageContext().runtimeMode,\n trafficSource:\n options.context.trafficSource ?? runtimeUsageContext().trafficSource,\n },\n transport,\n identity: options.identity ?? installationIdentity,\n enabled: () => valid && !usageDisabled() && (options.enabled?.() ?? true),\n debug: () =>\n env.KORTYX_USAGE_TELEMETRY_DEBUG === \"1\" || (options.debug?.() ?? false),\n inspect:\n options.inspect ??\n ((records) => console.error(\"[kortyx:usage]\", JSON.stringify(records))),\n });\n}\n\nconst clients = new Map<string, UsageTelemetry>();\n/** Flush registered component replacements without adding another emitter. */\nexport async function flushUsageTelemetry(): Promise<void> {\n await Promise.all([...clients.values()].map((client) => client.flush()));\n}\n\n/** Override a component client in another distribution or in an embedding application. */\nexport function configureUsageTelemetry(\n component: string,\n client: UsageTelemetry,\n): void {\n if (clients.get(component) === client) return;\n clients.get(component)?.dispose();\n clients.set(component, client);\n}\nexport function getUsageTelemetry(\n component: string,\n version = \"unknown\",\n product = \"sdk\",\n): UsageTelemetry {\n let client = clients.get(component);\n if (!client) {\n client = createNodeUsageTelemetry({\n context: {\n product,\n component,\n version,\n environment:\n process.env.KORTYX_USAGE_TELEMETRY_ENVIRONMENT === \"staging\"\n ? \"staging\"\n : \"production\",\n ...runtimeUsageContext(),\n },\n });\n clients.set(component, client);\n }\n return client;\n}\n\n/** Safe browser bootstrap: capture keys are public; no identity or secrets are returned. */\nexport function publicUsageConfiguration() {\n const key =\n process.env.KORTYX_USAGE_TELEMETRY_POSTHOG_KEY || RELEASE_POSTHOG_KEY;\n const host =\n process.env.KORTYX_USAGE_TELEMETRY_POSTHOG_HOST || RELEASE_POSTHOG_HOST;\n const endpoint = process.env.KORTYX_USAGE_TELEMETRY_ENDPOINT;\n let publicHost = RELEASE_POSTHOG_HOST;\n try {\n createPostHogTransport({ key: RELEASE_POSTHOG_KEY, host });\n publicHost = host;\n } catch {}\n let valid = true;\n try {\n if (endpoint) createCollectorTransport({ endpoint });\n else createPostHogTransport({ key, host });\n } catch {\n valid = false;\n }\n return {\n enabled: valid && !usageDisabled(),\n ...runtimeUsageContext(),\n debug: process.env.KORTYX_USAGE_TELEMETRY_DEBUG === \"1\",\n environment:\n process.env.KORTYX_USAGE_TELEMETRY_ENVIRONMENT === \"staging\"\n ? (\"staging\" as const)\n : (\"production\" as const),\n // A mistakenly supplied personal token or credential-bearing URL must never reach HTML.\n key: valid && /^phc_[a-zA-Z0-9]+$/.test(key) ? key : \"\",\n host: publicHost,\n ...(valid && endpoint ? { endpoint } : {}),\n };\n}\n","/** Only public product facts belong here. Other distributions register their own catalog. */\nexport const operations = [\n \"sdk.initialize\",\n \"sdk.registry\",\n \"sdk.execute\",\n \"sdk.resume\",\n \"sdk.chat.admission\",\n \"sdk.execution\",\n \"sdk.response\",\n \"sdk.model\",\n \"sdk.tool\",\n \"sdk.node\",\n \"sdk.parallel\",\n \"sdk.child\",\n \"sdk.structured\",\n \"sdk.complete_response\",\n \"sdk.prompt.resolve\",\n \"sdk.prompt.refresh\",\n \"sdk.eval\",\n \"sdk.mcp.connect\",\n \"sdk.mcp.discover\",\n \"sdk.mcp.close\",\n \"sdk.checkpoint.read\",\n \"sdk.checkpoint.list\",\n \"sdk.checkpoint.fork\",\n \"sdk.checkpoint.rollback\",\n \"sdk.export\",\n \"studio.setup\",\n \"studio.connection\",\n \"studio.read\",\n \"studio.render\",\n \"studio.navigation\",\n \"studio.inspect\",\n \"studio.filter\",\n \"studio.saved_view\",\n \"studio.live\",\n \"studio.prompt\",\n \"studio.eval\",\n \"studio.review\",\n \"studio.settings\",\n \"studio.update\",\n \"studio.ingest\",\n \"cli.command\",\n \"studio.eval.execution\",\n \"studio.diagnostic\",\n \"studio.table.layout\",\n \"cli.topology\",\n \"cli.eval\",\n] as const;\n\nexport type Outcome =\n | \"success\"\n | \"failed\"\n | \"cancelled\"\n | \"suspended\"\n | \"denied\"\n | \"limit_reached\"\n | \"quality_failed\"\n | \"ungraded\";\nexport const outcomes: readonly Outcome[] = [\n \"success\",\n \"failed\",\n \"cancelled\",\n \"suspended\",\n \"denied\",\n \"limit_reached\",\n \"quality_failed\",\n \"ungraded\",\n];\nexport type PropertyRule = \"boolean\" | readonly string[];\nexport interface UsageCatalog {\n products: readonly string[];\n operations: readonly string[];\n properties: Readonly<Record<string, PropertyRule>>;\n errorCodes: readonly string[];\n}\n\nexport const publicCatalog: UsageCatalog = {\n products: [\"sdk\", \"oss_studio\", \"cli\"],\n operations,\n properties: {\n measurement_version: [\"2\"],\n measurement_kind: [\n \"invocation\",\n \"stage\",\n \"execution\",\n \"attempt\",\n \"chunk\",\n \"output\",\n \"update\",\n \"poll\",\n \"request\",\n \"call\",\n \"feature\",\n \"observation\",\n ],\n traffic_source: [\"internal\", \"synthetic\", \"external\", \"unknown\"],\n layout_action: [\n \"visibility\",\n \"show_all\",\n \"reset\",\n \"apply\",\n \"reset_width\",\n \"pin\",\n \"unpin\",\n \"resize\",\n \"reorder\",\n ],\n eval_phase: [\n \"params\",\n \"setup\",\n \"execute\",\n \"responder\",\n \"reference\",\n \"grading\",\n \"verification\",\n \"cleanup\",\n \"reporting\",\n ],\n cli_resource: [\"evals.runs\", \"evals.suites\"],\n retryable: \"boolean\",\n retried: \"boolean\",\n recovered: \"boolean\",\n retry_attempt: [\"1\", \"2-5\", \"6-20\", \"21-100\", \"101+\"],\n batch_size: [\"1\", \"2-5\", \"6-20\", \"21-100\", \"101+\"],\n http_status_class: [\"1xx\", \"2xx\", \"3xx\", \"4xx\", \"5xx\"],\n cause_category: [\n \"configuration\",\n \"provider\",\n \"validation\",\n \"domain\",\n \"workflow\",\n \"persistence\",\n \"request\",\n \"transport\",\n \"internal\",\n \"unknown\",\n ],\n cli_command: [\n \"studio.start\",\n \"studio.stop\",\n \"studio.restart\",\n \"studio.status\",\n \"studio.logs\",\n \"studio.credentials\",\n \"studio.reset\",\n \"studio.prompts\",\n \"studio.evals\",\n \"studio.runs\",\n \"studio.sessions\",\n \"studio.interrupts\",\n \"studio.workflows\",\n \"studio.diagnostics\",\n \"studio.inspect\",\n \"studio.doctor\",\n \"studio.catalogs\",\n \"connections\",\n \"evals.run\",\n \"evals.list\",\n \"topology.push\",\n \"help\",\n \"unknown\",\n ],\n cli_action: [\n \"start\",\n \"stop\",\n \"restart\",\n \"status\",\n \"logs\",\n \"credentials\",\n \"reset\",\n \"run\",\n \"list\",\n \"get\",\n \"show\",\n \"inspect\",\n \"analyze\",\n \"download\",\n \"doctor\",\n \"cancel\",\n \"compare\",\n \"create\",\n \"update\",\n \"delete\",\n \"import\",\n \"export\",\n \"pull\",\n \"push\",\n \"add\",\n \"remove\",\n \"use\",\n \"verify\",\n \"versions\",\n \"diff\",\n \"validate\",\n \"action\",\n \"tag\",\n \"untag\",\n \"rollback\",\n \"promote\",\n \"archive\",\n \"restore\",\n \"test\",\n \"copy\",\n \"apply\",\n \"wait\",\n \"catalogs\",\n \"help\",\n \"unknown\",\n ],\n dry_run: \"boolean\",\n json_output: \"boolean\",\n settings_override: \"boolean\",\n case_timeout_override: \"boolean\",\n run_timeout_override: \"boolean\",\n phase: [\n \"admission\",\n \"execution\",\n \"delivery\",\n \"parse\",\n \"network\",\n \"http\",\n \"configuration\",\n \"preflight\",\n \"state\",\n \"pull\",\n \"ports\",\n \"compose\",\n \"rollback\",\n \"backup\",\n \"migration\",\n \"health\",\n ],\n source: [\n \"memory\",\n \"file\",\n \"custom\",\n \"local\",\n \"studio\",\n \"cache\",\n \"fallback\",\n \"eval\",\n \"mcp\",\n \"native\",\n ],\n storage: [\"in-memory\", \"redis\", \"postgres\", \"custom\"],\n calling_mode: [\"direct\", \"model\"],\n provider: [\n \"openai\",\n \"anthropic\",\n \"google\",\n \"mistral\",\n \"groq\",\n \"deepseek\",\n \"openrouter\",\n ],\n transport: [\"stdio\", \"sse\", \"http\", \"custom\"],\n format: [\n \"text\",\n \"json\",\n \"json_schema\",\n \"set\",\n \"append\",\n \"text-delta\",\n \"final\",\n ],\n resource: [\n \"runs\",\n \"sessions\",\n \"interrupts\",\n \"workflows\",\n \"prompts\",\n \"evals\",\n \"diagnostics\",\n \"settings\",\n \"home\",\n ],\n surface: [\n \"runs\",\n \"sessions\",\n \"interrupts\",\n \"workflows\",\n \"prompts\",\n \"evals\",\n \"settings\",\n \"other\",\n ],\n action: [\n \"view\",\n \"select\",\n \"retry\",\n \"first_use\",\n \"observed\",\n \"copy\",\n \"create\",\n \"draft\",\n \"save\",\n \"discard-draft\",\n \"update\",\n \"promote\",\n \"review\",\n \"policy\",\n \"tag-set\",\n \"tag-remove\",\n \"bulk-update\",\n \"category-create\",\n \"category-update\",\n \"category-delete\",\n \"group-create\",\n \"group-update\",\n \"group-delete\",\n \"import\",\n \"export\",\n \"launch\",\n \"cancel\",\n \"compare\",\n \"inspect\",\n \"clear\",\n \"apply\",\n \"delete\",\n \"enable\",\n \"disable\",\n \"manual_refresh\",\n \"fallback_refresh\",\n \"refresh\",\n \"change\",\n ],\n tab: [\n \"overview\",\n \"trace\",\n \"events\",\n \"model-io\",\n \"calls\",\n \"feedback\",\n \"content\",\n \"versions\",\n \"reviews\",\n \"usage\",\n \"diff\",\n \"cases\",\n \"results\",\n \"definition\",\n ],\n origin: [\"foreground\", \"background\", \"server\", \"browser\", \"cli\"],\n status: [\n \"empty\",\n \"nonempty\",\n \"off\",\n \"connecting\",\n \"live\",\n \"reconnecting\",\n \"paused\",\n \"running\",\n \"completed\",\n \"failed\",\n \"interrupted\",\n \"pending\",\n \"expired\",\n ],\n match: [\"all\", \"any\"],\n filter: [\n \"search\",\n \"status\",\n \"provider\",\n \"model\",\n \"environment\",\n \"version\",\n \"duration\",\n \"cost\",\n \"tokens\",\n \"time\",\n \"sort\",\n \"other\",\n ],\n scale: [\"1\", \"2-5\", \"6-20\", \"21-100\", \"101+\"],\n error_category: [\n \"configuration\",\n \"provider\",\n \"validation\",\n \"domain\",\n \"workflow\",\n \"persistence\",\n \"request\",\n \"transport\",\n \"internal\",\n \"unknown\",\n ],\n http_status: [\n \"400\",\n \"401\",\n \"403\",\n \"404\",\n \"408\",\n \"409\",\n \"413\",\n \"422\",\n \"429\",\n \"500\",\n \"502\",\n \"503\",\n \"504\",\n ],\n prompts: \"boolean\",\n data_reducers: \"boolean\",\n observability: \"boolean\",\n tools: \"boolean\",\n streaming: \"boolean\",\n requested_streaming: \"boolean\",\n executed: \"boolean\",\n cache: \"boolean\",\n reused: \"boolean\",\n continue_on_disconnect: \"boolean\",\n write_available: \"boolean\",\n },\n // Built-in contracts only; application codes and provider response text are excluded.\n errorCodes: [\n \"UNCLASSIFIED_FAILURE\",\n \"HTTP_UNAUTHORIZED\",\n \"HTTP_FORBIDDEN\",\n \"HTTP_NOT_FOUND\",\n \"HTTP_TIMEOUT\",\n \"HTTP_CONFLICT\",\n \"HTTP_TOO_LARGE\",\n \"HTTP_RATE_LIMITED\",\n \"HTTP_SERVER_ERROR\",\n \"HTTP_INVALID_REQUEST\",\n \"NETWORK_DNS_FAILED\",\n \"NETWORK_CONNECTION_REFUSED\",\n \"NETWORK_CONNECTION_RESET\",\n \"NETWORK_TIMEOUT\",\n \"NETWORK_TLS_FAILED\",\n \"CLI_ARGUMENT_INVALID\",\n \"CLI_EXIT_FAILED\",\n \"STUDIO_NOT_CONFIGURED\",\n \"STUDIO_RESPONSE_INVALID\",\n \"EVAL_CONCURRENCY_CHANGED\",\n \"EVAL_CONSUMER_FAILED\",\n \"EVAL_CONTRACT_CHANGED\",\n \"EVAL_DISCOVERY_REJECTED\",\n \"EVAL_EXECUTION_CONFLICT\",\n \"EVAL_EXECUTION_STORE_CHANGED\",\n \"EVAL_EXECUTION_UNKNOWN\",\n \"EVAL_EXECUTOR_BUSY\",\n \"EVAL_EXECUTOR_FAILED\",\n \"EVAL_EXECUTOR_REJECTED\",\n \"EVAL_EXECUTOR_UNAUTHORIZED\",\n \"EVAL_GRADING_FAILED\",\n \"EVAL_GRADING_TIMEOUT\",\n \"EVAL_JUDGE_UNAVAILABLE\",\n \"EVAL_LEASE_LOST\",\n \"EVAL_RETRY_DELAY_EXCEEDED\",\n \"EVAL_SETUP_TIMEOUT\",\n \"EVAL_TRANSPORT_UNAVAILABLE\",\n \"EVAL_VERIFICATION_TIMEOUT\",\n \"EVAL_RESULT_INVALID\",\n \"EVAL_RUN_TIMEOUT\",\n \"EVAL_SETTINGS_INVALID\",\n \"EXECUTION_FAILED\",\n \"INVALID_REQUEST\",\n \"INVALID_RESUME\",\n \"INVALID_RESPONSE\",\n \"INVALID_SESSION\",\n \"RESUME_MISMATCH\",\n \"RESUME_FAILED\",\n \"CONTRACT_MISMATCH\",\n \"INVALID_INPUT\",\n \"INVALID_OUTPUT\",\n \"MISSING_CONTRACT\",\n \"UNKNOWN_WORKFLOW\",\n \"DOMAIN_ERROR\",\n \"PERSISTENCE_ERROR\",\n \"WORKFLOW_CONTRACT_ERROR\",\n \"WORKFLOW_REDUCER_FAILED\",\n \"PROVIDER_REFUSAL\",\n \"PROVIDER_HTTP_ERROR\",\n \"PROVIDER_INVALID_RESPONSE\",\n \"PROVIDER_TRANSPORT_ERROR\",\n \"PROVIDER_REQUEST_FAILED\",\n \"INVALID_MODEL_JSON\",\n \"MODEL_OUTPUT_SCHEMA\",\n \"OUTPUT_TRUNCATED\",\n \"SCHEMA_VALIDATION\",\n \"PARALLEL_FAILED\",\n \"EVAL_TIMEOUT\",\n \"EVAL_HOOK_FAILED\",\n \"EVAL_INTERRUPT_CLEANUP_FAILED\",\n \"PROMPT_SOURCE_NOT_CONFIGURED\",\n \"PROMPT_REASON_CONFLICT\",\n \"PROMPT_REASON_INVALID\",\n \"REASON_OUTPUT_BUDGET_EXHAUSTED\",\n \"REASON_OUTPUT_CONTRACT_CORRECTION_EXHAUSTED\",\n \"PROMPT_CACHE_INVALID\",\n \"PROMPT_ENVIRONMENT_MISMATCH\",\n \"PROMPT_EVAL_PIN_CONFLICT\",\n \"PROMPT_EVAL_SNAPSHOT_INVALID\",\n \"PROMPT_NOT_ASSIGNED\",\n \"PROMPT_NOT_FOUND\",\n \"PROMPT_NOT_REGISTERED\",\n \"PROMPT_PIN_MISMATCH\",\n \"PROMPT_REFERENCE_DUPLICATE\",\n \"PROMPT_SNAPSHOT_INVALID\",\n \"PROMPT_SNAPSHOT_LIMIT\",\n \"PROMPT_SOURCE_HTTP\",\n \"PROMPT_SOURCE_INVALID\",\n \"PROMPT_TAG_MISMATCH\",\n \"PROMPT_CONTRACT_MISMATCH\",\n \"PROMPT_REFERENCE_INVALID\",\n \"PROMPT_SCHEMA_INVALID\",\n \"PROMPT_VARIABLE_CONFIG_OVERLAP\",\n \"PROMPT_VARIABLE_MISSING\",\n \"PROMPT_VARIABLE_UNKNOWN\",\n \"PROMPT_DEPENDENCY_CYCLE\",\n \"PROMPT_DEPENDENCY_MISMATCH\",\n \"PROMPT_HASH_MISMATCH\",\n \"PROMPT_REFERENCE_LIMIT\",\n \"PROMPT_REFERENCE_MISSING\",\n \"PROMPT_REFERENCE_ROLE\",\n \"STUDIO_PROTOCOL_MISMATCH\",\n ],\n};\n\nexport function scale(value: number): string {\n return value <= 1\n ? \"1\"\n : value <= 5\n ? \"2-5\"\n : value <= 20\n ? \"6-20\"\n : value <= 100\n ? \"21-100\"\n : \"101+\";\n}\n","import { type Outcome, publicCatalog, type UsageCatalog } from \"./catalog\";\n\n/** Inspect data fields only; never serialize or evaluate application errors. */\nexport function usageErrorProperty(value: unknown, key: string): unknown {\n try {\n if (!value || typeof value !== \"object\") return undefined;\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n return descriptor && \"value\" in descriptor ? descriptor.value : undefined;\n } catch {\n return undefined;\n }\n}\n\nconst networkCodes: Readonly<Record<string, string>> = {\n ENOTFOUND: \"NETWORK_DNS_FAILED\",\n EAI_AGAIN: \"NETWORK_DNS_FAILED\",\n ECONNREFUSED: \"NETWORK_CONNECTION_REFUSED\",\n ECONNRESET: \"NETWORK_CONNECTION_RESET\",\n EPIPE: \"NETWORK_CONNECTION_RESET\",\n ETIMEDOUT: \"NETWORK_TIMEOUT\",\n UND_ERR_CONNECT_TIMEOUT: \"NETWORK_TIMEOUT\",\n UND_ERR_HEADERS_TIMEOUT: \"NETWORK_TIMEOUT\",\n UND_ERR_BODY_TIMEOUT: \"NETWORK_TIMEOUT\",\n CERT_HAS_EXPIRED: \"NETWORK_TLS_FAILED\",\n DEPTH_ZERO_SELF_SIGNED_CERT: \"NETWORK_TLS_FAILED\",\n UNABLE_TO_VERIFY_LEAF_SIGNATURE: \"NETWORK_TLS_FAILED\",\n};\n\nexport type UsageFailure = {\n outcome: Outcome;\n properties: Record<string, string | boolean>;\n};\n\n/** HTTP facts only: no URL, response body, headers or error text is inspected. */\nexport function classifyUsageHttpStatus(status: number): UsageFailure {\n if (!Number.isInteger(status) || status < 100 || status > 599)\n return {\n outcome: \"failed\",\n properties: {\n error_code: \"UNCLASSIFIED_FAILURE\",\n error_category: \"unknown\",\n },\n };\n if (status < 400)\n return {\n outcome: \"success\",\n properties: { http_status_class: `${Math.floor(status / 100)}xx` },\n };\n const code =\n status === 401\n ? \"HTTP_UNAUTHORIZED\"\n : status === 403\n ? \"HTTP_FORBIDDEN\"\n : status === 404\n ? \"HTTP_NOT_FOUND\"\n : status === 408 || status === 504\n ? \"HTTP_TIMEOUT\"\n : status === 409\n ? \"HTTP_CONFLICT\"\n : status === 413\n ? \"HTTP_TOO_LARGE\"\n : status === 429\n ? \"HTTP_RATE_LIMITED\"\n : status >= 500\n ? \"HTTP_SERVER_ERROR\"\n : \"HTTP_INVALID_REQUEST\";\n return {\n outcome: \"failed\",\n properties: {\n error_code: code,\n error_category: status >= 500 || status === 408 ? \"transport\" : \"request\",\n http_status: String(status),\n http_status_class: `${Math.floor(status / 100)}xx`,\n retryable: status === 408 || status === 429 || status >= 500,\n },\n };\n}\n\nfunction nativeExceptionName(value: unknown): unknown {\n // Call the platform's brand-checked getter, never a value's custom getter.\n try {\n if (typeof DOMException !== \"undefined\")\n return Object.getOwnPropertyDescriptor(\n DOMException.prototype,\n \"name\",\n )?.get?.call(value);\n } catch {\n /* Not a native DOMException. */\n }\n return undefined;\n}\n\nfunction classifyOne(\n error: unknown,\n catalog: UsageCatalog,\n): UsageFailure | undefined {\n const read = (key: string) => usageErrorProperty(error, key);\n let name = read(\"name\") ?? nativeExceptionName(error);\n try {\n if (name === undefined && error instanceof SyntaxError)\n name = \"SyntaxError\";\n } catch {\n /* A hostile proxy is not diagnostic evidence. */\n }\n const code = read(\"code\");\n if (\n name === \"AbortError\" ||\n code === \"EXECUTION_CANCELLED\" ||\n code === \"ABORT_ERR\"\n )\n return { outcome: \"cancelled\", properties: {} };\n if (code === \"EXECUTION_LIMIT_REACHED\" || name === \"ExecutionLimitReached\")\n return { outcome: \"limit_reached\", properties: {} };\n if (\n typeof name === \"string\" &&\n [\n \"GraphInterrupt\",\n \"NodeInterrupt\",\n \"Interrupt\",\n \"ParallelChildWaiting\",\n ].includes(name)\n )\n return { outcome: \"suspended\", properties: {} };\n if (name === \"EvalConfigurationError\")\n return {\n outcome: \"failed\",\n properties: {\n error_code: \"EVAL_SETTINGS_INVALID\",\n error_category: \"configuration\",\n retryable: false,\n },\n };\n if (name === \"TimeoutError\")\n return {\n outcome: \"failed\",\n properties: {\n error_code: \"NETWORK_TIMEOUT\",\n error_category: \"transport\",\n retryable: true,\n },\n };\n if (typeof code === \"string\" && Object.hasOwn(networkCodes, code))\n return {\n outcome: \"failed\",\n properties: {\n error_code: networkCodes[code] ?? \"UNCLASSIFIED_FAILURE\",\n error_category: \"transport\",\n retryable: true,\n },\n };\n if (typeof code === \"string\" && catalog.errorCodes.includes(code)) {\n const failure = usageErrorProperty(error, \"failure\");\n const category =\n read(\"category\") ?? usageErrorProperty(failure, \"category\");\n const retryable =\n read(\"retryable\") ?? usageErrorProperty(failure, \"retryable\");\n const status = read(\"status\") ?? usageErrorProperty(failure, \"status\");\n return {\n outcome: \"failed\",\n properties: {\n ...(typeof status === \"number\"\n ? classifyUsageHttpStatus(status).properties\n : {}),\n // The framework code is more specific than its HTTP projection.\n error_code: code,\n error_category:\n code !== \"EXECUTION_FAILED\" &&\n typeof category === \"string\" &&\n Array.isArray(catalog.properties.error_category) &&\n catalog.properties.error_category.includes(category)\n ? category\n : \"unknown\",\n ...(typeof retryable === \"boolean\" ? { retryable } : {}),\n },\n };\n }\n const status = read(\"status\") ?? read(\"statusCode\");\n if (\n typeof status === \"number\" &&\n Number.isInteger(status) &&\n status >= 400 &&\n status <= 599\n )\n return classifyUsageHttpStatus(status);\n if (name === \"ZodError\" || name === \"SyntaxError\")\n return {\n outcome: \"failed\",\n properties: {\n error_code: \"SCHEMA_VALIDATION\",\n error_category: \"validation\",\n },\n };\n return undefined;\n}\n\n/** Bounded, cycle-safe projection of known codes, including wrapped network causes. */\nexport function classifyUsageError(\n error: unknown,\n catalog = publicCatalog,\n): UsageFailure {\n const seen = new Set<unknown>();\n const pending = [{ value: error, depth: 0 }];\n let result: UsageFailure | undefined;\n while (pending.length && seen.size < 8) {\n const current = pending.shift();\n if (!current || seen.has(current.value)) continue;\n seen.add(current.value);\n const found = classifyOne(current.value, catalog);\n if (found) {\n if (!result) result = found;\n else if (\n found.properties.error_code &&\n found.outcome === \"failed\" &&\n found.properties.error_code !== result.properties.error_code\n ) {\n result.properties.cause_code = found.properties.error_code;\n result.properties.cause_category =\n found.properties.error_category ?? \"unknown\";\n if (\n result.properties.retryable === undefined &&\n typeof found.properties.retryable === \"boolean\"\n )\n result.properties.retryable = found.properties.retryable;\n break;\n }\n if (result === found && found.outcome !== \"failed\") return found;\n }\n if (current.depth < 3)\n for (const key of [\"failure\", \"cause\", \"error\"]) {\n const value = usageErrorProperty(current.value, key);\n if (value && typeof value === \"object\")\n pending.push({ value, depth: current.depth + 1 });\n }\n }\n return (\n result ?? {\n outcome: \"failed\",\n properties: { error_code: \"other\", error_category: \"unknown\" },\n }\n );\n}\n","import type { UsageProperties } from \"./client\";\nimport { usageErrorProperty as property } from \"./failure\";\n\n/** Stable counting boundaries. Edition catalogs can supply a different approved kind. */\nexport function usageMeasurement(\n event: string,\n operation: string,\n input: UsageProperties,\n): string {\n if (event === \"usage.feature\")\n return property(input, \"origin\") === \"background\" ||\n property(input, \"origin\") === \"server\"\n ? \"observation\"\n : \"feature\";\n if (operation === \"cli.command\" || operation === \"sdk.eval\")\n return \"invocation\";\n if (operation === \"studio.setup\") return \"stage\";\n if (operation === \"sdk.execution\" || operation === \"studio.eval.execution\")\n return \"execution\";\n if (operation === \"sdk.export\" || operation === \"sdk.model\") return \"attempt\";\n if (operation === \"sdk.structured\") {\n const format = property(input, \"format\");\n return format === \"text-delta\"\n ? \"chunk\"\n : format === \"final\"\n ? \"output\"\n : \"update\";\n }\n if (property(input, \"origin\") === \"background\") return \"poll\";\n if (operation.startsWith(\"studio.\")) return \"request\";\n return \"call\";\n}\n","import {\n type Outcome,\n outcomes,\n publicCatalog,\n type UsageCatalog,\n} from \"./catalog\";\nimport {\n classifyUsageError,\n classifyUsageHttpStatus,\n usageErrorProperty as property,\n} from \"./failure\";\nimport { usageMeasurement } from \"./measurement\";\n\nexport type UsageProperties = Readonly<Record<string, unknown>>;\nexport interface UsageContext {\n product: string;\n component: string;\n version: string;\n environment?: \"production\" | \"staging\";\n identityScope?: \"installation\" | \"browser\" | \"process\";\n runtimeMode?: \"development\" | \"production\" | \"ci\" | \"unknown\";\n trafficSource?: \"internal\" | \"synthetic\" | \"external\" | \"unknown\";\n}\nexport interface UsageRecord {\n schema_version: 1;\n event_id: string;\n timestamp: string;\n event: \"usage.operation\" | \"usage.feature\";\n product: string;\n component: string;\n version: string;\n analytics_environment: \"production\" | \"staging\";\n runtime_mode: string;\n identity_scope: \"installation\" | \"browser\" | \"process\";\n operation: string;\n outcome: Outcome;\n properties: Record<string, string | boolean>;\n count: number;\n duration_total_ms: number;\n duration_buckets: number[];\n /** Loss since the last successfully delivered snapshot; attached once per batch. */\n delivery_health?: { dropped_observations: number; failed_batches: number };\n}\nexport type UsageTransport = (\n records: readonly UsageRecord[],\n identity: string,\n) => Promise<void>;\nexport interface UsageOptions {\n context: UsageContext;\n catalog?: UsageCatalog;\n enabled?: () => boolean;\n debug?: () => boolean;\n inspect?: (records: readonly UsageRecord[]) => void;\n identity: () =>\n | string\n | { id: string; scope: \"installation\" | \"browser\" | \"process\" }\n | Promise<\n string | { id: string; scope: \"installation\" | \"browser\" | \"process\" }\n >;\n transport: UsageTransport;\n now?: () => number;\n schedule?: (callback: () => void, ms: number) => { cancel(): void };\n flushIntervalMs?: number;\n maxGroups?: number;\n maxRecordsPerHour?: number;\n}\nexport interface UsageOperation {\n end(outcome?: Outcome, properties?: UsageProperties): void;\n fail(error: unknown, properties?: UsageProperties): void;\n}\nexport interface UsageTelemetry {\n start(operation: string, properties?: UsageProperties): UsageOperation;\n feature(operation: string, properties?: UsageProperties): void;\n measure<T>(\n operation: string,\n callback: () => T | Promise<T>,\n properties?: UsageProperties,\n outcome?: (value: T) => Outcome,\n ): Promise<T>;\n flush(): Promise<void>;\n dispose(): void;\n stats(): { pending: number; dropped: number; delivered: number };\n}\n\nexport { classifyUsageError } from \"./failure\";\n\nexport function sanitizeProperties(\n input: UsageProperties,\n catalog = publicCatalog,\n): Record<string, string | boolean> {\n const safe: Record<string, string | boolean> = {};\n for (const [key, rule] of Object.entries(catalog.properties)) {\n const value = property(input, key);\n if (value === undefined) continue;\n if (rule === \"boolean\") {\n if (typeof value === \"boolean\") safe[key] = value;\n } else if (typeof value === \"string\")\n safe[key] = rule.includes(value) ? value : \"other\";\n }\n for (const key of [\"error_code\", \"cause_code\"]) {\n const code = property(input, key);\n if (typeof code === \"string\")\n safe[key] = catalog.errorCodes.includes(code) ? code : \"other\";\n }\n return safe;\n}\n\nconst durationBounds = [10, 100, 1000, 10000, 60000];\nconst noopOperation: UsageOperation = { end() {}, fail() {} };\nfunction schedule(callback: () => void, ms: number) {\n const timer = setTimeout(callback, ms);\n (timer as unknown as { unref?: () => void }).unref?.();\n return { cancel: () => clearTimeout(timer) };\n}\nexport function createUsageTelemetry(options: UsageOptions): UsageTelemetry {\n const catalog = options.catalog ?? publicCatalog;\n const now = options.now ?? Date.now;\n const pending = new Map<string, UsageRecord>();\n let timer: { cancel(): void } | undefined;\n let flight: Promise<void> | undefined;\n let disposed = false;\n let dropped = 0;\n let delivered = 0;\n let lostObservations = 0;\n let failedBatches = 0;\n let reportedLoss = 0;\n let reportedFailures = 0;\n const lose = (count: number) => {\n lostObservations = Math.min(\n Number.MAX_SAFE_INTEGER,\n lostObservations + count,\n );\n };\n let hour = Math.floor(now() / 3_600_000);\n let sent = 0;\n const active = () => {\n try {\n return !disposed && (options.enabled?.() ?? true);\n } catch {\n return false;\n }\n };\n const clear = () => {\n pending.clear();\n try {\n timer?.cancel();\n } catch {}\n timer = undefined;\n };\n const configured =\n catalog.products.includes(options.context.product) &&\n /^[a-z][a-z0-9_]{0,31}$/.test(options.context.component) &&\n /^(?:\\d+\\.\\d+\\.\\d+(?:-[a-z0-9.-]+)?|development|unknown)$/.test(\n options.context.version,\n ) &&\n options.context.version.length <= 64;\n\n const flush = async (): Promise<void> => {\n if (flight) return flight;\n if (!active() || !configured) {\n clear();\n return;\n }\n try {\n timer?.cancel();\n } catch {}\n timer = undefined;\n const records = [...pending.values()];\n pending.clear();\n if (!records.length) return;\n let attempted = records.length;\n let attemptedObservations = records.reduce(\n (total, record) => total + record.count,\n 0,\n );\n flight = (async () => {\n try {\n if (options.debug?.()) {\n options.inspect?.(records);\n return;\n }\n const currentHour = Math.floor(now() / 3_600_000);\n if (hour !== currentHour) {\n hour = currentHour;\n sent = 0;\n }\n const allowance = Math.max(\n 0,\n (options.maxRecordsPerHour ?? 120) - sent,\n );\n const batch = records.slice(0, allowance);\n dropped += records.length - batch.length;\n lose(\n records\n .slice(allowance)\n .reduce((total, record) => total + record.count, 0),\n );\n attempted = batch.length;\n attemptedObservations = batch.reduce(\n (total, record) => total + record.count,\n 0,\n );\n if (!batch.length || !active()) return;\n const identified = await options.identity();\n const identity =\n typeof identified === \"string\" ? identified : identified.id;\n if (typeof identified !== \"string\")\n for (const record of batch) record.identity_scope = identified.scope;\n if (!active() || options.debug?.()) return;\n if (\n !/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/.test(\n identity,\n )\n ) {\n dropped += batch.length;\n lose(attemptedObservations);\n return;\n }\n sent += batch.length;\n const lossSnapshot = lostObservations;\n const failureSnapshot = failedBatches;\n if (\n batch[0] &&\n (lossSnapshot > reportedLoss || failureSnapshot > reportedFailures)\n )\n batch[0].delivery_health = {\n dropped_observations: lossSnapshot - reportedLoss,\n failed_batches: failureSnapshot - reportedFailures,\n };\n await options.transport(batch, identity);\n reportedLoss = lossSnapshot;\n reportedFailures = failureSnapshot;\n delivered += batch.length;\n } catch {\n dropped += attempted;\n lose(attemptedObservations);\n failedBatches = Math.min(Number.MAX_SAFE_INTEGER, failedBatches + 1);\n }\n })().finally(() => {\n flight = undefined;\n try {\n if (pending.size && active() && !timer)\n timer = (options.schedule ?? schedule)(\n () => void flush(),\n options.flushIntervalMs ?? 60_000,\n );\n } catch {\n clear();\n }\n });\n return flight;\n };\n\n const record = (\n event: UsageRecord[\"event\"],\n operation: string,\n outcome: Outcome,\n duration: number,\n input: UsageProperties,\n ) => {\n try {\n if (!active()) {\n clear();\n return;\n }\n if (\n !configured ||\n !catalog.operations.includes(operation) ||\n !outcomes.includes(outcome)\n )\n return;\n const failed = outcome === \"failed\";\n const status = property(input, \"http_status\");\n const http =\n typeof status === \"string\" && /^\\d{3}$/.test(status)\n ? classifyUsageHttpStatus(Number(status)).properties\n : {};\n const properties = sanitizeProperties(\n {\n measurement_version: \"2\",\n measurement_kind: usageMeasurement(event, operation, input),\n ...(failed\n ? {\n error_code: \"UNCLASSIFIED_FAILURE\",\n error_category: \"unknown\",\n ...http,\n }\n : {}),\n ...sanitizeProperties(input, catalog),\n traffic_source: options.context.trafficSource ?? \"unknown\",\n },\n catalog,\n );\n const key = JSON.stringify([event, operation, outcome, properties]);\n let existing = pending.get(key);\n if (!existing) {\n if (pending.size >= (options.maxGroups ?? 64)) {\n dropped++;\n lose(1);\n return;\n }\n existing = {\n schema_version: 1,\n event_id: crypto.randomUUID(),\n timestamp: new Date(now()).toISOString(),\n event,\n product: options.context.product,\n component: options.context.component,\n version: options.context.version,\n analytics_environment: options.context.environment ?? \"production\",\n runtime_mode: [\"development\", \"production\", \"ci\"].includes(\n options.context.runtimeMode ?? \"\",\n )\n ? (options.context.runtimeMode ?? \"unknown\")\n : \"unknown\",\n identity_scope: options.context.identityScope ?? \"installation\",\n operation,\n outcome,\n properties,\n count: 0,\n duration_total_ms: 0,\n duration_buckets: [0, 0, 0, 0, 0, 0],\n };\n pending.set(key, existing);\n }\n const elapsed = Math.max(\n 0,\n Math.min(86_400_000, Number.isFinite(duration) ? duration : 0),\n );\n existing.count = Math.min(Number.MAX_SAFE_INTEGER, existing.count + 1);\n existing.duration_total_ms = Math.min(\n Number.MAX_SAFE_INTEGER,\n existing.duration_total_ms + elapsed,\n );\n const index = durationBounds.findIndex((bound) => elapsed <= bound);\n const bucket = index === -1 ? durationBounds.length : index;\n existing.duration_buckets[bucket] =\n (existing.duration_buckets[bucket] ?? 0) + 1;\n if (!timer)\n timer = (options.schedule ?? schedule)(\n () => void flush(),\n options.flushIntervalMs ?? 60_000,\n );\n } catch {\n /* Usage collection cannot participate in product execution. */\n }\n };\n const start = (\n operation: string,\n properties: UsageProperties = {},\n ): UsageOperation => {\n if (!active()) {\n clear();\n return noopOperation;\n }\n try {\n const initial = sanitizeProperties(properties, catalog);\n const began = now();\n let ended = false;\n return {\n end(outcome = \"success\", extra = {}) {\n if (ended) return;\n ended = true;\n try {\n // Classify before enum bucketing so uncommon statuses keep their class.\n const status = property(extra, \"http_status\");\n const http =\n outcome === \"failed\" &&\n typeof status === \"string\" &&\n /^\\d{3}$/.test(status)\n ? classifyUsageHttpStatus(Number(status)).properties\n : {};\n record(\"usage.operation\", operation, outcome, now() - began, {\n ...initial,\n ...http,\n ...sanitizeProperties(extra, catalog),\n });\n } catch {}\n },\n fail(error, extra = {}) {\n if (ended) return;\n try {\n const failure = classifyUsageError(error, catalog);\n this.end(failure.outcome, {\n ...sanitizeProperties(extra, catalog),\n ...failure.properties,\n });\n } catch {}\n },\n };\n } catch {\n return noopOperation;\n }\n };\n return {\n start,\n feature(operation, properties = {}) {\n record(\"usage.feature\", operation, \"success\", 0, properties);\n },\n async measure(operation, callback, properties = {}, outcome) {\n const operationScope = start(operation, properties);\n try {\n const result = await callback();\n let status: Outcome = \"success\";\n try {\n status = outcome?.(result) ?? status;\n } catch {}\n operationScope.end(status);\n return result;\n } catch (error) {\n operationScope.fail(error);\n throw error;\n }\n },\n flush,\n dispose() {\n disposed = true;\n clear();\n },\n stats: () => ({ pending: pending.size, dropped, delivered }),\n };\n}\n","// Public ingestion key only. Personal API tokens must never be bundled.\nexport const RELEASE_POSTHOG_KEY =\n \"phc_xdiyTz8ezvRoCWFVefMELsEoULSWnxts6DnTqkaKiE5E\";\nexport const RELEASE_POSTHOG_HOST = \"https://eu.i.posthog.com\";\n","import type { UsageTransport } from \"./client\";\n\n/** Capture keys are public. This transport never accepts a personal API token. */\nexport function createPostHogTransport(options: {\n key: string;\n host?: string;\n fetch?: typeof fetch;\n timeoutMs?: number;\n}): UsageTransport {\n if (!/^phc_[a-zA-Z0-9]+$/.test(options.key))\n throw new Error(\"Usage telemetry requires a public PostHog capture key.\");\n const host = new URL(options.host ?? \"https://eu.i.posthog.com\");\n if (host.username || host.password || host.search || host.hash)\n throw new Error(\n \"Usage endpoint must not contain credentials or query parameters.\",\n );\n if (\n host.protocol !== \"https:\" &&\n host.hostname !== \"localhost\" &&\n host.hostname !== \"127.0.0.1\"\n )\n throw new Error(\"Usage telemetry requires HTTPS.\");\n return async (records, identity) => {\n const batch = records.map((record) => ({\n event: record.event,\n timestamp: record.timestamp,\n distinct_id: identity,\n uuid: record.event_id,\n properties: {\n ...record.properties,\n schema_version: record.schema_version,\n product: record.product,\n component: record.component,\n version: record.version,\n analytics_environment: record.analytics_environment,\n runtime_mode: record.runtime_mode,\n identity_scope: record.identity_scope,\n operation: record.operation,\n outcome: record.outcome,\n count: record.count,\n duration_total_ms: record.duration_total_ms,\n duration_buckets: record.duration_buckets,\n ...(record.delivery_health\n ? {\n usage_dropped_observations:\n record.delivery_health.dropped_observations,\n usage_failed_batches: record.delivery_health.failed_batches,\n }\n : {}),\n $process_person_profile: false,\n $geoip_disable: true,\n $ip: null,\n },\n }));\n const controller = new AbortController();\n const timeout = setTimeout(\n () => controller.abort(),\n options.timeoutMs ?? 2000,\n );\n (timeout as unknown as { unref?: () => void }).unref?.();\n try {\n const response = await (options.fetch ?? globalThis.fetch)(\n new URL(\"/batch/\", host),\n {\n method: \"POST\",\n credentials: \"omit\",\n referrerPolicy: \"no-referrer\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ api_key: options.key, batch }),\n signal: controller.signal,\n },\n );\n await response.body?.cancel();\n if (!response.ok) throw new Error(\"Usage delivery failed.\");\n } finally {\n clearTimeout(timeout);\n }\n };\n}\n\nexport function createCollectorTransport(options: {\n endpoint: string;\n fetch?: typeof fetch;\n}): UsageTransport {\n const endpoint = new URL(options.endpoint);\n if (\n endpoint.username ||\n endpoint.password ||\n endpoint.search ||\n endpoint.hash\n )\n throw new Error(\n \"Usage endpoint must not contain credentials or query parameters.\",\n );\n if (\n endpoint.protocol !== \"https:\" &&\n ![\"localhost\", \"127.0.0.1\"].includes(endpoint.hostname)\n )\n throw new Error(\"Usage telemetry requires HTTPS.\");\n return async (records, identity) => {\n const response = await (options.fetch ?? globalThis.fetch)(endpoint, {\n method: \"POST\",\n credentials: \"omit\",\n referrerPolicy: \"no-referrer\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ identity, records }),\n signal: AbortSignal.timeout(2000),\n });\n await response.body?.cancel();\n if (!response.ok) throw new Error(\"Usage delivery failed.\");\n };\n}\n"],"mappings":"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","names":["status","record","identity","identity"]}
|