risicare 0.1.2 → 0.1.4
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/index.cjs +5 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -6
- package/dist/index.d.ts +10 -6
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic/index.cjs.map +1 -1
- package/dist/providers/anthropic/index.js.map +1 -1
- package/dist/providers/openai/index.cjs.map +1 -1
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/vercel-ai/index.cjs.map +1 -1
- package/dist/providers/vercel-ai/index.js.map +1 -1
- package/package.json +11 -4
package/dist/index.cjs
CHANGED
|
@@ -81,6 +81,11 @@ function resolveConfig(config) {
|
|
|
81
81
|
const apiKey = config?.apiKey ?? env.RISICARE_API_KEY;
|
|
82
82
|
const endpoint = config?.endpoint ?? env.RISICARE_ENDPOINT ?? DEFAULT_ENDPOINT;
|
|
83
83
|
const projectId = config?.projectId ?? env.RISICARE_PROJECT_ID;
|
|
84
|
+
if (config?.projectId || env.RISICARE_PROJECT_ID) {
|
|
85
|
+
console.warn(
|
|
86
|
+
"[risicare] projectId is deprecated and ignored by the gateway. Your API key determines the project. Use serviceName and environment for within-project organization. projectId will be removed in v1.0."
|
|
87
|
+
);
|
|
88
|
+
}
|
|
84
89
|
const environment = config?.environment ?? env.RISICARE_ENVIRONMENT ?? "development";
|
|
85
90
|
const serviceName = config?.serviceName ?? env.RISICARE_SERVICE_NAME;
|
|
86
91
|
const serviceVersion = config?.serviceVersion ?? env.RISICARE_SERVICE_VERSION;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/ids.ts","../src/types.ts","../src/utils/clock.ts","../src/span.ts","../src/noop.ts","../src/utils/sampling.ts","../src/globals.ts","../src/context/storage.ts","../src/tracer.ts","../src/utils/log.ts","../src/exporters/batch.ts","../src/exporters/http.ts","../src/exporters/console.ts","../src/client.ts","../src/context/agent.ts","../src/decorators/agent.ts","../src/context/session.ts","../src/decorators/session.ts","../src/context/phase.ts","../src/decorators/phase.ts","../src/decorators/multi-agent.ts","../src/context/trace-context.ts","../src/context/registry.ts"],"sourcesContent":["/**\n * Risicare SDK for JavaScript/TypeScript — Public API.\n *\n * Progressive integration tiers:\n * Tier 1: init() + patchOpenAI() (minimum setup)\n * Tier 2: agent() wrapper (agent identity)\n * Tier 3: session() / withSession() (user sessions)\n * Tier 4: traceThink/Decide/Act/Observe (decision phases)\n * Tier 5: traceMessage/Delegate/Coordinate (multi-agent)\n */\n\n// ─── Tier 1: Initialization ─────────────────────────────────────────────────\n\nexport { init, shutdown, flush, enable, disable, isEnabled, getTracer, getTraceContent, getMetrics } from './client.js';\nexport type { RisicareConfig } from './config.js';\n\n// ─── Tier 2: Agent Identity ─────────────────────────────────────────────────\n\nexport { agent } from './decorators/agent.js';\nexport { withAgent } from './context/agent.js';\nexport type { AgentOptions } from './context/agent.js';\n\n// ─── Tier 3: Sessions ───────────────────────────────────────────────────────\n\nexport { session } from './decorators/session.js';\nexport { withSession } from './context/session.js';\nexport type { SessionOptions } from './context/session.js';\n\n// ─── Tier 4: Decision Phases ────────────────────────────────────────────────\n\nexport { traceThink, traceDecide, traceAct, traceObserve } from './decorators/phase.js';\nexport { withPhase } from './context/phase.js';\n\n// ─── Tier 5: Multi-Agent ────────────────────────────────────────────────────\n\nexport { traceMessage, traceDelegate, traceCoordinate } from './decorators/multi-agent.js';\n\n// ─── Tracer ─────────────────────────────────────────────────────────────────\n\nexport type { Tracer, StartSpanOptions } from './tracer.js';\n\n// ─── Span ───────────────────────────────────────────────────────────────────\n\nexport type { Span, SpanOptions } from './span.js';\n\n// ─── Context Accessors ──────────────────────────────────────────────────────\n\nexport {\n getCurrentSession,\n getCurrentAgent,\n getCurrentSpan,\n getCurrentPhase,\n getCurrentTraceId,\n getCurrentSpanId,\n getCurrentSessionId,\n getCurrentAgentId,\n getCurrentContext,\n} from './context/storage.js';\nexport type { SessionContext, AgentContext, TraceContext } from './context/index.js';\n\n// ─── Trace Context (Serializable + W3C) ─────────────────────────────────────\n\nexport {\n getTraceContext,\n injectTraceContext,\n extractTraceContext,\n} from './context/trace-context.js';\n\n// ─── Span Registry (Edge Cases) ─────────────────────────────────────────────\n\nexport { registerSpan, getSpanById, unregisterSpan } from './context/registry.js';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport { SpanKind, SpanStatus, SemanticPhase, AgentRole, MessageType } from './types.js';\n","/**\n * SDK configuration with environment variable loading.\n *\n * Environment variables match the Python SDK exactly:\n * RISICARE_API_KEY, RISICARE_ENDPOINT, RISICARE_PROJECT_ID, etc.\n */\n\nexport interface RisicareConfig {\n /** API key for authentication (format: \"rsk-{random}\") */\n apiKey?: string;\n\n /** Gateway endpoint URL */\n endpoint?: string;\n\n /** Project ID */\n projectId?: string;\n\n /** Environment name (production, staging, development) */\n environment?: string;\n\n /** Service name for identification */\n serviceName?: string;\n\n /** Service version */\n serviceVersion?: string;\n\n /** Whether tracing is enabled (default: true if apiKey provided) */\n enabled?: boolean;\n\n /** Whether to capture prompt/completion content (default: true) */\n traceContent?: boolean;\n\n /** Sample rate 0.0–1.0 (default: 1.0 = trace all) */\n sampleRate?: number;\n\n /** Batch size threshold before flush (default: 100) */\n batchSize?: number;\n\n /** Batch timeout in ms before flush (default: 1000) */\n batchTimeoutMs?: number;\n\n /** Maximum queue size (default: 10000) */\n maxQueueSize?: number;\n\n /** Enable debug logging (default: false) */\n debug?: boolean;\n\n /** Enable gzip compression for HTTP exports (default: false) */\n compress?: boolean;\n\n /** Custom metadata attached to all spans */\n metadata?: Record<string, unknown>;\n}\n\nconst DEFAULT_ENDPOINT = 'https://app.risicare.ai';\n\n/**\n * Load configuration from environment variables, merged with explicit config.\n * Explicit config takes precedence over env vars.\n */\nexport function resolveConfig(config?: Partial<RisicareConfig>): Required<Omit<RisicareConfig, 'metadata'>> & { metadata: Record<string, unknown> } {\n const env = process.env;\n\n const apiKey = config?.apiKey ?? env.RISICARE_API_KEY;\n const endpoint = config?.endpoint ?? env.RISICARE_ENDPOINT ?? DEFAULT_ENDPOINT;\n const projectId = config?.projectId ?? env.RISICARE_PROJECT_ID;\n const environment = config?.environment ?? env.RISICARE_ENVIRONMENT ?? 'development';\n const serviceName = config?.serviceName ?? env.RISICARE_SERVICE_NAME;\n const serviceVersion = config?.serviceVersion ?? env.RISICARE_SERVICE_VERSION;\n const traceContent = config?.traceContent ?? parseBool(env.RISICARE_TRACE_CONTENT, true);\n const sampleRate = config?.sampleRate ?? parseFloat(env.RISICARE_SAMPLE_RATE ?? '1.0');\n const debug = config?.debug ?? parseBool(env.RISICARE_DEBUG, false);\n const compress = config?.compress ?? parseBool(env.RISICARE_COMPRESS, false);\n const batchSize = config?.batchSize ?? 100;\n const batchTimeoutMs = config?.batchTimeoutMs ?? 1000;\n const maxQueueSize = config?.maxQueueSize ?? 10000;\n\n // Enabled logic: explicit > env RISICARE_TRACING > (true if apiKey present)\n let enabled: boolean;\n if (config?.enabled !== undefined) {\n enabled = config.enabled;\n } else if (env.RISICARE_TRACING !== undefined) {\n enabled = parseBool(env.RISICARE_TRACING, false);\n } else {\n enabled = !!apiKey;\n }\n\n return {\n apiKey: apiKey ?? '',\n endpoint,\n projectId: projectId ?? '',\n environment,\n serviceName: serviceName ?? '',\n serviceVersion: serviceVersion ?? '',\n enabled,\n traceContent,\n sampleRate: Math.max(0, Math.min(1, sampleRate)),\n batchSize,\n batchTimeoutMs,\n maxQueueSize,\n debug,\n compress,\n metadata: config?.metadata ?? {},\n };\n}\n\nfunction parseBool(value: string | undefined, defaultValue: boolean): boolean {\n if (value === undefined) return defaultValue;\n const lower = value.toLowerCase();\n return lower === 'true' || lower === '1' || lower === 'yes';\n}\n","/**\n * ID generation for traces and spans.\n *\n * Trace IDs: 32 lowercase hex characters (16 random bytes)\n * Span IDs: 16 lowercase hex characters (8 random bytes)\n *\n * Uses crypto.randomBytes for cryptographically secure randomness.\n */\n\nimport { randomBytes } from 'node:crypto';\n\nconst HEX_REGEX_32 = /^[0-9a-f]{32}$/;\nconst HEX_REGEX_16 = /^[0-9a-f]{16}$/;\n\nexport function generateTraceId(): string {\n return randomBytes(16).toString('hex');\n}\n\nexport function generateSpanId(): string {\n return randomBytes(8).toString('hex');\n}\n\nexport function generateAgentId(prefix?: string): string {\n const suffix = randomBytes(8).toString('hex');\n return prefix ? `${prefix}-${suffix}` : suffix;\n}\n\nexport function validateTraceId(id: string): boolean {\n return HEX_REGEX_32.test(id);\n}\n\nexport function validateSpanId(id: string): boolean {\n return HEX_REGEX_16.test(id);\n}\n","/**\n * Core type definitions for the Risicare SDK.\n *\n * These enums and types mirror the Python SDK's risicare-core types\n * and align with the Rust gateway's SpanData struct.\n */\n\n// ─── Span Kind ───────────────────────────────────────────────────────────────\n\nexport enum SpanKind {\n INTERNAL = 'internal',\n CLIENT = 'client',\n SERVER = 'server',\n PRODUCER = 'producer',\n CONSUMER = 'consumer',\n AGENT = 'agent',\n LLM_CALL = 'llm_call',\n TOOL_CALL = 'tool_call',\n RETRIEVAL = 'retrieval',\n DECISION = 'decision',\n MESSAGE = 'message',\n DELEGATION = 'delegation',\n COORDINATION = 'coordination',\n THINK = 'think',\n DECIDE = 'decide',\n OBSERVE = 'observe',\n REFLECT = 'reflect',\n}\n\n// ─── Span Status ─────────────────────────────────────────────────────────────\n\nexport enum SpanStatus {\n UNSET = 'unset',\n OK = 'ok',\n ERROR = 'error',\n}\n\n// ─── Semantic Phase (Tier 4: Decision Tracking) ──────────────────────────────\n\nexport enum SemanticPhase {\n THINK = 'think',\n DECIDE = 'decide',\n ACT = 'act',\n OBSERVE = 'observe',\n REFLECT = 'reflect',\n COMMUNICATE = 'communicate',\n COORDINATE = 'coordinate',\n}\n\n// ─── Agent Role ──────────────────────────────────────────────────────────────\n\nexport enum AgentRole {\n ORCHESTRATOR = 'orchestrator',\n WORKER = 'worker',\n REVIEWER = 'reviewer',\n PLANNER = 'planner',\n EXECUTOR = 'executor',\n CRITIC = 'critic',\n CUSTOM = 'custom',\n}\n\n// ─── Message Type (Tier 5: Multi-Agent) ──────────────────────────────────────\n\nexport enum MessageType {\n REQUEST = 'request',\n RESPONSE = 'response',\n DELEGATE = 'delegate',\n COORDINATE = 'coordinate',\n BROADCAST = 'broadcast',\n}\n\n// ─── Span Event ──────────────────────────────────────────────────────────────\n\nexport interface SpanEvent {\n name: string;\n timestamp: string;\n attributes?: Record<string, unknown>;\n}\n\n// ─── Span Link ───────────────────────────────────────────────────────────────\n\nexport interface SpanLink {\n traceId: string;\n spanId: string;\n attributes?: Record<string, unknown>;\n}\n\n// ─── Span Payload (Wire Format) ──────────────────────────────────────────────\n// Matches Rust gateway SpanData struct exactly (camelCase)\n\nexport interface SpanPayload {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n name: string;\n kind: string;\n startTime: string;\n endTime?: string;\n durationMs?: number;\n status: string;\n statusMessage?: string;\n attributes: Record<string, unknown>;\n events: SpanEvent[];\n links: SpanLink[];\n sessionId?: string;\n agentId?: string;\n agentName?: string;\n agentType?: string;\n semanticPhase?: string;\n llmProvider?: string;\n llmModel?: string;\n llmPromptTokens?: number;\n llmCompletionTokens?: number;\n llmTotalTokens?: number;\n llmCostUsd?: number;\n toolName?: string;\n toolSuccess?: boolean;\n}\n\n// ─── Ingest Request ──────────────────────────────────────────────────────────\n\nexport interface IngestRequest {\n spans: SpanPayload[];\n batchId?: string;\n projectId?: string;\n environment?: string;\n}\n","/**\n * High-resolution timing and ISO 8601 formatting utilities.\n */\n\n/**\n * Get current time as ISO 8601 string with millisecond precision.\n */\nexport function nowISO(): string {\n return new Date().toISOString();\n}\n\n/**\n * Get high-resolution monotonic time in milliseconds.\n * Uses process.hrtime.bigint() for sub-ms precision.\n */\nexport function hrtimeMs(): number {\n return Number(process.hrtime.bigint()) / 1_000_000;\n}\n\n/**\n * Compute duration in milliseconds between two hrtime values.\n */\nexport function durationMs(startHrtime: number, endHrtime: number): number {\n return Math.max(0, endHrtime - startHrtime);\n}\n\n/**\n * Format a Date or ISO string to ISO 8601 with millisecond precision.\n */\nexport function toISO(time: Date | string | number): string {\n if (typeof time === 'string') return time;\n if (typeof time === 'number') return new Date(time).toISOString();\n return time.toISOString();\n}\n","/**\n * Span class — the core unit of tracing.\n *\n * A span represents a single operation (LLM call, tool use, agent step).\n * Spans are mutable: attributes, events, and status can be set after creation.\n * Call end() to finalize the span and trigger export.\n */\n\nimport { generateSpanId, generateTraceId } from './ids.js';\nimport {\n SpanKind,\n SpanStatus,\n type SpanEvent,\n type SpanLink,\n type SpanPayload,\n} from './types.js';\nimport { nowISO, hrtimeMs } from './utils/clock.js';\n\nexport interface SpanOptions {\n name: string;\n kind?: SpanKind;\n traceId?: string;\n spanId?: string;\n parentSpanId?: string;\n attributes?: Record<string, unknown>;\n links?: SpanLink[];\n sessionId?: string;\n agentId?: string;\n agentName?: string;\n agentType?: string;\n semanticPhase?: string;\n}\n\nexport type SpanEndCallback = (span: Span) => void;\n\nexport class Span {\n readonly traceId: string;\n readonly spanId: string;\n readonly parentSpanId: string | undefined;\n readonly name: string;\n readonly kind: SpanKind;\n readonly startTime: string;\n readonly startHrtime: number;\n\n endTime: string | undefined;\n status: SpanStatus;\n statusMessage: string | undefined;\n attributes: Record<string, unknown>;\n events: SpanEvent[];\n links: SpanLink[];\n\n // Agent/session fields\n sessionId: string | undefined;\n agentId: string | undefined;\n agentName: string | undefined;\n agentType: string | undefined;\n semanticPhase: string | undefined;\n\n // LLM-specific fields\n llmProvider: string | undefined;\n llmModel: string | undefined;\n llmPromptTokens: number | undefined;\n llmCompletionTokens: number | undefined;\n llmTotalTokens: number | undefined;\n llmCostUsd: number | undefined;\n\n // Tool fields\n toolName: string | undefined;\n toolSuccess: boolean | undefined;\n\n private _ended = false;\n private _endHrtime: number | undefined;\n private _onEnd: SpanEndCallback | undefined;\n\n constructor(options: SpanOptions, onEnd?: SpanEndCallback) {\n this.traceId = options.traceId ?? generateTraceId();\n this.spanId = options.spanId ?? generateSpanId();\n this.parentSpanId = options.parentSpanId;\n this.name = options.name;\n this.kind = options.kind ?? SpanKind.INTERNAL;\n this.startTime = nowISO();\n this.startHrtime = hrtimeMs();\n\n this.status = SpanStatus.UNSET;\n this.attributes = options.attributes ? { ...options.attributes } : {};\n this.events = [];\n this.links = options.links ? [...options.links] : [];\n\n this.sessionId = options.sessionId;\n this.agentId = options.agentId;\n this.agentName = options.agentName;\n this.agentType = options.agentType;\n this.semanticPhase = options.semanticPhase;\n\n this._onEnd = onEnd;\n }\n\n get isEnded(): boolean {\n return this._ended;\n }\n\n get durationMs(): number {\n if (this._ended && this._endHrtime !== undefined) {\n return this._endHrtime - this.startHrtime;\n }\n return hrtimeMs() - this.startHrtime;\n }\n\n setAttribute(key: string, value: unknown): this {\n if (this._ended) return this;\n this.attributes[key] = value;\n return this;\n }\n\n setAttributes(attrs: Record<string, unknown>): this {\n if (this._ended) return this;\n Object.assign(this.attributes, attrs);\n return this;\n }\n\n setStatus(status: SpanStatus, message?: string): this {\n if (this._ended) return this;\n this.status = status;\n if (message !== undefined) {\n this.statusMessage = message;\n }\n return this;\n }\n\n addEvent(name: string, attributes?: Record<string, unknown>): this {\n if (this._ended) return this;\n this.events.push({\n name,\n timestamp: nowISO(),\n attributes,\n });\n return this;\n }\n\n addLink(traceId: string, spanId: string, attributes?: Record<string, unknown>): this {\n if (this._ended) return this;\n this.links.push({ traceId, spanId, attributes });\n return this;\n }\n\n recordException(error: Error | string): this {\n if (this._ended) return this;\n\n const message = typeof error === 'string' ? error : error.message;\n const stack = typeof error === 'string' ? undefined : error.stack;\n\n this.setStatus(SpanStatus.ERROR, message);\n this.addEvent('exception', {\n 'exception.type': typeof error === 'string' ? 'Error' : error.constructor.name,\n 'exception.message': message,\n ...(stack ? { 'exception.stacktrace': stack } : {}),\n });\n\n return this;\n }\n\n setLlmFields(fields: {\n provider?: string;\n model?: string;\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n costUsd?: number;\n }): this {\n if (this._ended) return this;\n if (fields.provider !== undefined) this.llmProvider = fields.provider;\n if (fields.model !== undefined) this.llmModel = fields.model;\n if (fields.promptTokens !== undefined) this.llmPromptTokens = fields.promptTokens;\n if (fields.completionTokens !== undefined) this.llmCompletionTokens = fields.completionTokens;\n if (fields.totalTokens !== undefined) this.llmTotalTokens = fields.totalTokens;\n if (fields.costUsd !== undefined) this.llmCostUsd = fields.costUsd;\n return this;\n }\n\n setToolFields(fields: { name?: string; success?: boolean }): this {\n if (this._ended) return this;\n if (fields.name !== undefined) this.toolName = fields.name;\n if (fields.success !== undefined) this.toolSuccess = fields.success;\n return this;\n }\n\n end(): void {\n if (this._ended) return;\n this._ended = true;\n this._endHrtime = hrtimeMs();\n this.endTime = nowISO();\n\n if (this.status === SpanStatus.UNSET) {\n this.status = SpanStatus.OK;\n }\n\n this._onEnd?.(this);\n }\n\n /**\n * Serialize to the wire format expected by the Rust gateway.\n */\n toPayload(): SpanPayload {\n const payload: SpanPayload = {\n traceId: this.traceId,\n spanId: this.spanId,\n name: this.name,\n kind: this.kind,\n startTime: this.startTime,\n status: this.status,\n attributes: this.attributes,\n events: this.events,\n links: this.links,\n };\n\n if (this.parentSpanId !== undefined) payload.parentSpanId = this.parentSpanId;\n if (this.endTime !== undefined) payload.endTime = this.endTime;\n if (this._ended) payload.durationMs = this.durationMs;\n if (this.statusMessage !== undefined) payload.statusMessage = this.statusMessage;\n if (this.sessionId !== undefined) payload.sessionId = this.sessionId;\n if (this.agentId !== undefined) payload.agentId = this.agentId;\n if (this.agentName !== undefined) payload.agentName = this.agentName;\n if (this.agentType !== undefined) payload.agentType = this.agentType;\n if (this.semanticPhase !== undefined) payload.semanticPhase = this.semanticPhase;\n if (this.llmProvider !== undefined) payload.llmProvider = this.llmProvider;\n if (this.llmModel !== undefined) payload.llmModel = this.llmModel;\n if (this.llmPromptTokens !== undefined) payload.llmPromptTokens = this.llmPromptTokens;\n if (this.llmCompletionTokens !== undefined) payload.llmCompletionTokens = this.llmCompletionTokens;\n if (this.llmTotalTokens !== undefined) payload.llmTotalTokens = this.llmTotalTokens;\n if (this.llmCostUsd !== undefined) payload.llmCostUsd = this.llmCostUsd;\n if (this.toolName !== undefined) payload.toolName = this.toolName;\n if (this.toolSuccess !== undefined) payload.toolSuccess = this.toolSuccess;\n\n return payload;\n }\n}\n","/**\n * No-op implementations for the disabled path.\n *\n * When tracing is disabled, all operations return these no-op objects\n * to maintain zero overhead. No allocations, no side effects.\n */\n\nimport { SpanKind, SpanStatus, type SpanPayload } from './types.js';\n\n/**\n * A frozen no-op span that silently ignores all operations.\n * Used when SDK is disabled to avoid overhead.\n */\nexport const NOOP_SPAN = Object.freeze({\n traceId: '00000000000000000000000000000000',\n spanId: '0000000000000000',\n parentSpanId: undefined,\n name: 'noop',\n kind: SpanKind.INTERNAL,\n startTime: '',\n startHrtime: 0,\n endTime: undefined,\n status: SpanStatus.UNSET,\n statusMessage: undefined,\n attributes: Object.freeze({}) as Record<string, unknown>,\n events: Object.freeze([]) as readonly [],\n links: Object.freeze([]) as readonly [],\n sessionId: undefined,\n agentId: undefined,\n agentName: undefined,\n semanticPhase: undefined,\n llmProvider: undefined,\n llmModel: undefined,\n llmPromptTokens: undefined,\n llmCompletionTokens: undefined,\n llmTotalTokens: undefined,\n llmCostUsd: undefined,\n toolName: undefined,\n toolSuccess: undefined,\n isEnded: true,\n durationMs: 0,\n\n setAttribute() { return this; },\n setAttributes() { return this; },\n setStatus() { return this; },\n addEvent() { return this; },\n addLink() { return this; },\n recordException() { return this; },\n setLlmFields() { return this; },\n setToolFields() { return this; },\n end() {},\n toPayload(): SpanPayload {\n return {\n traceId: this.traceId,\n spanId: this.spanId,\n name: this.name,\n kind: this.kind,\n startTime: this.startTime,\n status: this.status,\n attributes: {},\n events: [],\n links: [],\n };\n },\n});\n\nexport type NoopSpan = typeof NOOP_SPAN;\n","/**\n * Head-based deterministic sampling.\n *\n * Uses the first 8 hex characters of the trace ID as a hash\n * to make a deterministic sampling decision. This ensures:\n * - Same trace ID always produces the same decision\n * - Consistent across Python and JS/TS SDKs\n * - No external state needed\n */\n\n/**\n * Determine whether a trace should be sampled.\n *\n * @param traceId - 32-character hex trace ID\n * @param sampleRate - Rate between 0.0 (none) and 1.0 (all)\n * @returns true if the trace should be sampled\n */\nexport function shouldSample(traceId: string, sampleRate: number): boolean {\n if (sampleRate >= 1.0) return true;\n if (sampleRate <= 0.0) return false;\n\n // Parse first 8 hex chars as unsigned 32-bit integer\n const hash = parseInt(traceId.substring(0, 8), 16);\n return (hash / 0xFFFFFFFF) < sampleRate;\n}\n","/**\n * Shared state via globalThis — ensures all entry point bundles share\n * the same singleton instances.\n *\n * Problem: tsup with `splitting: false` gives each entry point (index,\n * openai, anthropic, vercel-ai) its own copy of module-level variables.\n * This means `init()` from 'risicare' sets a tracer that 'risicare/openai'\n * can't see — breaking all provider instrumentation silently.\n *\n * Solution: Store all mutable singletons on globalThis with a namespaced\n * prefix. Every bundle reads/writes the same global slots.\n *\n * This pattern is used by React, OpenTelemetry, and other SDKs that must\n * share state across independently bundled entry points.\n *\n * @internal\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G = globalThis as any;\nconst PREFIX = '__risicare_';\n\n// ─── Client & Tracer ────────────────────────────────────────────────────────\n\nexport function getClient(): unknown {\n return G[PREFIX + 'client'];\n}\n\nexport function setClient(client: unknown): void {\n G[PREFIX + 'client'] = client;\n}\n\nexport function getTracer(): unknown {\n return G[PREFIX + 'tracer'];\n}\n\nexport function setTracer(tracer: unknown): void {\n G[PREFIX + 'tracer'] = tracer;\n}\n\n// ─── Context Storage ────────────────────────────────────────────────────────\n\nexport function getContextStorage(): AsyncLocalStorage<unknown> {\n if (!G[PREFIX + 'ctx']) {\n G[PREFIX + 'ctx'] = new AsyncLocalStorage();\n }\n return G[PREFIX + 'ctx'];\n}\n\n// ─── Span Registry ──────────────────────────────────────────────────────────\n\nexport function getRegistry(): Map<string, unknown> {\n if (!G[PREFIX + 'registry']) {\n G[PREFIX + 'registry'] = new Map();\n }\n return G[PREFIX + 'registry'];\n}\n\nexport function getOpCount(): number {\n return G[PREFIX + 'opcount'] ?? 0;\n}\n\nexport function setOpCount(n: number): void {\n G[PREFIX + 'opcount'] = n;\n}\n\n// ─── Debug Flag ─────────────────────────────────────────────────────────────\n\nexport function getDebug(): boolean {\n return G[PREFIX + 'debug'] ?? false;\n}\n\nexport function setDebugFlag(enabled: boolean): void {\n G[PREFIX + 'debug'] = enabled;\n}\n","/**\n * AsyncLocalStorage-based context propagation.\n *\n * Uses a single AsyncLocalStorage instance with a composite state object.\n * This is simpler and more performant than multiple separate stores.\n *\n * Node.js AsyncLocalStorage automatically propagates through:\n * - Promise / async-await\n * - setTimeout / setImmediate\n * - EventEmitter callbacks\n * - process.nextTick\n * - async generators (unlike Python's contextvars!)\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport type { Span } from '../span.js';\nimport type { SemanticPhase } from '../types.js';\nimport { getContextStorage } from '../globals.js';\n\n// ─── Context Types ───────────────────────────────────────────────────────────\n\nexport interface SessionContext {\n sessionId: string;\n userId?: string;\n metadata?: Record<string, unknown>;\n parentSessionId?: string;\n turnNumber?: number;\n}\n\nexport interface AgentContext {\n agentId: string;\n agentName?: string;\n agentRole?: string;\n agentType?: string;\n parentAgentId?: string;\n version?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ContextState {\n session?: SessionContext;\n agent?: AgentContext;\n span?: Span;\n phase?: SemanticPhase;\n}\n\n// ─── Storage Accessor ────────────────────────────────────────────────────────\n\nfunction storage(): AsyncLocalStorage<ContextState> {\n return getContextStorage() as AsyncLocalStorage<ContextState>;\n}\n\n// ─── Core Operations ─────────────────────────────────────────────────────────\n\n/**\n * Get the current context state, or empty object if outside any context.\n */\nexport function getContext(): ContextState {\n return storage().getStore() ?? {};\n}\n\n/**\n * Run a callback within a new context scope.\n * The new scope inherits from the parent, with overrides applied.\n */\nexport function runWithContext<T>(overrides: Partial<ContextState>, fn: () => T): T {\n const parent = getContext();\n const merged: ContextState = { ...parent, ...overrides };\n return storage().run(merged, fn);\n}\n\n/**\n * Run an async callback within a new context scope.\n */\nexport function runWithContextAsync<T>(overrides: Partial<ContextState>, fn: () => Promise<T>): Promise<T> {\n const parent = getContext();\n const merged: ContextState = { ...parent, ...overrides };\n return storage().run(merged, fn);\n}\n\n// ─── Context Accessors ───────────────────────────────────────────────────────\n\nexport function getCurrentSession(): SessionContext | undefined {\n return getContext().session;\n}\n\nexport function getCurrentAgent(): AgentContext | undefined {\n return getContext().agent;\n}\n\nexport function getCurrentSpan(): Span | undefined {\n return getContext().span;\n}\n\nexport function getCurrentPhase(): SemanticPhase | undefined {\n return getContext().phase;\n}\n\nexport function getCurrentSessionId(): string | undefined {\n return getContext().session?.sessionId;\n}\n\nexport function getCurrentAgentId(): string | undefined {\n return getContext().agent?.agentId;\n}\n\nexport function getCurrentTraceId(): string | undefined {\n return getContext().span?.traceId;\n}\n\nexport function getCurrentSpanId(): string | undefined {\n return getContext().span?.spanId;\n}\n\nexport function getCurrentParentSpanId(): string | undefined {\n return getContext().span?.parentSpanId;\n}\n\n/**\n * Get all current context as a plain object (for debugging/serialization).\n */\nexport function getCurrentContext(): Record<string, unknown> {\n const ctx = getContext();\n return {\n session: ctx.session ? {\n sessionId: ctx.session.sessionId,\n userId: ctx.session.userId,\n ...(ctx.session.parentSessionId !== undefined ? { parentSessionId: ctx.session.parentSessionId } : {}),\n ...(ctx.session.turnNumber !== undefined ? { turnNumber: ctx.session.turnNumber } : {}),\n ...(ctx.session.metadata !== undefined ? { metadata: ctx.session.metadata } : {}),\n } : null,\n agent: ctx.agent ? {\n agentId: ctx.agent.agentId,\n agentName: ctx.agent.agentName,\n agentRole: ctx.agent.agentRole,\n agentType: ctx.agent.agentType,\n ...(ctx.agent.parentAgentId !== undefined ? { parentAgentId: ctx.agent.parentAgentId } : {}),\n ...(ctx.agent.version !== undefined ? { version: ctx.agent.version } : {}),\n ...(ctx.agent.metadata !== undefined ? { metadata: ctx.agent.metadata } : {}),\n } : null,\n span: ctx.span ? { spanId: ctx.span.spanId, traceId: ctx.span.traceId } : null,\n phase: ctx.phase ?? null,\n };\n}\n","/**\n * Tracer — creates spans with automatic context nesting.\n *\n * The Tracer is the primary API for creating spans. It automatically:\n * - Links child spans to parent spans via parentSpanId\n * - Propagates the trace ID from the active context\n * - Injects session/agent/phase context into new spans\n * - Runs the callback within the span's context scope\n *\n * Usage:\n * const tracer = new Tracer(processor);\n * await tracer.startSpan('my-operation', async (span) => {\n * span.setAttribute('key', 'value');\n * // Nested spans automatically become children\n * await tracer.startSpan('sub-op', async (child) => { ... });\n * });\n */\n\nimport { Span, type SpanOptions, type SpanEndCallback } from './span.js';\nimport { NOOP_SPAN } from './noop.js';\nimport { SpanKind } from './types.js';\nimport { generateTraceId } from './ids.js';\nimport { shouldSample } from './utils/sampling.js';\nimport {\n runWithContext,\n getCurrentSpan,\n getCurrentSession,\n getCurrentAgent,\n getCurrentPhase,\n} from './context/storage.js';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface StartSpanOptions {\n name: string;\n kind?: SpanKind;\n attributes?: Record<string, unknown>;\n /** Override trace ID (default: inherit from parent or generate new) */\n traceId?: string;\n /** Override parent span ID (default: current span in context) */\n parentSpanId?: string;\n}\n\nexport interface TracerConfig {\n /** Called when a span ends (typically feeds into batch processor) */\n onSpanEnd: SpanEndCallback;\n /** Sample rate 0.0–1.0 (default: 1.0) */\n sampleRate?: number;\n /** Whether tracing is enabled */\n enabled?: boolean;\n /** Whether to capture prompt/completion content (default: true) */\n traceContent?: boolean;\n}\n\n// ─── Tracer Class ───────────────────────────────────────────────────────────\n\nexport class Tracer {\n private _onSpanEnd: SpanEndCallback;\n private _sampleRate: number;\n private _enabled: boolean;\n private _traceContent: boolean;\n\n constructor(config: TracerConfig) {\n this._onSpanEnd = config.onSpanEnd;\n this._sampleRate = config.sampleRate ?? 1.0;\n this._enabled = config.enabled ?? true;\n this._traceContent = config.traceContent ?? true;\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n set enabled(value: boolean) {\n this._enabled = value;\n }\n\n get traceContent(): boolean {\n return this._traceContent;\n }\n\n /**\n * Start a span, run the callback within its context, and auto-end on completion.\n *\n * The span is automatically:\n * - Linked to the current parent span (if any)\n * - Given the current trace ID (or a new one for root spans)\n * - Enriched with session/agent/phase context\n * - Ended when the callback returns (or throws)\n * - Marked as ERROR if the callback throws\n *\n * @returns The callback's return value\n */\n startSpan<T>(options: StartSpanOptions | string, fn: (span: Span) => T): T {\n const opts = typeof options === 'string' ? { name: options } : options;\n\n // Fast path: disabled SDK\n if (!this._enabled) {\n return fn(NOOP_SPAN as unknown as Span);\n }\n\n // Resolve context\n const parentSpan = getCurrentSpan();\n const session = getCurrentSession();\n const agent = getCurrentAgent();\n const phase = getCurrentPhase();\n\n // Determine trace ID: explicit > parent > new\n const traceId = opts.traceId ?? parentSpan?.traceId ?? generateTraceId();\n\n // Sampling: check once per trace (root span decides)\n if (!parentSpan && this._sampleRate < 1.0) {\n if (!shouldSample(traceId, this._sampleRate)) {\n return fn(NOOP_SPAN as unknown as Span);\n }\n }\n\n // Parent span ID: explicit > current span in context\n const parentSpanId = opts.parentSpanId ?? parentSpan?.spanId;\n\n // Create the span\n const spanOptions: SpanOptions = {\n name: opts.name,\n kind: opts.kind ?? SpanKind.INTERNAL,\n traceId,\n parentSpanId,\n attributes: {\n ...opts.attributes,\n // Propagate context fields as attributes (matching Python SDK tracer.py:497-511)\n ...(agent?.agentRole ? { 'agent.role': agent.agentRole } : {}),\n ...(agent?.parentAgentId ? { 'parent_agent_id': agent.parentAgentId } : {}),\n ...(session?.userId ? { 'session.user_id': session.userId } : {}),\n },\n sessionId: session?.sessionId,\n agentId: agent?.agentId,\n agentName: agent?.agentName,\n agentType: agent?.agentType,\n semanticPhase: phase,\n };\n\n const span = new Span(spanOptions, this._onSpanEnd);\n\n // Run callback within span context\n try {\n const result = runWithContext({ span }, () => fn(span));\n\n // Handle async results (Promises)\n if (result instanceof Promise) {\n return result.then(\n (value) => {\n span.end();\n return value;\n },\n (error) => {\n span.recordException(error instanceof Error ? error : String(error));\n span.end();\n throw error;\n },\n ) as T;\n }\n\n // Sync: end span immediately\n span.end();\n return result;\n } catch (error) {\n // Sync error: record and re-throw\n span.recordException(error instanceof Error ? error : String(error));\n span.end();\n throw error;\n }\n }\n\n /**\n * Create a span without auto-ending. Caller is responsible for calling span.end().\n *\n * Useful for long-running operations where you need manual control.\n * The span is still linked to context and enriched with session/agent/phase.\n */\n createSpan(options: StartSpanOptions | string): Span {\n const opts = typeof options === 'string' ? { name: options } : options;\n\n if (!this._enabled) {\n return NOOP_SPAN as unknown as Span;\n }\n\n const parentSpan = getCurrentSpan();\n const session = getCurrentSession();\n const agent = getCurrentAgent();\n const phase = getCurrentPhase();\n\n const traceId = opts.traceId ?? parentSpan?.traceId ?? generateTraceId();\n\n if (!parentSpan && this._sampleRate < 1.0) {\n if (!shouldSample(traceId, this._sampleRate)) {\n return NOOP_SPAN as unknown as Span;\n }\n }\n\n const parentSpanId = opts.parentSpanId ?? parentSpan?.spanId;\n\n return new Span(\n {\n name: opts.name,\n kind: opts.kind ?? SpanKind.INTERNAL,\n traceId,\n parentSpanId,\n attributes: {\n ...opts.attributes,\n // Propagate context fields as attributes (matching Python SDK tracer.py:497-511)\n ...(agent?.agentRole ? { 'agent.role': agent.agentRole } : {}),\n ...(agent?.parentAgentId ? { 'parent_agent_id': agent.parentAgentId } : {}),\n ...(session?.userId ? { 'session.user_id': session.userId } : {}),\n },\n sessionId: session?.sessionId,\n agentId: agent?.agentId,\n agentName: agent?.agentName,\n agentType: agent?.agentType,\n semanticPhase: phase,\n },\n this._onSpanEnd,\n );\n }\n}\n","/**\n * Internal logger for the Risicare SDK.\n *\n * Centralizes all diagnostic output so that:\n * - Debug messages are gated by a single flag (zero-cost when disabled)\n * - Warnings always fire (operational alerts like queue full)\n * - All output goes to stderr with a consistent [risicare] prefix\n * - A future custom logger callback can be added in one place\n */\n\nimport { getDebug, setDebugFlag } from '../globals.js';\n\n/**\n * Enable or disable debug logging. Called once during init().\n * @internal\n */\nexport function setDebug(enabled: boolean): void {\n setDebugFlag(enabled);\n}\n\n/**\n * Log a debug message. Only outputs when debug mode is enabled.\n * @internal\n */\nexport function debug(msg: string): void {\n if (getDebug()) {\n process.stderr.write(`[risicare] ${msg}\\n`);\n }\n}\n\n/**\n * Log a warning. Always outputs regardless of debug mode.\n * Use sparingly — only for operational issues the user should see.\n * @internal\n */\nexport function warn(msg: string): void {\n process.stderr.write(`[risicare] WARNING: ${msg}\\n`);\n}\n","/**\n * Batch span processor.\n *\n * Collects spans and exports them in batches based on:\n * - Batch size threshold (default: 100 spans)\n * - Time interval (default: 1000ms)\n *\n * Node.js is single-threaded — no locks needed.\n * Timer is unref()'d so it doesn't prevent process exit.\n */\n\nimport type { Span } from '../span.js';\nimport { ExportResult, type SpanExporter } from './base.js';\nimport { debug, warn } from '../utils/log.js';\n\nexport interface BatchProcessorOptions {\n exporters: SpanExporter[];\n batchSize?: number;\n batchTimeoutMs?: number;\n maxQueueSize?: number;\n debug?: boolean;\n}\n\nexport class BatchSpanProcessor {\n private readonly _exporters: SpanExporter[];\n private readonly _batchSize: number;\n private readonly _batchTimeoutMs: number;\n private readonly _maxQueueSize: number;\n private readonly _debug: boolean;\n\n private _queue: Span[] = [];\n private _timer: ReturnType<typeof setInterval> | null = null;\n private _started = false;\n private _flushing = false;\n private _beforeExitHandler: (() => void) | null = null;\n\n // Retry tracking for failed batches (Audit #5)\n private _retryCounts = new Map<string, number>();\n private static readonly MAX_RETRIES = 3;\n\n // Metrics\n droppedSpans = 0;\n exportedSpans = 0;\n failedExports = 0;\n\n constructor(options: BatchProcessorOptions) {\n this._exporters = [...options.exporters];\n this._batchSize = options.batchSize ?? 100;\n this._batchTimeoutMs = options.batchTimeoutMs ?? 1000;\n this._maxQueueSize = options.maxQueueSize ?? 10000;\n this._debug = options.debug ?? false;\n }\n\n start(): void {\n if (this._started) return;\n this._started = true;\n\n // Periodic flush timer — unref so it doesn't keep process alive\n this._timer = setInterval(() => {\n void this._exportBatch();\n }, this._batchTimeoutMs);\n this._timer.unref();\n\n // Flush on process exit (Audit #3: use .once, not .on; await, not void)\n this._beforeExitHandler = () => {\n void this.shutdown();\n };\n process.once('beforeExit', this._beforeExitHandler);\n }\n\n async shutdown(timeoutMs = 5000): Promise<void> {\n if (!this._started) return;\n this._started = false;\n\n if (this._timer) {\n clearInterval(this._timer);\n this._timer = null;\n }\n\n // Remove process listener to prevent leak (Audit #3)\n if (this._beforeExitHandler) {\n process.removeListener('beforeExit', this._beforeExitHandler);\n this._beforeExitHandler = null;\n }\n\n // Final flush with timeout\n const flushPromise = this._exportBatch();\n const timeoutPromise = new Promise<void>((resolve) => setTimeout(resolve, timeoutMs));\n await Promise.race([flushPromise, timeoutPromise]);\n\n // Shutdown exporters\n for (const exporter of this._exporters) {\n try {\n await exporter.shutdown();\n } catch (e) {\n debug(`Error shutting down ${exporter.name}: ${e}`);\n }\n }\n\n // Clean up retry tracking\n this._retryCounts.clear();\n\n debug(\n `BatchSpanProcessor shutdown. Exported: ${this.exportedSpans}, ` +\n `Dropped: ${this.droppedSpans}, Failed: ${this.failedExports}`\n );\n }\n\n onSpanEnd(span: Span): void {\n if (!this._started) return;\n\n // Check queue capacity\n if (this._queue.length >= this._maxQueueSize) {\n this.droppedSpans++;\n if (this.droppedSpans === 1 || this.droppedSpans % 1000 === 0) {\n warn(`Span queue full (${this._maxQueueSize}). ${this.droppedSpans} spans dropped so far.`);\n }\n return;\n }\n\n this._queue.push(span);\n\n // Trigger immediate flush if batch size reached\n if (this._queue.length >= this._batchSize) {\n void this._exportBatch();\n }\n }\n\n async flush(timeoutMs = 5000): Promise<boolean> {\n if (!this._started) return true;\n\n const start = Date.now();\n\n // Wait for in-flight exports to complete AND queue to drain\n while (this._queue.length > 0 || this._flushing) {\n if (!this._flushing && this._queue.length > 0) {\n await this._exportBatch();\n } else {\n // Wait a tick for the in-flight export to finish\n await new Promise((r) => setTimeout(r, 1));\n }\n if (Date.now() - start > timeoutMs) return false;\n }\n\n return true;\n }\n\n getMetrics() {\n return {\n exportedSpans: this.exportedSpans,\n droppedSpans: this.droppedSpans,\n failedExports: this.failedExports,\n queueSize: this._queue.length,\n queueCapacity: this._maxQueueSize,\n queueUtilization: this._queue.length / this._maxQueueSize,\n };\n }\n\n private async _exportBatch(): Promise<void> {\n if (this._flushing || this._queue.length === 0) return;\n this._flushing = true;\n\n try {\n // Take up to batchSize spans\n const batch = this._queue.splice(0, this._batchSize);\n if (batch.length === 0) return;\n\n debug(`Exporting batch of ${batch.length} spans`);\n\n // Export to all exporters — count once, not per exporter\n let batchExported = false;\n for (const exporter of this._exporters) {\n try {\n const result = await exporter.export(batch);\n if (result === ExportResult.SUCCESS) {\n if (!batchExported) {\n this.exportedSpans += batch.length;\n batchExported = true;\n // Clear retry counts for successfully exported spans\n for (const span of batch) {\n this._retryCounts.delete(span.spanId);\n }\n }\n } else {\n this.failedExports++;\n }\n } catch (e) {\n this.failedExports++;\n debug(`Export to ${exporter.name} failed: ${e}`);\n }\n }\n\n // Audit #5: Re-queue failed batches with retry limit\n if (!batchExported) {\n const retryable = batch.filter(span => {\n const count = (this._retryCounts.get(span.spanId) ?? 0) + 1;\n if (count > BatchSpanProcessor.MAX_RETRIES) {\n this._retryCounts.delete(span.spanId);\n this.droppedSpans++;\n return false;\n }\n this._retryCounts.set(span.spanId, count);\n return true;\n });\n if (retryable.length > 0) {\n this._queue.unshift(...retryable);\n debug(`Re-queued ${retryable.length} spans for retry (${batch.length - retryable.length} dropped after max retries)`);\n }\n }\n } finally {\n this._flushing = false;\n }\n }\n}\n","/**\n * HTTP exporter for sending spans to the Risicare gateway.\n *\n * Uses native fetch (Node.js 18+), with:\n * - Automatic retry with exponential backoff\n * - Circuit breaker with half-open probe state\n * - Gzip compression for large payloads\n * - Bearer token authentication\n */\n\nimport type { Span } from '../span.js';\nimport type { IngestRequest } from '../types.js';\nimport { ExportResult, type SpanExporter } from './base.js';\nimport { debug, warn } from '../utils/log.js';\n\nconst SDK_VERSION = '0.1.1';\n\nexport interface HttpExporterOptions {\n endpoint: string;\n apiKey?: string;\n projectId?: string;\n environment?: string;\n timeoutMs?: number;\n maxRetries?: number;\n compress?: boolean;\n}\n\nexport class HttpExporter implements SpanExporter {\n readonly name = 'http';\n\n private readonly _endpoint: string;\n private readonly _apiKey: string | undefined;\n private readonly _projectId: string | undefined;\n private readonly _environment: string | undefined;\n private readonly _timeoutMs: number;\n private readonly _maxRetries: number;\n private readonly _compress: boolean;\n\n // Circuit breaker\n private _consecutiveFailures = 0;\n private _circuitOpenUntil = 0;\n private readonly _circuitBreakerThreshold = 3;\n private readonly _circuitBreakerCooldownMs = 30_000;\n\n constructor(options: HttpExporterOptions) {\n this._endpoint = options.endpoint.replace(/\\/+$/, '');\n this._apiKey = options.apiKey;\n this._projectId = options.projectId;\n this._environment = options.environment;\n this._timeoutMs = options.timeoutMs ?? 5000;\n this._maxRetries = options.maxRetries ?? 3;\n this._compress = options.compress ?? false;\n }\n\n async export(spans: Span[]): Promise<ExportResult> {\n if (spans.length === 0) return ExportResult.SUCCESS;\n\n // Circuit breaker: skip if open\n const now = Date.now();\n let isHalfOpen = false;\n if (this._consecutiveFailures >= this._circuitBreakerThreshold) {\n if (now < this._circuitOpenUntil) {\n return ExportResult.FAILURE;\n }\n // Cooldown expired — probe with single request (Audit #7: half-open state)\n isHalfOpen = true;\n }\n\n const body: IngestRequest = {\n spans: spans.map((s) => s.toPayload()),\n };\n if (this._projectId) body.projectId = this._projectId;\n if (this._environment) body.environment = this._environment;\n\n // Half-open: single probe request. Normal: full retry loop.\n const maxAttempts = isHalfOpen ? 1 : this._maxRetries;\n\n // Retry loop with exponential backoff\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const result = await this._sendRequest(body);\n\n if (result === ExportResult.SUCCESS) {\n this._consecutiveFailures = 0;\n return result;\n }\n\n // Backoff: 100ms, 200ms, 400ms\n if (attempt < maxAttempts - 1) {\n await sleep(100 * Math.pow(2, attempt));\n }\n }\n\n // All retries failed — update circuit breaker\n this._consecutiveFailures++;\n if (this._consecutiveFailures >= this._circuitBreakerThreshold) {\n this._circuitOpenUntil = Date.now() + this._circuitBreakerCooldownMs;\n warn(\n `HTTP exporter circuit breaker opened after ${this._consecutiveFailures} failures. ` +\n `Cooldown: ${this._circuitBreakerCooldownMs / 1000}s`\n );\n }\n\n return ExportResult.FAILURE;\n }\n\n private async _sendRequest(body: IngestRequest): Promise<ExportResult> {\n const url = `${this._endpoint}/v1/spans`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': `risicare-js/${SDK_VERSION} node/${process.version}`,\n };\n if (this._apiKey) {\n headers['Authorization'] = `Bearer ${this._apiKey}`;\n }\n\n let payload: string | Uint8Array = JSON.stringify(body);\n\n if (this._compress && payload.length > 1024) {\n try {\n const { gzipSync } = await import('node:zlib');\n payload = gzipSync(Buffer.from(payload));\n headers['Content-Encoding'] = 'gzip';\n } catch (e) {\n // Audit #16: log compression failures instead of silently swallowing\n debug(`Gzip compression failed, sending uncompressed: ${e}`);\n }\n }\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeoutMs);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: payload,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status < 300) {\n return ExportResult.SUCCESS;\n } else if (response.status === 408 || response.status === 504) {\n debug(`HTTP export timeout: ${response.status}`);\n return ExportResult.TIMEOUT;\n }\n debug(`HTTP export failed: ${response.status}`);\n return ExportResult.FAILURE;\n } catch (e) {\n debug(`HTTP export error: ${e}`);\n return ExportResult.FAILURE;\n }\n }\n\n shutdown(): void {\n // Native fetch doesn't need cleanup\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Console exporter for debugging.\n *\n * Prints span data to stderr in a readable format.\n */\n\nimport type { Span } from '../span.js';\nimport { ExportResult, type SpanExporter } from './base.js';\n\nexport class ConsoleExporter implements SpanExporter {\n readonly name = 'console';\n\n export(spans: Span[]): ExportResult {\n for (const span of spans) {\n const payload = span.toPayload();\n const line = JSON.stringify(payload);\n process.stderr.write(`[risicare] ${line}\\n`);\n }\n return ExportResult.SUCCESS;\n }\n\n shutdown(): void {\n // Nothing to clean up\n }\n}\n","/**\n * RisicareClient — singleton client managing SDK lifecycle.\n *\n * Handles initialization, shutdown, and the connection between\n * the Tracer and the export pipeline (batch processor + HTTP exporter).\n *\n * Usage:\n * import { init, shutdown } from 'risicare';\n * init({ apiKey: 'rsk-...', projectId: 'my-project' });\n * // ... instrument code ...\n * await shutdown(); // flush remaining spans\n */\n\nimport { type RisicareConfig, resolveConfig } from './config.js';\nimport { Tracer } from './tracer.js';\nimport { BatchSpanProcessor } from './exporters/batch.js';\nimport { HttpExporter } from './exporters/http.js';\nimport { ConsoleExporter } from './exporters/console.js';\nimport type { SpanExporter } from './exporters/base.js';\nimport { setDebug, debug } from './utils/log.js';\nimport {\n getClient as getGlobalClient,\n setClient as setGlobalClient,\n getTracer as getGlobalTracer,\n setTracer as setGlobalTracer,\n} from './globals.js';\n\n// ─── Client Class ───────────────────────────────────────────────────────────\n\nclass RisicareClient {\n readonly config: ReturnType<typeof resolveConfig>;\n readonly processor: BatchSpanProcessor;\n readonly tracer: Tracer;\n private _shutdownPromise: Promise<void> | undefined;\n private _shutdownHandlers: { signal: string; handler: () => void }[] = [];\n\n constructor(config?: Partial<RisicareConfig>) {\n this.config = resolveConfig(config);\n\n // API key format validation\n if (this.config.apiKey && !this.config.apiKey.startsWith('rsk-')) {\n debug('Warning: API key should start with \"rsk-\". Got: ' + this.config.apiKey.slice(0, 4) + '...');\n }\n\n // Build exporter chain\n let exporter: SpanExporter;\n if (this.config.debug && !this.config.apiKey) {\n exporter = new ConsoleExporter();\n } else if (this.config.apiKey) {\n exporter = new HttpExporter({\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n projectId: this.config.projectId || undefined,\n environment: this.config.environment || undefined,\n compress: this.config.compress,\n });\n } else {\n // No API key and not debug — use console as fallback\n exporter = new ConsoleExporter();\n }\n\n this.processor = new BatchSpanProcessor({\n exporters: [exporter],\n batchSize: this.config.batchSize,\n batchTimeoutMs: this.config.batchTimeoutMs,\n maxQueueSize: this.config.maxQueueSize,\n debug: this.config.debug,\n });\n\n this.tracer = new Tracer({\n onSpanEnd: (span) => this.processor.onSpanEnd(span),\n sampleRate: this.config.sampleRate,\n enabled: this.config.enabled,\n traceContent: this.config.traceContent,\n });\n\n // Start the batch processor (enables span queuing and periodic flushing)\n this.processor.start();\n\n // Register shutdown hooks\n this._registerShutdownHooks();\n\n // Enable internal debug logging if configured\n setDebug(this.config.debug);\n debug(`Initialized: enabled=${this.config.enabled}, endpoint=${this.config.endpoint}`);\n }\n\n get enabled(): boolean {\n return this.tracer.enabled;\n }\n\n set enabled(value: boolean) {\n this.tracer.enabled = value;\n }\n\n // Audit #6: Promise-based shutdown dedup (fixes TOCTOU race condition)\n async shutdown(): Promise<void> {\n if (this._shutdownPromise) return this._shutdownPromise;\n this._shutdownPromise = this._doShutdown();\n return this._shutdownPromise;\n }\n\n private async _doShutdown(): Promise<void> {\n debug('Shutting down...');\n\n // Audit #3: Remove process listeners to prevent leak\n for (const { signal, handler } of this._shutdownHandlers) {\n process.removeListener(signal, handler);\n }\n this._shutdownHandlers = [];\n\n await this.processor.shutdown();\n }\n\n async flush(): Promise<void> {\n await this.processor.flush();\n }\n\n private _registerShutdownHooks(): void {\n const onShutdown = () => {\n // Audit #3: Add 5s timeout to prevent hanging on signal\n const timeout = setTimeout(() => process.exit(1), 5000);\n timeout.unref();\n this.shutdown().catch(() => {}).finally(() => clearTimeout(timeout));\n };\n\n const signals = ['beforeExit', 'SIGTERM', 'SIGINT'];\n for (const signal of signals) {\n process.once(signal, onShutdown);\n this._shutdownHandlers.push({ signal, handler: onShutdown });\n }\n }\n}\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\n/**\n * Initialize the Risicare SDK. Call once at application startup.\n *\n * @example\n * import { init } from 'risicare';\n * init({ apiKey: 'rsk-...', projectId: 'my-project' });\n */\nexport function init(config?: Partial<RisicareConfig>): void {\n if (getGlobalClient()) {\n debug('Already initialized. Call shutdown() first to re-initialize.');\n return;\n }\n\n const client = new RisicareClient(config);\n setGlobalClient(client);\n setGlobalTracer(client.tracer);\n}\n\n/**\n * Gracefully shut down the SDK. Flushes pending spans before resolving.\n */\nexport async function shutdown(): Promise<void> {\n const client = getGlobalClient() as RisicareClient | undefined;\n if (!client) return;\n await client.shutdown();\n setGlobalClient(undefined);\n setGlobalTracer(undefined);\n}\n\n/**\n * Flush all pending spans without shutting down.\n */\nexport async function flush(): Promise<void> {\n const client = getGlobalClient() as RisicareClient | undefined;\n if (!client) return;\n await client.flush();\n}\n\n/**\n * Enable tracing at runtime.\n */\nexport function enable(): void {\n const client = getGlobalClient() as RisicareClient | undefined;\n if (client) client.enabled = true;\n}\n\n/**\n * Disable tracing at runtime. Spans will not be created or exported.\n */\nexport function disable(): void {\n const client = getGlobalClient() as RisicareClient | undefined;\n if (client) client.enabled = false;\n}\n\n/**\n * Check whether tracing is currently enabled.\n */\nexport function isEnabled(): boolean {\n const client = getGlobalClient() as RisicareClient | undefined;\n return client?.enabled ?? false;\n}\n\n/**\n * Get the global tracer instance. Returns undefined if not initialized.\n */\nexport function getTracer(): Tracer | undefined {\n return getGlobalTracer() as Tracer | undefined;\n}\n\n/**\n * Get the global tracer, or throw if not initialized.\n * @internal Used by decorators and providers that require an active tracer.\n */\nexport function requireTracer(): Tracer {\n const tracer = getGlobalTracer() as Tracer | undefined;\n if (!tracer) {\n throw new Error(\n 'Risicare SDK not initialized. Call init() before using tracing features.',\n );\n }\n return tracer;\n}\n\n/**\n * Check whether content tracing (prompt/completion capture) is enabled.\n */\nexport function getTraceContent(): boolean {\n const tracer = getGlobalTracer() as Tracer | undefined;\n return tracer?.traceContent ?? true;\n}\n\n/**\n * Get SDK metrics: exported spans, dropped spans, failed exports, queue stats.\n * Returns zero-valued metrics if SDK is not initialized.\n */\nexport function getMetrics() {\n const client = getGlobalClient() as RisicareClient | undefined;\n return client?.processor.getMetrics() ?? {\n exportedSpans: 0,\n droppedSpans: 0,\n failedExports: 0,\n queueSize: 0,\n queueCapacity: 0,\n queueUtilization: 0,\n };\n}\n","/**\n * Agent context — identifies which agent is executing.\n * Supports nesting: inner agents automatically track parent.\n */\n\nimport { generateAgentId } from '../ids.js';\nimport { isEnabled } from '../client.js';\nimport { runWithContext, getCurrentAgent, type AgentContext } from './storage.js';\n\nexport interface AgentOptions {\n agentId?: string;\n name?: string;\n role?: string;\n agentType?: string;\n version?: number;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Run a callback within an agent context.\n * If nested inside another agent, parentAgentId is set automatically.\n *\n * @example\n * await withAgent({ name: 'researcher', role: 'worker' }, async () => {\n * const result = await llm.invoke(query);\n * return result;\n * });\n */\nexport function withAgent<T>(options: AgentOptions, fn: () => T): T {\n if (!isEnabled()) return fn();\n\n const parent = getCurrentAgent();\n const agentName = options.name ?? 'agent';\n\n const agent: AgentContext = {\n agentId: options.agentId ?? generateAgentId(agentName),\n agentName: agentName,\n agentRole: options.role,\n agentType: options.agentType,\n parentAgentId: parent?.agentId,\n version: options.version,\n metadata: options.metadata,\n };\n\n return runWithContext({ agent }, fn);\n}\n","/**\n * agent() — Higher-order function wrapper for agent identity (Tier 2).\n *\n * Wraps a function to execute within an agent context. All spans created\n * inside will be tagged with the agent's identity.\n *\n * @example\n * const research = agent({ name: 'researcher', role: 'worker' }, async (query: string) => {\n * const result = await openai.chat.completions.create({ ... });\n * return result.choices[0].message.content;\n * });\n *\n * const answer = await research('What is quantum computing?');\n */\n\nimport { withAgent, type AgentOptions } from '../context/agent.js';\nimport { getTracer } from '../client.js';\nimport { SpanKind } from '../types.js';\n\n/**\n * Wrap a function with agent context and an automatic span.\n */\nexport function agent<TArgs extends unknown[], TReturn>(\n options: AgentOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const spanName = `agent:${options.name ?? 'agent'}`;\n\n return (...args: TArgs): TReturn => {\n const tracer = getTracer();\n if (!tracer) {\n // Graceful degradation: run user code without tracing\n return fn(...args);\n }\n return withAgent(options, () => {\n return tracer.startSpan({ name: spanName, kind: SpanKind.AGENT }, () => {\n return fn(...args);\n });\n });\n };\n}\n","/**\n * Session context — groups multiple traces from the same user interaction.\n */\n\nimport { isEnabled } from '../client.js';\nimport { runWithContext, type SessionContext } from './storage.js';\n\nexport interface SessionOptions {\n sessionId: string;\n userId?: string;\n metadata?: Record<string, unknown>;\n parentSessionId?: string;\n turnNumber?: number;\n}\n\n/**\n * Run a callback within a session context.\n *\n * @example\n * await withSession({ sessionId: 'sess-123', userId: 'user-1' }, async () => {\n * const result = await agent.run(query);\n * return result;\n * });\n */\nexport function withSession<T>(options: SessionOptions, fn: () => T): T {\n if (!isEnabled()) return fn();\n const session: SessionContext = {\n sessionId: options.sessionId,\n userId: options.userId,\n metadata: options.metadata,\n parentSessionId: options.parentSessionId,\n turnNumber: options.turnNumber ?? 1,\n };\n return runWithContext({ session }, fn);\n}\n","/**\n * session() — Higher-order function wrapper for session context (Tier 3).\n *\n * Wraps a function to execute within a session context. All spans created\n * inside will be tagged with the session identity.\n *\n * @example\n * const handleRequest = session(\n * (req) => ({ sessionId: req.sessionId, userId: req.userId }),\n * async (req: Request) => {\n * return await agent.run(req.query);\n * },\n * );\n */\n\nimport { withSession, type SessionOptions } from '../context/session.js';\n\n/**\n * Wrap a function with session context.\n *\n * @param optionsOrResolver - Static session options, or a function that derives them from args\n * @param fn - The function to wrap\n */\nexport function session<TArgs extends unknown[], TReturn>(\n optionsOrResolver: SessionOptions | ((...args: TArgs) => SessionOptions),\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return (...args: TArgs): TReturn => {\n const options = typeof optionsOrResolver === 'function'\n ? optionsOrResolver(...args)\n : optionsOrResolver;\n return withSession(options, () => fn(...args));\n };\n}\n","/**\n * Phase context — cognitive phase tracking (THINK/DECIDE/ACT/OBSERVE).\n */\n\nimport { isEnabled } from '../client.js';\nimport { SemanticPhase } from '../types.js';\nimport { runWithContext } from './storage.js';\n\n/**\n * Run a callback within a semantic phase context.\n */\nexport function withPhase<T>(phase: SemanticPhase, fn: () => T): T {\n if (!isEnabled()) return fn();\n return runWithContext({ phase }, fn);\n}\n","/**\n * Phase decorators — decision phase tracking (Tier 4).\n *\n * Wraps functions to execute within a semantic phase context (THINK/DECIDE/ACT/OBSERVE).\n * Each creates a span named after the phase.\n *\n * @example\n * const analyze = traceThink(async (data: string) => {\n * return await llm.invoke(`Analyze: ${data}`);\n * });\n *\n * const decide = traceDecide(async (analysis: string) => {\n * return await llm.invoke(`Decide action: ${analysis}`);\n * });\n */\n\nimport { withPhase } from '../context/phase.js';\nimport { getTracer } from '../client.js';\nimport { SemanticPhase, SpanKind } from '../types.js';\n\nfunction phaseWrapper<TArgs extends unknown[], TReturn>(\n phase: SemanticPhase,\n kind: SpanKind,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return (...args: TArgs): TReturn => {\n const tracer = getTracer();\n if (!tracer) {\n // Graceful degradation: run user code without tracing\n return fn(...args);\n }\n return withPhase(phase, () => {\n return tracer.startSpan({ name: `phase:${phase}`, kind }, () => fn(...args));\n });\n };\n}\n\n/** Wrap a function in a THINK phase context with auto-span. */\nexport function traceThink<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return phaseWrapper(SemanticPhase.THINK, SpanKind.THINK, fn);\n}\n\n/** Wrap a function in a DECIDE phase context with auto-span. */\nexport function traceDecide<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return phaseWrapper(SemanticPhase.DECIDE, SpanKind.DECIDE, fn);\n}\n\n/** Wrap a function in an ACT phase context with auto-span. */\nexport function traceAct<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return phaseWrapper(SemanticPhase.ACT, SpanKind.TOOL_CALL, fn);\n}\n\n/** Wrap a function in an OBSERVE phase context with auto-span. */\nexport function traceObserve<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return phaseWrapper(SemanticPhase.OBSERVE, SpanKind.OBSERVE, fn);\n}\n","/**\n * Multi-agent communication decorators (Tier 5).\n *\n * Track inter-agent messages, delegations, and coordination.\n *\n * @example\n * const sendToWorker = traceMessage({ to: 'worker-1', type: MessageType.DELEGATE },\n * async (task: string) => { ... }\n * );\n */\n\nimport { getTracer } from '../client.js';\nimport { MessageType, SpanKind } from '../types.js';\n\ninterface MessageOptions {\n to: string;\n type?: MessageType;\n metadata?: Record<string, unknown>;\n}\n\ninterface DelegateOptions {\n to: string;\n metadata?: Record<string, unknown>;\n}\n\ninterface CoordinateOptions {\n participants: string[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Namespace user metadata under 'metadata.*' to prevent overwriting\n * critical span attributes like message.type, message.to, etc.\n */\nfunction namespacedMetadata(metadata?: Record<string, unknown>): Record<string, unknown> {\n if (!metadata) return {};\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(metadata)) {\n result[`metadata.${key}`] = value;\n }\n return result;\n}\n\n/**\n * Wrap a function that sends a message to another agent.\n */\nexport function traceMessage<TArgs extends unknown[], TReturn>(\n options: MessageOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const msgType = options.type ?? MessageType.REQUEST;\n\n return (...args: TArgs): TReturn => {\n const tracer = getTracer();\n if (!tracer) return fn(...args);\n return tracer.startSpan(\n {\n name: `message:${msgType}→${options.to}`,\n kind: SpanKind.MESSAGE,\n attributes: {\n ...namespacedMetadata(options.metadata),\n 'message.to': options.to,\n 'message.type': msgType,\n 'message.target_agent_id': options.to,\n },\n },\n () => fn(...args),\n );\n };\n}\n\n/**\n * Wrap a function that delegates work to a sub-agent.\n */\nexport function traceDelegate<TArgs extends unknown[], TReturn>(\n options: DelegateOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return (...args: TArgs): TReturn => {\n const tracer = getTracer();\n if (!tracer) return fn(...args);\n return tracer.startSpan(\n {\n name: `delegate→${options.to}`,\n kind: SpanKind.DELEGATION,\n attributes: {\n ...namespacedMetadata(options.metadata),\n 'delegate.to': options.to,\n 'message.type': MessageType.DELEGATE,\n 'message.target_agent_id': options.to,\n },\n },\n () => fn(...args),\n );\n };\n}\n\n/**\n * Wrap a function that coordinates multiple agents.\n */\nexport function traceCoordinate<TArgs extends unknown[], TReturn>(\n options: CoordinateOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return (...args: TArgs): TReturn => {\n const tracer = getTracer();\n if (!tracer) return fn(...args);\n return tracer.startSpan(\n {\n name: `coordinate:[${options.participants.join(',')}]`,\n kind: SpanKind.COORDINATION,\n attributes: {\n ...namespacedMetadata(options.metadata),\n 'coordinate.participants': options.participants.join(','),\n 'message.type': MessageType.COORDINATE,\n },\n },\n () => fn(...args),\n );\n };\n}\n","/**\n * Serializable trace context + W3C Trace Context headers.\n *\n * TraceContext is a plain object that can be passed across process\n * boundaries (JSON serialization, HTTP headers, message queues).\n *\n * W3C Trace Context:\n * traceparent: {version}-{trace_id}-{span_id}-{flags}\n * tracestate: risicare=session_id={...};agent_id={...}\n */\n\nimport { generateTraceId, generateSpanId, validateTraceId, validateSpanId } from '../ids.js';\nimport { getCurrentSpan, getCurrentSession, getCurrentAgent } from './storage.js';\n\n// ─── Serializable Trace Context ──────────────────────────────────────────────\n\nexport interface TraceContext {\n traceId: string;\n spanId: string;\n sessionId?: string;\n agentId?: string;\n}\n\n/**\n * Get the current trace context as a serializable object.\n */\nexport function getTraceContext(): TraceContext {\n const span = getCurrentSpan();\n const session = getCurrentSession();\n const agent = getCurrentAgent();\n\n return {\n traceId: span?.traceId ?? generateTraceId(),\n spanId: span?.spanId ?? generateSpanId(),\n sessionId: session?.sessionId,\n agentId: agent?.agentId,\n };\n}\n\n// ─── W3C Trace Context Headers ───────────────────────────────────────────────\n\nconst TRACEPARENT_HEADER = 'traceparent';\nconst TRACESTATE_HEADER = 'tracestate';\nconst RISICARE_STATE_DELIMITER = ';';\n\n/**\n * Inject trace context into HTTP headers (W3C format).\n */\nexport function injectTraceContext(headers: Record<string, string>): Record<string, string> {\n const span = getCurrentSpan();\n const session = getCurrentSession();\n const agent = getCurrentAgent();\n\n if (span) {\n // W3C traceparent: version-trace_id-span_id-flags\n headers[TRACEPARENT_HEADER] = `00-${span.traceId}-${span.spanId}-01`;\n\n // Custom tracestate for Risicare (uses ';' as internal delimiter)\n // Preserve other vendors' tracestate entries per W3C spec\n const parts: string[] = [];\n if (session) parts.push(`session_id=${session.sessionId}`);\n if (agent) parts.push(`agent_id=${agent.agentId}`);\n\n if (parts.length > 0) {\n const riscareEntry = `risicare=${parts.join(RISICARE_STATE_DELIMITER)}`;\n const existing = headers[TRACESTATE_HEADER] ?? '';\n // Keep non-risicare vendor entries from any existing tracestate\n const otherEntries = existing\n .split(',')\n .map((e) => e.trim())\n .filter((e) => e && !e.startsWith('risicare='));\n headers[TRACESTATE_HEADER] = [riscareEntry, ...otherEntries].join(',');\n }\n }\n\n return headers;\n}\n\n/**\n * Extract trace context from HTTP headers (W3C format).\n */\nexport function extractTraceContext(headers: Record<string, string>): Record<string, string | undefined> {\n const result: Record<string, string | undefined> = {};\n\n // Normalize header keys to lowercase (HTTP headers are case-insensitive)\n const normalizedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n normalizedHeaders[key.toLowerCase()] = value;\n }\n\n // Parse traceparent\n const traceparent = normalizedHeaders[TRACEPARENT_HEADER] ?? '';\n if (traceparent) {\n const parts = traceparent.split('-');\n if (parts.length >= 4) {\n const traceId = parts[1].toLowerCase();\n const spanId = parts[2].toLowerCase();\n if (validateTraceId(traceId)) result.traceId = traceId;\n if (validateSpanId(spanId)) result.parentSpanId = spanId;\n result.flags = parts[3];\n }\n }\n\n // Parse tracestate\n const tracestate = normalizedHeaders[TRACESTATE_HEADER] ?? '';\n if (tracestate) {\n for (const entry of tracestate.split(',')) {\n const trimmed = entry.trim();\n if (trimmed.startsWith('risicare=')) {\n const state = trimmed.slice(9); // len(\"risicare=\")\n for (const kv of state.split(RISICARE_STATE_DELIMITER)) {\n const eqIdx = kv.indexOf('=');\n if (eqIdx > 0) {\n const key = kv.slice(0, eqIdx).trim();\n const value = kv.slice(eqIdx + 1).trim();\n if (key && value) {\n // Normalize known tracestate keys to camelCase\n const camelKey = key === 'session_id' ? 'sessionId'\n : key === 'agent_id' ? 'agentId'\n : key;\n result[camelKey] = value;\n }\n }\n }\n }\n }\n }\n\n return result;\n}\n","/**\n * Span registry — TTL-based span store for edge cases.\n *\n * While AsyncLocalStorage handles most context propagation in Node.js,\n * the registry is useful for:\n * - Cross-process span tracking\n * - Explicit span passing via ID\n * - Long-running operations that outlive their original context\n */\n\nimport type { Span } from '../span.js';\nimport { getRegistry, getOpCount, setOpCount } from '../globals.js';\n\ninterface RegistryEntry {\n span: Span;\n registeredAt: number;\n ttlMs: number;\n}\n\nconst DEFAULT_TTL_MS = 60_000;\nconst MAX_ENTRIES = 10_000;\nconst CLEANUP_INTERVAL = 100;\n\nfunction entries(): Map<string, RegistryEntry> {\n return getRegistry() as Map<string, RegistryEntry>;\n}\n\nexport function registerSpan(span: Span, ttlMs = DEFAULT_TTL_MS): void {\n entries().set(span.spanId, {\n span,\n registeredAt: Date.now(),\n ttlMs,\n });\n setOpCount(getOpCount() + 1);\n maybeCleanup();\n}\n\nexport function getSpanById(spanId: string): Span | undefined {\n const entry = entries().get(spanId);\n if (!entry) return undefined;\n\n if (Date.now() - entry.registeredAt > entry.ttlMs) {\n entries().delete(spanId);\n return undefined;\n }\n\n return entry.span;\n}\n\nexport function unregisterSpan(spanId: string): void {\n entries().delete(spanId);\n}\n\nexport function extendSpanTtl(spanId: string, additionalMs: number): boolean {\n const entry = entries().get(spanId);\n if (!entry) return false;\n\n if (Date.now() - entry.registeredAt > entry.ttlMs) {\n entries().delete(spanId);\n return false;\n }\n\n entry.ttlMs += additionalMs;\n return true;\n}\n\nexport function getRegistryStats(): { totalEntries: number; operationCount: number } {\n return {\n totalEntries: entries().size,\n operationCount: getOpCount(),\n };\n}\n\nexport function clearRegistry(): void {\n entries().clear();\n setOpCount(0);\n}\n\nfunction maybeCleanup(): void {\n if (getOpCount() % CLEANUP_INTERVAL !== 0) return;\n if (entries().size <= MAX_ENTRIES) return;\n\n const now = Date.now();\n for (const [id, entry] of entries()) {\n if (now - entry.registeredAt > entry.ttlMs) {\n entries().delete(id);\n }\n }\n}\n"],"mappings":"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","names":["getTracer","debug","SpanKind","SpanStatus","SemanticPhase","AgentRole","MessageType","session","agent","getTracer","agent","getTracer","session","getTracer","getTracer","session","agent"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config.ts","../src/ids.ts","../src/types.ts","../src/utils/clock.ts","../src/span.ts","../src/noop.ts","../src/utils/sampling.ts","../src/globals.ts","../src/context/storage.ts","../src/tracer.ts","../src/utils/log.ts","../src/exporters/batch.ts","../src/exporters/http.ts","../src/exporters/console.ts","../src/client.ts","../src/context/agent.ts","../src/decorators/agent.ts","../src/context/session.ts","../src/decorators/session.ts","../src/context/phase.ts","../src/decorators/phase.ts","../src/decorators/multi-agent.ts","../src/context/trace-context.ts","../src/context/registry.ts"],"sourcesContent":["/**\n * Risicare SDK for JavaScript/TypeScript — Public API.\n *\n * Progressive integration tiers:\n * Tier 1: init() + patchOpenAI() (minimum setup)\n * Tier 2: agent() wrapper (agent identity)\n * Tier 3: session() / withSession() (user sessions)\n * Tier 4: traceThink/Decide/Act/Observe (decision phases)\n * Tier 5: traceMessage/Delegate/Coordinate (multi-agent)\n */\n\n// ─── Tier 1: Initialization ─────────────────────────────────────────────────\n\nexport { init, shutdown, flush, enable, disable, isEnabled, getTracer, getTraceContent, getMetrics } from './client.js';\nexport type { RisicareConfig } from './config.js';\n\n// ─── Tier 2: Agent Identity ─────────────────────────────────────────────────\n\nexport { agent } from './decorators/agent.js';\nexport { withAgent } from './context/agent.js';\nexport type { AgentOptions } from './context/agent.js';\n\n// ─── Tier 3: Sessions ───────────────────────────────────────────────────────\n\nexport { session } from './decorators/session.js';\nexport { withSession } from './context/session.js';\nexport type { SessionOptions } from './context/session.js';\n\n// ─── Tier 4: Decision Phases ────────────────────────────────────────────────\n\nexport { traceThink, traceDecide, traceAct, traceObserve } from './decorators/phase.js';\nexport { withPhase } from './context/phase.js';\n\n// ─── Tier 5: Multi-Agent ────────────────────────────────────────────────────\n\nexport { traceMessage, traceDelegate, traceCoordinate } from './decorators/multi-agent.js';\n\n// ─── Tracer ─────────────────────────────────────────────────────────────────\n\nexport type { Tracer, StartSpanOptions } from './tracer.js';\n\n// ─── Span ───────────────────────────────────────────────────────────────────\n\nexport type { Span, SpanOptions } from './span.js';\n\n// ─── Context Accessors ──────────────────────────────────────────────────────\n\nexport {\n getCurrentSession,\n getCurrentAgent,\n getCurrentSpan,\n getCurrentPhase,\n getCurrentTraceId,\n getCurrentSpanId,\n getCurrentSessionId,\n getCurrentAgentId,\n getCurrentContext,\n} from './context/storage.js';\nexport type { SessionContext, AgentContext, TraceContext } from './context/index.js';\n\n// ─── Trace Context (Serializable + W3C) ─────────────────────────────────────\n\nexport {\n getTraceContext,\n injectTraceContext,\n extractTraceContext,\n} from './context/trace-context.js';\n\n// ─── Span Registry (Edge Cases) ─────────────────────────────────────────────\n\nexport { registerSpan, getSpanById, unregisterSpan } from './context/registry.js';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport { SpanKind, SpanStatus, SemanticPhase, AgentRole, MessageType } from './types.js';\n","/**\n * SDK configuration with environment variable loading.\n *\n * Environment variables match the Python SDK exactly:\n * RISICARE_API_KEY, RISICARE_ENDPOINT, RISICARE_PROJECT_ID, etc.\n */\n\nexport interface RisicareConfig {\n /** API key for authentication (format: \"rsk-{random}\"). Each key is scoped to one project. */\n apiKey?: string;\n\n /** Gateway endpoint URL */\n endpoint?: string;\n\n /**\n * @deprecated Project is determined by your API key. This field is ignored\n * by the gateway and will be removed in v1.0. Use `serviceName` and\n * `environment` for within-project organization.\n */\n projectId?: string;\n\n /** Environment name (production, staging, development). Used for within-project organization. */\n environment?: string;\n\n /** Service name for within-project organization. */\n serviceName?: string;\n\n /** Service version */\n serviceVersion?: string;\n\n /** Whether tracing is enabled (default: true if apiKey provided) */\n enabled?: boolean;\n\n /** Whether to capture prompt/completion content (default: true) */\n traceContent?: boolean;\n\n /** Sample rate 0.0–1.0 (default: 1.0 = trace all) */\n sampleRate?: number;\n\n /** Batch size threshold before flush (default: 100) */\n batchSize?: number;\n\n /** Batch timeout in ms before flush (default: 1000) */\n batchTimeoutMs?: number;\n\n /** Maximum queue size (default: 10000) */\n maxQueueSize?: number;\n\n /** Enable debug logging (default: false) */\n debug?: boolean;\n\n /** Enable gzip compression for HTTP exports (default: false) */\n compress?: boolean;\n\n /** Custom metadata attached to all spans */\n metadata?: Record<string, unknown>;\n}\n\nconst DEFAULT_ENDPOINT = 'https://app.risicare.ai';\n\n/**\n * Load configuration from environment variables, merged with explicit config.\n * Explicit config takes precedence over env vars.\n */\nexport function resolveConfig(config?: Partial<RisicareConfig>): Required<Omit<RisicareConfig, 'metadata'>> & { metadata: Record<string, unknown> } {\n const env = process.env;\n\n const apiKey = config?.apiKey ?? env.RISICARE_API_KEY;\n const endpoint = config?.endpoint ?? env.RISICARE_ENDPOINT ?? DEFAULT_ENDPOINT;\n const projectId = config?.projectId ?? env.RISICARE_PROJECT_ID;\n\n // Deprecation warning for projectId\n if (config?.projectId || env.RISICARE_PROJECT_ID) {\n console.warn(\n '[risicare] projectId is deprecated and ignored by the gateway. ' +\n 'Your API key determines the project. ' +\n 'Use serviceName and environment for within-project organization. ' +\n 'projectId will be removed in v1.0.'\n );\n }\n const environment = config?.environment ?? env.RISICARE_ENVIRONMENT ?? 'development';\n const serviceName = config?.serviceName ?? env.RISICARE_SERVICE_NAME;\n const serviceVersion = config?.serviceVersion ?? env.RISICARE_SERVICE_VERSION;\n const traceContent = config?.traceContent ?? parseBool(env.RISICARE_TRACE_CONTENT, true);\n const sampleRate = config?.sampleRate ?? parseFloat(env.RISICARE_SAMPLE_RATE ?? '1.0');\n const debug = config?.debug ?? parseBool(env.RISICARE_DEBUG, false);\n const compress = config?.compress ?? parseBool(env.RISICARE_COMPRESS, false);\n const batchSize = config?.batchSize ?? 100;\n const batchTimeoutMs = config?.batchTimeoutMs ?? 1000;\n const maxQueueSize = config?.maxQueueSize ?? 10000;\n\n // Enabled logic: explicit > env RISICARE_TRACING > (true if apiKey present)\n let enabled: boolean;\n if (config?.enabled !== undefined) {\n enabled = config.enabled;\n } else if (env.RISICARE_TRACING !== undefined) {\n enabled = parseBool(env.RISICARE_TRACING, false);\n } else {\n enabled = !!apiKey;\n }\n\n return {\n apiKey: apiKey ?? '',\n endpoint,\n projectId: projectId ?? '',\n environment,\n serviceName: serviceName ?? '',\n serviceVersion: serviceVersion ?? '',\n enabled,\n traceContent,\n sampleRate: Math.max(0, Math.min(1, sampleRate)),\n batchSize,\n batchTimeoutMs,\n maxQueueSize,\n debug,\n compress,\n metadata: config?.metadata ?? {},\n };\n}\n\nfunction parseBool(value: string | undefined, defaultValue: boolean): boolean {\n if (value === undefined) return defaultValue;\n const lower = value.toLowerCase();\n return lower === 'true' || lower === '1' || lower === 'yes';\n}\n","/**\n * ID generation for traces and spans.\n *\n * Trace IDs: 32 lowercase hex characters (16 random bytes)\n * Span IDs: 16 lowercase hex characters (8 random bytes)\n *\n * Uses crypto.randomBytes for cryptographically secure randomness.\n */\n\nimport { randomBytes } from 'node:crypto';\n\nconst HEX_REGEX_32 = /^[0-9a-f]{32}$/;\nconst HEX_REGEX_16 = /^[0-9a-f]{16}$/;\n\nexport function generateTraceId(): string {\n return randomBytes(16).toString('hex');\n}\n\nexport function generateSpanId(): string {\n return randomBytes(8).toString('hex');\n}\n\nexport function generateAgentId(prefix?: string): string {\n const suffix = randomBytes(8).toString('hex');\n return prefix ? `${prefix}-${suffix}` : suffix;\n}\n\nexport function validateTraceId(id: string): boolean {\n return HEX_REGEX_32.test(id);\n}\n\nexport function validateSpanId(id: string): boolean {\n return HEX_REGEX_16.test(id);\n}\n","/**\n * Core type definitions for the Risicare SDK.\n *\n * These enums and types mirror the Python SDK's risicare-core types\n * and align with the Rust gateway's SpanData struct.\n */\n\n// ─── Span Kind ───────────────────────────────────────────────────────────────\n\nexport enum SpanKind {\n INTERNAL = 'internal',\n CLIENT = 'client',\n SERVER = 'server',\n PRODUCER = 'producer',\n CONSUMER = 'consumer',\n AGENT = 'agent',\n LLM_CALL = 'llm_call',\n TOOL_CALL = 'tool_call',\n RETRIEVAL = 'retrieval',\n DECISION = 'decision',\n MESSAGE = 'message',\n DELEGATION = 'delegation',\n COORDINATION = 'coordination',\n THINK = 'think',\n DECIDE = 'decide',\n OBSERVE = 'observe',\n REFLECT = 'reflect',\n}\n\n// ─── Span Status ─────────────────────────────────────────────────────────────\n\nexport enum SpanStatus {\n UNSET = 'unset',\n OK = 'ok',\n ERROR = 'error',\n}\n\n// ─── Semantic Phase (Tier 4: Decision Tracking) ──────────────────────────────\n\nexport enum SemanticPhase {\n THINK = 'think',\n DECIDE = 'decide',\n ACT = 'act',\n OBSERVE = 'observe',\n REFLECT = 'reflect',\n COMMUNICATE = 'communicate',\n COORDINATE = 'coordinate',\n}\n\n// ─── Agent Role ──────────────────────────────────────────────────────────────\n\nexport enum AgentRole {\n ORCHESTRATOR = 'orchestrator',\n WORKER = 'worker',\n REVIEWER = 'reviewer',\n PLANNER = 'planner',\n EXECUTOR = 'executor',\n CRITIC = 'critic',\n CUSTOM = 'custom',\n}\n\n// ─── Message Type (Tier 5: Multi-Agent) ──────────────────────────────────────\n\nexport enum MessageType {\n REQUEST = 'request',\n RESPONSE = 'response',\n DELEGATE = 'delegate',\n COORDINATE = 'coordinate',\n BROADCAST = 'broadcast',\n}\n\n// ─── Span Event ──────────────────────────────────────────────────────────────\n\nexport interface SpanEvent {\n name: string;\n timestamp: string;\n attributes?: Record<string, unknown>;\n}\n\n// ─── Span Link ───────────────────────────────────────────────────────────────\n\nexport interface SpanLink {\n traceId: string;\n spanId: string;\n attributes?: Record<string, unknown>;\n}\n\n// ─── Span Payload (Wire Format) ──────────────────────────────────────────────\n// Matches Rust gateway SpanData struct exactly (camelCase)\n\nexport interface SpanPayload {\n traceId: string;\n spanId: string;\n parentSpanId?: string;\n name: string;\n kind: string;\n startTime: string;\n endTime?: string;\n durationMs?: number;\n status: string;\n statusMessage?: string;\n attributes: Record<string, unknown>;\n events: SpanEvent[];\n links: SpanLink[];\n sessionId?: string;\n agentId?: string;\n agentName?: string;\n agentType?: string;\n semanticPhase?: string;\n llmProvider?: string;\n llmModel?: string;\n llmPromptTokens?: number;\n llmCompletionTokens?: number;\n llmTotalTokens?: number;\n llmCostUsd?: number;\n toolName?: string;\n toolSuccess?: boolean;\n}\n\n// ─── Ingest Request ──────────────────────────────────────────────────────────\n\nexport interface IngestRequest {\n spans: SpanPayload[];\n batchId?: string;\n projectId?: string;\n environment?: string;\n}\n","/**\n * High-resolution timing and ISO 8601 formatting utilities.\n */\n\n/**\n * Get current time as ISO 8601 string with millisecond precision.\n */\nexport function nowISO(): string {\n return new Date().toISOString();\n}\n\n/**\n * Get high-resolution monotonic time in milliseconds.\n * Uses process.hrtime.bigint() for sub-ms precision.\n */\nexport function hrtimeMs(): number {\n return Number(process.hrtime.bigint()) / 1_000_000;\n}\n\n/**\n * Compute duration in milliseconds between two hrtime values.\n */\nexport function durationMs(startHrtime: number, endHrtime: number): number {\n return Math.max(0, endHrtime - startHrtime);\n}\n\n/**\n * Format a Date or ISO string to ISO 8601 with millisecond precision.\n */\nexport function toISO(time: Date | string | number): string {\n if (typeof time === 'string') return time;\n if (typeof time === 'number') return new Date(time).toISOString();\n return time.toISOString();\n}\n","/**\n * Span class — the core unit of tracing.\n *\n * A span represents a single operation (LLM call, tool use, agent step).\n * Spans are mutable: attributes, events, and status can be set after creation.\n * Call end() to finalize the span and trigger export.\n */\n\nimport { generateSpanId, generateTraceId } from './ids.js';\nimport {\n SpanKind,\n SpanStatus,\n type SpanEvent,\n type SpanLink,\n type SpanPayload,\n} from './types.js';\nimport { nowISO, hrtimeMs } from './utils/clock.js';\n\nexport interface SpanOptions {\n name: string;\n kind?: SpanKind;\n traceId?: string;\n spanId?: string;\n parentSpanId?: string;\n attributes?: Record<string, unknown>;\n links?: SpanLink[];\n sessionId?: string;\n agentId?: string;\n agentName?: string;\n agentType?: string;\n semanticPhase?: string;\n}\n\nexport type SpanEndCallback = (span: Span) => void;\n\nexport class Span {\n readonly traceId: string;\n readonly spanId: string;\n readonly parentSpanId: string | undefined;\n readonly name: string;\n readonly kind: SpanKind;\n readonly startTime: string;\n readonly startHrtime: number;\n\n endTime: string | undefined;\n status: SpanStatus;\n statusMessage: string | undefined;\n attributes: Record<string, unknown>;\n events: SpanEvent[];\n links: SpanLink[];\n\n // Agent/session fields\n sessionId: string | undefined;\n agentId: string | undefined;\n agentName: string | undefined;\n agentType: string | undefined;\n semanticPhase: string | undefined;\n\n // LLM-specific fields\n llmProvider: string | undefined;\n llmModel: string | undefined;\n llmPromptTokens: number | undefined;\n llmCompletionTokens: number | undefined;\n llmTotalTokens: number | undefined;\n llmCostUsd: number | undefined;\n\n // Tool fields\n toolName: string | undefined;\n toolSuccess: boolean | undefined;\n\n private _ended = false;\n private _endHrtime: number | undefined;\n private _onEnd: SpanEndCallback | undefined;\n\n constructor(options: SpanOptions, onEnd?: SpanEndCallback) {\n this.traceId = options.traceId ?? generateTraceId();\n this.spanId = options.spanId ?? generateSpanId();\n this.parentSpanId = options.parentSpanId;\n this.name = options.name;\n this.kind = options.kind ?? SpanKind.INTERNAL;\n this.startTime = nowISO();\n this.startHrtime = hrtimeMs();\n\n this.status = SpanStatus.UNSET;\n this.attributes = options.attributes ? { ...options.attributes } : {};\n this.events = [];\n this.links = options.links ? [...options.links] : [];\n\n this.sessionId = options.sessionId;\n this.agentId = options.agentId;\n this.agentName = options.agentName;\n this.agentType = options.agentType;\n this.semanticPhase = options.semanticPhase;\n\n this._onEnd = onEnd;\n }\n\n get isEnded(): boolean {\n return this._ended;\n }\n\n get durationMs(): number {\n if (this._ended && this._endHrtime !== undefined) {\n return this._endHrtime - this.startHrtime;\n }\n return hrtimeMs() - this.startHrtime;\n }\n\n setAttribute(key: string, value: unknown): this {\n if (this._ended) return this;\n this.attributes[key] = value;\n return this;\n }\n\n setAttributes(attrs: Record<string, unknown>): this {\n if (this._ended) return this;\n Object.assign(this.attributes, attrs);\n return this;\n }\n\n setStatus(status: SpanStatus, message?: string): this {\n if (this._ended) return this;\n this.status = status;\n if (message !== undefined) {\n this.statusMessage = message;\n }\n return this;\n }\n\n addEvent(name: string, attributes?: Record<string, unknown>): this {\n if (this._ended) return this;\n this.events.push({\n name,\n timestamp: nowISO(),\n attributes,\n });\n return this;\n }\n\n addLink(traceId: string, spanId: string, attributes?: Record<string, unknown>): this {\n if (this._ended) return this;\n this.links.push({ traceId, spanId, attributes });\n return this;\n }\n\n recordException(error: Error | string): this {\n if (this._ended) return this;\n\n const message = typeof error === 'string' ? error : error.message;\n const stack = typeof error === 'string' ? undefined : error.stack;\n\n this.setStatus(SpanStatus.ERROR, message);\n this.addEvent('exception', {\n 'exception.type': typeof error === 'string' ? 'Error' : error.constructor.name,\n 'exception.message': message,\n ...(stack ? { 'exception.stacktrace': stack } : {}),\n });\n\n return this;\n }\n\n setLlmFields(fields: {\n provider?: string;\n model?: string;\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n costUsd?: number;\n }): this {\n if (this._ended) return this;\n if (fields.provider !== undefined) this.llmProvider = fields.provider;\n if (fields.model !== undefined) this.llmModel = fields.model;\n if (fields.promptTokens !== undefined) this.llmPromptTokens = fields.promptTokens;\n if (fields.completionTokens !== undefined) this.llmCompletionTokens = fields.completionTokens;\n if (fields.totalTokens !== undefined) this.llmTotalTokens = fields.totalTokens;\n if (fields.costUsd !== undefined) this.llmCostUsd = fields.costUsd;\n return this;\n }\n\n setToolFields(fields: { name?: string; success?: boolean }): this {\n if (this._ended) return this;\n if (fields.name !== undefined) this.toolName = fields.name;\n if (fields.success !== undefined) this.toolSuccess = fields.success;\n return this;\n }\n\n end(): void {\n if (this._ended) return;\n this._ended = true;\n this._endHrtime = hrtimeMs();\n this.endTime = nowISO();\n\n if (this.status === SpanStatus.UNSET) {\n this.status = SpanStatus.OK;\n }\n\n this._onEnd?.(this);\n }\n\n /**\n * Serialize to the wire format expected by the Rust gateway.\n */\n toPayload(): SpanPayload {\n const payload: SpanPayload = {\n traceId: this.traceId,\n spanId: this.spanId,\n name: this.name,\n kind: this.kind,\n startTime: this.startTime,\n status: this.status,\n attributes: this.attributes,\n events: this.events,\n links: this.links,\n };\n\n if (this.parentSpanId !== undefined) payload.parentSpanId = this.parentSpanId;\n if (this.endTime !== undefined) payload.endTime = this.endTime;\n if (this._ended) payload.durationMs = this.durationMs;\n if (this.statusMessage !== undefined) payload.statusMessage = this.statusMessage;\n if (this.sessionId !== undefined) payload.sessionId = this.sessionId;\n if (this.agentId !== undefined) payload.agentId = this.agentId;\n if (this.agentName !== undefined) payload.agentName = this.agentName;\n if (this.agentType !== undefined) payload.agentType = this.agentType;\n if (this.semanticPhase !== undefined) payload.semanticPhase = this.semanticPhase;\n if (this.llmProvider !== undefined) payload.llmProvider = this.llmProvider;\n if (this.llmModel !== undefined) payload.llmModel = this.llmModel;\n if (this.llmPromptTokens !== undefined) payload.llmPromptTokens = this.llmPromptTokens;\n if (this.llmCompletionTokens !== undefined) payload.llmCompletionTokens = this.llmCompletionTokens;\n if (this.llmTotalTokens !== undefined) payload.llmTotalTokens = this.llmTotalTokens;\n if (this.llmCostUsd !== undefined) payload.llmCostUsd = this.llmCostUsd;\n if (this.toolName !== undefined) payload.toolName = this.toolName;\n if (this.toolSuccess !== undefined) payload.toolSuccess = this.toolSuccess;\n\n return payload;\n }\n}\n","/**\n * No-op implementations for the disabled path.\n *\n * When tracing is disabled, all operations return these no-op objects\n * to maintain zero overhead. No allocations, no side effects.\n */\n\nimport { SpanKind, SpanStatus, type SpanPayload } from './types.js';\n\n/**\n * A frozen no-op span that silently ignores all operations.\n * Used when SDK is disabled to avoid overhead.\n */\nexport const NOOP_SPAN = Object.freeze({\n traceId: '00000000000000000000000000000000',\n spanId: '0000000000000000',\n parentSpanId: undefined,\n name: 'noop',\n kind: SpanKind.INTERNAL,\n startTime: '',\n startHrtime: 0,\n endTime: undefined,\n status: SpanStatus.UNSET,\n statusMessage: undefined,\n attributes: Object.freeze({}) as Record<string, unknown>,\n events: Object.freeze([]) as readonly [],\n links: Object.freeze([]) as readonly [],\n sessionId: undefined,\n agentId: undefined,\n agentName: undefined,\n semanticPhase: undefined,\n llmProvider: undefined,\n llmModel: undefined,\n llmPromptTokens: undefined,\n llmCompletionTokens: undefined,\n llmTotalTokens: undefined,\n llmCostUsd: undefined,\n toolName: undefined,\n toolSuccess: undefined,\n isEnded: true,\n durationMs: 0,\n\n setAttribute() { return this; },\n setAttributes() { return this; },\n setStatus() { return this; },\n addEvent() { return this; },\n addLink() { return this; },\n recordException() { return this; },\n setLlmFields() { return this; },\n setToolFields() { return this; },\n end() {},\n toPayload(): SpanPayload {\n return {\n traceId: this.traceId,\n spanId: this.spanId,\n name: this.name,\n kind: this.kind,\n startTime: this.startTime,\n status: this.status,\n attributes: {},\n events: [],\n links: [],\n };\n },\n});\n\nexport type NoopSpan = typeof NOOP_SPAN;\n","/**\n * Head-based deterministic sampling.\n *\n * Uses the first 8 hex characters of the trace ID as a hash\n * to make a deterministic sampling decision. This ensures:\n * - Same trace ID always produces the same decision\n * - Consistent across Python and JS/TS SDKs\n * - No external state needed\n */\n\n/**\n * Determine whether a trace should be sampled.\n *\n * @param traceId - 32-character hex trace ID\n * @param sampleRate - Rate between 0.0 (none) and 1.0 (all)\n * @returns true if the trace should be sampled\n */\nexport function shouldSample(traceId: string, sampleRate: number): boolean {\n if (sampleRate >= 1.0) return true;\n if (sampleRate <= 0.0) return false;\n\n // Parse first 8 hex chars as unsigned 32-bit integer\n const hash = parseInt(traceId.substring(0, 8), 16);\n return (hash / 0xFFFFFFFF) < sampleRate;\n}\n","/**\n * Shared state via globalThis — ensures all entry point bundles share\n * the same singleton instances.\n *\n * Problem: tsup with `splitting: false` gives each entry point (index,\n * openai, anthropic, vercel-ai) its own copy of module-level variables.\n * This means `init()` from 'risicare' sets a tracer that 'risicare/openai'\n * can't see — breaking all provider instrumentation silently.\n *\n * Solution: Store all mutable singletons on globalThis with a namespaced\n * prefix. Every bundle reads/writes the same global slots.\n *\n * This pattern is used by React, OpenTelemetry, and other SDKs that must\n * share state across independently bundled entry points.\n *\n * @internal\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G = globalThis as any;\nconst PREFIX = '__risicare_';\n\n// ─── Client & Tracer ────────────────────────────────────────────────────────\n\nexport function getClient(): unknown {\n return G[PREFIX + 'client'];\n}\n\nexport function setClient(client: unknown): void {\n G[PREFIX + 'client'] = client;\n}\n\nexport function getTracer(): unknown {\n return G[PREFIX + 'tracer'];\n}\n\nexport function setTracer(tracer: unknown): void {\n G[PREFIX + 'tracer'] = tracer;\n}\n\n// ─── Context Storage ────────────────────────────────────────────────────────\n\nexport function getContextStorage(): AsyncLocalStorage<unknown> {\n if (!G[PREFIX + 'ctx']) {\n G[PREFIX + 'ctx'] = new AsyncLocalStorage();\n }\n return G[PREFIX + 'ctx'];\n}\n\n// ─── Span Registry ──────────────────────────────────────────────────────────\n\nexport function getRegistry(): Map<string, unknown> {\n if (!G[PREFIX + 'registry']) {\n G[PREFIX + 'registry'] = new Map();\n }\n return G[PREFIX + 'registry'];\n}\n\nexport function getOpCount(): number {\n return G[PREFIX + 'opcount'] ?? 0;\n}\n\nexport function setOpCount(n: number): void {\n G[PREFIX + 'opcount'] = n;\n}\n\n// ─── Debug Flag ─────────────────────────────────────────────────────────────\n\nexport function getDebug(): boolean {\n return G[PREFIX + 'debug'] ?? false;\n}\n\nexport function setDebugFlag(enabled: boolean): void {\n G[PREFIX + 'debug'] = enabled;\n}\n","/**\n * AsyncLocalStorage-based context propagation.\n *\n * Uses a single AsyncLocalStorage instance with a composite state object.\n * This is simpler and more performant than multiple separate stores.\n *\n * Node.js AsyncLocalStorage automatically propagates through:\n * - Promise / async-await\n * - setTimeout / setImmediate\n * - EventEmitter callbacks\n * - process.nextTick\n * - async generators (unlike Python's contextvars!)\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport type { Span } from '../span.js';\nimport type { SemanticPhase } from '../types.js';\nimport { getContextStorage } from '../globals.js';\n\n// ─── Context Types ───────────────────────────────────────────────────────────\n\nexport interface SessionContext {\n sessionId: string;\n userId?: string;\n metadata?: Record<string, unknown>;\n parentSessionId?: string;\n turnNumber?: number;\n}\n\nexport interface AgentContext {\n agentId: string;\n agentName?: string;\n agentRole?: string;\n agentType?: string;\n parentAgentId?: string;\n version?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ContextState {\n session?: SessionContext;\n agent?: AgentContext;\n span?: Span;\n phase?: SemanticPhase;\n}\n\n// ─── Storage Accessor ────────────────────────────────────────────────────────\n\nfunction storage(): AsyncLocalStorage<ContextState> {\n return getContextStorage() as AsyncLocalStorage<ContextState>;\n}\n\n// ─── Core Operations ─────────────────────────────────────────────────────────\n\n/**\n * Get the current context state, or empty object if outside any context.\n */\nexport function getContext(): ContextState {\n return storage().getStore() ?? {};\n}\n\n/**\n * Run a callback within a new context scope.\n * The new scope inherits from the parent, with overrides applied.\n */\nexport function runWithContext<T>(overrides: Partial<ContextState>, fn: () => T): T {\n const parent = getContext();\n const merged: ContextState = { ...parent, ...overrides };\n return storage().run(merged, fn);\n}\n\n/**\n * Run an async callback within a new context scope.\n */\nexport function runWithContextAsync<T>(overrides: Partial<ContextState>, fn: () => Promise<T>): Promise<T> {\n const parent = getContext();\n const merged: ContextState = { ...parent, ...overrides };\n return storage().run(merged, fn);\n}\n\n// ─── Context Accessors ───────────────────────────────────────────────────────\n\nexport function getCurrentSession(): SessionContext | undefined {\n return getContext().session;\n}\n\nexport function getCurrentAgent(): AgentContext | undefined {\n return getContext().agent;\n}\n\nexport function getCurrentSpan(): Span | undefined {\n return getContext().span;\n}\n\nexport function getCurrentPhase(): SemanticPhase | undefined {\n return getContext().phase;\n}\n\nexport function getCurrentSessionId(): string | undefined {\n return getContext().session?.sessionId;\n}\n\nexport function getCurrentAgentId(): string | undefined {\n return getContext().agent?.agentId;\n}\n\nexport function getCurrentTraceId(): string | undefined {\n return getContext().span?.traceId;\n}\n\nexport function getCurrentSpanId(): string | undefined {\n return getContext().span?.spanId;\n}\n\nexport function getCurrentParentSpanId(): string | undefined {\n return getContext().span?.parentSpanId;\n}\n\n/**\n * Get all current context as a plain object (for debugging/serialization).\n */\nexport function getCurrentContext(): Record<string, unknown> {\n const ctx = getContext();\n return {\n session: ctx.session ? {\n sessionId: ctx.session.sessionId,\n userId: ctx.session.userId,\n ...(ctx.session.parentSessionId !== undefined ? { parentSessionId: ctx.session.parentSessionId } : {}),\n ...(ctx.session.turnNumber !== undefined ? { turnNumber: ctx.session.turnNumber } : {}),\n ...(ctx.session.metadata !== undefined ? { metadata: ctx.session.metadata } : {}),\n } : null,\n agent: ctx.agent ? {\n agentId: ctx.agent.agentId,\n agentName: ctx.agent.agentName,\n agentRole: ctx.agent.agentRole,\n agentType: ctx.agent.agentType,\n ...(ctx.agent.parentAgentId !== undefined ? { parentAgentId: ctx.agent.parentAgentId } : {}),\n ...(ctx.agent.version !== undefined ? { version: ctx.agent.version } : {}),\n ...(ctx.agent.metadata !== undefined ? { metadata: ctx.agent.metadata } : {}),\n } : null,\n span: ctx.span ? { spanId: ctx.span.spanId, traceId: ctx.span.traceId } : null,\n phase: ctx.phase ?? null,\n };\n}\n","/**\n * Tracer — creates spans with automatic context nesting.\n *\n * The Tracer is the primary API for creating spans. It automatically:\n * - Links child spans to parent spans via parentSpanId\n * - Propagates the trace ID from the active context\n * - Injects session/agent/phase context into new spans\n * - Runs the callback within the span's context scope\n *\n * Usage:\n * const tracer = new Tracer(processor);\n * await tracer.startSpan('my-operation', async (span) => {\n * span.setAttribute('key', 'value');\n * // Nested spans automatically become children\n * await tracer.startSpan('sub-op', async (child) => { ... });\n * });\n */\n\nimport { Span, type SpanOptions, type SpanEndCallback } from './span.js';\nimport { NOOP_SPAN } from './noop.js';\nimport { SpanKind } from './types.js';\nimport { generateTraceId } from './ids.js';\nimport { shouldSample } from './utils/sampling.js';\nimport {\n runWithContext,\n getCurrentSpan,\n getCurrentSession,\n getCurrentAgent,\n getCurrentPhase,\n} from './context/storage.js';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport interface StartSpanOptions {\n name: string;\n kind?: SpanKind;\n attributes?: Record<string, unknown>;\n /** Override trace ID (default: inherit from parent or generate new) */\n traceId?: string;\n /** Override parent span ID (default: current span in context) */\n parentSpanId?: string;\n}\n\nexport interface TracerConfig {\n /** Called when a span ends (typically feeds into batch processor) */\n onSpanEnd: SpanEndCallback;\n /** Sample rate 0.0–1.0 (default: 1.0) */\n sampleRate?: number;\n /** Whether tracing is enabled */\n enabled?: boolean;\n /** Whether to capture prompt/completion content (default: true) */\n traceContent?: boolean;\n}\n\n// ─── Tracer Class ───────────────────────────────────────────────────────────\n\nexport class Tracer {\n private _onSpanEnd: SpanEndCallback;\n private _sampleRate: number;\n private _enabled: boolean;\n private _traceContent: boolean;\n\n constructor(config: TracerConfig) {\n this._onSpanEnd = config.onSpanEnd;\n this._sampleRate = config.sampleRate ?? 1.0;\n this._enabled = config.enabled ?? true;\n this._traceContent = config.traceContent ?? true;\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n set enabled(value: boolean) {\n this._enabled = value;\n }\n\n get traceContent(): boolean {\n return this._traceContent;\n }\n\n /**\n * Start a span, run the callback within its context, and auto-end on completion.\n *\n * The span is automatically:\n * - Linked to the current parent span (if any)\n * - Given the current trace ID (or a new one for root spans)\n * - Enriched with session/agent/phase context\n * - Ended when the callback returns (or throws)\n * - Marked as ERROR if the callback throws\n *\n * @returns The callback's return value\n */\n startSpan<T>(options: StartSpanOptions | string, fn: (span: Span) => T): T {\n const opts = typeof options === 'string' ? { name: options } : options;\n\n // Fast path: disabled SDK\n if (!this._enabled) {\n return fn(NOOP_SPAN as unknown as Span);\n }\n\n // Resolve context\n const parentSpan = getCurrentSpan();\n const session = getCurrentSession();\n const agent = getCurrentAgent();\n const phase = getCurrentPhase();\n\n // Determine trace ID: explicit > parent > new\n const traceId = opts.traceId ?? parentSpan?.traceId ?? generateTraceId();\n\n // Sampling: check once per trace (root span decides)\n if (!parentSpan && this._sampleRate < 1.0) {\n if (!shouldSample(traceId, this._sampleRate)) {\n return fn(NOOP_SPAN as unknown as Span);\n }\n }\n\n // Parent span ID: explicit > current span in context\n const parentSpanId = opts.parentSpanId ?? parentSpan?.spanId;\n\n // Create the span\n const spanOptions: SpanOptions = {\n name: opts.name,\n kind: opts.kind ?? SpanKind.INTERNAL,\n traceId,\n parentSpanId,\n attributes: {\n ...opts.attributes,\n // Propagate context fields as attributes (matching Python SDK tracer.py:497-511)\n ...(agent?.agentRole ? { 'agent.role': agent.agentRole } : {}),\n ...(agent?.parentAgentId ? { 'parent_agent_id': agent.parentAgentId } : {}),\n ...(session?.userId ? { 'session.user_id': session.userId } : {}),\n },\n sessionId: session?.sessionId,\n agentId: agent?.agentId,\n agentName: agent?.agentName,\n agentType: agent?.agentType,\n semanticPhase: phase,\n };\n\n const span = new Span(spanOptions, this._onSpanEnd);\n\n // Run callback within span context\n try {\n const result = runWithContext({ span }, () => fn(span));\n\n // Handle async results (Promises)\n if (result instanceof Promise) {\n return result.then(\n (value) => {\n span.end();\n return value;\n },\n (error) => {\n span.recordException(error instanceof Error ? error : String(error));\n span.end();\n throw error;\n },\n ) as T;\n }\n\n // Sync: end span immediately\n span.end();\n return result;\n } catch (error) {\n // Sync error: record and re-throw\n span.recordException(error instanceof Error ? error : String(error));\n span.end();\n throw error;\n }\n }\n\n /**\n * Create a span without auto-ending. Caller is responsible for calling span.end().\n *\n * Useful for long-running operations where you need manual control.\n * The span is still linked to context and enriched with session/agent/phase.\n */\n createSpan(options: StartSpanOptions | string): Span {\n const opts = typeof options === 'string' ? { name: options } : options;\n\n if (!this._enabled) {\n return NOOP_SPAN as unknown as Span;\n }\n\n const parentSpan = getCurrentSpan();\n const session = getCurrentSession();\n const agent = getCurrentAgent();\n const phase = getCurrentPhase();\n\n const traceId = opts.traceId ?? parentSpan?.traceId ?? generateTraceId();\n\n if (!parentSpan && this._sampleRate < 1.0) {\n if (!shouldSample(traceId, this._sampleRate)) {\n return NOOP_SPAN as unknown as Span;\n }\n }\n\n const parentSpanId = opts.parentSpanId ?? parentSpan?.spanId;\n\n return new Span(\n {\n name: opts.name,\n kind: opts.kind ?? SpanKind.INTERNAL,\n traceId,\n parentSpanId,\n attributes: {\n ...opts.attributes,\n // Propagate context fields as attributes (matching Python SDK tracer.py:497-511)\n ...(agent?.agentRole ? { 'agent.role': agent.agentRole } : {}),\n ...(agent?.parentAgentId ? { 'parent_agent_id': agent.parentAgentId } : {}),\n ...(session?.userId ? { 'session.user_id': session.userId } : {}),\n },\n sessionId: session?.sessionId,\n agentId: agent?.agentId,\n agentName: agent?.agentName,\n agentType: agent?.agentType,\n semanticPhase: phase,\n },\n this._onSpanEnd,\n );\n }\n}\n","/**\n * Internal logger for the Risicare SDK.\n *\n * Centralizes all diagnostic output so that:\n * - Debug messages are gated by a single flag (zero-cost when disabled)\n * - Warnings always fire (operational alerts like queue full)\n * - All output goes to stderr with a consistent [risicare] prefix\n * - A future custom logger callback can be added in one place\n */\n\nimport { getDebug, setDebugFlag } from '../globals.js';\n\n/**\n * Enable or disable debug logging. Called once during init().\n * @internal\n */\nexport function setDebug(enabled: boolean): void {\n setDebugFlag(enabled);\n}\n\n/**\n * Log a debug message. Only outputs when debug mode is enabled.\n * @internal\n */\nexport function debug(msg: string): void {\n if (getDebug()) {\n process.stderr.write(`[risicare] ${msg}\\n`);\n }\n}\n\n/**\n * Log a warning. Always outputs regardless of debug mode.\n * Use sparingly — only for operational issues the user should see.\n * @internal\n */\nexport function warn(msg: string): void {\n process.stderr.write(`[risicare] WARNING: ${msg}\\n`);\n}\n","/**\n * Batch span processor.\n *\n * Collects spans and exports them in batches based on:\n * - Batch size threshold (default: 100 spans)\n * - Time interval (default: 1000ms)\n *\n * Node.js is single-threaded — no locks needed.\n * Timer is unref()'d so it doesn't prevent process exit.\n */\n\nimport type { Span } from '../span.js';\nimport { ExportResult, type SpanExporter } from './base.js';\nimport { debug, warn } from '../utils/log.js';\n\nexport interface BatchProcessorOptions {\n exporters: SpanExporter[];\n batchSize?: number;\n batchTimeoutMs?: number;\n maxQueueSize?: number;\n debug?: boolean;\n}\n\nexport class BatchSpanProcessor {\n private readonly _exporters: SpanExporter[];\n private readonly _batchSize: number;\n private readonly _batchTimeoutMs: number;\n private readonly _maxQueueSize: number;\n private readonly _debug: boolean;\n\n private _queue: Span[] = [];\n private _timer: ReturnType<typeof setInterval> | null = null;\n private _started = false;\n private _flushing = false;\n private _beforeExitHandler: (() => void) | null = null;\n\n // Retry tracking for failed batches (Audit #5)\n private _retryCounts = new Map<string, number>();\n private static readonly MAX_RETRIES = 3;\n\n // Metrics\n droppedSpans = 0;\n exportedSpans = 0;\n failedExports = 0;\n\n constructor(options: BatchProcessorOptions) {\n this._exporters = [...options.exporters];\n this._batchSize = options.batchSize ?? 100;\n this._batchTimeoutMs = options.batchTimeoutMs ?? 1000;\n this._maxQueueSize = options.maxQueueSize ?? 10000;\n this._debug = options.debug ?? false;\n }\n\n start(): void {\n if (this._started) return;\n this._started = true;\n\n // Periodic flush timer — unref so it doesn't keep process alive\n this._timer = setInterval(() => {\n void this._exportBatch();\n }, this._batchTimeoutMs);\n this._timer.unref();\n\n // Flush on process exit (Audit #3: use .once, not .on; await, not void)\n this._beforeExitHandler = () => {\n void this.shutdown();\n };\n process.once('beforeExit', this._beforeExitHandler);\n }\n\n async shutdown(timeoutMs = 5000): Promise<void> {\n if (!this._started) return;\n this._started = false;\n\n if (this._timer) {\n clearInterval(this._timer);\n this._timer = null;\n }\n\n // Remove process listener to prevent leak (Audit #3)\n if (this._beforeExitHandler) {\n process.removeListener('beforeExit', this._beforeExitHandler);\n this._beforeExitHandler = null;\n }\n\n // Final flush with timeout\n const flushPromise = this._exportBatch();\n const timeoutPromise = new Promise<void>((resolve) => setTimeout(resolve, timeoutMs));\n await Promise.race([flushPromise, timeoutPromise]);\n\n // Shutdown exporters\n for (const exporter of this._exporters) {\n try {\n await exporter.shutdown();\n } catch (e) {\n debug(`Error shutting down ${exporter.name}: ${e}`);\n }\n }\n\n // Clean up retry tracking\n this._retryCounts.clear();\n\n debug(\n `BatchSpanProcessor shutdown. Exported: ${this.exportedSpans}, ` +\n `Dropped: ${this.droppedSpans}, Failed: ${this.failedExports}`\n );\n }\n\n onSpanEnd(span: Span): void {\n if (!this._started) return;\n\n // Check queue capacity\n if (this._queue.length >= this._maxQueueSize) {\n this.droppedSpans++;\n if (this.droppedSpans === 1 || this.droppedSpans % 1000 === 0) {\n warn(`Span queue full (${this._maxQueueSize}). ${this.droppedSpans} spans dropped so far.`);\n }\n return;\n }\n\n this._queue.push(span);\n\n // Trigger immediate flush if batch size reached\n if (this._queue.length >= this._batchSize) {\n void this._exportBatch();\n }\n }\n\n async flush(timeoutMs = 5000): Promise<boolean> {\n if (!this._started) return true;\n\n const start = Date.now();\n\n // Wait for in-flight exports to complete AND queue to drain\n while (this._queue.length > 0 || this._flushing) {\n if (!this._flushing && this._queue.length > 0) {\n await this._exportBatch();\n } else {\n // Wait a tick for the in-flight export to finish\n await new Promise((r) => setTimeout(r, 1));\n }\n if (Date.now() - start > timeoutMs) return false;\n }\n\n return true;\n }\n\n getMetrics() {\n return {\n exportedSpans: this.exportedSpans,\n droppedSpans: this.droppedSpans,\n failedExports: this.failedExports,\n queueSize: this._queue.length,\n queueCapacity: this._maxQueueSize,\n queueUtilization: this._queue.length / this._maxQueueSize,\n };\n }\n\n private async _exportBatch(): Promise<void> {\n if (this._flushing || this._queue.length === 0) return;\n this._flushing = true;\n\n try {\n // Take up to batchSize spans\n const batch = this._queue.splice(0, this._batchSize);\n if (batch.length === 0) return;\n\n debug(`Exporting batch of ${batch.length} spans`);\n\n // Export to all exporters — count once, not per exporter\n let batchExported = false;\n for (const exporter of this._exporters) {\n try {\n const result = await exporter.export(batch);\n if (result === ExportResult.SUCCESS) {\n if (!batchExported) {\n this.exportedSpans += batch.length;\n batchExported = true;\n // Clear retry counts for successfully exported spans\n for (const span of batch) {\n this._retryCounts.delete(span.spanId);\n }\n }\n } else {\n this.failedExports++;\n }\n } catch (e) {\n this.failedExports++;\n debug(`Export to ${exporter.name} failed: ${e}`);\n }\n }\n\n // Audit #5: Re-queue failed batches with retry limit\n if (!batchExported) {\n const retryable = batch.filter(span => {\n const count = (this._retryCounts.get(span.spanId) ?? 0) + 1;\n if (count > BatchSpanProcessor.MAX_RETRIES) {\n this._retryCounts.delete(span.spanId);\n this.droppedSpans++;\n return false;\n }\n this._retryCounts.set(span.spanId, count);\n return true;\n });\n if (retryable.length > 0) {\n this._queue.unshift(...retryable);\n debug(`Re-queued ${retryable.length} spans for retry (${batch.length - retryable.length} dropped after max retries)`);\n }\n }\n } finally {\n this._flushing = false;\n }\n }\n}\n","/**\n * HTTP exporter for sending spans to the Risicare gateway.\n *\n * Uses native fetch (Node.js 18+), with:\n * - Automatic retry with exponential backoff\n * - Circuit breaker with half-open probe state\n * - Gzip compression for large payloads\n * - Bearer token authentication\n */\n\nimport type { Span } from '../span.js';\nimport type { IngestRequest } from '../types.js';\nimport { ExportResult, type SpanExporter } from './base.js';\nimport { debug, warn } from '../utils/log.js';\n\nconst SDK_VERSION = '0.1.1';\n\nexport interface HttpExporterOptions {\n endpoint: string;\n apiKey?: string;\n projectId?: string;\n environment?: string;\n timeoutMs?: number;\n maxRetries?: number;\n compress?: boolean;\n}\n\nexport class HttpExporter implements SpanExporter {\n readonly name = 'http';\n\n private readonly _endpoint: string;\n private readonly _apiKey: string | undefined;\n private readonly _projectId: string | undefined;\n private readonly _environment: string | undefined;\n private readonly _timeoutMs: number;\n private readonly _maxRetries: number;\n private readonly _compress: boolean;\n\n // Circuit breaker\n private _consecutiveFailures = 0;\n private _circuitOpenUntil = 0;\n private readonly _circuitBreakerThreshold = 3;\n private readonly _circuitBreakerCooldownMs = 30_000;\n\n constructor(options: HttpExporterOptions) {\n this._endpoint = options.endpoint.replace(/\\/+$/, '');\n this._apiKey = options.apiKey;\n this._projectId = options.projectId;\n this._environment = options.environment;\n this._timeoutMs = options.timeoutMs ?? 5000;\n this._maxRetries = options.maxRetries ?? 3;\n this._compress = options.compress ?? false;\n }\n\n async export(spans: Span[]): Promise<ExportResult> {\n if (spans.length === 0) return ExportResult.SUCCESS;\n\n // Circuit breaker: skip if open\n const now = Date.now();\n let isHalfOpen = false;\n if (this._consecutiveFailures >= this._circuitBreakerThreshold) {\n if (now < this._circuitOpenUntil) {\n return ExportResult.FAILURE;\n }\n // Cooldown expired — probe with single request (Audit #7: half-open state)\n isHalfOpen = true;\n }\n\n const body: IngestRequest = {\n spans: spans.map((s) => s.toPayload()),\n };\n if (this._projectId) body.projectId = this._projectId;\n if (this._environment) body.environment = this._environment;\n\n // Half-open: single probe request. Normal: full retry loop.\n const maxAttempts = isHalfOpen ? 1 : this._maxRetries;\n\n // Retry loop with exponential backoff\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const result = await this._sendRequest(body);\n\n if (result === ExportResult.SUCCESS) {\n this._consecutiveFailures = 0;\n return result;\n }\n\n // Backoff: 100ms, 200ms, 400ms\n if (attempt < maxAttempts - 1) {\n await sleep(100 * Math.pow(2, attempt));\n }\n }\n\n // All retries failed — update circuit breaker\n this._consecutiveFailures++;\n if (this._consecutiveFailures >= this._circuitBreakerThreshold) {\n this._circuitOpenUntil = Date.now() + this._circuitBreakerCooldownMs;\n warn(\n `HTTP exporter circuit breaker opened after ${this._consecutiveFailures} failures. ` +\n `Cooldown: ${this._circuitBreakerCooldownMs / 1000}s`\n );\n }\n\n return ExportResult.FAILURE;\n }\n\n private async _sendRequest(body: IngestRequest): Promise<ExportResult> {\n const url = `${this._endpoint}/v1/spans`;\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': `risicare-js/${SDK_VERSION} node/${process.version}`,\n };\n if (this._apiKey) {\n headers['Authorization'] = `Bearer ${this._apiKey}`;\n }\n\n let payload: string | Uint8Array = JSON.stringify(body);\n\n if (this._compress && payload.length > 1024) {\n try {\n const { gzipSync } = await import('node:zlib');\n payload = gzipSync(Buffer.from(payload));\n headers['Content-Encoding'] = 'gzip';\n } catch (e) {\n // Audit #16: log compression failures instead of silently swallowing\n debug(`Gzip compression failed, sending uncompressed: ${e}`);\n }\n }\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this._timeoutMs);\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: payload,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (response.status < 300) {\n return ExportResult.SUCCESS;\n } else if (response.status === 408 || response.status === 504) {\n debug(`HTTP export timeout: ${response.status}`);\n return ExportResult.TIMEOUT;\n }\n debug(`HTTP export failed: ${response.status}`);\n return ExportResult.FAILURE;\n } catch (e) {\n debug(`HTTP export error: ${e}`);\n return ExportResult.FAILURE;\n }\n }\n\n shutdown(): void {\n // Native fetch doesn't need cleanup\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Console exporter for debugging.\n *\n * Prints span data to stderr in a readable format.\n */\n\nimport type { Span } from '../span.js';\nimport { ExportResult, type SpanExporter } from './base.js';\n\nexport class ConsoleExporter implements SpanExporter {\n readonly name = 'console';\n\n export(spans: Span[]): ExportResult {\n for (const span of spans) {\n const payload = span.toPayload();\n const line = JSON.stringify(payload);\n process.stderr.write(`[risicare] ${line}\\n`);\n }\n return ExportResult.SUCCESS;\n }\n\n shutdown(): void {\n // Nothing to clean up\n }\n}\n","/**\n * RisicareClient — singleton client managing SDK lifecycle.\n *\n * Handles initialization, shutdown, and the connection between\n * the Tracer and the export pipeline (batch processor + HTTP exporter).\n *\n * Usage:\n * import { init, shutdown } from 'risicare';\n * init({ apiKey: 'rsk-...' }); // API key determines project\n * // ... instrument code ...\n * await shutdown(); // flush remaining spans\n */\n\nimport { type RisicareConfig, resolveConfig } from './config.js';\nimport { Tracer } from './tracer.js';\nimport { BatchSpanProcessor } from './exporters/batch.js';\nimport { HttpExporter } from './exporters/http.js';\nimport { ConsoleExporter } from './exporters/console.js';\nimport type { SpanExporter } from './exporters/base.js';\nimport { setDebug, debug } from './utils/log.js';\nimport {\n getClient as getGlobalClient,\n setClient as setGlobalClient,\n getTracer as getGlobalTracer,\n setTracer as setGlobalTracer,\n} from './globals.js';\n\n// ─── Client Class ───────────────────────────────────────────────────────────\n\nclass RisicareClient {\n readonly config: ReturnType<typeof resolveConfig>;\n readonly processor: BatchSpanProcessor;\n readonly tracer: Tracer;\n private _shutdownPromise: Promise<void> | undefined;\n private _shutdownHandlers: { signal: string; handler: () => void }[] = [];\n\n constructor(config?: Partial<RisicareConfig>) {\n this.config = resolveConfig(config);\n\n // API key format validation\n if (this.config.apiKey && !this.config.apiKey.startsWith('rsk-')) {\n debug('Warning: API key should start with \"rsk-\". Got: ' + this.config.apiKey.slice(0, 4) + '...');\n }\n\n // Build exporter chain\n let exporter: SpanExporter;\n if (this.config.debug && !this.config.apiKey) {\n exporter = new ConsoleExporter();\n } else if (this.config.apiKey) {\n exporter = new HttpExporter({\n endpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n projectId: this.config.projectId || undefined,\n environment: this.config.environment || undefined,\n compress: this.config.compress,\n });\n } else {\n // No API key and not debug — use console as fallback\n exporter = new ConsoleExporter();\n }\n\n this.processor = new BatchSpanProcessor({\n exporters: [exporter],\n batchSize: this.config.batchSize,\n batchTimeoutMs: this.config.batchTimeoutMs,\n maxQueueSize: this.config.maxQueueSize,\n debug: this.config.debug,\n });\n\n this.tracer = new Tracer({\n onSpanEnd: (span) => this.processor.onSpanEnd(span),\n sampleRate: this.config.sampleRate,\n enabled: this.config.enabled,\n traceContent: this.config.traceContent,\n });\n\n // Start the batch processor (enables span queuing and periodic flushing)\n this.processor.start();\n\n // Register shutdown hooks\n this._registerShutdownHooks();\n\n // Enable internal debug logging if configured\n setDebug(this.config.debug);\n debug(`Initialized: enabled=${this.config.enabled}, endpoint=${this.config.endpoint}`);\n }\n\n get enabled(): boolean {\n return this.tracer.enabled;\n }\n\n set enabled(value: boolean) {\n this.tracer.enabled = value;\n }\n\n // Audit #6: Promise-based shutdown dedup (fixes TOCTOU race condition)\n async shutdown(): Promise<void> {\n if (this._shutdownPromise) return this._shutdownPromise;\n this._shutdownPromise = this._doShutdown();\n return this._shutdownPromise;\n }\n\n private async _doShutdown(): Promise<void> {\n debug('Shutting down...');\n\n // Audit #3: Remove process listeners to prevent leak\n for (const { signal, handler } of this._shutdownHandlers) {\n process.removeListener(signal, handler);\n }\n this._shutdownHandlers = [];\n\n await this.processor.shutdown();\n }\n\n async flush(): Promise<void> {\n await this.processor.flush();\n }\n\n private _registerShutdownHooks(): void {\n const onShutdown = () => {\n // Audit #3: Add 5s timeout to prevent hanging on signal\n const timeout = setTimeout(() => process.exit(1), 5000);\n timeout.unref();\n this.shutdown().catch(() => {}).finally(() => clearTimeout(timeout));\n };\n\n const signals = ['beforeExit', 'SIGTERM', 'SIGINT'];\n for (const signal of signals) {\n process.once(signal, onShutdown);\n this._shutdownHandlers.push({ signal, handler: onShutdown });\n }\n }\n}\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\n/**\n * Initialize the Risicare SDK. Call once at application startup.\n *\n * @example\n * import { init } from 'risicare';\n * init({ apiKey: 'rsk-...', serviceName: 'my-agent', environment: 'production' });\n */\nexport function init(config?: Partial<RisicareConfig>): void {\n if (getGlobalClient()) {\n debug('Already initialized. Call shutdown() first to re-initialize.');\n return;\n }\n\n const client = new RisicareClient(config);\n setGlobalClient(client);\n setGlobalTracer(client.tracer);\n}\n\n/**\n * Gracefully shut down the SDK. Flushes pending spans before resolving.\n */\nexport async function shutdown(): Promise<void> {\n const client = getGlobalClient() as RisicareClient | undefined;\n if (!client) return;\n await client.shutdown();\n setGlobalClient(undefined);\n setGlobalTracer(undefined);\n}\n\n/**\n * Flush all pending spans without shutting down.\n */\nexport async function flush(): Promise<void> {\n const client = getGlobalClient() as RisicareClient | undefined;\n if (!client) return;\n await client.flush();\n}\n\n/**\n * Enable tracing at runtime.\n */\nexport function enable(): void {\n const client = getGlobalClient() as RisicareClient | undefined;\n if (client) client.enabled = true;\n}\n\n/**\n * Disable tracing at runtime. Spans will not be created or exported.\n */\nexport function disable(): void {\n const client = getGlobalClient() as RisicareClient | undefined;\n if (client) client.enabled = false;\n}\n\n/**\n * Check whether tracing is currently enabled.\n */\nexport function isEnabled(): boolean {\n const client = getGlobalClient() as RisicareClient | undefined;\n return client?.enabled ?? false;\n}\n\n/**\n * Get the global tracer instance. Returns undefined if not initialized.\n */\nexport function getTracer(): Tracer | undefined {\n return getGlobalTracer() as Tracer | undefined;\n}\n\n/**\n * Get the global tracer, or throw if not initialized.\n * @internal Used by decorators and providers that require an active tracer.\n */\nexport function requireTracer(): Tracer {\n const tracer = getGlobalTracer() as Tracer | undefined;\n if (!tracer) {\n throw new Error(\n 'Risicare SDK not initialized. Call init() before using tracing features.',\n );\n }\n return tracer;\n}\n\n/**\n * Check whether content tracing (prompt/completion capture) is enabled.\n */\nexport function getTraceContent(): boolean {\n const tracer = getGlobalTracer() as Tracer | undefined;\n return tracer?.traceContent ?? true;\n}\n\n/**\n * Get SDK metrics: exported spans, dropped spans, failed exports, queue stats.\n * Returns zero-valued metrics if SDK is not initialized.\n */\nexport function getMetrics() {\n const client = getGlobalClient() as RisicareClient | undefined;\n return client?.processor.getMetrics() ?? {\n exportedSpans: 0,\n droppedSpans: 0,\n failedExports: 0,\n queueSize: 0,\n queueCapacity: 0,\n queueUtilization: 0,\n };\n}\n","/**\n * Agent context — identifies which agent is executing.\n * Supports nesting: inner agents automatically track parent.\n */\n\nimport { generateAgentId } from '../ids.js';\nimport { isEnabled } from '../client.js';\nimport { runWithContext, getCurrentAgent, type AgentContext } from './storage.js';\n\nexport interface AgentOptions {\n agentId?: string;\n name?: string;\n role?: string;\n agentType?: string;\n version?: number;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Run a callback within an agent context.\n * If nested inside another agent, parentAgentId is set automatically.\n *\n * @example\n * await withAgent({ name: 'researcher', role: 'worker' }, async () => {\n * const result = await llm.invoke(query);\n * return result;\n * });\n */\nexport function withAgent<T>(options: AgentOptions, fn: () => T): T {\n if (!isEnabled()) return fn();\n\n const parent = getCurrentAgent();\n const agentName = options.name ?? 'agent';\n\n const agent: AgentContext = {\n agentId: options.agentId ?? generateAgentId(agentName),\n agentName: agentName,\n agentRole: options.role,\n agentType: options.agentType,\n parentAgentId: parent?.agentId,\n version: options.version,\n metadata: options.metadata,\n };\n\n return runWithContext({ agent }, fn);\n}\n","/**\n * agent() — Higher-order function wrapper for agent identity (Tier 2).\n *\n * Wraps a function to execute within an agent context. All spans created\n * inside will be tagged with the agent's identity.\n *\n * @example\n * const research = agent({ name: 'researcher', role: 'worker' }, async (query: string) => {\n * const result = await openai.chat.completions.create({ ... });\n * return result.choices[0].message.content;\n * });\n *\n * const answer = await research('What is quantum computing?');\n */\n\nimport { withAgent, type AgentOptions } from '../context/agent.js';\nimport { getTracer } from '../client.js';\nimport { SpanKind } from '../types.js';\n\n/**\n * Wrap a function with agent context and an automatic span.\n */\nexport function agent<TArgs extends unknown[], TReturn>(\n options: AgentOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const spanName = `agent:${options.name ?? 'agent'}`;\n\n return (...args: TArgs): TReturn => {\n const tracer = getTracer();\n if (!tracer) {\n // Graceful degradation: run user code without tracing\n return fn(...args);\n }\n return withAgent(options, () => {\n return tracer.startSpan({ name: spanName, kind: SpanKind.AGENT }, () => {\n return fn(...args);\n });\n });\n };\n}\n","/**\n * Session context — groups multiple traces from the same user interaction.\n */\n\nimport { isEnabled } from '../client.js';\nimport { runWithContext, type SessionContext } from './storage.js';\n\nexport interface SessionOptions {\n sessionId: string;\n userId?: string;\n metadata?: Record<string, unknown>;\n parentSessionId?: string;\n turnNumber?: number;\n}\n\n/**\n * Run a callback within a session context.\n *\n * @example\n * await withSession({ sessionId: 'sess-123', userId: 'user-1' }, async () => {\n * const result = await agent.run(query);\n * return result;\n * });\n */\nexport function withSession<T>(options: SessionOptions, fn: () => T): T {\n if (!isEnabled()) return fn();\n const session: SessionContext = {\n sessionId: options.sessionId,\n userId: options.userId,\n metadata: options.metadata,\n parentSessionId: options.parentSessionId,\n turnNumber: options.turnNumber ?? 1,\n };\n return runWithContext({ session }, fn);\n}\n","/**\n * session() — Higher-order function wrapper for session context (Tier 3).\n *\n * Wraps a function to execute within a session context. All spans created\n * inside will be tagged with the session identity.\n *\n * @example\n * const handleRequest = session(\n * (req) => ({ sessionId: req.sessionId, userId: req.userId }),\n * async (req: Request) => {\n * return await agent.run(req.query);\n * },\n * );\n */\n\nimport { withSession, type SessionOptions } from '../context/session.js';\n\n/**\n * Wrap a function with session context.\n *\n * @param optionsOrResolver - Static session options, or a function that derives them from args\n * @param fn - The function to wrap\n */\nexport function session<TArgs extends unknown[], TReturn>(\n optionsOrResolver: SessionOptions | ((...args: TArgs) => SessionOptions),\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return (...args: TArgs): TReturn => {\n const options = typeof optionsOrResolver === 'function'\n ? optionsOrResolver(...args)\n : optionsOrResolver;\n return withSession(options, () => fn(...args));\n };\n}\n","/**\n * Phase context — cognitive phase tracking (THINK/DECIDE/ACT/OBSERVE).\n */\n\nimport { isEnabled } from '../client.js';\nimport { SemanticPhase } from '../types.js';\nimport { runWithContext } from './storage.js';\n\n/**\n * Run a callback within a semantic phase context.\n */\nexport function withPhase<T>(phase: SemanticPhase, fn: () => T): T {\n if (!isEnabled()) return fn();\n return runWithContext({ phase }, fn);\n}\n","/**\n * Phase decorators — decision phase tracking (Tier 4).\n *\n * Wraps functions to execute within a semantic phase context (THINK/DECIDE/ACT/OBSERVE).\n * Each creates a span named after the phase.\n *\n * @example\n * const analyze = traceThink(async (data: string) => {\n * return await llm.invoke(`Analyze: ${data}`);\n * });\n *\n * const decide = traceDecide(async (analysis: string) => {\n * return await llm.invoke(`Decide action: ${analysis}`);\n * });\n */\n\nimport { withPhase } from '../context/phase.js';\nimport { getTracer } from '../client.js';\nimport { SemanticPhase, SpanKind } from '../types.js';\n\nfunction phaseWrapper<TArgs extends unknown[], TReturn>(\n phase: SemanticPhase,\n kind: SpanKind,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return (...args: TArgs): TReturn => {\n const tracer = getTracer();\n if (!tracer) {\n // Graceful degradation: run user code without tracing\n return fn(...args);\n }\n return withPhase(phase, () => {\n return tracer.startSpan({ name: `phase:${phase}`, kind }, () => fn(...args));\n });\n };\n}\n\n/** Wrap a function in a THINK phase context with auto-span. */\nexport function traceThink<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return phaseWrapper(SemanticPhase.THINK, SpanKind.THINK, fn);\n}\n\n/** Wrap a function in a DECIDE phase context with auto-span. */\nexport function traceDecide<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return phaseWrapper(SemanticPhase.DECIDE, SpanKind.DECIDE, fn);\n}\n\n/** Wrap a function in an ACT phase context with auto-span. */\nexport function traceAct<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return phaseWrapper(SemanticPhase.ACT, SpanKind.TOOL_CALL, fn);\n}\n\n/** Wrap a function in an OBSERVE phase context with auto-span. */\nexport function traceObserve<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return phaseWrapper(SemanticPhase.OBSERVE, SpanKind.OBSERVE, fn);\n}\n","/**\n * Multi-agent communication decorators (Tier 5).\n *\n * Track inter-agent messages, delegations, and coordination.\n *\n * @example\n * const sendToWorker = traceMessage({ to: 'worker-1', type: MessageType.DELEGATE },\n * async (task: string) => { ... }\n * );\n */\n\nimport { getTracer } from '../client.js';\nimport { MessageType, SpanKind } from '../types.js';\n\ninterface MessageOptions {\n to: string;\n type?: MessageType;\n metadata?: Record<string, unknown>;\n}\n\ninterface DelegateOptions {\n to: string;\n metadata?: Record<string, unknown>;\n}\n\ninterface CoordinateOptions {\n participants: string[];\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Namespace user metadata under 'metadata.*' to prevent overwriting\n * critical span attributes like message.type, message.to, etc.\n */\nfunction namespacedMetadata(metadata?: Record<string, unknown>): Record<string, unknown> {\n if (!metadata) return {};\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(metadata)) {\n result[`metadata.${key}`] = value;\n }\n return result;\n}\n\n/**\n * Wrap a function that sends a message to another agent.\n */\nexport function traceMessage<TArgs extends unknown[], TReturn>(\n options: MessageOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const msgType = options.type ?? MessageType.REQUEST;\n\n return (...args: TArgs): TReturn => {\n const tracer = getTracer();\n if (!tracer) return fn(...args);\n return tracer.startSpan(\n {\n name: `message:${msgType}→${options.to}`,\n kind: SpanKind.MESSAGE,\n attributes: {\n ...namespacedMetadata(options.metadata),\n 'message.to': options.to,\n 'message.type': msgType,\n 'message.target_agent_id': options.to,\n },\n },\n () => fn(...args),\n );\n };\n}\n\n/**\n * Wrap a function that delegates work to a sub-agent.\n */\nexport function traceDelegate<TArgs extends unknown[], TReturn>(\n options: DelegateOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return (...args: TArgs): TReturn => {\n const tracer = getTracer();\n if (!tracer) return fn(...args);\n return tracer.startSpan(\n {\n name: `delegate→${options.to}`,\n kind: SpanKind.DELEGATION,\n attributes: {\n ...namespacedMetadata(options.metadata),\n 'delegate.to': options.to,\n 'message.type': MessageType.DELEGATE,\n 'message.target_agent_id': options.to,\n },\n },\n () => fn(...args),\n );\n };\n}\n\n/**\n * Wrap a function that coordinates multiple agents.\n */\nexport function traceCoordinate<TArgs extends unknown[], TReturn>(\n options: CoordinateOptions,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return (...args: TArgs): TReturn => {\n const tracer = getTracer();\n if (!tracer) return fn(...args);\n return tracer.startSpan(\n {\n name: `coordinate:[${options.participants.join(',')}]`,\n kind: SpanKind.COORDINATION,\n attributes: {\n ...namespacedMetadata(options.metadata),\n 'coordinate.participants': options.participants.join(','),\n 'message.type': MessageType.COORDINATE,\n },\n },\n () => fn(...args),\n );\n };\n}\n","/**\n * Serializable trace context + W3C Trace Context headers.\n *\n * TraceContext is a plain object that can be passed across process\n * boundaries (JSON serialization, HTTP headers, message queues).\n *\n * W3C Trace Context:\n * traceparent: {version}-{trace_id}-{span_id}-{flags}\n * tracestate: risicare=session_id={...};agent_id={...}\n */\n\nimport { generateTraceId, generateSpanId, validateTraceId, validateSpanId } from '../ids.js';\nimport { getCurrentSpan, getCurrentSession, getCurrentAgent } from './storage.js';\n\n// ─── Serializable Trace Context ──────────────────────────────────────────────\n\nexport interface TraceContext {\n traceId: string;\n spanId: string;\n sessionId?: string;\n agentId?: string;\n}\n\n/**\n * Get the current trace context as a serializable object.\n */\nexport function getTraceContext(): TraceContext {\n const span = getCurrentSpan();\n const session = getCurrentSession();\n const agent = getCurrentAgent();\n\n return {\n traceId: span?.traceId ?? generateTraceId(),\n spanId: span?.spanId ?? generateSpanId(),\n sessionId: session?.sessionId,\n agentId: agent?.agentId,\n };\n}\n\n// ─── W3C Trace Context Headers ───────────────────────────────────────────────\n\nconst TRACEPARENT_HEADER = 'traceparent';\nconst TRACESTATE_HEADER = 'tracestate';\nconst RISICARE_STATE_DELIMITER = ';';\n\n/**\n * Inject trace context into HTTP headers (W3C format).\n */\nexport function injectTraceContext(headers: Record<string, string>): Record<string, string> {\n const span = getCurrentSpan();\n const session = getCurrentSession();\n const agent = getCurrentAgent();\n\n if (span) {\n // W3C traceparent: version-trace_id-span_id-flags\n headers[TRACEPARENT_HEADER] = `00-${span.traceId}-${span.spanId}-01`;\n\n // Custom tracestate for Risicare (uses ';' as internal delimiter)\n // Preserve other vendors' tracestate entries per W3C spec\n const parts: string[] = [];\n if (session) parts.push(`session_id=${session.sessionId}`);\n if (agent) parts.push(`agent_id=${agent.agentId}`);\n\n if (parts.length > 0) {\n const riscareEntry = `risicare=${parts.join(RISICARE_STATE_DELIMITER)}`;\n const existing = headers[TRACESTATE_HEADER] ?? '';\n // Keep non-risicare vendor entries from any existing tracestate\n const otherEntries = existing\n .split(',')\n .map((e) => e.trim())\n .filter((e) => e && !e.startsWith('risicare='));\n headers[TRACESTATE_HEADER] = [riscareEntry, ...otherEntries].join(',');\n }\n }\n\n return headers;\n}\n\n/**\n * Extract trace context from HTTP headers (W3C format).\n */\nexport function extractTraceContext(headers: Record<string, string>): Record<string, string | undefined> {\n const result: Record<string, string | undefined> = {};\n\n // Normalize header keys to lowercase (HTTP headers are case-insensitive)\n const normalizedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n normalizedHeaders[key.toLowerCase()] = value;\n }\n\n // Parse traceparent\n const traceparent = normalizedHeaders[TRACEPARENT_HEADER] ?? '';\n if (traceparent) {\n const parts = traceparent.split('-');\n if (parts.length >= 4) {\n const traceId = parts[1].toLowerCase();\n const spanId = parts[2].toLowerCase();\n if (validateTraceId(traceId)) result.traceId = traceId;\n if (validateSpanId(spanId)) result.parentSpanId = spanId;\n result.flags = parts[3];\n }\n }\n\n // Parse tracestate\n const tracestate = normalizedHeaders[TRACESTATE_HEADER] ?? '';\n if (tracestate) {\n for (const entry of tracestate.split(',')) {\n const trimmed = entry.trim();\n if (trimmed.startsWith('risicare=')) {\n const state = trimmed.slice(9); // len(\"risicare=\")\n for (const kv of state.split(RISICARE_STATE_DELIMITER)) {\n const eqIdx = kv.indexOf('=');\n if (eqIdx > 0) {\n const key = kv.slice(0, eqIdx).trim();\n const value = kv.slice(eqIdx + 1).trim();\n if (key && value) {\n // Normalize known tracestate keys to camelCase\n const camelKey = key === 'session_id' ? 'sessionId'\n : key === 'agent_id' ? 'agentId'\n : key;\n result[camelKey] = value;\n }\n }\n }\n }\n }\n }\n\n return result;\n}\n","/**\n * Span registry — TTL-based span store for edge cases.\n *\n * While AsyncLocalStorage handles most context propagation in Node.js,\n * the registry is useful for:\n * - Cross-process span tracking\n * - Explicit span passing via ID\n * - Long-running operations that outlive their original context\n */\n\nimport type { Span } from '../span.js';\nimport { getRegistry, getOpCount, setOpCount } from '../globals.js';\n\ninterface RegistryEntry {\n span: Span;\n registeredAt: number;\n ttlMs: number;\n}\n\nconst DEFAULT_TTL_MS = 60_000;\nconst MAX_ENTRIES = 10_000;\nconst CLEANUP_INTERVAL = 100;\n\nfunction entries(): Map<string, RegistryEntry> {\n return getRegistry() as Map<string, RegistryEntry>;\n}\n\nexport function registerSpan(span: Span, ttlMs = DEFAULT_TTL_MS): void {\n entries().set(span.spanId, {\n span,\n registeredAt: Date.now(),\n ttlMs,\n });\n setOpCount(getOpCount() + 1);\n maybeCleanup();\n}\n\nexport function getSpanById(spanId: string): Span | undefined {\n const entry = entries().get(spanId);\n if (!entry) return undefined;\n\n if (Date.now() - entry.registeredAt > entry.ttlMs) {\n entries().delete(spanId);\n return undefined;\n }\n\n return entry.span;\n}\n\nexport function unregisterSpan(spanId: string): void {\n entries().delete(spanId);\n}\n\nexport function extendSpanTtl(spanId: string, additionalMs: number): boolean {\n const entry = entries().get(spanId);\n if (!entry) return false;\n\n if (Date.now() - entry.registeredAt > entry.ttlMs) {\n entries().delete(spanId);\n return false;\n }\n\n entry.ttlMs += additionalMs;\n return true;\n}\n\nexport function getRegistryStats(): { totalEntries: number; operationCount: number } {\n return {\n totalEntries: entries().size,\n operationCount: getOpCount(),\n };\n}\n\nexport function clearRegistry(): void {\n entries().clear();\n setOpCount(0);\n}\n\nfunction maybeCleanup(): void {\n if (getOpCount() % CLEANUP_INTERVAL !== 0) return;\n if (entries().size <= MAX_ENTRIES) return;\n\n const now = Date.now();\n for (const [id, entry] of entries()) {\n if (now - entry.registeredAt > entry.ttlMs) {\n entries().delete(id);\n }\n }\n}\n"],"mappings":"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","names":["getTracer","debug","SpanKind","SpanStatus","SemanticPhase","AgentRole","MessageType","session","agent","getTracer","agent","getTracer","session","getTracer","getTracer","session","agent"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -5,15 +5,19 @@
|
|
|
5
5
|
* RISICARE_API_KEY, RISICARE_ENDPOINT, RISICARE_PROJECT_ID, etc.
|
|
6
6
|
*/
|
|
7
7
|
interface RisicareConfig {
|
|
8
|
-
/** API key for authentication (format: "rsk-{random}") */
|
|
8
|
+
/** API key for authentication (format: "rsk-{random}"). Each key is scoped to one project. */
|
|
9
9
|
apiKey?: string;
|
|
10
10
|
/** Gateway endpoint URL */
|
|
11
11
|
endpoint?: string;
|
|
12
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated Project is determined by your API key. This field is ignored
|
|
14
|
+
* by the gateway and will be removed in v1.0. Use `serviceName` and
|
|
15
|
+
* `environment` for within-project organization.
|
|
16
|
+
*/
|
|
13
17
|
projectId?: string;
|
|
14
|
-
/** Environment name (production, staging, development) */
|
|
18
|
+
/** Environment name (production, staging, development). Used for within-project organization. */
|
|
15
19
|
environment?: string;
|
|
16
|
-
/** Service name for
|
|
20
|
+
/** Service name for within-project organization. */
|
|
17
21
|
serviceName?: string;
|
|
18
22
|
/** Service version */
|
|
19
23
|
serviceVersion?: string;
|
|
@@ -288,7 +292,7 @@ declare class Tracer {
|
|
|
288
292
|
*
|
|
289
293
|
* Usage:
|
|
290
294
|
* import { init, shutdown } from 'risicare';
|
|
291
|
-
* init({ apiKey: 'rsk-...'
|
|
295
|
+
* init({ apiKey: 'rsk-...' }); // API key determines project
|
|
292
296
|
* // ... instrument code ...
|
|
293
297
|
* await shutdown(); // flush remaining spans
|
|
294
298
|
*/
|
|
@@ -298,7 +302,7 @@ declare class Tracer {
|
|
|
298
302
|
*
|
|
299
303
|
* @example
|
|
300
304
|
* import { init } from 'risicare';
|
|
301
|
-
* init({ apiKey: 'rsk-...',
|
|
305
|
+
* init({ apiKey: 'rsk-...', serviceName: 'my-agent', environment: 'production' });
|
|
302
306
|
*/
|
|
303
307
|
declare function init(config?: Partial<RisicareConfig>): void;
|
|
304
308
|
/**
|