risicare 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/frameworks/instructor.cjs +45 -17
  2. package/dist/frameworks/instructor.cjs.map +1 -1
  3. package/dist/frameworks/instructor.js +47 -17
  4. package/dist/frameworks/instructor.js.map +1 -1
  5. package/dist/frameworks/langchain.cjs +73 -6
  6. package/dist/frameworks/langchain.cjs.map +1 -1
  7. package/dist/frameworks/langchain.d.cts +20 -4
  8. package/dist/frameworks/langchain.d.ts +20 -4
  9. package/dist/frameworks/langchain.js +75 -6
  10. package/dist/frameworks/langchain.js.map +1 -1
  11. package/dist/frameworks/langgraph.cjs +73 -6
  12. package/dist/frameworks/langgraph.cjs.map +1 -1
  13. package/dist/frameworks/langgraph.js +75 -6
  14. package/dist/frameworks/langgraph.js.map +1 -1
  15. package/dist/frameworks/llamaindex.cjs +41 -14
  16. package/dist/frameworks/llamaindex.cjs.map +1 -1
  17. package/dist/frameworks/llamaindex.js +43 -14
  18. package/dist/frameworks/llamaindex.js.map +1 -1
  19. package/dist/index.cjs +1494 -67
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.cts +436 -1
  22. package/dist/index.d.ts +436 -1
  23. package/dist/index.js +1515 -67
  24. package/dist/index.js.map +1 -1
  25. package/dist/providers/anthropic/index.cjs +74 -24
  26. package/dist/providers/anthropic/index.cjs.map +1 -1
  27. package/dist/providers/anthropic/index.js +76 -24
  28. package/dist/providers/anthropic/index.js.map +1 -1
  29. package/dist/providers/bedrock/index.cjs +81 -24
  30. package/dist/providers/bedrock/index.cjs.map +1 -1
  31. package/dist/providers/bedrock/index.js +83 -24
  32. package/dist/providers/bedrock/index.js.map +1 -1
  33. package/dist/providers/cerebras/index.cjs +78 -25
  34. package/dist/providers/cerebras/index.cjs.map +1 -1
  35. package/dist/providers/cerebras/index.js +80 -25
  36. package/dist/providers/cerebras/index.js.map +1 -1
  37. package/dist/providers/cohere/index.cjs +95 -25
  38. package/dist/providers/cohere/index.cjs.map +1 -1
  39. package/dist/providers/cohere/index.js +97 -25
  40. package/dist/providers/cohere/index.js.map +1 -1
  41. package/dist/providers/google/index.cjs +77 -25
  42. package/dist/providers/google/index.cjs.map +1 -1
  43. package/dist/providers/google/index.js +79 -25
  44. package/dist/providers/google/index.js.map +1 -1
  45. package/dist/providers/groq/index.cjs +80 -25
  46. package/dist/providers/groq/index.cjs.map +1 -1
  47. package/dist/providers/groq/index.js +82 -25
  48. package/dist/providers/groq/index.js.map +1 -1
  49. package/dist/providers/huggingface/index.cjs +80 -25
  50. package/dist/providers/huggingface/index.cjs.map +1 -1
  51. package/dist/providers/huggingface/index.js +82 -25
  52. package/dist/providers/huggingface/index.js.map +1 -1
  53. package/dist/providers/mistral/index.cjs +72 -24
  54. package/dist/providers/mistral/index.cjs.map +1 -1
  55. package/dist/providers/mistral/index.js +74 -24
  56. package/dist/providers/mistral/index.js.map +1 -1
  57. package/dist/providers/ollama/index.cjs +83 -25
  58. package/dist/providers/ollama/index.cjs.map +1 -1
  59. package/dist/providers/ollama/index.js +85 -25
  60. package/dist/providers/ollama/index.js.map +1 -1
  61. package/dist/providers/openai/index.cjs +1429 -28
  62. package/dist/providers/openai/index.cjs.map +1 -1
  63. package/dist/providers/openai/index.js +1447 -28
  64. package/dist/providers/openai/index.js.map +1 -1
  65. package/dist/providers/together/index.cjs +80 -25
  66. package/dist/providers/together/index.cjs.map +1 -1
  67. package/dist/providers/together/index.js +82 -25
  68. package/dist/providers/together/index.js.map +1 -1
  69. package/dist/providers/vercel-ai/index.cjs +45 -17
  70. package/dist/providers/vercel-ai/index.cjs.map +1 -1
  71. package/dist/providers/vercel-ai/index.js +47 -17
  72. package/dist/providers/vercel-ai/index.js.map +1 -1
  73. package/package.json +1 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../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","../src/streaming.ts","../src/frameworks/langchain.ts","../src/frameworks/langgraph.ts","../src/frameworks/instructor.ts","../src/context/dedup.ts","../src/frameworks/llamaindex.ts"],"sourcesContent":["/**\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 // Primary roles\n ORCHESTRATOR = 'orchestrator',\n WORKER = 'worker',\n SUPERVISOR = 'supervisor',\n SPECIALIST = 'specialist',\n // Communication roles\n ROUTER = 'router',\n AGGREGATOR = 'aggregator',\n BROADCASTER = 'broadcaster',\n // Specialized roles\n CRITIC = 'critic',\n PLANNER = 'planner',\n EXECUTOR = 'executor',\n RETRIEVER = 'retriever',\n VALIDATOR = 'validator',\n // JS-specific (backwards compatibility)\n REVIEWER = 'reviewer',\n CUSTOM = 'custom',\n}\n\n// ─── Message Type (Tier 5: Multi-Agent) ──────────────────────────────────────\n\nexport enum MessageType {\n // Control messages\n TASK = 'task',\n RESULT = 'result',\n STATUS = 'status',\n ERROR = 'error',\n // Communication messages\n QUERY = 'query',\n RESPONSE = 'response',\n BROADCAST = 'broadcast',\n DIRECT = 'direct',\n // Coordination messages\n PROPOSAL = 'proposal',\n VOTE = 'vote',\n CONSENSUS = 'consensus',\n CONFLICT = 'conflict',\n // Lifecycle messages\n HEARTBEAT = 'heartbeat',\n SHUTDOWN = 'shutdown',\n HANDOFF = 'handoff',\n // JS-specific (backwards compatibility)\n REQUEST = 'request',\n DELEGATE = 'delegate',\n COORDINATE = 'coordinate',\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 /** When true, provider instrumentors skip span creation (framework is handling it). */\n _suppressProviderInstrumentation?: boolean;\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 { SpanKind, SpanStatus } from './types.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// ─── reportError ──────────────────────────────────────────────────────────\n\n/**\n * Report a caught exception to the self-healing pipeline.\n *\n * Creates an error span that triggers diagnosis and fix generation.\n * This function never throws and is non-blocking.\n *\n * @param error - The caught exception (Error object or string)\n * @param options - Optional attributes and context overrides\n */\nexport function reportError(\n error: unknown,\n options?: { name?: string; attributes?: Record<string, unknown> },\n): void {\n try {\n const tracer = getTracer();\n if (!tracer) return;\n\n const err = error instanceof Error ? error : new Error(String(error));\n const spanName = options?.name ?? `error:${err.constructor.name}`;\n\n tracer.startSpan({ name: spanName, kind: SpanKind.INTERNAL }, (span) => {\n span.setStatus(SpanStatus.ERROR, err.message);\n span.setAttribute('error', true);\n span.setAttribute('error.type', err.constructor.name);\n span.setAttribute('error.message', err.message.slice(0, 2000));\n if (err.stack) span.setAttribute('error.stack', err.stack.slice(0, 4000));\n span.setAttribute('risicare.reported_error', true);\n if (options?.attributes) {\n for (const [k, v] of Object.entries(options.attributes)) {\n span.setAttribute(k, v);\n }\n }\n });\n } catch {\n // Never crash the host application\n debug('reportError failed');\n }\n}\n\n// ─── score ─────────────────────────────────────────────────────────────────\n\n/**\n * Record a custom evaluation score on a trace.\n *\n * Sends the score to the server in a fire-and-forget fashion.\n * This function never throws and is non-blocking.\n *\n * @param traceId - The trace to score\n * @param name - Score name (e.g., \"accuracy\", \"user_satisfaction\")\n * @param value - Score value between 0.0 and 1.0 inclusive\n * @param options - Optional span_id and comment\n */\nexport function score(\n traceId: string,\n name: string,\n value: number,\n options?: { spanId?: string; comment?: string },\n): void {\n try {\n if (typeof value !== 'number' || value < 0.0 || value > 1.0) {\n debug(`score: value must be in [0.0, 1.0], got ${value}. Score not sent.`);\n return;\n }\n if (!traceId || !name) {\n debug('score: traceId and name are required');\n return;\n }\n\n const client = getGlobalClient() as RisicareClient | undefined;\n if (!client?.enabled || !client.config.apiKey) return;\n\n const endpoint = client.config.endpoint.replace(/\\/$/, '');\n const url = `${endpoint}/api/v1/scores`;\n const body = JSON.stringify({\n trace_id: traceId,\n name,\n score: value,\n source: 'sdk',\n ...(options?.spanId && { span_id: options.spanId }),\n ...(options?.comment && { comment: options.comment }),\n });\n\n // Fire-and-forget — never blocks caller\n fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${client.config.apiKey}`,\n },\n body,\n }).catch((err) => debug(`score: send failed: ${err}`));\n } catch {\n // Never crash the host application\n debug('score failed');\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 { 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 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 { 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 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 { 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 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 name: string,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return (...args: TArgs): TReturn => {\n const tracer = getTracer();\n if (!tracer) {\n return fn(...args);\n }\n return withPhase(phase, () => {\n return tracer.startSpan({ name, kind }, () => fn(...args));\n });\n };\n}\n\n/**\n * Wrap a function in a THINK phase context with auto-span.\n *\n * @example traceThink(async () => { ... })\n * @example traceThink(\"analyze-data\", async () => { ... })\n */\nexport function traceThink<TArgs extends unknown[], TReturn>(\n fnOrName: ((...args: TArgs) => TReturn) | string,\n maybeFn?: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const name = typeof fnOrName === 'string' ? fnOrName : `phase:think`;\n const fn = typeof fnOrName === 'function' ? fnOrName : maybeFn!;\n return phaseWrapper(SemanticPhase.THINK, SpanKind.THINK, name, fn);\n}\n\n/**\n * Wrap a function in a DECIDE phase context with auto-span.\n *\n * @example traceDecide(async () => { ... })\n * @example traceDecide(\"choose-action\", async () => { ... })\n */\nexport function traceDecide<TArgs extends unknown[], TReturn>(\n fnOrName: ((...args: TArgs) => TReturn) | string,\n maybeFn?: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const name = typeof fnOrName === 'string' ? fnOrName : `phase:decide`;\n const fn = typeof fnOrName === 'function' ? fnOrName : maybeFn!;\n return phaseWrapper(SemanticPhase.DECIDE, SpanKind.DECIDE, name, fn);\n}\n\n/**\n * Wrap a function in an ACT phase context with auto-span.\n *\n * @example traceAct(async () => { ... })\n * @example traceAct(\"execute-tool\", async () => { ... })\n */\nexport function traceAct<TArgs extends unknown[], TReturn>(\n fnOrName: ((...args: TArgs) => TReturn) | string,\n maybeFn?: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const name = typeof fnOrName === 'string' ? fnOrName : `phase:act`;\n const fn = typeof fnOrName === 'function' ? fnOrName : maybeFn!;\n return phaseWrapper(SemanticPhase.ACT, SpanKind.TOOL_CALL, name, fn);\n}\n\n/**\n * Wrap a function in an OBSERVE phase context with auto-span.\n *\n * @example traceObserve(async () => { ... })\n * @example traceObserve(\"check-result\", async () => { ... })\n */\nexport function traceObserve<TArgs extends unknown[], TReturn>(\n fnOrName: ((...args: TArgs) => TReturn) | string,\n maybeFn?: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const name = typeof fnOrName === 'string' ? fnOrName : `phase:observe`;\n const fn = typeof fnOrName === 'function' ? fnOrName : maybeFn!;\n return phaseWrapper(SemanticPhase.OBSERVE, SpanKind.OBSERVE, name, 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","/**\n * tracedStream — Wrap an async iterable in a trace span.\n *\n * Creates a span that starts when iteration begins and ends when\n * iteration completes (or errors). Chunks pass through UNCHANGED.\n *\n * This is the user-level streaming utility. For provider-level streaming\n * enrichment (token counts, cost), see individual provider instrumentors.\n *\n * Usage:\n * const stream = await openai.chat.completions.create({ stream: true, ... });\n * for await (const chunk of tracedStream(stream, { name: 'llm-stream' })) {\n * process(chunk);\n * }\n */\n\nimport { getTracer } from './client.js';\nimport { SpanKind } from './types.js';\n\nexport interface TracedStreamOptions {\n /** Span name */\n name: string;\n /** Span kind (default: INTERNAL) */\n kind?: SpanKind;\n /** Additional span attributes */\n attributes?: Record<string, unknown>;\n}\n\n/**\n * Wrap an async iterable in a trace span.\n *\n * - Span starts on first iteration\n * - chunk_count attribute set when iteration ends\n * - On error: span records exception, error re-thrown to caller\n * - On early break: span ended cleanly via finally\n * - If SDK not initialized: chunks pass through without wrapping\n */\nexport async function* tracedStream<T>(\n source: AsyncIterable<T>,\n options: TracedStreamOptions | string,\n): AsyncGenerator<T, void, undefined> {\n const opts = typeof options === 'string' ? { name: options } : options;\n\n // Graceful degradation: if SDK not initialized, pass through\n const tracer = getTracer();\n if (!tracer || !tracer.enabled) {\n yield* source;\n return;\n }\n\n const span = tracer.createSpan({\n name: opts.name,\n kind: opts.kind ?? SpanKind.INTERNAL,\n attributes: opts.attributes,\n });\n\n let chunkCount = 0;\n\n try {\n for await (const chunk of source) {\n chunkCount++;\n yield chunk;\n }\n\n span.setAttribute('stream.chunk_count', chunkCount);\n span.setAttribute('stream.completed', true);\n } catch (error) {\n span.setAttribute('stream.chunk_count', chunkCount);\n span.setAttribute('stream.completed', false);\n span.recordException(error instanceof Error ? error : String(error));\n throw error;\n } finally {\n span.end();\n }\n}\n","/**\n * LangChain.js integration via callback handler.\n *\n * LangChain.js uses BaseCallbackHandler from @langchain/core/callbacks/base.\n * This handler receives lifecycle events (handleChainStart, handleLLMEnd, etc.)\n * with a runId (UUID string) for parent-child correlation.\n *\n * Usage:\n * import { RisicareCallbackHandler } from 'risicare/frameworks/langchain';\n * const handler = new RisicareCallbackHandler();\n * const result = await chain.invoke(input, { callbacks: [handler] });\n *\n * Does NOT suppress provider instrumentation -- LangChain callbacks are\n * supplementary to the underlying LLM provider spans.\n */\n\nimport { getTracer } from '../client.js';\nimport { SpanKind } from '../types.js';\nimport type { Span } from '../span.js';\n\ninterface SpanEntry {\n span: Span;\n startTime: number;\n}\n\nexport class RisicareCallbackHandler {\n name = 'RisicareCallbackHandler';\n\n private _spans = new Map<string, SpanEntry>();\n\n // ── Chain lifecycle ────────────────────────────────────────────────────────\n\n handleChainStart(\n chain: { name?: string; _type?: string },\n _inputs: Record<string, unknown>,\n runId: string,\n parentRunId?: string,\n ): void {\n const tracer = getTracer();\n if (!tracer?.enabled) return;\n\n const parentEntry = parentRunId ? this._spans.get(parentRunId) : undefined;\n const span = tracer.createSpan({\n name: chain.name || chain._type || 'chain',\n kind: SpanKind.INTERNAL,\n parentSpanId: parentEntry?.span.spanId,\n traceId: parentEntry?.span.traceId,\n attributes: {\n 'framework': 'langchain',\n 'langchain.run_id': runId,\n ...(parentRunId ? { 'langchain.parent_run_id': parentRunId } : {}),\n ...(chain._type ? { 'langchain.chain_type': chain._type } : {}),\n },\n });\n\n this._spans.set(runId, { span, startTime: Date.now() });\n }\n\n handleChainEnd(_outputs: Record<string, unknown>, runId: string): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n entry.span.setAttribute('gen_ai.latency_ms', Date.now() - entry.startTime);\n entry.span.end();\n this._spans.delete(runId);\n }\n\n handleChainError(error: Error, runId: string): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n entry.span.recordException(error);\n entry.span.end();\n this._spans.delete(runId);\n }\n\n // ── LLM lifecycle ─────────────────────────────────────────────────────────\n\n handleLLMStart(\n llm: { name?: string; _type?: string },\n _prompts: string[],\n runId: string,\n parentRunId?: string,\n ): void {\n const tracer = getTracer();\n if (!tracer?.enabled) return;\n\n const parentEntry = parentRunId ? this._spans.get(parentRunId) : undefined;\n const span = tracer.createSpan({\n name: llm.name || llm._type || 'llm',\n kind: SpanKind.LLM_CALL,\n parentSpanId: parentEntry?.span.spanId,\n traceId: parentEntry?.span.traceId,\n attributes: {\n 'framework': 'langchain',\n 'langchain.run_id': runId,\n 'gen_ai.system': 'langchain',\n 'gen_ai.prompt.count': _prompts.length,\n },\n });\n\n this._spans.set(runId, { span, startTime: Date.now() });\n }\n\n handleLLMEnd(\n output: {\n generations?: unknown[][];\n llmOutput?: Record<string, unknown>;\n },\n runId: string,\n ): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n\n // Extract token usage from llmOutput\n const usage = output.llmOutput?.tokenUsage as\n | Record<string, number>\n | undefined;\n if (usage) {\n entry.span.setLlmFields({\n promptTokens: usage.promptTokens ?? usage.prompt_tokens,\n completionTokens: usage.completionTokens ?? usage.completion_tokens,\n totalTokens: usage.totalTokens ?? usage.total_tokens,\n });\n }\n\n const model = (output.llmOutput?.model ??\n output.llmOutput?.modelName) as string | undefined;\n if (model) {\n entry.span.setLlmFields({ model });\n }\n\n entry.span.setAttribute('gen_ai.latency_ms', Date.now() - entry.startTime);\n entry.span.end();\n this._spans.delete(runId);\n }\n\n handleLLMError(error: Error, runId: string): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n entry.span.recordException(error);\n entry.span.end();\n this._spans.delete(runId);\n }\n\n // ── Tool lifecycle ────────────────────────────────────────────────────────\n\n handleToolStart(\n tool: { name?: string },\n input: string,\n runId: string,\n parentRunId?: string,\n ): void {\n const tracer = getTracer();\n if (!tracer?.enabled) return;\n\n const parentEntry = parentRunId ? this._spans.get(parentRunId) : undefined;\n const span = tracer.createSpan({\n name: tool.name || 'tool',\n kind: SpanKind.TOOL_CALL,\n parentSpanId: parentEntry?.span.spanId,\n traceId: parentEntry?.span.traceId,\n attributes: {\n 'framework': 'langchain',\n 'langchain.run_id': runId,\n 'tool.name': tool.name || 'unknown',\n 'tool.input_length': input?.length ?? 0,\n },\n });\n\n this._spans.set(runId, { span, startTime: Date.now() });\n }\n\n handleToolEnd(output: string, runId: string): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n entry.span.setAttribute('tool.output_length', output?.length ?? 0);\n entry.span.setAttribute('gen_ai.latency_ms', Date.now() - entry.startTime);\n entry.span.end();\n this._spans.delete(runId);\n }\n\n handleToolError(error: Error, runId: string): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n entry.span.recordException(error);\n entry.span.end();\n this._spans.delete(runId);\n }\n\n // ── Retriever lifecycle ───────────────────────────────────────────────────\n\n handleRetrieverStart(\n retriever: { name?: string },\n _query: string,\n runId: string,\n parentRunId?: string,\n ): void {\n const tracer = getTracer();\n if (!tracer?.enabled) return;\n\n const parentEntry = parentRunId ? this._spans.get(parentRunId) : undefined;\n const span = tracer.createSpan({\n name: retriever.name || 'retriever',\n kind: SpanKind.RETRIEVAL,\n parentSpanId: parentEntry?.span.spanId,\n traceId: parentEntry?.span.traceId,\n attributes: {\n 'framework': 'langchain',\n 'langchain.run_id': runId,\n },\n });\n\n this._spans.set(runId, { span, startTime: Date.now() });\n }\n\n handleRetrieverEnd(documents: unknown[], runId: string): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n entry.span.setAttribute(\n 'retriever.document_count',\n documents?.length ?? 0,\n );\n entry.span.setAttribute('gen_ai.latency_ms', Date.now() - entry.startTime);\n entry.span.end();\n this._spans.delete(runId);\n }\n}\n","/**\n * LangGraph.js integration via Proxy wrapping.\n *\n * LangGraph uses LangChain callbacks under the hood. This integration wraps\n * a compiled graph's invoke/stream methods to:\n * 1. Create a parent \"langgraph.invoke\" or \"langgraph.stream\" span\n * 2. Inject a RisicareCallbackHandler into the config so all internal\n * chain/LLM/tool calls are also traced\n *\n * Usage:\n * import { instrumentLangGraph } from 'risicare/frameworks/langgraph';\n * const graph = instrumentLangGraph(compiledGraph);\n * const result = await graph.invoke(input);\n *\n * Does NOT suppress provider instrumentation.\n */\n\nimport { getTracer } from '../client.js';\nimport { SpanKind } from '../types.js';\nimport { RisicareCallbackHandler } from './langchain.js';\n\n/**\n * Wrap a compiled LangGraph graph with Risicare tracing.\n *\n * Returns a Proxy that intercepts `invoke` and `stream` calls to create\n * a parent span and inject the LangChain callback handler.\n *\n * @param graph - A compiled LangGraph graph object with invoke/stream methods\n * @returns A proxied graph with tracing enabled\n */\nexport function instrumentLangGraph<T extends object>(graph: T): T {\n return new Proxy(graph, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (\n (prop === 'invoke' || prop === 'stream') &&\n typeof value === 'function'\n ) {\n return function patchedMethod(\n this: unknown,\n ...args: unknown[]\n ): unknown {\n const tracer = getTracer();\n if (!tracer?.enabled) return value.apply(this, args);\n\n return tracer.startSpan(\n {\n name: `langgraph.${String(prop)}`,\n kind: SpanKind.AGENT,\n attributes: { framework: 'langgraph' },\n },\n (_span) => {\n // Inject RisicareCallbackHandler into config (second argument)\n const config = (args[1] ?? {}) as Record<string, unknown>;\n const callbacks = (config.callbacks ?? []) as unknown[];\n callbacks.push(new RisicareCallbackHandler());\n args[1] = { ...config, callbacks };\n\n const result = value.apply(this, args);\n\n // Handle async results (Promises)\n if (\n result &&\n typeof (result as Promise<unknown>).then === 'function'\n ) {\n return (result as Promise<unknown>).then((r) => r);\n }\n return result;\n },\n );\n };\n }\n\n return value;\n },\n });\n}\n","/**\n * Instructor integration via Proxy wrapping.\n *\n * Instructor wraps an LLM client's create() method to extract structured\n * data from completions using a response model (Zod schema, etc.).\n * This integration intercepts the instructor client's create() to add a span\n * around the structured extraction call.\n *\n * Usage:\n * import { patchInstructor } from 'risicare/frameworks/instructor';\n * import Instructor from '@instructor-ai/instructor';\n * const client = patchInstructor(Instructor.from(openai));\n *\n * Does NOT suppress provider instrumentation -- Instructor delegates to the\n * underlying LLM client, which should produce its own provider span.\n */\n\nimport { getTracer } from '../client.js';\nimport { SpanKind } from '../types.js';\nimport { debug } from '../utils/log.js';\n\n/**\n * Wrap an Instructor client with Risicare tracing.\n *\n * Returns a Proxy that intercepts `create` calls to create a span\n * capturing the structured extraction metadata (response model, retries).\n *\n * @param client - An Instructor client with a create() method\n * @returns A proxied client with tracing enabled\n */\nexport function patchInstructor<T extends object>(client: T): T {\n return new Proxy(client, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return function patchedCreate(\n this: unknown,\n ...args: unknown[]\n ): unknown {\n const tracer = getTracer();\n if (!tracer?.enabled) {\n debug(\n 'Tracer not initialized — call init() before using patchInstructor()',\n );\n return value.apply(this, args);\n }\n\n const params = (args[0] ?? {}) as Record<string, unknown>;\n const responseModel =\n params.response_model ?? params.responseModel;\n\n // Extract a readable name from the response model\n let modelName = 'unknown';\n if (responseModel && typeof responseModel === 'function') {\n modelName =\n (responseModel as { name?: string }).name || 'unknown';\n } else if (responseModel && typeof responseModel === 'object') {\n modelName =\n ((responseModel as Record<string, unknown>).name as string) ??\n ((responseModel as Record<string, unknown>).description as string) ??\n 'schema';\n } else if (typeof responseModel === 'string') {\n modelName = responseModel;\n }\n\n return tracer.startSpan(\n {\n name: 'instructor.create',\n kind: SpanKind.LLM_CALL,\n attributes: {\n framework: 'instructor',\n 'framework.span_kind': 'extraction',\n 'instructor.response_model': modelName,\n ...(params.max_retries != null\n ? { 'instructor.max_retries': params.max_retries }\n : {}),\n ...(params.model != null\n ? { 'gen_ai.request.model': params.model }\n : {}),\n },\n },\n (_span) => {\n const result = value.apply(this, args);\n\n // Handle async results (Promises)\n if (\n result &&\n typeof (result as Promise<unknown>).then === 'function'\n ) {\n return (result as Promise<unknown>).then((r) => r);\n }\n return result;\n },\n );\n };\n }\n\n return value;\n },\n });\n}\n","/**\n * Double-tracing prevention for framework integrations.\n *\n * When a framework integration (e.g., LlamaIndex handler) creates its own\n * LLM span, the underlying provider proxy (e.g., patchOpenAI) would also\n * create a duplicate span. This module provides suppression:\n *\n * - Framework integrations SET suppression via suppressProviderInstrumentation()\n * - Provider proxies CHECK via isProviderInstrumentationSuppressed() and skip\n *\n * Scoped to AsyncLocalStorage — concurrent calls are independent.\n */\n\nimport { getContext, runWithContext } from './storage.js';\n\n/**\n * Run a callback with provider instrumentation suppressed.\n *\n * During this callback, all provider instrumentors (patchOpenAI, etc.) will\n * skip span creation. The framework is responsible for creating the span.\n *\n * @param fn - The function to run with suppression active\n * @returns The function's return value\n */\nexport function suppressProviderInstrumentation<T>(fn: () => T): T {\n return runWithContext({ _suppressProviderInstrumentation: true }, fn);\n}\n\n/**\n * Check if provider instrumentation should be suppressed.\n *\n * Called by provider instrumentors as an early-exit guard. When true,\n * the provider calls the original method directly without creating a span.\n */\nexport function isProviderInstrumentationSuppressed(): boolean {\n return getContext()._suppressProviderInstrumentation === true;\n}\n","/**\n * LlamaIndex.TS integration via event handler.\n *\n * LlamaIndex uses a span handler / callback event pattern. This handler\n * receives events with { type, id, parentId, data } and manages the\n * span lifecycle accordingly.\n *\n * Usage:\n * import { RisicareLlamaIndexHandler } from 'risicare/frameworks/llamaindex';\n * const handler = new RisicareLlamaIndexHandler();\n *\n * // Register with LlamaIndex's event system\n * Settings.callbackManager.on('*', (event) => handler.onEvent(event));\n *\n * // For LLM/embedding calls, suppress provider instrumentation:\n * const result = handler.withSuppression(() => query(...));\n *\n * SUPPRESSES provider instrumentation -- LlamaIndex creates its own LLM spans,\n * so provider-level spans (patchOpenAI, etc.) would duplicate.\n */\n\nimport { getTracer } from '../client.js';\nimport { SpanKind } from '../types.js';\nimport { suppressProviderInstrumentation } from '../context/dedup.js';\nimport type { Span } from '../span.js';\n\ninterface SpanEntry {\n span: Span;\n startTime: number;\n componentKind: string;\n}\n\nexport interface LlamaIndexEvent {\n type: string;\n id: string;\n parentId?: string;\n data?: Record<string, unknown>;\n}\n\nexport class RisicareLlamaIndexHandler {\n private _spans = new Map<string, SpanEntry>();\n\n /**\n * Handle a LlamaIndex lifecycle event.\n *\n * Events follow the convention:\n * - `*.start` / `*.begin` -- component starts\n * - `*.end` / `*.complete` -- component finishes\n * - `*.error` -- component failed\n */\n onEvent(event: LlamaIndexEvent): void {\n const tracer = getTracer();\n if (!tracer?.enabled) return;\n\n if (event.type.endsWith('.start') || event.type.endsWith('.begin')) {\n this._handleStart(event);\n } else if (\n event.type.endsWith('.end') ||\n event.type.endsWith('.complete')\n ) {\n this._handleEnd(event);\n } else if (event.type.endsWith('.error')) {\n this._handleError(event);\n }\n }\n\n /**\n * Run a function with provider instrumentation suppressed.\n *\n * LlamaIndex handler creates its own LLM spans, so provider spans\n * (patchOpenAI, patchAnthropic, etc.) should be suppressed to avoid\n * double-tracing.\n */\n withSuppression<T>(fn: () => T): T {\n return suppressProviderInstrumentation(fn);\n }\n\n // ── Internal event handlers ───────────────────────────────────────────────\n\n private _handleStart(event: LlamaIndexEvent): void {\n const tracer = getTracer();\n if (!tracer?.enabled) return;\n\n const componentKind = this._classifyComponent(event.type);\n const parentEntry = event.parentId\n ? this._spans.get(event.parentId)\n : undefined;\n\n const spanKind =\n componentKind === 'llm'\n ? SpanKind.LLM_CALL\n : componentKind === 'retrieval'\n ? SpanKind.RETRIEVAL\n : componentKind === 'embedding'\n ? SpanKind.LLM_CALL\n : SpanKind.INTERNAL;\n\n const span = tracer.createSpan({\n name: event.type.replace(/\\.(start|begin)$/, ''),\n kind: spanKind,\n parentSpanId: parentEntry?.span.spanId,\n traceId: parentEntry?.span.traceId,\n attributes: {\n framework: 'llamaindex',\n 'framework.span_kind': componentKind,\n ...(event.data?.model\n ? { 'gen_ai.request.model': event.data.model }\n : {}),\n },\n });\n\n this._spans.set(event.id, { span, startTime: Date.now(), componentKind });\n }\n\n private _handleEnd(event: LlamaIndexEvent): void {\n const entry = this._spans.get(event.id);\n if (!entry) return;\n\n entry.span.setAttribute(\n 'gen_ai.latency_ms',\n Date.now() - entry.startTime,\n );\n\n // Extract token usage if available\n const usage = event.data?.usage as Record<string, number> | undefined;\n if (usage) {\n entry.span.setLlmFields({\n promptTokens: usage.promptTokens ?? usage.prompt_tokens,\n completionTokens: usage.completionTokens ?? usage.completion_tokens,\n });\n }\n\n if (event.data?.documentCount != null) {\n entry.span.setAttribute(\n 'retriever.document_count',\n event.data.documentCount,\n );\n }\n\n entry.span.end();\n this._spans.delete(event.id);\n }\n\n private _handleError(event: LlamaIndexEvent): void {\n const entry = this._spans.get(event.id);\n if (!entry) return;\n\n const error = event.data?.error;\n entry.span.recordException(\n error instanceof Error ? error : String(error ?? 'Unknown error'),\n );\n entry.span.end();\n this._spans.delete(event.id);\n }\n\n /**\n * Classify a LlamaIndex event type into a component kind.\n */\n private _classifyComponent(eventType: string): string {\n const lower = eventType.toLowerCase();\n if (lower.includes('llm') || lower.includes('chat')) return 'llm';\n if (lower.includes('embed')) return 'embedding';\n if (lower.includes('retriev') || lower.includes('vector')) return 'retrieval';\n if (lower.includes('synth') || lower.includes('response')) return 'synthesis';\n if (lower.includes('query')) return 'query';\n return 'component';\n }\n}\n"],"mappings":"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","names":["debug","SpanKind","SpanStatus","SemanticPhase","AgentRole","MessageType","session","agent","getTracer","getTracer","agent","getTracer","session","getTracer","getTracer","session","agent","getTracer","getTracer","getTracer","getTracer","getTracer"]}
