@kortyx/usage-telemetry 0.2.1-canary.pr309.5c08abd3.139.1 → 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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.3.0](https://github.com/kortyx-io/kortyx/compare/usage-telemetry-v0.2.0...usage-telemetry-v0.3.0) (2026-10-13)
4
+
5
+
6
+ ### ⚠ BREAKING CHANGES
7
+
8
+ * **runtime:** Consumer eval routes cap active attempts at 20 by default. Set maxActiveAttempts before upgrading consumers with higher concurrency. Upgrade API and Studio together for the new case-dispatch progress events.
9
+
10
+ ### Features
11
+
12
+ * **runtime:** add opt-in workflow data reducers ([#340](https://github.com/kortyx-io/kortyx/issues/340)) ([8be2c81](https://github.com/kortyx-io/kortyx/commit/8be2c81f74c5c51ab98443144f3491d4e8d54a88))
13
+
3
14
  ## [0.2.0](https://github.com/kortyx-io/kortyx/compare/usage-telemetry-v0.1.0...usage-telemetry-v0.2.0) (2026-10-11)
4
15
 
5
16
 
package/README.md CHANGED
@@ -59,6 +59,21 @@ The root export is browser safe. Bundlers use a browser fallback for the Node en
59
59
 
60
60
  Studio uses the `@studio/usage` server adapter and `@studio/usage-contracts` contract, following its existing edition alias pattern. An adapter owns its server client and serializable browser configuration, including an optional extended catalog. Browser configuration chooses one product. `configureStudioUsage(config, extensionClient)` also accepts a custom browser client. API embedders can pass `usage` to `createApiApp`. Never put a personal PostHog token in a browser config or transport.
61
61
 
62
+ ## Workflow reducer adoption
63
+
64
+ Successful `sdk.registry` operations carry the boolean `data_reducers`: whether
65
+ at least one registered workflow has a callback. Compare `sum(count)` with the
66
+ flag enabled against all successful registry operations in the same release cohort
67
+ to measure configured adoption. This counts registry resolutions, not workflow
68
+ runs or unique workflows. Registries without a `list` method cannot establish
69
+ adoption and omit the property. Repeated agent initialization and best-effort
70
+ aggregation/delivery affect reach estimates as described above.
71
+
72
+ Existing execution outcomes allowlist `WORKFLOW_REDUCER_FAILED` as a known error
73
+ code for reliability measurement. Reducer field names, callbacks, schemas, values
74
+ and raw error messages are never usage properties. Existing opt-out, bounded
75
+ aggregation and failure-independent delivery apply unchanged.
76
+
62
77
  ## First slice and follow-up opportunities
63
78
 
64
79
  SDK boundaries include initialization, registry resolution, direct execution/resume, chat admission, terminal graph execution, response completion, model and tool execution, structured output, explicit response completion, prompt resolution, eval outcomes, MCP connection/discovery/close, checkpoint operations and observability export attempts. Early response completion and later graph failure are separate outcomes. An eval quality failure is distinct from an execution error.
@@ -275,6 +275,7 @@ var publicCatalog = {
275
275
  "504"
276
276
  ],
277
277
  prompts: "boolean",
278
+ data_reducers: "boolean",
278
279
  observability: "boolean",
279
280
  tools: "boolean",
280
281
  streaming: "boolean",
@@ -302,6 +303,7 @@ var publicCatalog = {
302
303
  "DOMAIN_ERROR",
303
304
  "PERSISTENCE_ERROR",
304
305
  "WORKFLOW_CONTRACT_ERROR",
306
+ "WORKFLOW_REDUCER_FAILED",
305
307
  "PROVIDER_REFUSAL",
306
308
  "PROVIDER_HTTP_ERROR",
307
309
  "PROVIDER_INVALID_RESPONSE",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/browser-node.ts","../src/catalog.ts","../src/client.ts"],"sourcesContent":["// Browser fallback for libraries whose portable exports share a Node entry.\n// Default-on Node collection cannot infer a browser's operator opt-out policy.\n// Explicit browser bootstrap belongs to the embedding application's integration.\nimport {\n createUsageTelemetry,\n type UsageOptions,\n type UsageTelemetry,\n} from \"./client\";\n\nexport { scale } from \"./catalog\";\nexport { createUsageTelemetry, type UsageTelemetry } from \"./client\";\n\nconst clients = new Map<string, UsageTelemetry>();\nexport function createNodeUsageTelemetry(\n options: Pick<UsageOptions, \"context\"> &\n Partial<Omit<UsageOptions, \"context\">>,\n): UsageTelemetry {\n return createUsageTelemetry({\n ...options,\n identity: options.identity ?? (() => \"\"),\n transport: options.transport ?? (async () => {}),\n enabled: () => false,\n });\n}\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: { component, version, product },\n });\n clients.set(component, client);\n }\n return client;\n}\nexport function usageDisabled() {\n return true;\n}\nexport function publicUsageConfiguration() {\n return {\n enabled: false,\n debug: false,\n environment: \"production\" as const,\n key: \"\",\n host: \"https://eu.i.posthog.com\",\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 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 \"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"],"mappings":"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","names":["record"]}
1
+ {"version":3,"sources":["../src/browser-node.ts","../src/catalog.ts","../src/client.ts"],"sourcesContent":["// Browser fallback for libraries whose portable exports share a Node entry.\n// Default-on Node collection cannot infer a browser's operator opt-out policy.\n// Explicit browser bootstrap belongs to the embedding application's integration.\nimport {\n createUsageTelemetry,\n type UsageOptions,\n type UsageTelemetry,\n} from \"./client\";\n\nexport { scale } from \"./catalog\";\nexport { createUsageTelemetry, type UsageTelemetry } from \"./client\";\n\nconst clients = new Map<string, UsageTelemetry>();\nexport function createNodeUsageTelemetry(\n options: Pick<UsageOptions, \"context\"> &\n Partial<Omit<UsageOptions, \"context\">>,\n): UsageTelemetry {\n return createUsageTelemetry({\n ...options,\n identity: options.identity ?? (() => \"\"),\n transport: options.transport ?? (async () => {}),\n enabled: () => false,\n });\n}\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: { component, version, product },\n });\n clients.set(component, client);\n }\n return client;\n}\nexport function usageDisabled() {\n return true;\n}\nexport function publicUsageConfiguration() {\n return {\n enabled: false,\n debug: false,\n environment: \"production\" as const,\n key: \"\",\n host: \"https://eu.i.posthog.com\",\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"],"mappings":"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","names":["record"]}
package/dist/index.js CHANGED
@@ -275,6 +275,7 @@ var publicCatalog = {
275
275
  "504"
276
276
  ],
277
277
  prompts: "boolean",
278
+ data_reducers: "boolean",
278
279
  observability: "boolean",
279
280
  tools: "boolean",
280
281
  streaming: "boolean",
@@ -302,6 +303,7 @@ var publicCatalog = {
302
303
  "DOMAIN_ERROR",
303
304
  "PERSISTENCE_ERROR",
304
305
  "WORKFLOW_CONTRACT_ERROR",
306
+ "WORKFLOW_REDUCER_FAILED",
305
307
  "PROVIDER_REFUSAL",
306
308
  "PROVIDER_HTTP_ERROR",
307
309
  "PROVIDER_INVALID_RESPONSE",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/catalog.ts","../src/client.ts","../src/transport.ts"],"sourcesContent":["// Browser-safe contract and client. Node defaults live exclusively in ./node.\nexport {\n type Outcome,\n publicCatalog,\n scale,\n type UsageCatalog,\n} from \"./catalog\";\nexport {\n classifyUsageError,\n createUsageTelemetry,\n sanitizeProperties,\n type UsageContext,\n type UsageOperation,\n type UsageOptions,\n type UsageRecord,\n type UsageTelemetry,\n type UsageTransport,\n} from \"./client\";\nexport { createCollectorTransport, createPostHogTransport } from \"./transport\";\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 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 \"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","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":["record"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/catalog.ts","../src/client.ts","../src/transport.ts"],"sourcesContent":["// Browser-safe contract and client. Node defaults live exclusively in ./node.\nexport {\n type Outcome,\n publicCatalog,\n scale,\n type UsageCatalog,\n} from \"./catalog\";\nexport {\n classifyUsageError,\n createUsageTelemetry,\n sanitizeProperties,\n type UsageContext,\n type UsageOperation,\n type UsageOptions,\n type UsageRecord,\n type UsageTelemetry,\n type UsageTransport,\n} from \"./client\";\nexport { createCollectorTransport, createPostHogTransport } from \"./transport\";\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","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":["record"]}
package/dist/node.js CHANGED
@@ -279,6 +279,7 @@ var publicCatalog = {
279
279
  "504"
280
280
  ],
281
281
  prompts: "boolean",
282
+ data_reducers: "boolean",
282
283
  observability: "boolean",
283
284
  tools: "boolean",
284
285
  streaming: "boolean",
@@ -306,6 +307,7 @@ var publicCatalog = {
306
307
  "DOMAIN_ERROR",
307
308
  "PERSISTENCE_ERROR",
308
309
  "WORKFLOW_CONTRACT_ERROR",
310
+ "WORKFLOW_REDUCER_FAILED",
309
311
  "PROVIDER_REFUSAL",
310
312
  "PROVIDER_HTTP_ERROR",
311
313
  "PROVIDER_INVALID_RESPONSE",
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 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 \"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/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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kortyx/usage-telemetry",
3
- "version": "0.2.1-canary.pr309.5c08abd3.139.1",
3
+ "version": "0.3.0",
4
4
  "private": false,
5
5
  "description": "Bounded, privacy-preserving product usage telemetry for Kortyx.",
6
6
  "license": "Apache-2.0",