@wrongstack/core 0.1.9 → 0.2.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/dist/agent-bridge-DmBiCipY.d.ts +33 -0
- package/dist/compactor-DSl2FK7a.d.ts +17 -0
- package/dist/config-DXrqb41m.d.ts +193 -0
- package/dist/{provider-txgB0Oq9.d.ts → context-u0bryklF.d.ts} +540 -472
- package/dist/coordination/index.d.ts +892 -0
- package/dist/coordination/index.js +2869 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/defaults/index.d.ts +34 -2309
- package/dist/defaults/index.js +5610 -4608
- package/dist/defaults/index.js.map +1 -1
- package/dist/events-B6Q03pTu.d.ts +290 -0
- package/dist/execution/index.d.ts +260 -0
- package/dist/execution/index.js +1625 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/index.d.ts +81 -11
- package/dist/index.js +7727 -6174
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/index.d.ts +10 -0
- package/dist/infrastructure/index.js +575 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/input-reader-E-ffP2ee.d.ts +12 -0
- package/dist/kernel/index.d.ts +15 -4
- package/dist/kernel/index.js.map +1 -1
- package/dist/logger-BH6AE0W9.d.ts +24 -0
- package/dist/logger-BMQgxvdy.d.ts +12 -0
- package/dist/mcp-servers-BA1Ofmfj.d.ts +100 -0
- package/dist/memory-CEXuo7sz.d.ts +16 -0
- package/dist/mode-CV077NjV.d.ts +27 -0
- package/dist/models/index.d.ts +60 -0
- package/dist/models/index.js +621 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models-registry-DqzwpBQy.d.ts +46 -0
- package/dist/models-registry-Y2xbog0E.d.ts +95 -0
- package/dist/multi-agent-BDfkxL5C.d.ts +351 -0
- package/dist/observability/index.d.ts +353 -0
- package/dist/observability/index.js +691 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability-BhnVLBLS.d.ts +67 -0
- package/dist/path-resolver-CPRj4bFY.d.ts +10 -0
- package/dist/path-resolver-Crkt8wTQ.d.ts +54 -0
- package/dist/plugin-CoYYZKdn.d.ts +447 -0
- package/dist/renderer-0A2ZEtca.d.ts +158 -0
- package/dist/sdd/index.d.ts +206 -0
- package/dist/sdd/index.js +864 -0
- package/dist/sdd/index.js.map +1 -0
- package/dist/secret-scrubber-3TLUkiCV.d.ts +31 -0
- package/dist/secret-scrubber-CwYliRWd.d.ts +54 -0
- package/dist/secret-vault-DoISxaKO.d.ts +19 -0
- package/dist/security/index.d.ts +46 -0
- package/dist/security/index.js +536 -0
- package/dist/security/index.js.map +1 -0
- package/dist/selector-BRqzvugb.d.ts +51 -0
- package/dist/session-reader-C3x96CDR.d.ts +150 -0
- package/dist/skill-Bx8jxznf.d.ts +72 -0
- package/dist/storage/index.d.ts +540 -0
- package/dist/storage/index.js +1802 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/{system-prompt-vAB0F54-.d.ts → system-prompt-CG9jU5-5.d.ts} +9 -1
- package/dist/task-graph-BITvWt4t.d.ts +160 -0
- package/dist/tool-executor-CYdZdtno.d.ts +97 -0
- package/dist/types/index.d.ts +26 -4
- package/dist/types/index.js +1787 -4
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +49 -2
- package/dist/utils/index.js +100 -2
- package/dist/utils/index.js.map +1 -1
- package/package.json +34 -2
- package/dist/mode-Pjt5vMS6.d.ts +0 -815
- package/dist/session-reader-9sOTgmeC.d.ts +0 -1087
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/observability/metrics.ts","../../src/observability/health.ts","../../src/observability/tracer.ts","../../src/observability/otel-tracer.ts","../../src/observability/event-bridge.ts","../../src/observability/prometheus.ts","../../src/observability/otlp-metrics.ts","../../src/observability/otlp-traces.ts"],"names":["DEFAULT_INTERVAL_MS","DEFAULT_TIMEOUT_MS","joinEndpoint"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n MetricLabels,\n MetricSeries,\n MetricsSink,\n MetricsSnapshot,\n} from '../types/observability.js';\n\ninterface CounterState {\n value: number;\n}\n\ninterface GaugeState {\n value: number;\n}\n\ninterface HistogramState {\n count: number;\n sum: number;\n min: number;\n max: number;\n // Reservoir sample for cheap quantile estimates. 1024 samples gives <2% error\n // on p99 for typical agent workloads — small memory footprint, no exporter\n // dependency. Swap for HdrHistogram if you need bounded-error guarantees.\n samples: number[];\n}\n\nconst RESERVOIR_SIZE = 1024;\n\nfunction labelKey(labels: MetricLabels | undefined): string {\n if (!labels) return '';\n const keys = Object.keys(labels).sort();\n return keys.map((k) => `${k}=${labels[k]}`).join(',');\n}\n\nfunction quantile(sorted: number[], q: number): number {\n if (sorted.length === 0) return 0;\n const idx = Math.min(sorted.length - 1, Math.floor(q * sorted.length));\n return sorted[idx] ?? 0;\n}\n\n/**\n * In-memory metrics sink. Suitable for embedded use, tests, and /metrics\n * scrape over HTTP. For production push-based pipelines, write an adapter\n * that implements MetricsSink and forwards to OTLP/StatsD/Prometheus.\n */\nexport class InMemoryMetricsSink implements MetricsSink {\n private counters = new Map<string, Map<string, CounterState>>();\n private gauges = new Map<string, Map<string, GaugeState>>();\n private histograms = new Map<string, Map<string, HistogramState>>();\n\n counter(name: string, value = 1, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.counters, name);\n const key = labelKey(labels);\n const state = series.get(key) ?? { value: 0 };\n state.value += value;\n series.set(key, state);\n }\n\n gauge(name: string, value: number, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.gauges, name);\n series.set(labelKey(labels), { value });\n }\n\n histogram(name: string, value: number, labels?: MetricLabels): void {\n const series = this.getOrCreate(this.histograms, name);\n const key = labelKey(labels);\n let state = series.get(key);\n if (!state) {\n state = { count: 0, sum: 0, min: value, max: value, samples: [] };\n series.set(key, state);\n }\n state.count++;\n state.sum += value;\n if (value < state.min) state.min = value;\n if (value > state.max) state.max = value;\n if (state.samples.length < RESERVOIR_SIZE) {\n state.samples.push(value);\n } else {\n // Vitter's Algorithm R — every new value has size/count chance of replacing.\n const r = Math.floor(Math.random() * state.count);\n if (r < RESERVOIR_SIZE) state.samples[r] = value;\n }\n }\n\n snapshot(): MetricsSnapshot {\n const series: MetricSeries[] = [];\n\n for (const [name, byLabel] of this.counters) {\n for (const [key, state] of byLabel) {\n series.push({\n name,\n type: 'counter',\n labels: parseLabelKey(key),\n values: { value: state.value },\n });\n }\n }\n\n for (const [name, byLabel] of this.gauges) {\n for (const [key, state] of byLabel) {\n series.push({\n name,\n type: 'gauge',\n labels: parseLabelKey(key),\n values: { value: state.value },\n });\n }\n }\n\n for (const [name, byLabel] of this.histograms) {\n for (const [key, state] of byLabel) {\n const sorted = [...state.samples].sort((a, b) => a - b);\n series.push({\n name,\n type: 'histogram',\n labels: parseLabelKey(key),\n values: {\n count: state.count,\n sum: state.sum,\n min: state.min,\n max: state.max,\n p50: quantile(sorted, 0.5),\n p95: quantile(sorted, 0.95),\n p99: quantile(sorted, 0.99),\n },\n });\n }\n }\n\n return { timestamp: Date.now(), series };\n }\n\n reset(): void {\n this.counters.clear();\n this.gauges.clear();\n this.histograms.clear();\n }\n\n private getOrCreate<V>(bag: Map<string, Map<string, V>>, name: string): Map<string, V> {\n let series = bag.get(name);\n if (!series) {\n series = new Map();\n bag.set(name, series);\n }\n return series;\n }\n}\n\nfunction parseLabelKey(key: string): MetricLabels {\n if (!key) return {};\n const labels: MetricLabels = {};\n for (const pair of key.split(',')) {\n const eq = pair.indexOf('=');\n if (eq > 0) labels[pair.slice(0, eq)] = pair.slice(eq + 1);\n }\n return labels;\n}\n\n/** Cheap noop sink — drop-in default when observability is not configured. */\nexport class NoopMetricsSink implements MetricsSink {\n counter(): void {}\n gauge(): void {}\n histogram(): void {}\n snapshot(): MetricsSnapshot {\n return { timestamp: Date.now(), series: [] };\n }\n reset(): void {}\n}\n","import type {\n AggregateHealth,\n HealthCheck,\n HealthCheckResult,\n HealthRegistry,\n HealthStatus,\n} from '../types/observability.js';\n\nconst SEVERITY: Record<HealthStatus, number> = {\n healthy: 0,\n degraded: 1,\n unhealthy: 2,\n};\n\n/**\n * Aggregates registered health checks. Worst status wins — one unhealthy check\n * makes the whole system unhealthy. Use timeouts so a slow probe can't stall\n * the response.\n */\nexport class DefaultHealthRegistry implements HealthRegistry {\n private checks = new Map<string, HealthCheck>();\n private readonly timeoutMs: number;\n\n constructor(opts: { timeoutMs?: number } = {}) {\n this.timeoutMs = opts.timeoutMs ?? 5_000;\n }\n\n register(check: HealthCheck): void {\n this.checks.set(check.name, check);\n }\n\n unregister(name: string): void {\n this.checks.delete(name);\n }\n\n async run(): Promise<AggregateHealth> {\n const results = await Promise.all(\n Array.from(this.checks.values()).map(async (c) => {\n const result = await this.runOne(c);\n return { name: c.name, ...result };\n }),\n );\n\n let status: HealthStatus = 'healthy';\n for (const r of results) {\n if (SEVERITY[r.status] > SEVERITY[status]) status = r.status;\n }\n\n return { status, timestamp: Date.now(), checks: results };\n }\n\n private async runOne(check: HealthCheck): Promise<HealthCheckResult> {\n let timer: ReturnType<typeof setTimeout> | null = null;\n const timeout = new Promise<HealthCheckResult>((resolve) => {\n timer = setTimeout(\n () => resolve({ status: 'unhealthy', detail: `timeout after ${this.timeoutMs}ms` }),\n this.timeoutMs,\n );\n });\n try {\n return await Promise.race([check.check(), timeout]);\n } catch (err) {\n return { status: 'unhealthy', detail: err instanceof Error ? err.message : String(err) };\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n}\n","import type { Span, Tracer } from '../types/observability.js';\n\n/**\n * Default tracer is a noop — zero overhead when observability is not wired up.\n * Replace at runtime with an OpenTelemetry-backed Tracer to enable real spans.\n */\nexport class NoopTracer implements Tracer {\n startSpan(): Span {\n return NOOP_SPAN;\n }\n}\n\nconst NOOP_SPAN: Span = {\n setAttribute() {},\n recordError() {},\n end() {},\n};\n","/**\n * Lightweight OTel adapter. Doesn't pull in `@opentelemetry/api` directly —\n * the user passes their already-initialized OTel Tracer through, and this\n * wrapper translates our minimal Span surface onto theirs.\n *\n * Usage:\n * import { trace } from '@opentelemetry/api';\n * const tracer = trace.getTracer('wrongstack', '1.0');\n * const wrappedTracer = new OTelTracer(tracer);\n * // pass `wrappedTracer` as Agent.tracer / ToolExecutor.tracer.\n *\n * The shape of the upstream Tracer is intentionally typed loosely so we\n * don't need a build-time dependency. Anything OTel-compatible works,\n * including OpenInference, Tempo, etc.\n */\nimport type { Span as WStackSpan, Tracer as WStackTracer } from '../types/observability.js';\n\ninterface OTelLikeSpan {\n setAttribute(key: string, value: string | number | boolean): unknown;\n recordException(err: { message: string; stack?: string; name?: string }): unknown;\n setStatus?(status: { code: number; message?: string }): unknown;\n end(): unknown;\n}\n\ninterface OTelLikeTracer {\n startSpan(\n name: string,\n options?: { attributes?: Record<string, string | number | boolean> },\n ): OTelLikeSpan;\n}\n\n// OTel SpanStatusCode.ERROR = 2 (per the spec). Hard-coded here so we don't\n// depend on the @opentelemetry/api enum.\nconst OTEL_STATUS_ERROR = 2;\n\nexport class OTelTracer implements WStackTracer {\n constructor(private readonly upstream: OTelLikeTracer) {}\n\n startSpan(name: string, attrs?: Record<string, string | number | boolean>): WStackSpan {\n const otelSpan = this.upstream.startSpan(name, attrs ? { attributes: attrs } : undefined);\n return new OTelSpan(otelSpan);\n }\n}\n\nclass OTelSpan implements WStackSpan {\n constructor(private readonly span: OTelLikeSpan) {}\n\n setAttribute(key: string, value: string | number | boolean): void {\n this.span.setAttribute(key, value);\n }\n\n recordError(err: Error): void {\n this.span.recordException(err);\n this.span.setStatus?.({ code: OTEL_STATUS_ERROR, message: err.message });\n }\n\n end(): void {\n this.span.end();\n }\n}\n","import type { EventBus } from '../kernel/events.js';\nimport type { MetricsSink } from '../types/observability.js';\n\n/**\n * Subscribes a MetricsSink to the EventBus. Returns an unsubscribe function\n * that detaches all listeners. This is the single integration point between\n * the agent's event stream and the observability layer — no metric calls\n * leak into core call sites.\n */\nexport function wireMetricsToEvents(events: EventBus, sink: MetricsSink): () => void {\n const unsubs: Array<() => void> = [];\n\n unsubs.push(\n events.on('session.started', () => sink.counter('agent.sessions.started')),\n events.on('session.ended', (e) => {\n sink.counter('agent.sessions.ended');\n sink.histogram('agent.session.tokens.input', e.usage.input);\n sink.histogram('agent.session.tokens.output', e.usage.output);\n }),\n events.on('session.damaged', () => sink.counter('agent.sessions.damaged')),\n events.on('iteration.completed', () => sink.counter('agent.iterations.total')),\n events.on('iteration.limit_reached', () => sink.counter('agent.iteration_limit.hit')),\n events.on('provider.response', (e) => {\n sink.counter('provider.responses.total', 1, { stop_reason: e.stopReason });\n sink.counter('provider.tokens.input', e.usage.input);\n sink.counter('provider.tokens.output', e.usage.output);\n if (e.usage.cacheRead) sink.counter('provider.tokens.cache_read', e.usage.cacheRead);\n if (e.usage.cacheWrite) sink.counter('provider.tokens.cache_write', e.usage.cacheWrite);\n }),\n events.on('provider.retry', (e) =>\n sink.counter('provider.retries.total', 1, {\n provider: e.providerId,\n status: String(e.status),\n }),\n ),\n events.on('provider.error', (e) =>\n sink.counter('provider.errors.total', 1, {\n provider: e.providerId,\n status: String(e.status),\n retryable: String(e.retryable),\n }),\n ),\n events.on('tool.started', (e) => sink.counter('tool.starts.total', 1, { tool: e.name })),\n events.on('tool.executed', (e) => {\n sink.counter('tool.executions.total', 1, { tool: e.name, ok: String(e.ok) });\n sink.histogram('tool.duration_ms', e.durationMs, { tool: e.name });\n }),\n events.on('token.threshold', (e) => sink.gauge('agent.tokens.used', e.used)),\n events.on('compaction.fired', (e) => {\n sink.counter('compaction.fired.total');\n sink.histogram('compaction.reduction_tokens', e.before - e.after);\n }),\n events.on('mcp.server.connected', (e) =>\n sink.counter('mcp.connects.total', 1, { server: e.name }),\n ),\n events.on('mcp.server.reconnected', (e) =>\n sink.counter('mcp.reconnects.total', 1, { server: e.name }),\n ),\n events.on('mcp.server.disconnected', (e) =>\n sink.counter('mcp.disconnects.total', 1, { server: e.name }),\n ),\n events.on('error', (e) => sink.counter('agent.errors.total', 1, { phase: e.phase })),\n );\n\n return () => {\n for (const u of unsubs) u();\n };\n}\n","import type { HealthRegistry, MetricsSink, MetricsSnapshot } from '../types/observability.js';\n\n/** TLS options for HTTPS metrics endpoint. */\nexport interface MetricsTlsOptions {\n cert: string;\n key: string;\n}\n\n/**\n * L3-C: Prometheus text exposition format renderer.\n *\n * Implements v0.0.4 (the line-oriented format every scraper accepts):\n * # HELP <name> <help>\n * # TYPE <name> <counter|gauge|histogram|summary>\n * <name>{label=\"value\"} <number>\n *\n * Histograms are emitted as Prometheus *summary* type because our in-memory\n * sink already stores quantiles (p50/p95/p99) rather than open bucket lists.\n * That maps 1:1 onto Prometheus summary semantics and avoids us having to\n * carry a bucket schema we cannot infer from samples.\n */\n\nconst NUMBER_FORMAT_INFINITY = 'NaN'; // Prometheus accepts `NaN` for missing values.\n\nfunction escapeLabelValue(v: string): string {\n return v.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nfunction formatLabels(labels: Record<string, string>): string {\n const keys = Object.keys(labels);\n if (keys.length === 0) return '';\n const parts = keys.map((k) => `${k}=\"${escapeLabelValue(labels[k] ?? '')}\"`);\n return `{${parts.join(',')}}`;\n}\n\nfunction formatNumber(n: number): string {\n if (!Number.isFinite(n)) return NUMBER_FORMAT_INFINITY;\n return Number.isInteger(n) ? n.toString() : n.toString();\n}\n\nfunction joinLabels(\n base: Record<string, string>,\n extra: Record<string, string>,\n): Record<string, string> {\n return { ...base, ...extra };\n}\n\n/**\n * Render a `MetricsSnapshot` as Prometheus text-format bytes. The output\n * always ends with a trailing newline (Prometheus requires it).\n */\nexport function renderPrometheus(snapshot: MetricsSnapshot): string {\n // Group by name so we can emit one HELP/TYPE pair per metric.\n type Row = { labels: Record<string, string>; values: Record<string, number> };\n const groups = new Map<\n string,\n { type: MetricsSnapshot['series'][number]['type']; rows: Row[] }\n >();\n for (const s of snapshot.series) {\n let g = groups.get(s.name);\n if (!g) {\n g = { type: s.type, rows: [] };\n groups.set(s.name, g);\n }\n g.rows.push({ labels: s.labels, values: s.values });\n }\n\n const lines: string[] = [];\n for (const [name, g] of groups) {\n const promType = g.type === 'histogram' ? 'summary' : g.type;\n lines.push(`# HELP ${name} ${name}`);\n lines.push(`# TYPE ${name} ${promType}`);\n\n if (g.type === 'counter' || g.type === 'gauge') {\n for (const row of g.rows) {\n lines.push(`${name}${formatLabels(row.labels)} ${formatNumber(row.values.value ?? 0)}`);\n }\n } else {\n // histogram → summary\n for (const row of g.rows) {\n const { count = 0, sum = 0, p50 = 0, p95 = 0, p99 = 0 } = row.values;\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.5' }))} ${formatNumber(p50)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.95' }))} ${formatNumber(p95)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.99' }))} ${formatNumber(p99)}`,\n );\n lines.push(`${name}_sum${formatLabels(row.labels)} ${formatNumber(sum)}`);\n lines.push(`${name}_count${formatLabels(row.labels)} ${formatNumber(count)}`);\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/** MIME type Prometheus servers must respond with on /metrics. */\nexport const PROMETHEUS_CONTENT_TYPE = 'text/plain; version=0.0.4; charset=utf-8';\n\nexport interface MetricsServerOptions {\n port: number;\n /** Bind address. Defaults to 127.0.0.1 so we don't accidentally expose metrics publicly. */\n host?: string;\n sink: MetricsSink;\n /** Path to serve on. Defaults to /metrics. */\n path?: string;\n /**\n * V2-C: optional health registry. When provided, the server also responds\n * on `/healthz` (configurable via `healthPath`) with a JSON aggregate of\n * every registered health check. K8s probes expect a single HTTP server\n * exposing both `/metrics` and `/healthz`, so we mount them on the same\n * port rather than opening a sibling listener.\n */\n healthRegistry?: HealthRegistry;\n /** Path to serve health JSON on. Defaults to /healthz. */\n healthPath?: string;\n /** Enable HTTPS by providing TLS key/cert. Both required. */\n tls?: MetricsTlsOptions;\n}\n\nexport interface MetricsServerHandle {\n port: number;\n url: string;\n close(): Promise<void>;\n}\n\n/**\n * Start an HTTP server that exposes a Prometheus scrape endpoint.\n * Uses node:http directly to avoid pulling a framework into the core graph.\n *\n * Why bind to 127.0.0.1 by default: telemetry endpoints inside an agent\n * process can leak prompt content via metric labels (tool name, error\n * message, etc.). The default keeps that on the loopback interface;\n * operators who want network scraping opt in explicitly with host: '0.0.0.0'.\n */\nexport async function startMetricsServer(opts: MetricsServerOptions): Promise<MetricsServerHandle> {\n const tls = opts.tls;\n const useHttps = !!(tls?.cert && tls?.key);\n const host = opts.host ?? '127.0.0.1';\n const path = opts.path ?? '/metrics';\n const healthPath = opts.healthPath ?? '/healthz';\n const healthRegistry = opts.healthRegistry;\n\n type RequestListener = (req: import('node:http').IncomingMessage, res: import('node:http').ServerResponse) => void;\n const listener: RequestListener = (req, res) => {\n if (!req.url || req.method !== 'GET') {\n res.statusCode = req.url ? 405 : 400;\n res.end();\n return;\n }\n // Strip query string for the route match.\n const url = req.url.split('?')[0];\n if (url === path) {\n let body: string;\n try {\n body = renderPrometheus(opts.sink.snapshot());\n } catch (err) {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`metrics render failed: ${err instanceof Error ? err.message : String(err)}`);\n return;\n }\n res.statusCode = 200;\n res.setHeader('content-type', PROMETHEUS_CONTENT_TYPE);\n res.end(body);\n return;\n }\n if (healthRegistry && url === healthPath) {\n healthRegistry.run().then(\n (agg) => {\n res.statusCode = agg.status === 'unhealthy' ? 503 : 200;\n res.setHeader('content-type', 'application/json; charset=utf-8');\n res.end(JSON.stringify(agg, null, 2));\n },\n (err: unknown) => {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`health run failed: ${err instanceof Error ? err.message : String(err)}`);\n },\n );\n return;\n }\n res.statusCode = 404;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end('Not Found');\n };\n\n let server: import('node:http').Server;\n if (useHttps && tls) {\n const { createServer } = await import('node:https');\n const { readFileSync } = await import('node:fs');\n server = createServer(\n { cert: readFileSync(tls.cert), key: readFileSync(tls.key) },\n listener,\n );\n } else {\n const { createServer } = await import('node:http');\n server = createServer(listener);\n }\n\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error) => {\n server.off('listening', onListening);\n reject(err);\n };\n const onListening = () => {\n server.off('error', onError);\n resolve();\n };\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(opts.port, host);\n });\n\n const addr = server.address();\n const boundPort = typeof addr === 'object' && addr ? addr.port : opts.port;\n const protocol = useHttps ? 'https' : 'http';\n return {\n port: boundPort,\n url: `${protocol}://${host}:${boundPort}${path}`,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err: Error | undefined) => (err ? reject(err) : resolve()));\n }),\n };\n}\n","import type { MetricSeries, MetricsSink } from '../types/observability.js';\n\n/**\n * V2-A: OTLP/JSON metrics push exporter.\n *\n * Periodically POSTs `MetricsSink.snapshot()` to an OTLP HTTP receiver\n * (the OpenTelemetry Collector, vendor agents like Honeycomb, Datadog,\n * Grafana Cloud, etc.). The wire format is OTLP/JSON v1.0 — covered by\n * the spec at github.com/open-telemetry/opentelemetry-proto.\n *\n * Why no `@opentelemetry/*` dep: the core graph is intentionally\n * dependency-free. The JSON shape is well-defined and stable; bringing\n * in the official SDK would add ~3MB and pin us to its release cadence.\n * Operators who need the OTLP gRPC transport or vendor-specific quirks\n * can wrap an `@opentelemetry/exporter-metrics-otlp-grpc` in a custom\n * `MetricsSink` instead — the seam exists.\n */\n\nexport interface OtlpMetricsExporterOptions {\n /** Source of metric data. The exporter reads `snapshot()` per interval. */\n sink: MetricsSink;\n /**\n * OTLP HTTP endpoint base URL. Path `/v1/metrics` is appended unless\n * the URL already ends with `/v1/metrics` (idempotent).\n * Example: `http://otel-collector:4318` or `https://otlp.example.com`.\n */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 30s (Prometheus default). */\n intervalMs?: number;\n /** Optional bearer token / API key (sent as `Authorization`). */\n authorization?: string;\n /** Extra request headers (vendor-specific keys go here). */\n headers?: Record<string, string>;\n /** Resource attributes attached to every export. Defaults: `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope. Default: `wrongstack`. */\n scopeName?: string;\n /** Per-request timeout. Defaults to 10s. */\n timeoutMs?: number;\n /** Override fetch (for tests). Defaults to global `fetch`. */\n fetchImpl?: typeof globalThis.fetch;\n /** Called when a push fails. Defaults to silent (telemetry must never crash the host). */\n onError?: (err: unknown) => void;\n}\n\nexport interface OtlpMetricsExporterHandle {\n /** Push immediately (in addition to the scheduled interval). */\n flush(): Promise<void>;\n /** Stop the timer, attempt a final flush, then resolve. */\n stop(): Promise<void>;\n}\n\nconst DEFAULT_INTERVAL_MS = 30_000;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/metrics\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/metrics';\n}\n\ninterface OtlpAttribute {\n key: string;\n value: { stringValue: string };\n}\n\ninterface OtlpDataPoint {\n attributes: OtlpAttribute[];\n timeUnixNano: string;\n asDouble?: number;\n asInt?: string;\n count?: string;\n sum?: number;\n quantileValues?: { quantile: number; value: number }[];\n}\n\ninterface OtlpMetric {\n name: string;\n description?: string;\n unit?: string;\n sum?: { dataPoints: OtlpDataPoint[]; aggregationTemporality: 2; isMonotonic: true };\n gauge?: { dataPoints: OtlpDataPoint[] };\n summary?: { dataPoints: OtlpDataPoint[] };\n}\n\ninterface OtlpExportRequest {\n resourceMetrics: {\n resource: { attributes: OtlpAttribute[] };\n scopeMetrics: {\n scope: { name: string; version?: string };\n metrics: OtlpMetric[];\n }[];\n }[];\n}\n\nfunction attributesFor(labels: Record<string, string>): OtlpAttribute[] {\n return Object.entries(labels).map(([key, value]) => ({\n key,\n value: { stringValue: value },\n }));\n}\n\nfunction buildExportBody(opts: {\n series: MetricSeries[];\n resourceAttributes: Record<string, string>;\n scopeName: string;\n timeUnixNano: string;\n}): OtlpExportRequest {\n const metrics: OtlpMetric[] = [];\n for (const s of opts.series) {\n const dp: OtlpDataPoint = {\n attributes: attributesFor(s.labels),\n timeUnixNano: opts.timeUnixNano,\n };\n\n if (s.type === 'counter') {\n // OTLP requires sum data points carry `startTimeUnixNano`, but the spec\n // accepts omission for cumulative counters when the receiver can\n // assume process start. Most collectors do; vendor-specific tightness\n // is the user's problem if they need it stricter.\n dp.asDouble = s.values.value ?? 0;\n metrics.push({\n name: s.name,\n sum: { dataPoints: [dp], aggregationTemporality: 2, isMonotonic: true },\n });\n } else if (s.type === 'gauge') {\n dp.asDouble = s.values.value ?? 0;\n metrics.push({ name: s.name, gauge: { dataPoints: [dp] } });\n } else {\n // histogram → OTLP summary (quantiles are pre-computed by the sink)\n dp.count = String(s.values.count ?? 0);\n dp.sum = s.values.sum ?? 0;\n dp.quantileValues = [\n { quantile: 0.5, value: s.values.p50 ?? 0 },\n { quantile: 0.95, value: s.values.p95 ?? 0 },\n { quantile: 0.99, value: s.values.p99 ?? 0 },\n ];\n metrics.push({ name: s.name, summary: { dataPoints: [dp] } });\n }\n }\n\n return {\n resourceMetrics: [\n {\n resource: { attributes: attributesFor(opts.resourceAttributes) },\n scopeMetrics: [\n {\n scope: { name: opts.scopeName },\n metrics,\n },\n ],\n },\n ],\n };\n}\n\n/**\n * Build the OTLP/JSON export body from a sink snapshot. Exported for tests\n * and for callers that want to ship via their own transport.\n */\nexport function buildOtlpMetricsRequest(\n sink: MetricsSink,\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string } = {},\n): OtlpExportRequest {\n return buildExportBody({\n series: sink.snapshot().series,\n resourceAttributes: opts.resourceAttributes ?? { 'service.name': 'wrongstack' },\n scopeName: opts.scopeName ?? 'wrongstack',\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n}\n\n/**\n * Start pushing metrics to an OTLP HTTP receiver. Returns a handle with\n * `flush()` and `stop()`.\n */\nexport function startOtlpMetricsExporter(\n opts: OtlpMetricsExporterOptions,\n): OtlpMetricsExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n async function pushOnce(): Promise<void> {\n if (stopped) return;\n const body = buildExportBody({\n series: opts.sink.snapshot().series,\n resourceAttributes,\n scopeName,\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n void pushOnce();\n }, intervalMs);\n // Don't keep the process alive just to push metrics — graceful shutdown\n // is the host's job.\n handle.unref?.();\n\n return {\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n };\n}\n","import * as crypto from 'node:crypto';\nimport type { Span, Tracer } from '../types/observability.js';\n\n/**\n * V2-B: OTLP/JSON trace exporter.\n *\n * The `Tracer` produced here captures every started span into an\n * in-memory buffer; an exporter timer drains the buffer and POSTs to\n * `/v1/traces` on the configured OTLP HTTP endpoint.\n *\n * Two production paths:\n *\n * 1. **This adapter** — zero deps, single-process, no parent/child\n * relationships (every span is a root span). Suitable when you\n * mostly want to see the agent's iteration / provider-call /\n * tool-call timings in a vendor UI (Jaeger, Tempo, Honeycomb,\n * Datadog APM, Grafana Cloud, Lightstep, …).\n *\n * 2. **Wrap a real OTel SDK** via the existing `OTelTracer` adapter.\n * Use this when you need context propagation, distributed traces\n * across processes, or vendor-specific span attributes.\n *\n * Keep `@opentelemetry/*` out of the dependency graph by design — both\n * paths above let users opt in to that dep on their own.\n */\n\nconst SPAN_STATUS_CODE_UNSET = 0;\nconst SPAN_STATUS_CODE_OK = 1;\nconst SPAN_STATUS_CODE_ERROR = 2;\n\ntype SpanAttrValue = string | number | boolean;\n\ninterface RecordedSpan {\n traceId: string;\n spanId: string;\n name: string;\n startTimeUnixNano: bigint;\n endTimeUnixNano?: bigint;\n attributes: Record<string, SpanAttrValue>;\n status: { code: number; message?: string };\n}\n\nfunction hex(bytes: number): string {\n return crypto.randomBytes(bytes).toString('hex');\n}\n\nfunction nowNs(): bigint {\n // Date.now() resolution is 1ms — fine for spans whose work takes ≥1ms.\n // Performance.now-based high-res nanoseconds would help, but reference\n // monoclock differs across processes and the OTLP receiver expects\n // wall-clock anyway.\n return BigInt(Date.now()) * 1_000_000n;\n}\n\nclass CapturingSpan implements Span {\n constructor(\n private readonly state: RecordedSpan,\n private readonly onEnd: (s: RecordedSpan) => void,\n ) {}\n\n setAttribute(key: string, value: SpanAttrValue): void {\n this.state.attributes[key] = value;\n }\n\n recordError(err: Error): void {\n this.state.status = { code: SPAN_STATUS_CODE_ERROR, message: err.message };\n this.state.attributes['exception.message'] = err.message;\n if (err.name) this.state.attributes['exception.type'] = err.name;\n }\n\n end(): void {\n if (this.state.endTimeUnixNano !== undefined) return;\n this.state.endTimeUnixNano = nowNs();\n if (this.state.status.code === SPAN_STATUS_CODE_UNSET) {\n this.state.status.code = SPAN_STATUS_CODE_OK;\n }\n this.onEnd(this.state);\n }\n}\n\nexport interface OtlpTraceExporterOptions {\n /** OTLP HTTP endpoint base URL. `/v1/traces` is appended unless already present. */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 5s (traces are bursty). */\n intervalMs?: number;\n /** Hard cap on buffered spans. When exceeded, oldest are dropped. Defaults to 2048. */\n maxBufferedSpans?: number;\n /** Authorization header. */\n authorization?: string;\n /** Extra request headers. */\n headers?: Record<string, string>;\n /** Resource attributes. Defaults to `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope name. Default `wrongstack`. */\n scopeName?: string;\n /** Per-request timeout in ms. Default 10s. */\n timeoutMs?: number;\n /** Override fetch (for tests). */\n fetchImpl?: typeof globalThis.fetch;\n /** Called on push failure. Defaults to silent. */\n onError?: (err: unknown) => void;\n}\n\nexport interface OtlpTraceExporterHandle {\n /** The Tracer to install on Agent / ToolExecutor. */\n readonly tracer: Tracer;\n /** Push buffered spans immediately. */\n flush(): Promise<void>;\n /** Stop the timer, push remaining spans, resolve. */\n stop(): Promise<void>;\n /** Test helper: snapshot of spans currently in the buffer (not yet pushed). */\n readonly buffered: () => readonly RecordedSpan[];\n}\n\nconst DEFAULT_INTERVAL_MS = 5_000;\nconst DEFAULT_BUFFER_CAP = 2048;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/traces\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/traces';\n}\n\ninterface OtlpAttribute {\n key: string;\n value:\n | { stringValue: string }\n | { boolValue: boolean }\n | { doubleValue: number }\n | { intValue: string };\n}\n\nfunction encodeAttr(key: string, value: SpanAttrValue): OtlpAttribute {\n if (typeof value === 'boolean') return { key, value: { boolValue: value } };\n if (typeof value === 'number') {\n return Number.isInteger(value)\n ? { key, value: { intValue: String(value) } }\n : { key, value: { doubleValue: value } };\n }\n return { key, value: { stringValue: value } };\n}\n\ninterface OtlpSpan {\n traceId: string;\n spanId: string;\n name: string;\n kind: 1;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes: OtlpAttribute[];\n status: { code: number; message?: string };\n}\n\ninterface OtlpTracesRequest {\n resourceSpans: {\n resource: { attributes: OtlpAttribute[] };\n scopeSpans: {\n scope: { name: string };\n spans: OtlpSpan[];\n }[];\n }[];\n}\n\nexport function buildOtlpTracesRequest(\n spans: readonly RecordedSpan[],\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string } = {},\n): OtlpTracesRequest {\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n const otlpSpans: OtlpSpan[] = spans.map((s) => ({\n traceId: s.traceId,\n spanId: s.spanId,\n name: s.name,\n kind: 1, // SPAN_KIND_INTERNAL\n startTimeUnixNano: s.startTimeUnixNano.toString(),\n endTimeUnixNano: (s.endTimeUnixNano ?? s.startTimeUnixNano).toString(),\n attributes: Object.entries(s.attributes).map(([k, v]) => encodeAttr(k, v)),\n status: s.status,\n }));\n\n return {\n resourceSpans: [\n {\n resource: {\n attributes: Object.entries(resourceAttributes).map(([k, v]) => encodeAttr(k, v)),\n },\n scopeSpans: [{ scope: { name: scopeName }, spans: otlpSpans }],\n },\n ],\n };\n}\n\n/**\n * Start the OTLP trace exporter. Returns a `Tracer` to install on the\n * runtime (`Agent.run` etc.) and `flush()`/`stop()` controls.\n */\nexport function startOtlpTraceExporter(opts: OtlpTraceExporterOptions): OtlpTraceExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const maxBuffered = opts.maxBufferedSpans ?? DEFAULT_BUFFER_CAP;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n const buffer: RecordedSpan[] = [];\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n const tracer: Tracer = {\n startSpan(name, attrs) {\n const state: RecordedSpan = {\n traceId: hex(16),\n spanId: hex(8),\n name,\n startTimeUnixNano: nowNs(),\n attributes: { ...(attrs ?? {}) },\n status: { code: SPAN_STATUS_CODE_UNSET },\n };\n return new CapturingSpan(state, (ended) => {\n if (buffer.length >= maxBuffered) buffer.shift();\n buffer.push(ended);\n });\n },\n };\n\n async function pushOnce(): Promise<void> {\n if (buffer.length === 0) return;\n const batch = buffer.splice(0, buffer.length);\n const body = buildOtlpTracesRequest(batch, { resourceAttributes, scopeName });\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP traces push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n if (!stopped) void pushOnce();\n }, intervalMs);\n handle.unref?.();\n\n return {\n tracer,\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n buffered: () => [...buffer],\n };\n}\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observability primitives — metrics, tracing, health. Implementations live in
|
|
3
|
+
* `defaults/observability/`. Consumers depend on these interfaces so a noop
|
|
4
|
+
* sink can be swapped for an OTel/Prometheus adapter without touching call
|
|
5
|
+
* sites.
|
|
6
|
+
*/
|
|
7
|
+
type MetricLabels = Record<string, string>;
|
|
8
|
+
interface MetricsSink {
|
|
9
|
+
/** Monotonically-increasing counter (e.g. total tool calls). */
|
|
10
|
+
counter(name: string, value?: number, labels?: MetricLabels): void;
|
|
11
|
+
/** Latency / size distribution (e.g. tool duration). */
|
|
12
|
+
histogram(name: string, value: number, labels?: MetricLabels): void;
|
|
13
|
+
/** Current value (e.g. active subagents, pending tasks). */
|
|
14
|
+
gauge(name: string, value: number, labels?: MetricLabels): void;
|
|
15
|
+
/** Point-in-time export — for /metrics scrape, debug dumps, tests. */
|
|
16
|
+
snapshot(): MetricsSnapshot;
|
|
17
|
+
/** Reset all metrics. Useful for tests; production code should rarely use. */
|
|
18
|
+
reset(): void;
|
|
19
|
+
}
|
|
20
|
+
interface MetricSeries {
|
|
21
|
+
name: string;
|
|
22
|
+
type: 'counter' | 'histogram' | 'gauge';
|
|
23
|
+
labels: MetricLabels;
|
|
24
|
+
/** Counter/gauge: latest value. Histogram: count, sum, min, max, p50, p95, p99. */
|
|
25
|
+
values: Record<string, number>;
|
|
26
|
+
}
|
|
27
|
+
interface MetricsSnapshot {
|
|
28
|
+
timestamp: number;
|
|
29
|
+
series: MetricSeries[];
|
|
30
|
+
}
|
|
31
|
+
type HealthStatus = 'healthy' | 'degraded' | 'unhealthy';
|
|
32
|
+
interface HealthCheckResult {
|
|
33
|
+
status: HealthStatus;
|
|
34
|
+
detail?: string;
|
|
35
|
+
/** Optional structured data (e.g. latency, version) for dashboards. */
|
|
36
|
+
data?: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
interface HealthCheck {
|
|
39
|
+
readonly name: string;
|
|
40
|
+
check(): Promise<HealthCheckResult>;
|
|
41
|
+
}
|
|
42
|
+
interface AggregateHealth {
|
|
43
|
+
status: HealthStatus;
|
|
44
|
+
timestamp: number;
|
|
45
|
+
checks: (HealthCheckResult & {
|
|
46
|
+
name: string;
|
|
47
|
+
})[];
|
|
48
|
+
}
|
|
49
|
+
interface HealthRegistry {
|
|
50
|
+
register(check: HealthCheck): void;
|
|
51
|
+
unregister(name: string): void;
|
|
52
|
+
run(): Promise<AggregateHealth>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Minimal OTel-compatible Span. The default implementation is a noop; wire an
|
|
56
|
+
* OpenTelemetry adapter in production to get distributed tracing for free.
|
|
57
|
+
*/
|
|
58
|
+
interface Span {
|
|
59
|
+
setAttribute(key: string, value: string | number | boolean): void;
|
|
60
|
+
recordError(err: Error): void;
|
|
61
|
+
end(): void;
|
|
62
|
+
}
|
|
63
|
+
interface Tracer {
|
|
64
|
+
startSpan(name: string, attrs?: Record<string, string | number | boolean>): Span;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export type { AggregateHealth as A, HealthCheck as H, MetricLabels as M, Span as S, Tracer as T, HealthCheckResult as a, HealthRegistry as b, HealthStatus as c, MetricSeries as d, MetricsSink as e, MetricsSnapshot as f };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface PathResolver {
|
|
2
|
+
readonly projectRoot: string;
|
|
3
|
+
readonly cwd: string;
|
|
4
|
+
resolve(input: string): string;
|
|
5
|
+
isInsideRoot(absPath: string): boolean;
|
|
6
|
+
ensureInsideRoot(absPath: string): string;
|
|
7
|
+
detectProjectRoot(start: string): string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export type { PathResolver as P };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { E as EventBus } from './events-B6Q03pTu.js';
|
|
2
|
+
import { M as ModelsRegistry, b as ResolvedModel } from './models-registry-Y2xbog0E.js';
|
|
3
|
+
import { a1 as TokenCounter, U as Usage, a2 as CacheStats } from './context-u0bryklF.js';
|
|
4
|
+
import { P as PathResolver } from './path-resolver-CPRj4bFY.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Token counter that derives pricing from the ModelsRegistry instead of a
|
|
8
|
+
* hardcoded table. If a model is unknown to the registry (or the registry is
|
|
9
|
+
* unavailable) the counter still tracks token totals but reports zero cost.
|
|
10
|
+
*/
|
|
11
|
+
declare class DefaultTokenCounter implements TokenCounter {
|
|
12
|
+
private input;
|
|
13
|
+
private output;
|
|
14
|
+
private cacheRead;
|
|
15
|
+
private cacheWrite;
|
|
16
|
+
private costInput;
|
|
17
|
+
private costOutput;
|
|
18
|
+
private readonly registry?;
|
|
19
|
+
private readonly providerId?;
|
|
20
|
+
private readonly events?;
|
|
21
|
+
private priceCache;
|
|
22
|
+
constructor(opts?: {
|
|
23
|
+
registry?: ModelsRegistry;
|
|
24
|
+
providerId?: string;
|
|
25
|
+
events?: EventBus;
|
|
26
|
+
});
|
|
27
|
+
account(usage: Usage, model?: string): void;
|
|
28
|
+
/** Synchronous variant for code paths that have already resolved the model. */
|
|
29
|
+
accountWithModel(usage: Usage, resolved: ResolvedModel): void;
|
|
30
|
+
total(): Usage;
|
|
31
|
+
estimateCost(): {
|
|
32
|
+
input: number;
|
|
33
|
+
output: number;
|
|
34
|
+
total: number;
|
|
35
|
+
currency: 'USD';
|
|
36
|
+
};
|
|
37
|
+
cacheStats(): CacheStats;
|
|
38
|
+
/** Invalidate cached prices so the next account() call fetches fresh data. */
|
|
39
|
+
invalidateCache(): void;
|
|
40
|
+
reset(): void;
|
|
41
|
+
private applyPrice;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
declare class DefaultPathResolver implements PathResolver {
|
|
45
|
+
readonly projectRoot: string;
|
|
46
|
+
readonly cwd: string;
|
|
47
|
+
constructor(cwd?: string);
|
|
48
|
+
detectProjectRoot(start: string): string;
|
|
49
|
+
resolve(input: string): string;
|
|
50
|
+
isInsideRoot(absPath: string): boolean;
|
|
51
|
+
ensureInsideRoot(absPath: string): string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export { DefaultPathResolver as D, DefaultTokenCounter as a };
|