1
+ {"version":3,"sources":["../src/globals.ts","../src/utils/log.ts","../src/runtime/config.ts","../src/runtime/cache.ts","../src/runtime/applier.ts","../src/runtime/loader.ts","../src/runtime/interceptors.ts","../src/runtime/runtime.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/context/storage.ts","../src/tracer.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","../src/streaming.ts","../src/context/dedup.ts","../src/frameworks/langchain.ts","../src/frameworks/langgraph.ts","../src/frameworks/instructor.ts","../src/frameworks/llamaindex.ts","../src/index.ts"],"sourcesContent":["/**\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// ─── Fix Runtime ────────────────────────────────────────────────────────\n\nexport function getGlobalFixRuntime(): unknown {\n return G[PREFIX + 'fix_runtime'];\n}\n\nexport function setGlobalFixRuntime(runtime: unknown): void {\n G[PREFIX + 'fix_runtime'] = runtime;\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 * Fix Runtime Configuration.\n *\n * Settings for the fix runtime including caching, refresh intervals,\n * A/B testing, and fix application behavior.\n *\n * Port of Python SDK's runtime/config.py adapted for Node.js patterns.\n */\n\n// ─── Runtime Configuration ──────────────────────────────────────────────────\n\nexport interface FixRuntimeConfig {\n /** API endpoint URL (e.g., \"https://app.risicare.ai\") */\n apiEndpoint: string;\n\n /** API key for authentication (format: \"rsk-{random}\") */\n apiKey: string;\n\n /** Whether the fix runtime is enabled (default: true) */\n enabled?: boolean;\n\n /** Whether caching is enabled (default: true) */\n cacheEnabled?: boolean;\n\n /** Cache entry TTL in milliseconds (default: 300_000 = 5 min) */\n cacheTtlMs?: number;\n\n /** Maximum number of cache entries (default: 1000) */\n cacheMaxEntries?: number;\n\n /** Whether to auto-refresh fixes in background (default: true) */\n autoRefresh?: boolean;\n\n /** Background refresh interval in milliseconds (default: 60_000 = 1 min) */\n refreshIntervalMs?: number;\n\n /** Log but don't apply fixes (default: false) */\n dryRun?: boolean;\n\n /** Whether A/B testing bucketing is active (default: true) */\n abTestingEnabled?: boolean;\n\n /** Timeout for API requests in milliseconds (default: 1000) */\n timeoutMs?: number;\n\n /** Enable debug logging (default: false) */\n debug?: boolean;\n}\n\n/** Resolve config with defaults applied. */\nexport function resolveFixRuntimeConfig(\n config: FixRuntimeConfig,\n): Required<FixRuntimeConfig> {\n return {\n apiEndpoint: config.apiEndpoint,\n apiKey: config.apiKey,\n enabled: config.enabled ?? true,\n cacheEnabled: config.cacheEnabled ?? true,\n cacheTtlMs: config.cacheTtlMs ?? 300_000,\n cacheMaxEntries: config.cacheMaxEntries ?? 1000,\n autoRefresh: config.autoRefresh ?? true,\n refreshIntervalMs: config.refreshIntervalMs ?? 60_000,\n dryRun: config.dryRun ?? false,\n abTestingEnabled: config.abTestingEnabled ?? true,\n timeoutMs: config.timeoutMs ?? 1000,\n debug: config.debug ?? false,\n };\n}\n\n// ─── Fix Type ───────────────────────────────────────────────────────────────\n\nexport type FixType =\n | 'prompt'\n | 'parameter'\n | 'retry'\n | 'fallback'\n | 'guard'\n | 'routing'\n | 'tool';\n\n// ─── Active Fix ─────────────────────────────────────────────────────────────\n\nexport interface ActiveFix {\n fixId: string;\n deploymentId?: string;\n errorCode: string;\n fixType: FixType;\n config: Record<string, unknown>;\n trafficPercentage: number; // 0–100\n version: number;\n}\n\n/**\n * Check if a fix matches the given error code.\n *\n * Supports exact match and wildcard prefix matching:\n * - \"TOOL.EXECUTION.TIMEOUT\" matches \"TOOL.EXECUTION.TIMEOUT\"\n * - \"TOOL.EXECUTION.*\" matches \"TOOL.EXECUTION.TIMEOUT\", \"TOOL.EXECUTION.FAILURE\", etc.\n * - \"TOOL.*\" matches any TOOL error\n */\nexport function matchesError(fix: ActiveFix, errorCode: string): boolean {\n if (fix.errorCode === errorCode) {\n return true;\n }\n\n // Wildcard matching\n if (fix.errorCode.endsWith('*')) {\n const prefix = fix.errorCode.slice(0, -1);\n return errorCode.startsWith(prefix);\n }\n\n return false;\n}\n\n/**\n * Determine if fix should be applied based on A/B traffic percentage.\n *\n * Uses consistent hashing so the same session always gets the same\n * treatment (fix or no fix).\n */\nexport function shouldApply(fix: ActiveFix, sessionHash: number): boolean {\n if (fix.trafficPercentage >= 100) return true;\n if (fix.trafficPercentage <= 0) return false;\n\n const bucket = sessionHash % 100;\n return bucket < fix.trafficPercentage;\n}\n\n/**\n * Create an ActiveFix from an API response item.\n *\n * Handles both snake_case (server API) and camelCase field names.\n */\nexport function activeFixFromApiResponse(\n item: Record<string, unknown>,\n): ActiveFix {\n return {\n fixId: (item.id ?? item.fix_id ?? item.fixId ?? '') as string,\n deploymentId: (item.deployment_id ?? item.deploymentId ?? '') as string,\n errorCode: (item.error_code ?? item.errorCode ?? '') as string,\n fixType: (item.fix_type ?? item.fixType ?? 'prompt') as FixType,\n config: (item.config ?? {}) as Record<string, unknown>,\n trafficPercentage: (item.traffic_percentage ?? item.trafficPercentage ?? 100) as number,\n version: (item.version ?? 1) as number,\n };\n}\n","/**\n * Fix Cache — Local cache for active fixes with TTL eviction.\n *\n * Provides fast lookup of fixes keyed by error code with exact match\n * and wildcard fallback. No locks needed — JS is single-threaded.\n *\n * Port of Python SDK's runtime/cache.py.\n */\n\nimport type { ActiveFix, FixRuntimeConfig } from './config.js';\nimport { matchesError } from './config.js';\nimport { debug } from '../utils/log.js';\n\n// ─── Cache Entry ────────────────────────────────────────────────────────────\n\ninterface CacheEntry {\n fix: ActiveFix;\n createdAt: number;\n expiresAt: number;\n}\n\n// ─── Cache Stats ────────────────────────────────────────────────────────────\n\nexport interface CacheStats {\n hits: number;\n misses: number;\n evictions: number;\n size: number;\n lastRefresh: number | null;\n}\n\n// ─── Fix Cache ──────────────────────────────────────────────────────────────\n\nexport class FixCache {\n private readonly _ttlMs: number;\n private readonly _maxEntries: number;\n private readonly _enabled: boolean;\n private _cache: Map<string, CacheEntry>;\n private _stats: CacheStats;\n\n constructor(config?: Pick<FixRuntimeConfig, 'cacheEnabled' | 'cacheTtlMs' | 'cacheMaxEntries'>) {\n this._enabled = config?.cacheEnabled ?? true;\n this._ttlMs = config?.cacheTtlMs ?? 300_000;\n this._maxEntries = config?.cacheMaxEntries ?? 1000;\n this._cache = new Map();\n this._stats = {\n hits: 0,\n misses: 0,\n evictions: 0,\n size: 0,\n lastRefresh: null,\n };\n }\n\n /** Whether caching is enabled. */\n get enabled(): boolean {\n return this._enabled;\n }\n\n /**\n * Get a fix by error code.\n *\n * Checks exact match first, then scans for wildcard matches.\n * Expired entries are evicted on access.\n */\n get(errorCode: string): ActiveFix | null {\n try {\n if (!this._enabled) return null;\n\n const now = Date.now();\n\n // Try exact match first (fast path)\n const exactEntry = this._cache.get(errorCode);\n if (exactEntry) {\n if (exactEntry.expiresAt > now) {\n this._stats.hits++;\n return exactEntry.fix;\n }\n // Expired — evict\n this._cache.delete(errorCode);\n this._stats.evictions++;\n }\n\n // Wildcard scan (slower path)\n for (const [key, entry] of this._cache) {\n if (entry.expiresAt <= now) {\n this._cache.delete(key);\n this._stats.evictions++;\n continue;\n }\n\n if (matchesError(entry.fix, errorCode)) {\n this._stats.hits++;\n return entry.fix;\n }\n }\n\n this._stats.misses++;\n return null;\n } catch (e) {\n debug(`FixCache.get error: ${e}`);\n return null;\n }\n }\n\n /**\n * Add a single fix to the cache.\n *\n * Evicts the oldest entry if at capacity.\n */\n set(fix: ActiveFix): void {\n try {\n if (!this._enabled) return;\n\n // Evict oldest if at capacity\n if (this._cache.size >= this._maxEntries) {\n this._evictOldest();\n }\n\n const now = Date.now();\n this._cache.set(fix.errorCode, {\n fix,\n createdAt: now,\n expiresAt: now + this._ttlMs,\n });\n this._stats.size = this._cache.size;\n } catch (e) {\n debug(`FixCache.set error: ${e}`);\n }\n }\n\n /**\n * Replace all cached fixes (bulk refresh).\n *\n * Clears the cache and populates with the given fixes.\n */\n setAll(fixes: ActiveFix[]): void {\n try {\n if (!this._enabled) return;\n\n this._cache.clear();\n const now = Date.now();\n\n for (const fix of fixes) {\n if (this._cache.size >= this._maxEntries) break;\n\n this._cache.set(fix.errorCode, {\n fix,\n createdAt: now,\n expiresAt: now + this._ttlMs,\n });\n }\n\n this._stats.size = this._cache.size;\n this._stats.lastRefresh = now;\n } catch (e) {\n debug(`FixCache.setAll error: ${e}`);\n }\n }\n\n /**\n * Get all non-expired fixes.\n */\n getAll(): ActiveFix[] {\n try {\n const now = Date.now();\n const valid: ActiveFix[] = [];\n const expired: string[] = [];\n\n for (const [key, entry] of this._cache) {\n if (entry.expiresAt > now) {\n valid.push(entry.fix);\n } else {\n expired.push(key);\n }\n }\n\n // Clean up expired entries\n for (const key of expired) {\n this._cache.delete(key);\n this._stats.evictions++;\n }\n\n this._stats.size = this._cache.size;\n return valid;\n } catch (e) {\n debug(`FixCache.getAll error: ${e}`);\n return [];\n }\n }\n\n /** Clear all cache entries. Returns the number of entries cleared. */\n clear(): number {\n const count = this._cache.size;\n this._cache.clear();\n this._stats.size = 0;\n return count;\n }\n\n /** Get cache statistics. */\n get stats(): CacheStats {\n this._stats.size = this._cache.size;\n return { ...this._stats };\n }\n\n /** Evict the oldest cache entry. */\n private _evictOldest(): void {\n if (this._cache.size === 0) return;\n\n let oldestKey: string | null = null;\n let oldestTime = Infinity;\n\n for (const [key, entry] of this._cache) {\n if (entry.createdAt < oldestTime) {\n oldestTime = entry.createdAt;\n oldestKey = key;\n }\n }\n\n if (oldestKey !== null) {\n this._cache.delete(oldestKey);\n this._stats.evictions++;\n }\n }\n}\n","/**\n * Fix Applier — Applies fixes to agent operations.\n *\n * Handles different fix types:\n * - PromptFix: Modify system/user prompts (prepend, append, replace, few_shot)\n * - ParameterFix: Adjust LLM parameters (temperature, model, etc.)\n * - RetryFix: Retry with exponential backoff + jitter\n * - FallbackFix: Switch to fallback model or default response\n * - GuardFix: Input/output validation (content filter, format check, length)\n *\n * Port of Python SDK's runtime/applier.py adapted for Node.js.\n */\n\nimport { createHash } from 'node:crypto';\nimport type { ActiveFix, FixRuntimeConfig } from './config.js';\nimport { shouldApply, resolveFixRuntimeConfig } from './config.js';\nimport type { FixCache } from './cache.js';\nimport { debug, warn } from '../utils/log.js';\n\n/**\n * Maximum length for fix content injected into prompts.\n * Prevents unbounded prompt injection from malicious/corrupted fix configs.\n */\nconst MAX_FIX_CONTENT_LENGTH = 10_000;\n\n// ─── Apply Result ───────────────────────────────────────────────────────────\n\nexport interface ApplyResult {\n applied: boolean;\n fixId?: string;\n deploymentId?: string;\n fixType?: string;\n modifications: Record<string, unknown>;\n error?: string;\n}\n\nfunction emptyResult(fix: ActiveFix, fixType: string): ApplyResult {\n return {\n applied: false,\n fixId: fix.fixId,\n deploymentId: fix.deploymentId,\n fixType,\n modifications: {},\n };\n}\n\n// ─── Fix Applier ────────────────────────────────────────────────────────────\n\nexport class FixApplier {\n private readonly _config: Required<FixRuntimeConfig>;\n private readonly _cache: FixCache;\n private _applicationLog: ApplyResult[] = [];\n\n constructor(config: FixRuntimeConfig, cache: FixCache) {\n this._config = resolveFixRuntimeConfig(config);\n this._cache = cache;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Fix Lookup\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Get applicable fix for an error code.\n *\n * Considers A/B testing bucket if sessionId is provided. Uses\n * crypto.createHash('md5') for deterministic bucketing across restarts.\n */\n getFixForError(\n errorCode: string,\n sessionId?: string,\n ): ActiveFix | null {\n try {\n const fix = this._cache.get(errorCode);\n if (!fix) return null;\n\n // Check A/B test bucketing\n if (sessionId && this._config.abTestingEnabled) {\n const hashHex = createHash('md5')\n .update(sessionId)\n .digest('hex')\n .substring(0, 8);\n const sessionHash = parseInt(hashHex, 16);\n\n if (!shouldApply(fix, sessionHash)) {\n debug(`Fix ${fix.fixId} not applied (A/B control group)`);\n return null;\n }\n }\n\n return fix;\n } catch (e) {\n debug(`getFixForError error: ${e}`);\n return null;\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // 1. Prompt Fix\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Apply a prompt fix to messages.\n *\n * Supports 4 modification types:\n * - prepend: Add content before first system message\n * - append: Add content after first system message\n * - replace: Regex replace across all messages\n * - few_shot: Insert user/assistant example pairs after system message\n */\n applyPromptFix(\n fix: ActiveFix,\n messages: Record<string, unknown>[],\n ): { messages: Record<string, unknown>[]; result: ApplyResult } {\n try {\n const cfg = fix.config;\n const modificationType = (cfg.modification_type ?? cfg.modificationType ?? 'append') as string;\n const target = (cfg.target ?? 'system') as string;\n let content = (cfg.content ?? '') as string;\n\n // Truncate oversized content to prevent prompt injection\n if (content.length > MAX_FIX_CONTENT_LENGTH) {\n warn(\n `Fix ${fix.fixId} content truncated from ${content.length} to ${MAX_FIX_CONTENT_LENGTH} chars`,\n );\n content = content.slice(0, MAX_FIX_CONTENT_LENGTH);\n }\n\n const result = emptyResult(fix, 'prompt');\n\n if (this._config.dryRun) {\n result.modifications = {\n type: modificationType,\n target,\n contentPreview: content.slice(0, 100),\n };\n return { messages, result };\n }\n\n let modified = messages.map((m) => ({ ...m }));\n\n if (modificationType === 'prepend') {\n modified = this._prependToTarget(modified, target, content);\n result.applied = true;\n result.modifications = { type: 'prepend', target };\n } else if (modificationType === 'append') {\n modified = this._appendToTarget(modified, target, content);\n result.applied = true;\n result.modifications = { type: 'append', target };\n } else if (modificationType === 'replace') {\n const pattern = (cfg.pattern ?? '') as string;\n if (pattern) {\n modified = this._replaceInMessages(modified, pattern, content);\n result.applied = true;\n result.modifications = { type: 'replace', pattern };\n }\n } else if (modificationType === 'few_shot') {\n const examples = (cfg.examples ?? []) as Array<Record<string, string>>;\n if (examples.length > 0) {\n modified = this._addFewShotExamples(modified, examples);\n result.applied = true;\n result.modifications = { type: 'few_shot', count: examples.length };\n }\n }\n\n return { messages: modified, result };\n } catch (e) {\n debug(`applyPromptFix error: ${e}`);\n return {\n messages,\n result: {\n applied: false,\n fixId: fix.fixId,\n fixType: 'prompt',\n modifications: {},\n error: String(e),\n },\n };\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // 2. Parameter Fix\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Apply a parameter fix — merge config.parameters into params.\n */\n applyParameterFix(\n fix: ActiveFix,\n params: Record<string, unknown>,\n ): { params: Record<string, unknown>; result: ApplyResult } {\n try {\n const newParams = (fix.config.parameters ?? {}) as Record<string, unknown>;\n const result = emptyResult(fix, 'parameter');\n\n if (this._config.dryRun) {\n result.modifications = { parameters: newParams };\n return { params, result };\n }\n\n const modified = { ...params, ...newParams };\n result.applied = true;\n result.modifications = { parameters: newParams };\n\n return { params: modified, result };\n } catch (e) {\n debug(`applyParameterFix error: ${e}`);\n return {\n params,\n result: {\n applied: false,\n fixId: fix.fixId,\n fixType: 'parameter',\n modifications: {},\n error: String(e),\n },\n };\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // 3. Retry Fix (async — uses setTimeout for sleeping)\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Apply a retry fix to an async operation.\n *\n * Retries with exponential backoff + jitter using\n * `await new Promise(r => setTimeout(r, delay))`.\n */\n async applyRetryFix<T>(\n fix: ActiveFix,\n operation: () => Promise<T>,\n ): Promise<{ value: T; result: ApplyResult }> {\n const cfg = fix.config;\n const maxRetries = (cfg.max_retries ?? cfg.maxRetries ?? 3) as number;\n const initialDelayMs = (cfg.initial_delay_ms ?? cfg.initialDelayMs ?? 1000) as number;\n const maxDelayMs = (cfg.max_delay_ms ?? cfg.maxDelayMs ?? 30_000) as number;\n const exponentialBase = (cfg.exponential_base ?? cfg.exponentialBase ?? 2.0) as number;\n const jitter = (cfg.jitter ?? true) as boolean;\n const retryOn = (cfg.retry_on ?? cfg.retryOn ?? []) as string[];\n\n const result = emptyResult(fix, 'retry');\n\n if (this._config.dryRun) {\n result.modifications = { maxRetries, initialDelayMs };\n const value = await operation();\n return { value, result };\n }\n\n let lastError: Error | null = null;\n let attempts = 0;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n attempts++;\n try {\n const value = await operation();\n result.applied = true;\n result.modifications = { attempts };\n return { value, result };\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n const errorType = lastError.constructor.name;\n\n // Check if we should retry this specific error type\n if (retryOn.length > 0 && !retryOn.includes(errorType)) {\n throw lastError;\n }\n\n if (attempt < maxRetries) {\n // Calculate delay with exponential backoff\n let delayMs = Math.min(\n initialDelayMs * Math.pow(exponentialBase, attempt),\n maxDelayMs,\n );\n\n // Add jitter: multiply by random factor [0.5, 1.5)\n if (jitter) {\n delayMs *= 0.5 + Math.random();\n }\n\n debug(\n `Retry ${attempt + 1}/${maxRetries} after ${Math.round(delayMs)}ms`,\n );\n await new Promise<void>((r) => setTimeout(r, delayMs));\n }\n }\n }\n\n // All retries exhausted\n result.applied = true;\n result.error = lastError?.message;\n result.modifications = { attempts, exhausted: true };\n throw lastError;\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // 4. Fallback Fix\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Apply a fallback fix.\n *\n * - 'model': Replace params.model with the fallback model\n * - 'default': Set params._fallbackResponse for the caller to use\n */\n applyFallbackFix(\n fix: ActiveFix,\n params: Record<string, unknown>,\n ): { params: Record<string, unknown>; result: ApplyResult } {\n try {\n const cfg = fix.config;\n const fallbackType = (cfg.fallback_type ?? cfg.fallbackType ?? 'model') as string;\n const fallbackConfig = (cfg.fallback_config ?? cfg.fallbackConfig ?? {}) as Record<string, unknown>;\n const result = emptyResult(fix, 'fallback');\n\n if (this._config.dryRun) {\n result.modifications = { fallbackType, fallbackConfig };\n return { params, result };\n }\n\n const modified = { ...params };\n\n if (fallbackType === 'model') {\n const fallbackModel = fallbackConfig.model as string | undefined;\n if (fallbackModel) {\n modified.model = fallbackModel;\n result.applied = true;\n result.modifications = { model: fallbackModel };\n }\n } else if (fallbackType === 'default') {\n const defaultResponse = fallbackConfig.response;\n if (defaultResponse !== undefined) {\n modified._fallbackResponse = defaultResponse;\n result.applied = true;\n result.modifications = { defaultResponse: true };\n }\n }\n\n return { params: modified, result };\n } catch (e) {\n debug(`applyFallbackFix error: ${e}`);\n return {\n params,\n result: {\n applied: false,\n fixId: fix.fixId,\n fixType: 'fallback',\n modifications: {},\n error: String(e),\n },\n };\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // 5. Guard Fix\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Apply a guard fix (validation).\n *\n * Guard types:\n * - content_filter: Regex-based blocked patterns\n * - format_check: JSON.parse() validity\n * - input_validation / output_validation: min/max length\n */\n applyGuardFix(\n fix: ActiveFix,\n content: string,\n isInput = true,\n ): { content: string; passed: boolean; result: ApplyResult } {\n try {\n const cfg = fix.config;\n const guardType = (cfg.guard_type ?? cfg.guardType ?? 'output_validation') as string;\n const guardConfig = (cfg.guard_config ?? cfg.guardConfig ?? {}) as Record<string, unknown>;\n const result = emptyResult(fix, 'guard');\n\n // Check if guard applies to this direction\n if (isInput && guardType !== 'input_validation' && guardType !== 'content_filter') {\n return { content, passed: true, result };\n }\n if (!isInput && guardType !== 'output_validation' && guardType !== 'format_check') {\n return { content, passed: true, result };\n }\n\n if (this._config.dryRun) {\n result.modifications = { guardType };\n return { content, passed: true, result };\n }\n\n let passed = true;\n\n if (guardType === 'content_filter') {\n const blockedPatterns = (guardConfig.blocked_patterns ?? guardConfig.blockedPatterns ?? []) as string[];\n for (const pattern of blockedPatterns) {\n const regex = this._safeCompileRegex(pattern);\n if (regex && regex.test(content)) {\n passed = false;\n break;\n }\n }\n } else if (guardType === 'format_check') {\n const requiredFormat = guardConfig.format as string | undefined;\n if (requiredFormat === 'json') {\n try {\n JSON.parse(content);\n } catch {\n passed = false;\n }\n }\n } else if (guardType === 'input_validation' || guardType === 'output_validation') {\n const minLength = (guardConfig.min_length ?? guardConfig.minLength ?? 0) as number;\n const maxLength = (guardConfig.max_length ?? guardConfig.maxLength ?? Infinity) as number;\n if (content.length < minLength || content.length > maxLength) {\n passed = false;\n }\n }\n\n result.applied = true;\n result.modifications = { passed, guardType };\n\n return { content, passed, result };\n } catch (e) {\n debug(`applyGuardFix error: ${e}`);\n return {\n content,\n passed: true,\n result: {\n applied: false,\n fixId: fix.fixId,\n fixType: 'guard',\n modifications: {},\n error: String(e),\n },\n };\n }\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Application Log\n // ═══════════════════════════════════════════════════════════════════════════\n\n /** Log a fix application result. */\n logApplication(result: ApplyResult): void {\n this._applicationLog.push(result);\n\n // Limit log size\n if (this._applicationLog.length > 1000) {\n this._applicationLog = this._applicationLog.slice(-500);\n }\n }\n\n /** Get the application log. */\n getApplicationLog(): ApplyResult[] {\n return [...this._applicationLog];\n }\n\n // ═══════════════════════════════════════════════════════════════════════════\n // Private Helpers\n // ═══════════════════════════════════════════════════════════════════════════\n\n /**\n * Safely compile a regex pattern from untrusted input.\n * Returns null if invalid or too long.\n */\n private _safeCompileRegex(\n pattern: string,\n maxLength = 500,\n ): RegExp | null {\n if (!pattern || pattern.length > maxLength) return null;\n try {\n return new RegExp(pattern, 'i');\n } catch {\n debug(`Invalid regex pattern (length=${pattern.length})`);\n return null;\n }\n }\n\n /** Prepend content to the first message matching the target role. */\n private _prependToTarget(\n messages: Record<string, unknown>[],\n target: string,\n content: string,\n ): Record<string, unknown>[] {\n return messages.map((msg) => {\n if (msg.role === target) {\n return {\n ...msg,\n content: content + '\\n\\n' + ((msg.content as string) ?? ''),\n };\n }\n return msg;\n });\n }\n\n /** Append content to the first message matching the target role. */\n private _appendToTarget(\n messages: Record<string, unknown>[],\n target: string,\n content: string,\n ): Record<string, unknown>[] {\n return messages.map((msg) => {\n if (msg.role === target) {\n return {\n ...msg,\n content: ((msg.content as string) ?? '') + '\\n\\n' + content,\n };\n }\n return msg;\n });\n }\n\n /** Regex replace across all messages. */\n private _replaceInMessages(\n messages: Record<string, unknown>[],\n pattern: string,\n replacement: string,\n ): Record<string, unknown>[] {\n const regex = this._safeCompileRegex(pattern);\n if (!regex) {\n debug('Skipping invalid regex pattern in prompt fix');\n return messages;\n }\n\n return messages.map((msg) => {\n const msgContent = msg.content;\n if (typeof msgContent === 'string') {\n return { ...msg, content: msgContent.replace(regex, replacement) };\n }\n return msg;\n });\n }\n\n /** Add few-shot examples after the first system message. */\n private _addFewShotExamples(\n messages: Record<string, unknown>[],\n examples: Array<Record<string, string>>,\n ): Record<string, unknown>[] {\n const result: Record<string, unknown>[] = [];\n let systemFound = false;\n\n for (const msg of messages) {\n result.push(msg);\n\n if (msg.role === 'system' && !systemFound) {\n systemFound = true;\n for (const example of examples) {\n if (example.user) {\n result.push({ role: 'user', content: example.user });\n }\n if (example.assistant) {\n result.push({ role: 'assistant', content: example.assistant });\n }\n }\n }\n }\n\n return result;\n }\n}\n","/**\n * Fix Loader — Fetches active fixes from the Risicare API.\n *\n * Handles:\n * - Initial loading of fixes on startup\n * - Periodic background refresh via setInterval (unref'd)\n * - Exponential backoff on failure\n * - Circuit breaker: after 3 consecutive failures, stop trying for 30s\n *\n * Uses native fetch (Node.js 18+) with AbortController for timeouts.\n *\n * Port of Python SDK's runtime/loader.py adapted for Node.js.\n */\n\nimport type { ActiveFix } from './config.js';\nimport { activeFixFromApiResponse } from './config.js';\nimport type { FixRuntimeConfig } from './config.js';\nimport { resolveFixRuntimeConfig } from './config.js';\nimport type { FixCache } from './cache.js';\nimport { debug, warn } from '../utils/log.js';\n\nconst SDK_VERSION = '0.1.3';\n\nexport class FixLoader {\n private readonly _config: Required<FixRuntimeConfig>;\n private readonly _cache: FixCache;\n\n private _refreshTimer: ReturnType<typeof setInterval> | null = null;\n private _lastLoadTime: number | null = null;\n private _consecutiveFailures = 0;\n private _circuitOpenUntil = 0;\n private _onLoadCallbacks: Array<(fixes: ActiveFix[]) => void> = [];\n\n // Circuit breaker settings\n private static readonly CIRCUIT_BREAKER_THRESHOLD = 3;\n private static readonly CIRCUIT_BREAKER_COOLDOWN_MS = 30_000;\n\n constructor(config: FixRuntimeConfig, cache: FixCache) {\n this._config = resolveFixRuntimeConfig(config);\n this._cache = cache;\n }\n\n /** Timestamp of last successful load. */\n get lastLoadTime(): number | null {\n return this._lastLoadTime;\n }\n\n /**\n * Start the loader: perform initial load and start background refresh.\n *\n * Never throws — failures are logged and the runtime degrades gracefully.\n */\n start(): void {\n try {\n if (!this._config.enabled) {\n debug('Fix runtime disabled, skipping loader start');\n return;\n }\n\n if (!this._config.apiKey) {\n warn('No API key configured, fixes will not be loaded');\n return;\n }\n\n // Initial load (fire-and-forget — don't block startup)\n this.loadSync().catch((e) => {\n debug(`Initial fix load failed: ${e}`);\n });\n\n // Start background refresh\n if (this._config.autoRefresh) {\n this._startRefreshInterval();\n }\n } catch (e) {\n debug(`FixLoader.start error: ${e}`);\n }\n }\n\n /** Stop the loader: clear the refresh interval. */\n stop(): void {\n try {\n if (this._refreshTimer !== null) {\n clearInterval(this._refreshTimer);\n this._refreshTimer = null;\n }\n } catch (e) {\n debug(`FixLoader.stop error: ${e}`);\n }\n }\n\n /**\n * Register a callback invoked after each successful load.\n */\n onLoad(callback: (fixes: ActiveFix[]) => void): void {\n this._onLoadCallbacks.push(callback);\n }\n\n /**\n * Load fixes from the API.\n *\n * Name kept as \"loadSync\" for parity with the Python SDK, but this\n * returns a Promise in JS (there's no synchronous fetch in Node.js).\n */\n async loadSync(): Promise<ActiveFix[]> {\n if (!this._config.apiKey) {\n return [];\n }\n\n // Circuit breaker: skip if circuit is open\n const now = Date.now();\n if (\n this._consecutiveFailures >= FixLoader.CIRCUIT_BREAKER_THRESHOLD &&\n now < this._circuitOpenUntil\n ) {\n debug('Fix loader circuit breaker open — skipping load');\n return this._cache.getAll();\n }\n\n try {\n // Build URL: /api/v1/ routes to FastAPI via Caddy (NOT /v1/ which is the Rust gateway)\n const endpoint = this._config.apiEndpoint.replace(/\\/+$/, '');\n const url = `${endpoint}/api/v1/fixes/active`;\n\n // AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () => controller.abort(),\n this._config.timeoutMs,\n );\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${this._config.apiKey}`,\n 'Content-Type': 'application/json',\n 'X-Risicare-SDK-Version': SDK_VERSION,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n const fixes = this._parseResponse(data);\n this._onLoadSuccess(fixes);\n return fixes;\n } catch (e) {\n this._onLoadFailure(e as Error);\n throw e;\n }\n }\n\n /** Get currently cached fixes without hitting the API. */\n getCached(): ActiveFix[] {\n return this._cache.getAll();\n }\n\n // ─── Private ────────────────────────────────────────────────────────────\n\n private _parseResponse(data: Record<string, unknown>): ActiveFix[] {\n const fixes: ActiveFix[] = [];\n const items =\n (data.fixes as unknown[]) ??\n (data.data as unknown[]) ??\n [];\n\n if (!Array.isArray(items)) return fixes;\n\n for (const item of items) {\n try {\n if (item && typeof item === 'object') {\n fixes.push(activeFixFromApiResponse(item as Record<string, unknown>));\n }\n } catch (e) {\n debug(`Failed to parse fix item: ${e}`);\n }\n }\n\n return fixes;\n }\n\n private _onLoadSuccess(fixes: ActiveFix[]): void {\n this._lastLoadTime = Date.now();\n this._consecutiveFailures = 0;\n\n // Update cache\n this._cache.setAll(fixes);\n\n // Notify callbacks\n for (const callback of this._onLoadCallbacks) {\n try {\n callback(fixes);\n } catch (e) {\n debug(`Load callback error: ${e}`);\n }\n }\n\n debug(`Loaded ${fixes.length} active fixes`);\n }\n\n private _onLoadFailure(error: Error): void {\n this._consecutiveFailures++;\n\n if (this._consecutiveFailures >= FixLoader.CIRCUIT_BREAKER_THRESHOLD) {\n this._circuitOpenUntil = Date.now() + FixLoader.CIRCUIT_BREAKER_COOLDOWN_MS;\n warn(\n `Fix loader circuit breaker opened after ${this._consecutiveFailures} failures. ` +\n `Cooldown: ${FixLoader.CIRCUIT_BREAKER_COOLDOWN_MS / 1000}s`,\n );\n } else {\n debug(\n `Fix load failed (attempt ${this._consecutiveFailures}): ${error.message}`,\n );\n }\n }\n\n private _startRefreshInterval(): void {\n // Use exponential backoff on the refresh interval after failures\n const tick = (): void => {\n this.loadSync().catch((e) => {\n debug(`Background fix refresh failed: ${e}`);\n });\n };\n\n this._refreshTimer = setInterval(\n () => {\n // Skip if circuit breaker is open (loadSync handles this,\n // but we also avoid the async overhead)\n if (\n this._consecutiveFailures >= FixLoader.CIRCUIT_BREAKER_THRESHOLD &&\n Date.now() < this._circuitOpenUntil\n ) {\n return;\n }\n tick();\n },\n this._config.refreshIntervalMs,\n );\n\n // unref() so the interval doesn't prevent Node.js process exit\n this._refreshTimer.unref();\n\n debug('Started fix refresh interval');\n }\n}\n","/**\n * Fix Interceptors — Hook into LLM/tool calls to apply fixes.\n *\n * Interceptors are registered with the runtime and called during agent\n * execution to apply relevant fixes at three interception points:\n * - preCall: Before the LLM/tool call (prompt/parameter/fallback fixes)\n * - postCall: After the call (output guard validation)\n * - onError: When an error occurs (retry/fallback decisions)\n *\n * Port of Python SDK's runtime/interceptors.py adapted for Node.js.\n */\n\nimport type { ApplyResult } from './applier.js';\nimport { FixApplier } from './applier.js';\nimport type { FixCache } from './cache.js';\nimport type { FixRuntimeConfig } from './config.js';\nimport { resolveFixRuntimeConfig } from './config.js';\nimport { debug, warn } from '../utils/log.js';\n\n// ─── Intercept Context ──────────────────────────────────────────────────────\n\nexport interface InterceptContext {\n /** Type of operation: \"llm_call\", \"tool_call\", \"agent_delegate\" */\n operationType: string;\n\n /** Name of the operation: model name, tool name, agent name */\n operationName: string;\n\n /** Session ID for A/B testing bucketing */\n sessionId?: string;\n\n /** Trace ID for correlation */\n traceId?: string;\n\n /** Error code (set when retrying after error) */\n errorCode?: string;\n\n /** Error message (set when retrying after error) */\n errorMessage?: string;\n\n /** Current attempt number (1-based) */\n attempt: number;\n\n /** Fixes applied during this intercept lifecycle */\n appliedFixes: ApplyResult[];\n}\n\n/** Create a fresh InterceptContext. */\nexport function createInterceptContext(\n operationType: string,\n operationName: string,\n options?: {\n sessionId?: string;\n traceId?: string;\n errorCode?: string;\n },\n): InterceptContext {\n return {\n operationType,\n operationName,\n sessionId: options?.sessionId,\n traceId: options?.traceId,\n errorCode: options?.errorCode,\n attempt: 1,\n appliedFixes: [],\n };\n}\n\n// ─── Interceptor Interface ──────────────────────────────────────────────────\n\nexport interface FixInterceptor {\n /**\n * Called before an LLM/tool call.\n * Returns modified messages and params.\n */\n preCall(\n ctx: InterceptContext,\n messages: unknown[] | null,\n params: Record<string, unknown>,\n ): { messages: unknown[] | null; params: Record<string, unknown> };\n\n /**\n * Called after an LLM/tool call.\n * Returns modified response and whether to continue.\n */\n postCall(\n ctx: InterceptContext,\n response: unknown,\n ): { response: unknown; shouldContinue: boolean };\n\n /**\n * Called when an error occurs.\n * Returns whether to retry and optional modified params.\n */\n onError(\n ctx: InterceptContext,\n error: Error,\n ): { shouldRetry: boolean; modifiedParams: Record<string, unknown> | null };\n}\n\n// ─── Default Fix Interceptor ────────────────────────────────────────────────\n\nexport class DefaultFixInterceptor implements FixInterceptor {\n private readonly _config: Required<FixRuntimeConfig>;\n private readonly _cache: FixCache;\n private readonly _applier: FixApplier;\n\n constructor(config: FixRuntimeConfig, cache: FixCache, applier: FixApplier) {\n this._config = resolveFixRuntimeConfig(config);\n this._cache = cache;\n this._applier = applier;\n }\n\n /**\n * Apply pre-call fixes.\n *\n * - If retrying after error: look up fix by error_code, apply\n * prompt/parameter/fallback fixes\n * - Runs input guard fixes on all message content\n */\n preCall(\n ctx: InterceptContext,\n messages: unknown[] | null,\n params: Record<string, unknown>,\n ): { messages: unknown[] | null; params: Record<string, unknown> } {\n try {\n if (!this._config.enabled) {\n return { messages, params };\n }\n\n let modifiedMessages = messages;\n let modifiedParams = { ...params };\n\n // If retrying after error, check for applicable fixes\n if (ctx.errorCode) {\n const fix = this._applier.getFixForError(ctx.errorCode, ctx.sessionId);\n\n if (fix) {\n debug(`Applying fix ${fix.fixId} for ${ctx.errorCode}`);\n\n if (fix.fixType === 'prompt' && messages) {\n const msgRecords = messages as Record<string, unknown>[];\n const { messages: newMessages, result } =\n this._applier.applyPromptFix(fix, msgRecords);\n modifiedMessages = newMessages;\n ctx.appliedFixes.push(result);\n this._applier.logApplication(result);\n } else if (fix.fixType === 'parameter') {\n const { params: newParams, result } =\n this._applier.applyParameterFix(fix, modifiedParams);\n modifiedParams = newParams;\n ctx.appliedFixes.push(result);\n this._applier.logApplication(result);\n } else if (fix.fixType === 'fallback') {\n const { params: newParams, result } =\n this._applier.applyFallbackFix(fix, modifiedParams);\n modifiedParams = newParams;\n ctx.appliedFixes.push(result);\n this._applier.logApplication(result);\n }\n }\n }\n\n // Apply input guard fixes on all message content\n if (modifiedMessages && this._config.enabled) {\n for (const msg of modifiedMessages as Record<string, unknown>[]) {\n const content = msg.content;\n if (typeof content === 'string') {\n for (const fix of this._cache.getAll()) {\n if (fix.fixType === 'guard') {\n const { result } = this._applier.applyGuardFix(\n fix,\n content,\n true,\n );\n if (result.applied) {\n ctx.appliedFixes.push(result);\n this._applier.logApplication(result);\n }\n }\n }\n }\n }\n }\n\n return { messages: modifiedMessages, params: modifiedParams };\n } catch (e) {\n debug(`DefaultFixInterceptor.preCall error: ${e}`);\n return { messages, params };\n }\n }\n\n /**\n * Apply post-call fixes (output validation).\n *\n * Runs output guard fixes on response content.\n */\n postCall(\n ctx: InterceptContext,\n response: unknown,\n ): { response: unknown; shouldContinue: boolean } {\n try {\n if (!this._config.enabled) {\n return { response, shouldContinue: true };\n }\n\n for (const fix of this._cache.getAll()) {\n if (fix.fixType !== 'guard') continue;\n\n const content = this._extractResponseContent(response);\n if (!content) continue;\n\n const { passed, result } = this._applier.applyGuardFix(\n fix,\n content,\n false,\n );\n\n if (result.applied) {\n ctx.appliedFixes.push(result);\n this._applier.logApplication(result);\n }\n\n if (!passed) {\n warn(`Output guard failed for fix ${fix.fixId}`);\n }\n }\n\n return { response, shouldContinue: true };\n } catch (e) {\n debug(`DefaultFixInterceptor.postCall error: ${e}`);\n return { response, shouldContinue: true };\n }\n }\n\n /**\n * Handle errors and decide whether to retry.\n *\n * Classifies the error, looks up retry/fallback fixes, and returns\n * whether the caller should retry.\n */\n onError(\n ctx: InterceptContext,\n error: Error,\n ): { shouldRetry: boolean; modifiedParams: Record<string, unknown> | null } {\n try {\n if (!this._config.enabled) {\n return { shouldRetry: false, modifiedParams: null };\n }\n\n // Classify the error\n const errorCode = classifyError(error);\n ctx.errorCode = errorCode;\n ctx.errorMessage = error.message;\n\n // Check for retry fix\n const fix = this._applier.getFixForError(errorCode, ctx.sessionId);\n if (!fix) {\n return { shouldRetry: false, modifiedParams: null };\n }\n\n if (fix.fixType === 'retry') {\n const maxRetries = (fix.config.max_retries ?? fix.config.maxRetries ?? 3) as number;\n\n if (ctx.attempt <= maxRetries) {\n debug(\n `Retry fix ${fix.fixId}: attempt ${ctx.attempt}/${maxRetries}`,\n );\n\n const result: ApplyResult = {\n applied: true,\n fixId: fix.fixId,\n deploymentId: fix.deploymentId,\n fixType: 'retry',\n modifications: { attempt: ctx.attempt },\n };\n ctx.appliedFixes.push(result);\n this._applier.logApplication(result);\n\n return { shouldRetry: true, modifiedParams: null };\n }\n }\n\n // Check for fallback fix\n if (fix.fixType === 'fallback') {\n const { params: modifiedParams, result } =\n this._applier.applyFallbackFix(fix, {});\n if (result.applied) {\n ctx.appliedFixes.push(result);\n this._applier.logApplication(result);\n return { shouldRetry: true, modifiedParams };\n }\n }\n\n return { shouldRetry: false, modifiedParams: null };\n } catch (e) {\n debug(`DefaultFixInterceptor.onError error: ${e}`);\n return { shouldRetry: false, modifiedParams: null };\n }\n }\n\n // ─── Private ────────────────────────────────────────────────────────────\n\n /** Extract text content from a response object. */\n private _extractResponseContent(response: unknown): string | null {\n if (typeof response === 'string') return response;\n\n if (response && typeof response === 'object') {\n const resp = response as Record<string, unknown>;\n\n // OpenAI-style response: { choices: [{ message: { content: \"...\" } }] }\n const choices = resp.choices as unknown[];\n if (Array.isArray(choices) && choices.length > 0) {\n const first = choices[0] as Record<string, unknown>;\n const message = first?.message as Record<string, unknown>;\n if (typeof message?.content === 'string') {\n return message.content;\n }\n }\n\n // Anthropic-style response: { content: [{ text: \"...\" }] }\n const content = resp.content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content) && content.length > 0) {\n const first = content[0] as Record<string, unknown>;\n if (typeof first?.text === 'string') return first.text;\n }\n }\n\n return null;\n }\n}\n\n// ─── Error Classification ───────────────────────────────────────────────────\n\n/**\n * Classify an error into an error code.\n *\n * Simple heuristic classification. In production, this would use the full\n * taxonomy from risicare-core (10 modules, 35+ categories).\n */\nexport function classifyError(error: Error): string {\n const errorType = error.constructor.name.toLowerCase();\n const errorMsg = error.message.toLowerCase();\n\n // Timeout errors\n if (errorType.includes('timeout') || errorMsg.includes('timeout') || errorMsg.includes('aborted')) {\n return 'TOOL.EXECUTION.TIMEOUT';\n }\n\n // Rate limit errors\n if (errorMsg.includes('rate') && errorMsg.includes('limit')) {\n return 'TOOL.EXECUTION.RATE_LIMIT';\n }\n if (errorMsg.includes('429') || errorMsg.includes('too many requests')) {\n return 'TOOL.EXECUTION.RATE_LIMIT';\n }\n\n // Connection errors\n if (\n errorType.includes('connection') ||\n errorMsg.includes('connection') ||\n errorMsg.includes('econnrefused') ||\n errorMsg.includes('econnreset') ||\n errorMsg.includes('fetch failed')\n ) {\n return 'TOOL.EXECUTION.CONNECTION_ERROR';\n }\n\n // Authentication errors\n if (\n errorMsg.includes('auth') ||\n errorMsg.includes('401') ||\n errorMsg.includes('403') ||\n errorMsg.includes('unauthorized') ||\n errorMsg.includes('forbidden')\n ) {\n return 'TOOL.EXECUTION.AUTH_ERROR';\n }\n\n // JSON parsing errors\n if (\n errorType.includes('syntaxerror') ||\n errorType.includes('json') ||\n errorMsg.includes('json') ||\n errorMsg.includes('unexpected token')\n ) {\n return 'OUTPUT.FORMAT.JSON_INVALID';\n }\n\n // Generic execution error\n return 'TOOL.EXECUTION.FAILURE';\n}\n","/**\n * Fix Runtime — Main orchestrator for the fix application system.\n *\n * Manages:\n * - Loading active fixes from the API (via FixLoader)\n * - Caching fixes locally (via FixCache)\n * - Applying fixes via interceptors (via DefaultFixInterceptor)\n * - Tracking fix effectiveness\n *\n * Singleton management via globalThis (same pattern as the tracer).\n *\n * Port of Python SDK's runtime/runtime.py adapted for Node.js.\n */\n\nimport { FixCache } from './cache.js';\nimport type { ActiveFix, FixRuntimeConfig } from './config.js';\nimport { resolveFixRuntimeConfig } from './config.js';\nimport { FixApplier } from './applier.js';\nimport { FixLoader } from './loader.js';\nimport {\n DefaultFixInterceptor,\n createInterceptContext,\n type FixInterceptor,\n type InterceptContext,\n} from './interceptors.js';\nimport { debug, warn } from '../utils/log.js';\n\n// ─── globalThis singleton key ───────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G = globalThis as any;\nconst RUNTIME_KEY = '__risicare_fix_runtime';\n\n// ─── Fix Runtime ────────────────────────────────────────────────────────────\n\nexport class FixRuntime {\n private readonly _config: Required<FixRuntimeConfig>;\n private readonly _cache: FixCache;\n private readonly _loader: FixLoader;\n private readonly _applier: FixApplier;\n private readonly _interceptor: DefaultFixInterceptor;\n private _started = false;\n\n // Effectiveness tracking\n private _fixApplications = new Map<string, number>();\n private _fixSuccesses = new Map<string, number>();\n\n constructor(config: FixRuntimeConfig) {\n this._config = resolveFixRuntimeConfig(config);\n this._cache = new FixCache(this._config);\n this._loader = new FixLoader(config, this._cache);\n this._applier = new FixApplier(config, this._cache);\n this._interceptor = new DefaultFixInterceptor(\n config,\n this._cache,\n this._applier,\n );\n }\n\n // ─── Accessors ──────────────────────────────────────────────────────────\n\n /** Runtime configuration (with defaults resolved). */\n get config(): Required<FixRuntimeConfig> {\n return this._config;\n }\n\n /** Whether the runtime is enabled and started. */\n get isEnabled(): boolean {\n return this._config.enabled && this._started;\n }\n\n /** The fix cache. */\n get cache(): FixCache {\n return this._cache;\n }\n\n /** The fix loader. */\n get loader(): FixLoader {\n return this._loader;\n }\n\n /** The fix applier. */\n get applier(): FixApplier {\n return this._applier;\n }\n\n /** The interceptor. */\n get interceptor(): FixInterceptor {\n return this._interceptor;\n }\n\n // ─── Lifecycle ──────────────────────────────────────────────────────────\n\n /**\n * Start the runtime.\n *\n * Triggers initial fix load and starts background refresh.\n * Never throws — failures degrade gracefully.\n */\n start(): void {\n try {\n if (this._started) return;\n\n if (!this._config.enabled) {\n debug('Fix runtime disabled');\n return;\n }\n\n debug('Starting fix runtime...');\n this._loader.start();\n this._started = true;\n debug('Fix runtime started');\n } catch (e) {\n warn(`Fix runtime start failed: ${e}`);\n }\n }\n\n /**\n * Stop the runtime.\n *\n * Stops background refresh and clears the cache.\n * Never throws.\n */\n stop(): void {\n try {\n if (!this._started) return;\n\n debug('Stopping fix runtime...');\n this._loader.stop();\n this._cache.clear();\n this._started = false;\n debug('Fix runtime stopped');\n } catch (e) {\n debug(`Fix runtime stop error: ${e}`);\n }\n }\n\n // ─── Intercept API ──────────────────────────────────────────────────────\n\n /**\n * Intercept a call: create context and run preCall fixes.\n *\n * Returns modified messages/params and the InterceptContext for\n * use in subsequent interceptResponse / interceptError calls.\n */\n interceptCall(\n operationType: string,\n operationName: string,\n messages: unknown[] | null,\n params: Record<string, unknown>,\n options?: {\n sessionId?: string;\n traceId?: string;\n errorCode?: string;\n },\n ): {\n messages: unknown[] | null;\n params: Record<string, unknown>;\n ctx: InterceptContext;\n } {\n const ctx = createInterceptContext(operationType, operationName, options);\n\n try {\n if (!this.isEnabled) {\n return { messages, params, ctx };\n }\n\n const result = this._interceptor.preCall(ctx, messages, params);\n return { messages: result.messages, params: result.params, ctx };\n } catch (e) {\n debug(`interceptCall error: ${e}`);\n return { messages, params, ctx };\n }\n }\n\n /**\n * Intercept a response: run postCall fixes (output validation).\n */\n interceptResponse(\n ctx: InterceptContext,\n response: unknown,\n ): { response: unknown; shouldContinue: boolean } {\n try {\n if (!this.isEnabled) {\n return { response, shouldContinue: true };\n }\n\n const result = this._interceptor.postCall(ctx, response);\n\n // Track success for effectiveness\n this._trackSuccess(ctx);\n\n return result;\n } catch (e) {\n debug(`interceptResponse error: ${e}`);\n return { response, shouldContinue: true };\n }\n }\n\n /**\n * Intercept an error: decide on retry/fallback.\n */\n interceptError(\n ctx: InterceptContext,\n error: Error,\n ): { shouldRetry: boolean; modifiedParams: Record<string, unknown> | null } {\n try {\n if (!this.isEnabled) {\n return { shouldRetry: false, modifiedParams: null };\n }\n\n ctx.attempt++;\n const result = this._interceptor.onError(ctx, error);\n\n // If not retrying, track failure for effectiveness\n if (!result.shouldRetry) {\n this._trackFailure(ctx);\n }\n\n return result;\n } catch (e) {\n debug(`interceptError error: ${e}`);\n return { shouldRetry: false, modifiedParams: null };\n }\n }\n\n // ─── Direct Fix Access ──────────────────────────────────────────────────\n\n /**\n * Get applicable fix for an error code.\n */\n getFix(errorCode: string, sessionId?: string): ActiveFix | null {\n try {\n if (!this.isEnabled) return null;\n return this._applier.getFixForError(errorCode, sessionId);\n } catch (e) {\n debug(`getFix error: ${e}`);\n return null;\n }\n }\n\n /**\n * Manually refresh fixes from the API.\n */\n async refreshFixes(): Promise<ActiveFix[]> {\n try {\n return await this._loader.loadSync();\n } catch (e) {\n debug(`refreshFixes error: ${e}`);\n return [];\n }\n }\n\n // ─── Effectiveness ──────────────────────────────────────────────────────\n\n /** Get effectiveness statistics for all fixes. */\n getEffectivenessStats(): Record<\n string,\n { applications: number; successes: number; successRate: number }\n > {\n const stats: Record<\n string,\n { applications: number; successes: number; successRate: number }\n > = {};\n\n for (const [fixId, applications] of this._fixApplications) {\n const successes = this._fixSuccesses.get(fixId) ?? 0;\n stats[fixId] = {\n applications,\n successes,\n successRate: applications > 0 ? successes / applications : 0,\n };\n }\n\n return stats;\n }\n\n // ─── Private ────────────────────────────────────────────────────────────\n\n private _trackSuccess(ctx: InterceptContext): void {\n for (const result of ctx.appliedFixes) {\n if (result.applied && result.fixId) {\n this._fixApplications.set(\n result.fixId,\n (this._fixApplications.get(result.fixId) ?? 0) + 1,\n );\n this._fixSuccesses.set(\n result.fixId,\n (this._fixSuccesses.get(result.fixId) ?? 0) + 1,\n );\n }\n }\n }\n\n private _trackFailure(ctx: InterceptContext): void {\n for (const result of ctx.appliedFixes) {\n if (result.applied && result.fixId) {\n this._fixApplications.set(\n result.fixId,\n (this._fixApplications.get(result.fixId) ?? 0) + 1,\n );\n // Don't increment success count\n }\n }\n }\n}\n\n// ─── Singleton Management ───────────────────────────────────────────────────\n\n/** Get the global FixRuntime instance, if initialized. */\nexport function getFixRuntime(): FixRuntime | undefined {\n return G[RUNTIME_KEY] as FixRuntime | undefined;\n}\n\n/** Set the global FixRuntime instance (for advanced use). */\nexport function setFixRuntime(runtime: FixRuntime): void {\n G[RUNTIME_KEY] = runtime;\n}\n\n/**\n * Initialize and start the global FixRuntime.\n *\n * If already initialized, returns the existing instance.\n * Never throws — initialization failures degrade gracefully.\n */\nexport function initFixRuntime(config: FixRuntimeConfig): FixRuntime {\n try {\n const existing = G[RUNTIME_KEY] as FixRuntime | undefined;\n if (existing) {\n debug('Fix runtime already initialized');\n return existing;\n }\n\n const runtime = new FixRuntime(config);\n runtime.start();\n G[RUNTIME_KEY] = runtime;\n return runtime;\n } catch (e) {\n warn(`initFixRuntime failed: ${e}`);\n // Return a disabled runtime so callers don't need null checks\n const fallback = new FixRuntime({ ...config, enabled: false });\n G[RUNTIME_KEY] = fallback;\n return fallback;\n }\n}\n\n/**\n * Shutdown and remove the global FixRuntime.\n *\n * Never throws.\n */\nexport function shutdownFixRuntime(): void {\n try {\n const runtime = G[RUNTIME_KEY] as FixRuntime | undefined;\n if (runtime) {\n runtime.stop();\n }\n G[RUNTIME_KEY] = undefined;\n } catch (e) {\n debug(`shutdownFixRuntime error: ${e}`);\n G[RUNTIME_KEY] = undefined;\n }\n}\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 // Primary roles\n ORCHESTRATOR = 'orchestrator',\n WORKER = 'worker',\n SUPERVISOR = 'supervisor',\n SPECIALIST = 'specialist',\n // Communication roles\n ROUTER = 'router',\n AGGREGATOR = 'aggregator',\n BROADCASTER = 'broadcaster',\n // Specialized roles\n CRITIC = 'critic',\n PLANNER = 'planner',\n EXECUTOR = 'executor',\n RETRIEVER = 'retriever',\n VALIDATOR = 'validator',\n // JS-specific (backwards compatibility)\n REVIEWER = 'reviewer',\n CUSTOM = 'custom',\n}\n\n// ─── Message Type (Tier 5: Multi-Agent) ──────────────────────────────────────\n\nexport enum MessageType {\n // Control messages\n TASK = 'task',\n RESULT = 'result',\n STATUS = 'status',\n ERROR = 'error',\n // Communication messages\n QUERY = 'query',\n RESPONSE = 'response',\n BROADCAST = 'broadcast',\n DIRECT = 'direct',\n // Coordination messages\n PROPOSAL = 'proposal',\n VOTE = 'vote',\n CONSENSUS = 'consensus',\n CONFLICT = 'conflict',\n // Lifecycle messages\n HEARTBEAT = 'heartbeat',\n SHUTDOWN = 'shutdown',\n HANDOFF = 'handoff',\n // JS-specific (backwards compatibility)\n REQUEST = 'request',\n DELEGATE = 'delegate',\n COORDINATE = 'coordinate',\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 * 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 /** When true, provider instrumentors skip span creation (framework is handling it). */\n _suppressProviderInstrumentation?: boolean;\n /**\n * Pre-allocated trace ID from getTraceContext() when no span exists yet.\n * Ensures that getTraceContext().traceId matches the next span created\n * in this context — preventing the \"trace ID mismatch\" bug.\n */\n _rootTraceId?: string;\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 getContext,\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 > pre-allocated (from getTraceContext) > new\n const ctx = getContext();\n const traceId = opts.traceId ?? parentSpan?.traceId ?? ctx._rootTraceId ?? 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 * 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 { SpanKind, SpanStatus } from './types.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 // Start FixRuntime for self-healing fix application.\n // Loads active fixes from /api/v1/fixes/active, caches with TTL,\n // background-refreshes every 60s. Provider patches call interceptCall()\n // to apply fixes before LLM calls.\n if (this.config.apiKey && this.config.enabled) {\n try {\n const { initFixRuntime } = require('./runtime/runtime.js') as typeof import('./runtime/runtime.js');\n initFixRuntime({\n apiEndpoint: this.config.endpoint,\n apiKey: this.config.apiKey,\n enabled: true,\n debug: this.config.debug,\n });\n } catch {\n // FixRuntime failure is non-fatal — tracing still works\n }\n }\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 // Stop FixRuntime first (stops background refresh)\n try {\n const { shutdownFixRuntime } = require('./runtime/runtime.js') as typeof import('./runtime/runtime.js');\n shutdownFixRuntime();\n } catch {\n // FixRuntime may not be initialized\n }\n\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// ─── reportError ──────────────────────────────────────────────────────────\n\n// Error dedup: SHA256 fingerprint → timestamp. Prevents retry loops from\n// creating N duplicate diagnoses. Matches Python SDK's 5-minute TTL.\nconst _ERROR_DEDUP_TTL_MS = 5 * 60 * 1000; // 5 minutes\nconst _ERROR_DEDUP_MAX = 1000;\nconst _recentErrors = new Map<string, number>(); // fingerprint → Date.now()\n\nfunction _errorFingerprint(err: Error): string {\n const raw = `${err.constructor?.name ?? 'Error'}:${String(err.message ?? '').slice(0, 200)}`;\n const { createHash } = require('node:crypto') as typeof import('node:crypto');\n return createHash('sha256').update(raw).digest('hex').slice(0, 16);\n}\n\nfunction _isDuplicateError(fingerprint: string): boolean {\n const now = Date.now();\n // Evict expired entries\n for (const [fp, ts] of _recentErrors) {\n if (now - ts > _ERROR_DEDUP_TTL_MS) _recentErrors.delete(fp);\n else break; // Map iterates in insertion order\n }\n if (_recentErrors.has(fingerprint)) return true;\n // Enforce max size\n if (_recentErrors.size >= _ERROR_DEDUP_MAX) {\n const oldest = _recentErrors.keys().next().value;\n if (oldest !== undefined) _recentErrors.delete(oldest);\n }\n _recentErrors.set(fingerprint, now);\n return false;\n}\n\n/**\n * Report a caught exception to the self-healing pipeline.\n *\n * Creates an error span that triggers diagnosis and fix generation.\n * Deduplicates identical errors within a 5-minute window (SHA256 fingerprint).\n * This function never throws and is non-blocking.\n *\n * @param error - The caught exception (Error object or string)\n * @param options - Optional attributes and context overrides\n */\nexport function reportError(\n error: unknown,\n options?: { name?: string; attributes?: Record<string, unknown> },\n): void {\n try {\n const tracer = getTracer();\n if (!tracer) return;\n\n const err = error instanceof Error ? error : new Error(String(error ?? 'unknown'));\n const spanName = options?.name ?? `error:${err.constructor.name}`;\n\n // Dedup: suppress identical errors within TTL (matches Python SDK)\n const fp = _errorFingerprint(err);\n if (_isDuplicateError(fp)) {\n debug(`reportError: duplicate suppressed (fp=${fp.slice(0, 8)})`);\n return;\n }\n\n tracer.startSpan({ name: spanName, kind: SpanKind.INTERNAL }, (span) => {\n span.setStatus(SpanStatus.ERROR, err.message);\n span.setAttribute('error', true);\n span.setAttribute('error.type', err.constructor.name);\n span.setAttribute('error.message', err.message.slice(0, 2000));\n if (err.stack) span.setAttribute('error.stack', err.stack.slice(0, 4000));\n span.setAttribute('risicare.reported_error', true);\n if (options?.attributes) {\n for (const [k, v] of Object.entries(options.attributes)) {\n span.setAttribute(k, v);\n }\n }\n });\n } catch {\n // Never crash the host application\n debug('reportError failed');\n }\n}\n\n// ─── score ─────────────────────────────────────────────────────────────────\n\n/**\n * Record a custom evaluation score on a trace.\n *\n * Sends the score to the server in a fire-and-forget fashion.\n * This function never throws and is non-blocking.\n *\n * @param traceId - The trace to score\n * @param name - Score name (e.g., \"accuracy\", \"user_satisfaction\")\n * @param value - Score value between 0.0 and 1.0 inclusive\n * @param options - Optional span_id and comment\n */\nexport function score(\n traceId: string,\n name: string,\n value: number,\n options?: { spanId?: string; comment?: string },\n): void {\n try {\n if (typeof value !== 'number' || value < 0.0 || value > 1.0) {\n debug(`score: value must be in [0.0, 1.0], got ${value}. Score not sent.`);\n return;\n }\n if (!traceId || !name) {\n debug('score: traceId and name are required');\n return;\n }\n\n const client = getGlobalClient() as RisicareClient | undefined;\n if (!client?.enabled || !client.config.apiKey) return;\n\n const endpoint = client.config.endpoint.replace(/\\/$/, '');\n const url = `${endpoint}/api/v1/scores`;\n const body = JSON.stringify({\n trace_id: traceId,\n name,\n score: value,\n source: 'sdk',\n ...(options?.spanId && { span_id: options.spanId }),\n ...(options?.comment && { comment: options.comment }),\n });\n\n // Fire-and-forget — never blocks caller\n fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${client.config.apiKey}`,\n },\n body,\n }).catch((err) => debug(`score: send failed: ${err}`));\n } catch {\n // Never crash the host application\n debug('score failed');\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 { 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 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 { 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 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 { 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 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 name: string,\n fn: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n return (...args: TArgs): TReturn => {\n const tracer = getTracer();\n if (!tracer) {\n return fn(...args);\n }\n return withPhase(phase, () => {\n return tracer.startSpan({ name, kind }, () => fn(...args));\n });\n };\n}\n\n/**\n * Wrap a function in a THINK phase context with auto-span.\n *\n * @example traceThink(async () => { ... })\n * @example traceThink(\"analyze-data\", async () => { ... })\n */\nexport function traceThink<TArgs extends unknown[], TReturn>(\n fnOrName: ((...args: TArgs) => TReturn) | string,\n maybeFn?: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const name = typeof fnOrName === 'string' ? fnOrName : `phase:think`;\n const fn = typeof fnOrName === 'function' ? fnOrName : maybeFn!;\n return phaseWrapper(SemanticPhase.THINK, SpanKind.THINK, name, fn);\n}\n\n/**\n * Wrap a function in a DECIDE phase context with auto-span.\n *\n * @example traceDecide(async () => { ... })\n * @example traceDecide(\"choose-action\", async () => { ... })\n */\nexport function traceDecide<TArgs extends unknown[], TReturn>(\n fnOrName: ((...args: TArgs) => TReturn) | string,\n maybeFn?: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const name = typeof fnOrName === 'string' ? fnOrName : `phase:decide`;\n const fn = typeof fnOrName === 'function' ? fnOrName : maybeFn!;\n return phaseWrapper(SemanticPhase.DECIDE, SpanKind.DECIDE, name, fn);\n}\n\n/**\n * Wrap a function in an ACT phase context with auto-span.\n *\n * @example traceAct(async () => { ... })\n * @example traceAct(\"execute-tool\", async () => { ... })\n */\nexport function traceAct<TArgs extends unknown[], TReturn>(\n fnOrName: ((...args: TArgs) => TReturn) | string,\n maybeFn?: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const name = typeof fnOrName === 'string' ? fnOrName : `phase:act`;\n const fn = typeof fnOrName === 'function' ? fnOrName : maybeFn!;\n return phaseWrapper(SemanticPhase.ACT, SpanKind.TOOL_CALL, name, fn);\n}\n\n/**\n * Wrap a function in an OBSERVE phase context with auto-span.\n *\n * @example traceObserve(async () => { ... })\n * @example traceObserve(\"check-result\", async () => { ... })\n */\nexport function traceObserve<TArgs extends unknown[], TReturn>(\n fnOrName: ((...args: TArgs) => TReturn) | string,\n maybeFn?: (...args: TArgs) => TReturn,\n): (...args: TArgs) => TReturn {\n const name = typeof fnOrName === 'string' ? fnOrName : `phase:observe`;\n const fn = typeof fnOrName === 'function' ? fnOrName : maybeFn!;\n return phaseWrapper(SemanticPhase.OBSERVE, SpanKind.OBSERVE, name, 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, getContext } 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 *\n * When called inside a span context, returns the active span's IDs.\n * When called outside a span (e.g. inside session() but before agent()),\n * pre-allocates a trace ID and stores it in context so the next\n * startSpan() call inherits it — preventing trace ID mismatch.\n */\nexport function getTraceContext(): TraceContext {\n const span = getCurrentSpan();\n const session = getCurrentSession();\n const agent = getCurrentAgent();\n\n let traceId: string;\n if (span) {\n traceId = span.traceId;\n } else {\n // No active span — check for a previously pre-allocated root trace ID\n const ctx = getContext();\n if (ctx._rootTraceId) {\n traceId = ctx._rootTraceId;\n } else {\n // Pre-allocate and store so startSpan() will inherit this ID\n traceId = generateTraceId();\n // Store in the current context scope (if one exists)\n // This is a no-op if we're outside any runWithContext scope\n if (ctx.session || ctx.agent) {\n // We're inside a session/agent scope — store the pre-allocated ID\n // by mutating the existing context object (safe because AsyncLocalStorage\n // gives each scope its own copy via spread in runWithContext)\n (ctx as Record<string, unknown>)._rootTraceId = traceId;\n }\n }\n }\n\n return {\n traceId,\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","/**\n * tracedStream — Wrap an async iterable in a trace span.\n *\n * Creates a span that starts when iteration begins and ends when\n * iteration completes (or errors). Chunks pass through UNCHANGED.\n *\n * This is the user-level streaming utility. For provider-level streaming\n * enrichment (token counts, cost), see individual provider instrumentors.\n *\n * Usage:\n * const stream = await openai.chat.completions.create({ stream: true, ... });\n * for await (const chunk of tracedStream(stream, { name: 'llm-stream' })) {\n * process(chunk);\n * }\n */\n\nimport { getTracer } from './client.js';\nimport { SpanKind } from './types.js';\n\nexport interface TracedStreamOptions {\n /** Span name */\n name: string;\n /** Span kind (default: INTERNAL) */\n kind?: SpanKind;\n /** Additional span attributes */\n attributes?: Record<string, unknown>;\n}\n\n/**\n * Wrap an async iterable in a trace span.\n *\n * - Span starts on first iteration\n * - chunk_count attribute set when iteration ends\n * - On error: span records exception, error re-thrown to caller\n * - On early break: span ended cleanly via finally\n * - If SDK not initialized: chunks pass through without wrapping\n */\nexport async function* tracedStream<T>(\n source: AsyncIterable<T>,\n options: TracedStreamOptions | string,\n): AsyncGenerator<T, void, undefined> {\n const opts = typeof options === 'string' ? { name: options } : options;\n\n // Graceful degradation: if SDK not initialized, pass through\n const tracer = getTracer();\n if (!tracer || !tracer.enabled) {\n yield* source;\n return;\n }\n\n const span = tracer.createSpan({\n name: opts.name,\n kind: opts.kind ?? SpanKind.INTERNAL,\n attributes: opts.attributes,\n });\n\n let chunkCount = 0;\n\n try {\n for await (const chunk of source) {\n chunkCount++;\n yield chunk;\n }\n\n span.setAttribute('stream.chunk_count', chunkCount);\n span.setAttribute('stream.completed', true);\n } catch (error) {\n span.setAttribute('stream.chunk_count', chunkCount);\n span.setAttribute('stream.completed', false);\n span.recordException(error instanceof Error ? error : String(error));\n throw error;\n } finally {\n span.end();\n }\n}\n","/**\n * Double-tracing prevention for framework integrations.\n *\n * When a framework integration (e.g., LlamaIndex handler) creates its own\n * LLM span, the underlying provider proxy (e.g., patchOpenAI) would also\n * create a duplicate span. This module provides suppression:\n *\n * - Framework integrations SET suppression via suppressProviderInstrumentation()\n * - Provider proxies CHECK via isProviderInstrumentationSuppressed() and skip\n *\n * Scoped to AsyncLocalStorage — concurrent calls are independent.\n */\n\nimport { getContext, runWithContext } from './storage.js';\n\n/**\n * Run a callback with provider instrumentation suppressed.\n *\n * During this callback, all provider instrumentors (patchOpenAI, etc.) will\n * skip span creation. The framework is responsible for creating the span.\n *\n * @param fn - The function to run with suppression active\n * @returns The function's return value\n */\nexport function suppressProviderInstrumentation<T>(fn: () => T): T {\n return runWithContext({ _suppressProviderInstrumentation: true }, fn);\n}\n\n/**\n * Check if provider instrumentation should be suppressed.\n *\n * Called by provider instrumentors as an early-exit guard. When true,\n * the provider calls the original method directly without creating a span.\n */\nexport function isProviderInstrumentationSuppressed(): boolean {\n return getContext()._suppressProviderInstrumentation === true;\n}\n","/**\n * LangChain.js integration via callback handler.\n *\n * LangChain.js uses BaseCallbackHandler from @langchain/core/callbacks/base.\n * This handler receives lifecycle events (handleChainStart, handleLLMEnd, etc.)\n * with a runId (UUID string) for parent-child correlation.\n *\n * Usage:\n * import { RisicareCallbackHandler } from 'risicare/langchain';\n * const handler = new RisicareCallbackHandler();\n * const result = await handler.withSuppression(() =>\n * chain.invoke(input, { callbacks: [handler] })\n * );\n *\n * SUPPRESSES provider instrumentation — LangChain handler creates LLM spans,\n * so provider-level spans (patchOpenAI, etc.) would duplicate without suppression.\n */\n\nimport { getTracer } from '../client.js';\nimport { SpanKind } from '../types.js';\nimport { suppressProviderInstrumentation } from '../context/dedup.js';\nimport type { Span } from '../span.js';\n\ninterface SpanEntry {\n span: Span;\n startTime: number;\n}\n\nexport class RisicareCallbackHandler {\n name = 'RisicareCallbackHandler';\n\n private _spans = new Map<string, SpanEntry>();\n\n /**\n * Run a function with provider instrumentation suppressed.\n *\n * Wrap your chain.invoke() call with this to prevent duplicate spans.\n * The handler creates LLM/tool spans, so provider proxies (patchOpenAI, etc.)\n * should be suppressed during chain execution.\n *\n * @example\n * const handler = new RisicareCallbackHandler();\n * const result = await handler.withSuppression(() =>\n * chain.invoke(input, { callbacks: [handler] })\n * );\n */\n withSuppression<T>(fn: () => T): T {\n return suppressProviderInstrumentation(fn);\n }\n\n // ── Chain lifecycle ────────────────────────────────────────────────────────\n\n handleChainStart(\n chain: { name?: string; _type?: string },\n _inputs: Record<string, unknown>,\n runId: string,\n parentRunId?: string,\n ): void {\n const tracer = getTracer();\n if (!tracer?.enabled) return;\n\n const parentEntry = parentRunId ? this._spans.get(parentRunId) : undefined;\n const span = tracer.createSpan({\n name: chain.name || chain._type || 'chain',\n kind: SpanKind.INTERNAL,\n parentSpanId: parentEntry?.span.spanId,\n traceId: parentEntry?.span.traceId,\n attributes: {\n 'framework': 'langchain',\n 'langchain.run_id': runId,\n ...(parentRunId ? { 'langchain.parent_run_id': parentRunId } : {}),\n ...(chain._type ? { 'langchain.chain_type': chain._type } : {}),\n },\n });\n\n this._spans.set(runId, { span, startTime: Date.now() });\n }\n\n handleChainEnd(_outputs: Record<string, unknown>, runId: string): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n entry.span.setAttribute('gen_ai.latency_ms', Date.now() - entry.startTime);\n entry.span.end();\n this._spans.delete(runId);\n }\n\n handleChainError(error: Error, runId: string): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n entry.span.recordException(error);\n entry.span.end();\n this._spans.delete(runId);\n }\n\n // ── LLM lifecycle ─────────────────────────────────────────────────────────\n\n handleLLMStart(\n llm: { name?: string; _type?: string },\n _prompts: string[],\n runId: string,\n parentRunId?: string,\n ): void {\n const tracer = getTracer();\n if (!tracer?.enabled) return;\n\n const parentEntry = parentRunId ? this._spans.get(parentRunId) : undefined;\n const span = tracer.createSpan({\n name: llm.name || llm._type || 'llm',\n kind: SpanKind.LLM_CALL,\n parentSpanId: parentEntry?.span.spanId,\n traceId: parentEntry?.span.traceId,\n attributes: {\n 'framework': 'langchain',\n 'langchain.run_id': runId,\n 'gen_ai.system': 'langchain',\n 'gen_ai.prompt.count': _prompts.length,\n },\n });\n\n this._spans.set(runId, { span, startTime: Date.now() });\n }\n\n handleLLMEnd(\n output: {\n generations?: unknown[][];\n llmOutput?: Record<string, unknown>;\n },\n runId: string,\n ): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n\n // Extract token usage from llmOutput\n const usage = output.llmOutput?.tokenUsage as\n | Record<string, number>\n | undefined;\n if (usage) {\n entry.span.setLlmFields({\n promptTokens: usage.promptTokens ?? usage.prompt_tokens,\n completionTokens: usage.completionTokens ?? usage.completion_tokens,\n totalTokens: usage.totalTokens ?? usage.total_tokens,\n });\n }\n\n const model = (output.llmOutput?.model ??\n output.llmOutput?.modelName) as string | undefined;\n if (model) {\n entry.span.setLlmFields({ model });\n }\n\n entry.span.setAttribute('gen_ai.latency_ms', Date.now() - entry.startTime);\n entry.span.end();\n this._spans.delete(runId);\n }\n\n handleLLMError(error: Error, runId: string): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n entry.span.recordException(error);\n entry.span.end();\n this._spans.delete(runId);\n }\n\n // ── Tool lifecycle ────────────────────────────────────────────────────────\n\n handleToolStart(\n tool: { name?: string },\n input: string,\n runId: string,\n parentRunId?: string,\n ): void {\n const tracer = getTracer();\n if (!tracer?.enabled) return;\n\n const parentEntry = parentRunId ? this._spans.get(parentRunId) : undefined;\n const span = tracer.createSpan({\n name: tool.name || 'tool',\n kind: SpanKind.TOOL_CALL,\n parentSpanId: parentEntry?.span.spanId,\n traceId: parentEntry?.span.traceId,\n attributes: {\n 'framework': 'langchain',\n 'langchain.run_id': runId,\n 'tool.name': tool.name || 'unknown',\n 'tool.input_length': input?.length ?? 0,\n },\n });\n\n this._spans.set(runId, { span, startTime: Date.now() });\n }\n\n handleToolEnd(output: string, runId: string): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n entry.span.setAttribute('tool.output_length', output?.length ?? 0);\n entry.span.setAttribute('gen_ai.latency_ms', Date.now() - entry.startTime);\n entry.span.end();\n this._spans.delete(runId);\n }\n\n handleToolError(error: Error, runId: string): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n entry.span.recordException(error);\n entry.span.end();\n this._spans.delete(runId);\n }\n\n // ── Retriever lifecycle ───────────────────────────────────────────────────\n\n handleRetrieverStart(\n retriever: { name?: string },\n _query: string,\n runId: string,\n parentRunId?: string,\n ): void {\n const tracer = getTracer();\n if (!tracer?.enabled) return;\n\n const parentEntry = parentRunId ? this._spans.get(parentRunId) : undefined;\n const span = tracer.createSpan({\n name: retriever.name || 'retriever',\n kind: SpanKind.RETRIEVAL,\n parentSpanId: parentEntry?.span.spanId,\n traceId: parentEntry?.span.traceId,\n attributes: {\n 'framework': 'langchain',\n 'langchain.run_id': runId,\n },\n });\n\n this._spans.set(runId, { span, startTime: Date.now() });\n }\n\n handleRetrieverEnd(documents: unknown[], runId: string): void {\n const entry = this._spans.get(runId);\n if (!entry) return;\n entry.span.setAttribute(\n 'retriever.document_count',\n documents?.length ?? 0,\n );\n entry.span.setAttribute('gen_ai.latency_ms', Date.now() - entry.startTime);\n entry.span.end();\n this._spans.delete(runId);\n }\n}\n","/**\n * LangGraph.js integration via Proxy wrapping.\n *\n * LangGraph uses LangChain callbacks under the hood. This integration wraps\n * a compiled graph's invoke/stream methods to:\n * 1. Create a parent \"langgraph.invoke\" or \"langgraph.stream\" span\n * 2. Inject a RisicareCallbackHandler into the config so all internal\n * chain/LLM/tool calls are also traced\n *\n * Usage:\n * import { instrumentLangGraph } from 'risicare/frameworks/langgraph';\n * const graph = instrumentLangGraph(compiledGraph);\n * const result = await graph.invoke(input);\n *\n * Does NOT suppress provider instrumentation.\n */\n\nimport { getTracer } from '../client.js';\nimport { SpanKind } from '../types.js';\nimport { RisicareCallbackHandler } from './langchain.js';\n\n/**\n * Wrap a compiled LangGraph graph with Risicare tracing.\n *\n * Returns a Proxy that intercepts `invoke` and `stream` calls to create\n * a parent span and inject the LangChain callback handler.\n *\n * @param graph - A compiled LangGraph graph object with invoke/stream methods\n * @returns A proxied graph with tracing enabled\n */\nexport function instrumentLangGraph<T extends object>(graph: T): T {\n return new Proxy(graph, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (\n (prop === 'invoke' || prop === 'stream') &&\n typeof value === 'function'\n ) {\n return function patchedMethod(\n this: unknown,\n ...args: unknown[]\n ): unknown {\n const tracer = getTracer();\n if (!tracer?.enabled) return value.apply(this, args);\n\n return tracer.startSpan(\n {\n name: `langgraph.${String(prop)}`,\n kind: SpanKind.AGENT,\n attributes: { framework: 'langgraph' },\n },\n (_span) => {\n // Inject RisicareCallbackHandler into config (second argument)\n const config = (args[1] ?? {}) as Record<string, unknown>;\n const callbacks = (config.callbacks ?? []) as unknown[];\n callbacks.push(new RisicareCallbackHandler());\n args[1] = { ...config, callbacks };\n\n const result = value.apply(this, args);\n\n // Handle async results (Promises)\n if (\n result &&\n typeof (result as Promise<unknown>).then === 'function'\n ) {\n return (result as Promise<unknown>).then((r) => r);\n }\n return result;\n },\n );\n };\n }\n\n return value;\n },\n });\n}\n","/**\n * Instructor integration via Proxy wrapping.\n *\n * Instructor wraps an LLM client's create() method to extract structured\n * data from completions using a response model (Zod schema, etc.).\n * This integration intercepts the instructor client's create() to add a span\n * around the structured extraction call.\n *\n * Usage:\n * import { patchInstructor } from 'risicare/frameworks/instructor';\n * import Instructor from '@instructor-ai/instructor';\n * const client = patchInstructor(Instructor.from(openai));\n *\n * Does NOT suppress provider instrumentation -- Instructor delegates to the\n * underlying LLM client, which should produce its own provider span.\n */\n\nimport { getTracer } from '../client.js';\nimport { SpanKind } from '../types.js';\nimport { debug } from '../utils/log.js';\n\n/**\n * Wrap an Instructor client with Risicare tracing.\n *\n * Returns a Proxy that intercepts `create` calls to create a span\n * capturing the structured extraction metadata (response model, retries).\n *\n * @param client - An Instructor client with a create() method\n * @returns A proxied client with tracing enabled\n */\nexport function patchInstructor<T extends object>(client: T): T {\n return new Proxy(client, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return function patchedCreate(\n this: unknown,\n ...args: unknown[]\n ): unknown {\n const tracer = getTracer();\n if (!tracer?.enabled) {\n debug(\n 'Tracer not initialized — call init() before using patchInstructor()',\n );\n return value.apply(this, args);\n }\n\n const params = (args[0] ?? {}) as Record<string, unknown>;\n const responseModel =\n params.response_model ?? params.responseModel;\n\n // Extract a readable name from the response model\n let modelName = 'unknown';\n if (responseModel && typeof responseModel === 'function') {\n modelName =\n (responseModel as { name?: string }).name || 'unknown';\n } else if (responseModel && typeof responseModel === 'object') {\n modelName =\n ((responseModel as Record<string, unknown>).name as string) ??\n ((responseModel as Record<string, unknown>).description as string) ??\n 'schema';\n } else if (typeof responseModel === 'string') {\n modelName = responseModel;\n }\n\n return tracer.startSpan(\n {\n name: 'instructor.create',\n kind: SpanKind.LLM_CALL,\n attributes: {\n framework: 'instructor',\n 'framework.span_kind': 'extraction',\n 'instructor.response_model': modelName,\n ...(params.max_retries != null\n ? { 'instructor.max_retries': params.max_retries }\n : {}),\n ...(params.model != null\n ? { 'gen_ai.request.model': params.model }\n : {}),\n },\n },\n (_span) => {\n const result = value.apply(this, args);\n\n // Handle async results (Promises)\n if (\n result &&\n typeof (result as Promise<unknown>).then === 'function'\n ) {\n return (result as Promise<unknown>).then((r) => r);\n }\n return result;\n },\n );\n };\n }\n\n return value;\n },\n });\n}\n","/**\n * LlamaIndex.TS integration via event handler.\n *\n * LlamaIndex uses a span handler / callback event pattern. This handler\n * receives events with { type, id, parentId, data } and manages the\n * span lifecycle accordingly.\n *\n * Usage:\n * import { RisicareLlamaIndexHandler } from 'risicare/frameworks/llamaindex';\n * const handler = new RisicareLlamaIndexHandler();\n *\n * // Register with LlamaIndex's event system\n * Settings.callbackManager.on('*', (event) => handler.onEvent(event));\n *\n * // For LLM/embedding calls, suppress provider instrumentation:\n * const result = handler.withSuppression(() => query(...));\n *\n * SUPPRESSES provider instrumentation -- LlamaIndex creates its own LLM spans,\n * so provider-level spans (patchOpenAI, etc.) would duplicate.\n */\n\nimport { getTracer } from '../client.js';\nimport { SpanKind } from '../types.js';\nimport { suppressProviderInstrumentation } from '../context/dedup.js';\nimport type { Span } from '../span.js';\n\ninterface SpanEntry {\n span: Span;\n startTime: number;\n componentKind: string;\n}\n\nexport interface LlamaIndexEvent {\n type: string;\n id: string;\n parentId?: string;\n data?: Record<string, unknown>;\n}\n\nexport class RisicareLlamaIndexHandler {\n private _spans = new Map<string, SpanEntry>();\n\n /**\n * Handle a LlamaIndex lifecycle event.\n *\n * Events follow the convention:\n * - `*.start` / `*.begin` -- component starts\n * - `*.end` / `*.complete` -- component finishes\n * - `*.error` -- component failed\n */\n onEvent(event: LlamaIndexEvent): void {\n const tracer = getTracer();\n if (!tracer?.enabled) return;\n\n if (event.type.endsWith('.start') || event.type.endsWith('.begin')) {\n this._handleStart(event);\n } else if (\n event.type.endsWith('.end') ||\n event.type.endsWith('.complete')\n ) {\n this._handleEnd(event);\n } else if (event.type.endsWith('.error')) {\n this._handleError(event);\n }\n }\n\n /**\n * Run a function with provider instrumentation suppressed.\n *\n * LlamaIndex handler creates its own LLM spans, so provider spans\n * (patchOpenAI, patchAnthropic, etc.) should be suppressed to avoid\n * double-tracing.\n */\n withSuppression<T>(fn: () => T): T {\n return suppressProviderInstrumentation(fn);\n }\n\n // ── Internal event handlers ───────────────────────────────────────────────\n\n private _handleStart(event: LlamaIndexEvent): void {\n const tracer = getTracer();\n if (!tracer?.enabled) return;\n\n const componentKind = this._classifyComponent(event.type);\n const parentEntry = event.parentId\n ? this._spans.get(event.parentId)\n : undefined;\n\n const spanKind =\n componentKind === 'llm'\n ? SpanKind.LLM_CALL\n : componentKind === 'retrieval'\n ? SpanKind.RETRIEVAL\n : componentKind === 'embedding'\n ? SpanKind.LLM_CALL\n : SpanKind.INTERNAL;\n\n const span = tracer.createSpan({\n name: event.type.replace(/\\.(start|begin)$/, ''),\n kind: spanKind,\n parentSpanId: parentEntry?.span.spanId,\n traceId: parentEntry?.span.traceId,\n attributes: {\n framework: 'llamaindex',\n 'framework.span_kind': componentKind,\n ...(event.data?.model\n ? { 'gen_ai.request.model': event.data.model }\n : {}),\n },\n });\n\n this._spans.set(event.id, { span, startTime: Date.now(), componentKind });\n }\n\n private _handleEnd(event: LlamaIndexEvent): void {\n const entry = this._spans.get(event.id);\n if (!entry) return;\n\n entry.span.setAttribute(\n 'gen_ai.latency_ms',\n Date.now() - entry.startTime,\n );\n\n // Extract token usage if available\n const usage = event.data?.usage as Record<string, number> | undefined;\n if (usage) {\n entry.span.setLlmFields({\n promptTokens: usage.promptTokens ?? usage.prompt_tokens,\n completionTokens: usage.completionTokens ?? usage.completion_tokens,\n });\n }\n\n if (event.data?.documentCount != null) {\n entry.span.setAttribute(\n 'retriever.document_count',\n event.data.documentCount,\n );\n }\n\n entry.span.end();\n this._spans.delete(event.id);\n }\n\n private _handleError(event: LlamaIndexEvent): void {\n const entry = this._spans.get(event.id);\n if (!entry) return;\n\n const error = event.data?.error;\n entry.span.recordException(\n error instanceof Error ? error : String(error ?? 'Unknown error'),\n );\n entry.span.end();\n this._spans.delete(event.id);\n }\n\n /**\n * Classify a LlamaIndex event type into a component kind.\n */\n private _classifyComponent(eventType: string): string {\n const lower = eventType.toLowerCase();\n if (lower.includes('llm') || lower.includes('chat')) return 'llm';\n if (lower.includes('embed')) return 'embedding';\n if (lower.includes('retriev') || lower.includes('vector')) return 'retrieval';\n if (lower.includes('synth') || lower.includes('response')) return 'synthesis';\n if (lower.includes('query')) return 'query';\n return 'component';\n }\n}\n","/**\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, reportError, score } 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// ─── Streaming ──────────────────────────────────────────────────────────────\n\nexport { tracedStream } from './streaming.js';\nexport type { TracedStreamOptions } from './streaming.js';\n\n// ─── Framework Integrations ─────────────────────────────────────────────────\n\nexport { RisicareCallbackHandler } from './frameworks/langchain.js';\nexport { instrumentLangGraph } from './frameworks/langgraph.js';\nexport { patchInstructor } from './frameworks/instructor.js';\nexport { RisicareLlamaIndexHandler } from './frameworks/llamaindex.js';\n\n// ─── Dedup (for advanced users building custom integrations) ────────────────\n\nexport { suppressProviderInstrumentation, isProviderInstrumentationSuppressed } from './context/dedup.js';\n\n// Fix Runtime (self-healing)\nexport { getFixRuntime, initFixRuntime, shutdownFixRuntime } from './runtime/runtime.js';\nexport type { FixRuntimeConfig, ActiveFix } from './runtime/config.js';\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport { SpanKind, SpanStatus, SemanticPhase, AgentRole, MessageType } from './types.js';\n"],"mappings":"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","names":["SDK_VERSION","G","debug","SpanKind","SpanStatus","SemanticPhase","AgentRole","MessageType","session","agent","initFixRuntime","shutdownFixRuntime","getTracer","createHash","getTracer","agent","getTracer","session","getTracer","getTracer","session","agent","getTracer","getTracer","getTracer","getTracer","getTracer"]}