@conquext/observa-core 0.1.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/LICENSE +21 -0
- package/dist/index.d.ts +606 -0
- package/dist/index.js +657 -0
- package/dist/index.js.map +1 -0
- package/package.json +28 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas.ts","../src/errors.ts","../src/pricing-table.json","../src/pricing.ts","../src/memory-backend.ts","../src/batch.ts","../src/context.ts","../src/adapter.ts","../src/callbacks.ts","../src/budget.ts","../src/observatory.ts","../src/noop.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const UserContextSchema = z.object({\n\tid: z.string().min(1),\n\tname: z.string().optional(),\n\temail: z.string().email().optional(),\n\tteam: z.string().optional(),\n\tplan: z.string().optional(),\n});\n\nexport const TaskContextSchema = z.object({\n\tid: z.string().min(1),\n\ttitle: z.string().optional(),\n\ttype: z.string().optional(),\n\tpriority: z.enum([\"low\", \"medium\", \"high\", \"critical\"]).optional(),\n});\n\nexport const SessionContextSchema = z.object({\n\tid: z.string().min(1),\n\tconversationId: z.string().optional(),\n\tparentCallId: z.string().optional(),\n});\n\nexport const ObservabilityContextSchema = z.object({\n\tuser: UserContextSchema.optional(),\n\ttask: TaskContextSchema.optional(),\n\tsession: SessionContextSchema.optional(),\n\tlabels: z.record(z.string(), z.string()).optional(),\n});\n\nexport const UsageEventInputSchema = z.object({\n\tmodel: z.string().min(1),\n\tprovider: z.string().min(1),\n\trequested_model: z.string().optional(),\n\tinput_tokens: z.number().int().nonnegative(),\n\toutput_tokens: z.number().int().nonnegative(),\n\ttotal_tokens: z.number().int().nonnegative().optional(),\n\tcost: z.number().nonnegative().optional(),\n\tlatency_ms: z.number().nonnegative(),\n\tstatus: z.enum([\"success\", \"error\"]),\n\terror: z.string().optional(),\n\tstreaming: z.boolean().optional(),\n\ttime_to_first_token_ms: z.number().nonnegative().optional(),\n\tcache_read_tokens: z.number().int().nonnegative().optional(),\n\tcache_write_tokens: z.number().int().nonnegative().optional(),\n\tcontext: ObservabilityContextSchema.optional(),\n});\n","import type { BudgetWindow } from \"./types.js\";\n\nexport class BudgetExhaustedError extends Error {\n\treadonly scope: \"user\" | \"team\" | \"task\";\n\treadonly scopeId: string;\n\treadonly spent: number;\n\treadonly limit: number;\n\treadonly window: BudgetWindow;\n\treadonly resetAt?: Date;\n\n\tconstructor(params: {\n\t\tscope: \"user\" | \"team\" | \"task\";\n\t\tscopeId: string;\n\t\tspent: number;\n\t\tlimit: number;\n\t\twindow: BudgetWindow;\n\t\tresetAt?: Date;\n\t}) {\n\t\tsuper(\n\t\t\t`Budget exhausted for ${params.scope} \"${params.scopeId}\": ` +\n\t\t\t\t`$${params.spent.toFixed(2)} spent of $${params.limit.toFixed(2)} ${params.window} limit`,\n\t\t);\n\t\tthis.name = \"BudgetExhaustedError\";\n\t\tthis.scope = params.scope;\n\t\tthis.scopeId = params.scopeId;\n\t\tthis.spent = params.spent;\n\t\tthis.limit = params.limit;\n\t\tthis.window = params.window;\n\t\tthis.resetAt = params.resetAt;\n\t}\n}\n","{\n \"updatedAt\": \"2025-06-01\",\n \"models\": {\n \"gpt-4o\": { \"provider\": \"openai\", \"input_per_million\": 2.50, \"output_per_million\": 10.00 },\n \"gpt-4o-mini\": { \"provider\": \"openai\", \"input_per_million\": 0.15, \"output_per_million\": 0.60 },\n \"gpt-4-turbo\": { \"provider\": \"openai\", \"input_per_million\": 10.00, \"output_per_million\": 30.00 },\n \"gpt-3.5-turbo\": { \"provider\": \"openai\", \"input_per_million\": 0.50, \"output_per_million\": 1.50 },\n \"o1\": { \"provider\": \"openai\", \"input_per_million\": 15.00, \"output_per_million\": 60.00 },\n \"o1-mini\": { \"provider\": \"openai\", \"input_per_million\": 3.00, \"output_per_million\": 12.00 },\n \"o3-mini\": { \"provider\": \"openai\", \"input_per_million\": 1.10, \"output_per_million\": 4.40 },\n \"claude-opus-4-20250514\": { \"provider\": \"anthropic\", \"input_per_million\": 15.00, \"output_per_million\": 75.00, \"cache_read_per_million\": 1.50, \"cache_write_per_million\": 18.75 },\n \"claude-sonnet-4-20250514\": { \"provider\": \"anthropic\", \"input_per_million\": 3.00, \"output_per_million\": 15.00, \"cache_read_per_million\": 0.30, \"cache_write_per_million\": 3.75 },\n \"claude-haiku-3-5\": { \"provider\": \"anthropic\", \"input_per_million\": 0.80, \"output_per_million\": 4.00, \"cache_read_per_million\": 0.08, \"cache_write_per_million\": 1.00 },\n \"gemini-2.0-flash\": { \"provider\": \"google\", \"input_per_million\": 0.10, \"output_per_million\": 0.40 },\n \"gemini-1.5-pro\": { \"provider\": \"google\", \"input_per_million\": 1.25, \"output_per_million\": 5.00 },\n \"gemini-1.5-flash\": { \"provider\": \"google\", \"input_per_million\": 0.075, \"output_per_million\": 0.30 }\n }\n}\n","import builtinPricing from \"./pricing-table.json\" with { type: \"json\" };\nimport type { ModelPricing, PricingConfig, PricingTable, UsageEventInput } from \"./types.js\";\n\nexport class PricingEngine {\n\tprivate readonly table: PricingTable;\n\tprivate readonly sortedModelKeys: string[];\n\n\tconstructor(config: PricingConfig) {\n\t\tthis.table = PricingEngine.resolve(config);\n\t\t// Sort by length descending so longer (more specific) keys match first\n\t\tthis.sortedModelKeys = Object.keys(this.table.models).sort((a, b) => b.length - a.length);\n\t}\n\n\tstatic resolve(config: PricingConfig): PricingTable {\n\t\tif (config === \"builtin\") {\n\t\t\treturn builtinPricing as PricingTable;\n\t\t}\n\t\tif (\"updatedAt\" in config && \"models\" in config) {\n\t\t\treturn config;\n\t\t}\n\t\t// { base: 'builtin', overrides: {...} }\n\t\tconst base = builtinPricing as PricingTable;\n\t\treturn {\n\t\t\tupdatedAt: base.updatedAt,\n\t\t\tmodels: { ...base.models, ...config.overrides },\n\t\t};\n\t}\n\n\tcalculateCost(event: UsageEventInput): number {\n\t\tconst pricing = this.findModel(event.model);\n\t\tif (!pricing) return 0;\n\n\t\tlet cost = 0;\n\n\t\tconst standardInput = event.input_tokens - (event.cache_read_tokens ?? 0);\n\t\tcost += (standardInput / 1_000_000) * pricing.input_per_million;\n\n\t\tif (event.cache_read_tokens && pricing.cache_read_per_million) {\n\t\t\tcost += (event.cache_read_tokens / 1_000_000) * pricing.cache_read_per_million;\n\t\t}\n\n\t\tif (event.cache_write_tokens && pricing.cache_write_per_million) {\n\t\t\tcost += (event.cache_write_tokens / 1_000_000) * pricing.cache_write_per_million;\n\t\t}\n\n\t\tcost += (event.output_tokens / 1_000_000) * pricing.output_per_million;\n\n\t\treturn cost;\n\t}\n\n\tisPricingMiss(model: string): boolean {\n\t\treturn this.findModel(model) === undefined;\n\t}\n\n\tprivate findModel(model: string): ModelPricing | undefined {\n\t\t// Exact match first\n\t\tif (this.table.models[model]) {\n\t\t\treturn this.table.models[model];\n\t\t}\n\t\t// Prefix match — find the longest key that the model starts with\n\t\tfor (const key of this.sortedModelKeys) {\n\t\t\tif (model.startsWith(key)) {\n\t\t\t\treturn this.table.models[key];\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n}\n","import type { StorageBackend, UsageEvent, UsageQuery } from './types.js';\n\nexport class MemoryBackend implements StorageBackend {\n private events: UsageEvent[] = [];\n\n async write(events: UsageEvent[]): Promise<void> {\n this.events.push(...events);\n }\n\n async query(query: UsageQuery): Promise<UsageEvent[]> {\n return this.events.filter((event) => {\n if (event.timestamp < query.from || event.timestamp > query.to) return false;\n if (query.user && event.context?.user?.id !== query.user) return false;\n if (query.task && event.context?.task?.id !== query.task) return false;\n if (query.session && event.context?.session?.id !== query.session) return false;\n if (query.model && event.model !== query.model) return false;\n if (query.provider && event.provider !== query.provider) return false;\n if (query.labels) {\n const eventLabels = event.context?.labels ?? {};\n for (const [key, value] of Object.entries(query.labels)) {\n if (eventLabels[key] !== value) return false;\n }\n }\n return true;\n });\n }\n\n async close(): Promise<void> {\n this.events = [];\n }\n\n getAll(): UsageEvent[] {\n return [...this.events];\n }\n\n get size(): number {\n return this.events.length;\n }\n}\n","import type { BatchConfig, StorageBackend, UsageEvent } from './types.js';\n\nexport const DEFAULT_BATCH_CONFIG: BatchConfig = {\n maxSize: 100,\n flushInterval: 5000,\n};\n\nexport class BatchProcessor {\n private buffer: UsageEvent[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private readonly backend: StorageBackend;\n private readonly config: BatchConfig;\n private closed = false;\n\n constructor(backend: StorageBackend, config?: Partial<BatchConfig>) {\n this.backend = backend;\n this.config = { ...DEFAULT_BATCH_CONFIG, ...config };\n this.startTimer();\n }\n\n async add(event: UsageEvent): Promise<void> {\n if (this.closed) return;\n this.buffer.push(event);\n if (this.buffer.length >= this.config.maxSize) {\n await this.flush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.buffer.length === 0) return;\n const batch = this.buffer;\n this.buffer = [];\n await this.backend.write(batch);\n }\n\n async close(): Promise<void> {\n this.closed = true;\n this.stopTimer();\n await this.flush();\n await this.backend.close();\n }\n\n get pending(): number {\n return this.buffer.length;\n }\n\n private startTimer(): void {\n if (this.config.flushInterval > 0) {\n this.timer = setInterval(() => {\n this.flush().catch(() => {\n // Swallow flush errors in background timer\n });\n }, this.config.flushInterval);\n // Unref so the timer doesn't keep the process alive\n if (this.timer && typeof this.timer === 'object' && 'unref' in this.timer) {\n this.timer.unref();\n }\n }\n }\n\n private stopTimer(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { ObservabilityContext } from './types.js';\n\nconst storage = new AsyncLocalStorage<ObservabilityContext>();\n\nexport const ContextManager = {\n get(): ObservabilityContext | undefined {\n return storage.getStore();\n },\n\n run<T>(context: ObservabilityContext, fn: () => T): T {\n return storage.run(context, fn);\n },\n\n merge(base: ObservabilityContext | undefined, override: ObservabilityContext | undefined): ObservabilityContext {\n if (!base && !override) return {};\n if (!base) return override!;\n if (!override) return base;\n return {\n user: override.user ?? base.user,\n task: override.task ?? base.task,\n session: override.session ?? base.session,\n labels: { ...base.labels, ...override.labels },\n };\n },\n};\n","import type { ExtractedUsage, ProviderAdapter, TrackedStream } from './types.js';\n\nexport function defineAdapter(config: {\n name: string;\n instrumentedMethods: string[];\n extractUsage: (response: unknown) => ExtractedUsage;\n extractStreamUsage?: (stream: AsyncIterable<unknown>) => TrackedStream<unknown>;\n}): ProviderAdapter {\n return {\n name: config.name,\n instrumentedMethods: config.instrumentedMethods,\n extractUsage: config.extractUsage,\n extractStreamUsage: config.extractStreamUsage ?? defaultStreamExtractor,\n };\n}\n\nfunction defaultStreamExtractor(_stream: AsyncIterable<unknown>): TrackedStream<unknown> {\n throw new Error('Streaming not supported by this adapter. Implement extractStreamUsage.');\n}\n\nexport function createTrackedStream<T>(\n source: AsyncIterable<T>,\n onComplete: (chunks: T[]) => ExtractedUsage,\n): TrackedStream<T> {\n const chunks: T[] = [];\n let usage: ExtractedUsage | undefined;\n let done = false;\n\n const iterator: AsyncIterable<T> = {\n [Symbol.asyncIterator]() {\n const sourceIterator = source[Symbol.asyncIterator]();\n return {\n async next() {\n const result = await sourceIterator.next();\n if (result.done) {\n done = true;\n usage = onComplete(chunks);\n return result;\n }\n chunks.push(result.value);\n return result;\n },\n };\n },\n };\n\n return Object.assign(iterator, {\n getUsage(): Promise<ExtractedUsage> {\n if (done && usage) return Promise.resolve(usage);\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n clearInterval(check);\n reject(new Error('Stream usage not available — stream may not have been fully consumed'));\n }, 30000);\n\n const check = setInterval(() => {\n if (done && usage) {\n clearInterval(check);\n clearTimeout(timeoutId);\n resolve(usage);\n }\n }, 10);\n });\n },\n });\n}\n","import type { CallbackConfig, UsageEvent } from './types.js';\n\nexport class CallbackDispatcher {\n private readonly config: CallbackConfig;\n private readonly errorCounts = new Map<string, { errors: number; total: number; windowStart: number }>();\n\n constructor(config: CallbackConfig) {\n this.config = config;\n }\n\n dispatch(event: UsageEvent): void {\n try {\n this.config.event?.(event);\n } catch {\n // Swallow callback errors\n }\n\n if (this.config.costThreshold && event.cost >= this.config.costThreshold.threshold) {\n try {\n this.config.costThreshold.handler(event);\n } catch {\n // Swallow\n }\n }\n\n if (this.config.errorSpike) {\n this.checkErrorSpike(event);\n }\n }\n\n private checkErrorSpike(event: UsageEvent): void {\n const cfg = this.config.errorSpike!;\n const windowMs = parseWindow(cfg.window);\n const now = Date.now();\n const key = event.model;\n\n let entry = this.errorCounts.get(key);\n if (!entry || now - entry.windowStart > windowMs) {\n entry = { errors: 0, total: 0, windowStart: now };\n this.errorCounts.set(key, entry);\n }\n\n entry.total++;\n if (event.status === 'error') entry.errors++;\n\n if (entry.total >= 5) {\n const rate = entry.errors / entry.total;\n if (rate >= cfg.threshold) {\n try {\n cfg.handler(event.model, rate);\n } catch {\n // Swallow\n }\n }\n }\n }\n}\n\nfunction parseWindow(window: string): number {\n const match = window.match(/^(\\d+)(s|m|h)$/);\n if (!match) return 5 * 60 * 1000; // default 5m\n const [, num, unit] = match;\n const multipliers: Record<string, number> = { s: 1000, m: 60_000, h: 3_600_000 };\n return Number(num) * multipliers[unit];\n}\n","import type { BudgetConfig, BudgetLimits, BudgetWindow, ObservabilityContext, UsageEvent } from './types.js';\nimport { BudgetExhaustedError } from './errors.js';\n\nexport interface BudgetCheckResult {\n exceeded: boolean;\n scope?: 'user' | 'team' | 'task';\n scopeId?: string;\n spent?: number;\n limit?: number;\n window?: BudgetWindow;\n downgrade?: string;\n}\n\ninterface WindowAccumulator {\n hourly: Map<string, { amount: number; windowStart: number }>;\n daily: Map<string, { amount: number; windowStart: number }>;\n monthly: Map<string, { amount: number; windowStart: number }>;\n total: Map<string, number>;\n}\n\nconst WINDOW_DURATIONS: Record<string, number> = {\n hourly: 3_600_000,\n daily: 86_400_000,\n monthly: 2_592_000_000, // 30 days\n};\n\nexport class BudgetEngine {\n private readonly config: BudgetConfig;\n private readonly accumulators = {\n user: createAccumulator(),\n team: createAccumulator(),\n task: createAccumulator(),\n };\n\n constructor(config: BudgetConfig) {\n this.config = config;\n }\n\n check(context: ObservabilityContext | undefined, model: string, estimatedCost: number): BudgetCheckResult {\n if (!context) return { exceeded: false };\n\n // Check user budget\n if (this.config.perUser && context.user?.id) {\n const result = this.checkScope('user', context.user.id, this.config.perUser, model, estimatedCost);\n if (result) return result;\n }\n\n // Check team budget\n if (this.config.perTeam && context.user?.team) {\n const result = this.checkScope('team', context.user.team, this.config.perTeam, model, estimatedCost);\n if (result) return result;\n }\n\n // Check task budget\n if (this.config.perTask && context.task?.id) {\n const result = this.checkScope('task', context.task.id, this.config.perTask, model, estimatedCost);\n if (result) return result;\n }\n\n return { exceeded: false };\n }\n\n accumulate(event: UsageEvent): void {\n const now = Date.now();\n\n if (event.context?.user?.id) {\n addToAccumulator(this.accumulators.user, event.context.user.id, event.cost, now);\n }\n if (event.context?.user?.team) {\n addToAccumulator(this.accumulators.team, event.context.user.team, event.cost, now);\n }\n if (event.context?.task?.id) {\n addToAccumulator(this.accumulators.task, event.context.task.id, event.cost, now);\n }\n }\n\n private checkScope(\n scope: 'user' | 'team' | 'task',\n scopeId: string,\n limits: BudgetLimits,\n model: string,\n estimatedCost: number,\n ): BudgetCheckResult | undefined {\n const acc = this.accumulators[scope];\n const now = Date.now();\n\n for (const [window, limit] of Object.entries(limits) as [BudgetWindow, number][]) {\n if (limit === undefined) continue;\n\n const spent = getSpent(acc, scopeId, window, now);\n const projected = spent + estimatedCost;\n\n if (projected > limit) {\n return this.handleExceeded(scope, scopeId, spent, limit, window, model);\n }\n\n // Check downgrade threshold\n if (this.config.enforcement === 'downgrade') {\n const threshold = this.config.downgradeThreshold ?? 0.8;\n if (spent / limit >= threshold) {\n const downgradeModel = this.config.downgrades?.[model];\n if (downgradeModel) {\n return { exceeded: false, downgrade: downgradeModel };\n }\n }\n }\n }\n\n return undefined;\n }\n\n private handleExceeded(\n scope: 'user' | 'team' | 'task',\n scopeId: string,\n spent: number,\n limit: number,\n window: BudgetWindow,\n model: string,\n ): BudgetCheckResult {\n if (this.config.enforcement === 'hard') {\n throw new BudgetExhaustedError({ scope, scopeId, spent, limit, window });\n }\n\n if (this.config.enforcement === 'downgrade') {\n const downgradeModel = this.config.downgrades?.[model];\n if (downgradeModel) {\n return { exceeded: true, scope, scopeId, spent, limit, window, downgrade: downgradeModel };\n }\n // No downgrade available — fall back to hard\n throw new BudgetExhaustedError({ scope, scopeId, spent, limit, window });\n }\n\n // soft\n return { exceeded: true, scope, scopeId, spent, limit, window };\n }\n}\n\nfunction createAccumulator(): WindowAccumulator {\n return {\n hourly: new Map(),\n daily: new Map(),\n monthly: new Map(),\n total: new Map(),\n };\n}\n\nfunction addToAccumulator(acc: WindowAccumulator, key: string, cost: number, now: number): void {\n for (const window of ['hourly', 'daily', 'monthly'] as const) {\n const map = acc[window];\n const entry = map.get(key);\n const duration = WINDOW_DURATIONS[window];\n\n if (!entry || now - entry.windowStart > duration) {\n map.set(key, { amount: cost, windowStart: now });\n } else {\n entry.amount += cost;\n }\n }\n\n acc.total.set(key, (acc.total.get(key) ?? 0) + cost);\n}\n\nfunction getSpent(acc: WindowAccumulator, key: string, window: BudgetWindow, now: number): number {\n if (window === 'total') {\n return acc.total.get(key) ?? 0;\n }\n\n const entry = acc[window].get(key);\n if (!entry) return 0;\n\n const duration = WINDOW_DURATIONS[window];\n if (now - entry.windowStart > duration) return 0;\n\n return entry.amount;\n}\n","import { ulid } from 'ulid';\nimport type {\n ObservatoryConfig,\n UsageEventInput,\n UsageEvent,\n TrackOptions,\n ObservabilityContext,\n ProviderAdapter,\n MiddlewareOptions,\n StorageBackend,\n} from './types.js';\nimport { UsageEventInputSchema } from './schemas.js';\nimport { PricingEngine } from './pricing.js';\nimport { BatchProcessor } from './batch.js';\nimport { ContextManager } from './context.js';\nimport { CallbackDispatcher } from './callbacks.js';\nimport { BudgetEngine } from './budget.js';\n\nexport class Observatory {\n private readonly backend: StorageBackend;\n private readonly pricing: PricingEngine;\n private readonly batch: BatchProcessor;\n private readonly defaultContext?: ObservabilityContext;\n private readonly disabled: boolean;\n private readonly callbacks?: CallbackDispatcher;\n private readonly budgetEngine?: BudgetEngine;\n\n constructor(config: ObservatoryConfig) {\n this.disabled = config.disabled ?? false;\n this.backend = config.backend;\n this.pricing = new PricingEngine(config.pricing ?? 'builtin');\n this.batch = new BatchProcessor(config.backend, config.batching);\n this.defaultContext = config.defaultContext;\n this.callbacks = config.on ? new CallbackDispatcher(config.on) : undefined;\n this.budgetEngine = config.budgets ? new BudgetEngine(config.budgets) : undefined;\n }\n\n async record(input: UsageEventInput): Promise<void> {\n if (this.disabled) return;\n\n const validated = UsageEventInputSchema.parse(input);\n\n const pricingMiss = this.pricing.isPricingMiss(validated.model);\n const cost = validated.cost ?? (pricingMiss ? 0 : this.pricing.calculateCost(validated));\n\n const resolvedContext = ContextManager.merge(this.defaultContext, validated.context);\n\n const event: UsageEvent = {\n ...validated,\n id: ulid(),\n timestamp: new Date(),\n total_tokens: validated.total_tokens ?? validated.input_tokens + validated.output_tokens,\n cost,\n pricing_miss: pricingMiss || undefined,\n context: Object.keys(resolvedContext).length > 0 ? resolvedContext : undefined,\n };\n\n await this.batch.add(event);\n this.budgetEngine?.accumulate(event);\n this.callbacks?.dispatch(event);\n }\n\n async track<T>(fn: () => Promise<T>, opts: TrackOptions): Promise<T> {\n if (this.disabled) return fn();\n\n const start = performance.now();\n let result: T;\n\n try {\n result = await fn();\n } catch (err) {\n const latency_ms = performance.now() - start;\n await this.record({\n model: 'unknown',\n provider: opts.provider.name,\n input_tokens: 0,\n output_tokens: 0,\n latency_ms,\n status: 'error',\n error: err instanceof Error ? err.message : String(err),\n context: opts.context,\n });\n throw err;\n }\n\n const latency_ms = performance.now() - start;\n const usage = opts.provider.extractUsage(result);\n\n const mergedContext = ContextManager.merge(ContextManager.get(), opts.context);\n\n await this.record({\n model: usage.model,\n provider: opts.provider.name,\n input_tokens: usage.input_tokens,\n output_tokens: usage.output_tokens,\n cache_read_tokens: usage.cache_read_tokens,\n cache_write_tokens: usage.cache_write_tokens,\n latency_ms,\n status: 'success',\n context: mergedContext,\n });\n\n return result;\n }\n\n instrument<T extends object>(client: T, adapter: ProviderAdapter): T {\n if (this.disabled) return client;\n\n const obs = this;\n const handler: ProxyHandler<T> = {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (typeof prop === 'string' && adapter.instrumentedMethods.includes(prop) && typeof value === 'function') {\n return (...args: unknown[]) => {\n return obs.track(\n () => value.apply(target, args),\n { provider: adapter, context: ContextManager.get() },\n );\n };\n }\n\n // Handle nested objects (e.g., openai.chat.completions.create)\n // Only proxy if this property is a prefix of at least one instrumented method\n if (typeof prop === 'string' && typeof value === 'object' && value !== null) {\n const hasMatchingMethod = adapter.instrumentedMethods.some(\n m => m === prop || m.startsWith(`${prop}.`)\n );\n if (hasMatchingMethod) {\n return new Proxy(value as object, makeNestedHandler(obs, adapter, prop));\n }\n }\n\n return value;\n },\n };\n\n return new Proxy(client, handler);\n }\n\n async withContext<T>(ctx: ObservabilityContext, fn: () => T | Promise<T>): Promise<T> {\n if (this.disabled) return fn();\n return ContextManager.run(ctx, fn) as Promise<T>;\n }\n\n middleware(opts: MiddlewareOptions) {\n const obs = this;\n return (req: unknown, _res: unknown, next: () => void) => {\n const ctx = opts.extractContext(req);\n return ContextManager.run(ctx, next);\n };\n }\n\n async flush(): Promise<void> {\n await this.batch.flush();\n }\n\n async close(): Promise<void> {\n await this.batch.close();\n }\n}\n\nfunction makeNestedHandler(obs: Observatory, adapter: ProviderAdapter, parentPath: string): ProxyHandler<object> {\n return {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n const fullPath = `${parentPath}.${String(prop)}`;\n\n if (typeof prop === 'string' && adapter.instrumentedMethods.includes(fullPath) && typeof value === 'function') {\n return (...args: unknown[]) => {\n return obs.track(\n () => value.apply(target, args),\n { provider: adapter, context: ContextManager.get() },\n );\n };\n }\n\n // Only proxy if this property is a prefix of at least one instrumented method\n if (typeof prop === 'string' && typeof value === 'object' && value !== null) {\n const hasMatchingMethod = adapter.instrumentedMethods.some(\n m => m === fullPath || m.startsWith(`${fullPath}.`)\n );\n if (hasMatchingMethod) {\n return new Proxy(value as object, makeNestedHandler(obs, adapter, fullPath));\n }\n }\n\n return value;\n },\n };\n}\n","import type { ObservabilityContext, ProviderAdapter, TrackOptions, MiddlewareOptions } from './types.js';\n\nexport class NoopObservatory {\n async record(): Promise<void> {}\n\n async track<T>(fn: () => Promise<T>): Promise<T> {\n return fn();\n }\n\n instrument<T extends object>(client: T): T {\n return client;\n }\n\n async withContext<T>(_ctx: ObservabilityContext, fn: () => T | Promise<T>): Promise<T> {\n return fn();\n }\n\n middleware() {\n return (_req: unknown, _res: unknown, next: () => void) => next();\n }\n\n async flush(): Promise<void> {}\n async close(): Promise<void> {}\n}\n"],"mappings":"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","names":["latency_ms"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@conquext/observa-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"ulid": "^2.3.0",
|
|
21
|
+
"zod": "^3.23.0"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsup",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"test": "vitest run"
|
|
27
|
+
}
|
|
28
|
+
}
|