@amplitude/ai 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/instrument-with-amplitude-ai.md +12 -0
- package/.cursor/skills/instrument-with-amplitude-ai/SKILL.md +4 -42
- package/AGENTS.md +86 -28
- package/README.md +190 -111
- package/amplitude-ai.md +463 -0
- package/bin/amplitude-ai-doctor.mjs +0 -0
- package/bin/amplitude-ai-instrument.mjs +0 -0
- package/bin/amplitude-ai-mcp.mjs +0 -0
- package/bin/amplitude-ai-register-catalog.mjs +0 -0
- package/bin/amplitude-ai-status.mjs +0 -0
- package/bin/amplitude-ai.mjs +14 -5
- package/data/agent_event_catalog.json +52 -2
- package/dist/bound-agent.d.ts +18 -14
- package/dist/bound-agent.d.ts.map +1 -1
- package/dist/bound-agent.js +4 -1
- package/dist/bound-agent.js.map +1 -1
- package/dist/cli/status.d.ts.map +1 -1
- package/dist/cli/status.js +31 -19
- package/dist/cli/status.js.map +1 -1
- package/dist/client.d.ts +14 -14
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +38 -0
- package/dist/client.js.map +1 -1
- package/dist/context.d.ts +5 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +4 -0
- package/dist/context.js.map +1 -1
- package/dist/core/constants.d.ts +3 -1
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +3 -1
- package/dist/core/constants.js.map +1 -1
- package/dist/core/tracking.d.ts +12 -2
- package/dist/core/tracking.d.ts.map +1 -1
- package/dist/core/tracking.js +13 -2
- package/dist/core/tracking.js.map +1 -1
- package/dist/decorators.d.ts +1 -1
- package/dist/decorators.d.ts.map +1 -1
- package/dist/decorators.js +4 -3
- package/dist/decorators.js.map +1 -1
- package/dist/index.d.ts +7 -4
- package/dist/index.js +5 -2
- package/dist/mcp/contract.d.ts +4 -0
- package/dist/mcp/contract.d.ts.map +1 -1
- package/dist/mcp/contract.js +6 -2
- package/dist/mcp/contract.js.map +1 -1
- package/dist/mcp/generate-verify-test.d.ts +7 -0
- package/dist/mcp/generate-verify-test.d.ts.map +1 -0
- package/dist/mcp/generate-verify-test.js +33 -0
- package/dist/mcp/generate-verify-test.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -1
- package/dist/mcp/index.js +2 -1
- package/dist/mcp/instrument-file.d.ts +14 -0
- package/dist/mcp/instrument-file.d.ts.map +1 -0
- package/dist/mcp/instrument-file.js +136 -0
- package/dist/mcp/instrument-file.js.map +1 -0
- package/dist/mcp/scan-project.d.ts +52 -0
- package/dist/mcp/scan-project.d.ts.map +1 -0
- package/dist/mcp/scan-project.js +309 -0
- package/dist/mcp/scan-project.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +79 -4
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/validate-file.d.ts +4 -0
- package/dist/mcp/validate-file.d.ts.map +1 -1
- package/dist/mcp/validate-file.js +559 -11
- package/dist/mcp/validate-file.js.map +1 -1
- package/dist/middleware.js +2 -1
- package/dist/middleware.js.map +1 -1
- package/dist/node_modules/.pnpm/acorn-typescript@1.4.13_acorn@8.16.0/node_modules/acorn-typescript/lib/index.js +2389 -0
- package/dist/node_modules/.pnpm/acorn-typescript@1.4.13_acorn@8.16.0/node_modules/acorn-typescript/lib/index.js.map +1 -0
- package/dist/node_modules/.pnpm/acorn@8.16.0/node_modules/acorn/dist/acorn.js +5128 -0
- package/dist/node_modules/.pnpm/acorn@8.16.0/node_modules/acorn/dist/acorn.js.map +1 -0
- package/dist/node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.js +1 -1
- package/dist/propagation.d.ts.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +1 -0
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/base.d.ts +2 -1
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +4 -0
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/mistral.d.ts.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +2 -0
- package/dist/providers/openai.js.map +1 -1
- package/dist/serverless.d.ts +19 -0
- package/dist/serverless.d.ts.map +1 -0
- package/dist/serverless.js +35 -0
- package/dist/serverless.js.map +1 -0
- package/dist/session.d.ts +24 -8
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +20 -1
- package/dist/session.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/llms-full.txt +353 -69
- package/llms.txt +6 -2
- package/mcp.schema.json +7 -3
- package/package.json +10 -5
- package/bin/amplitude-ai-init.mjs +0 -27
- package/dist/cli/init.d.ts +0 -14
- package/dist/cli/init.d.ts.map +0 -1
- package/dist/cli/init.js +0 -40
- package/dist/cli/init.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracking.js","names":["serialized: string","properties: Record<string, unknown>","event: AmplitudeEvent"],"sources":["../../src/core/tracking.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { ValidationError } from '../exceptions.js';\nimport type {\n AmplitudeEvent,\n AmplitudeLike,\n Attachment,\n ToolCallShape,\n} from '../types.js';\nimport { getLogger } from '../utils/logger.js';\nimport { inferModelTier } from '../utils/model-tiers.js';\nimport {\n EVENT_AI_RESPONSE,\n EVENT_EMBEDDING,\n EVENT_SCORE,\n EVENT_SESSION_END,\n EVENT_SESSION_ENRICHMENT,\n EVENT_SPAN,\n EVENT_TOOL_CALL,\n EVENT_USER_MESSAGE,\n MAX_SERIALIZED_LENGTH,\n PROP_ABANDONMENT_TURN,\n PROP_AGENT_ID,\n PROP_AGENT_VERSION,\n PROP_ATTACHMENT_COUNT,\n PROP_ATTACHMENT_TYPES,\n PROP_ATTACHMENTS,\n PROP_CACHE_CREATION_TOKENS,\n PROP_CACHE_READ_TOKENS,\n PROP_COMMENT,\n PROP_COMPONENT_TYPE,\n PROP_CONTEXT,\n PROP_COST_USD,\n PROP_CUSTOMER_ORG_ID,\n PROP_EDITED_MESSAGE_ID,\n PROP_EMBEDDING_DIMENSIONS,\n PROP_ENRICHMENTS,\n PROP_ENV,\n PROP_ERROR_MESSAGE,\n PROP_EVALUATION_SOURCE,\n PROP_FINISH_REASON,\n PROP_HAS_ATTACHMENTS,\n PROP_IDLE_TIMEOUT_MINUTES,\n PROP_INPUT_STATE,\n PROP_INPUT_TOKENS,\n PROP_INVOCATION_ID,\n PROP_IS_EDIT,\n PROP_IS_ERROR,\n PROP_IS_REGENERATION,\n PROP_IS_STREAMING,\n PROP_LATENCY_MS,\n PROP_LOCALE,\n PROP_MAX_OUTPUT_TOKENS,\n PROP_MESSAGE_ID,\n PROP_MESSAGE_LABELS,\n PROP_MODEL_NAME,\n PROP_MODEL_TIER,\n PROP_OUTPUT_STATE,\n PROP_OUTPUT_TOKENS,\n PROP_PARENT_AGENT_ID,\n PROP_PARENT_MESSAGE_ID,\n PROP_PARENT_SPAN_ID,\n PROP_PROMPT_ID,\n PROP_PROVIDER,\n PROP_REASONING_TOKENS,\n PROP_RUNTIME,\n PROP_SCORE_NAME,\n PROP_SCORE_VALUE,\n PROP_SDK_VERSION,\n PROP_SESSION_ID,\n PROP_SPAN_ID,\n PROP_SPAN_KIND,\n PROP_SPAN_NAME,\n PROP_TARGET_ID,\n PROP_TARGET_TYPE,\n PROP_TEMPERATURE,\n PROP_TOOL_CALLS,\n PROP_TOOL_INPUT,\n PROP_TOOL_NAME,\n PROP_TOOL_OUTPUT,\n PROP_TOOL_SUCCESS,\n PROP_TOP_P,\n PROP_TOTAL_ATTACHMENT_SIZE,\n PROP_TOTAL_TOKENS,\n PROP_TRACE_ID,\n PROP_TTFB_MS,\n PROP_TURN_ID,\n PROP_WAS_CACHED,\n PROP_WAS_COPIED,\n SDK_RUNTIME,\n SDK_VERSION,\n} from './constants.js';\nimport type { MessageLabel, SessionEnrichments } from './enrichments.js';\nimport {\n getTextFromLlmMessage,\n PrivacyConfig,\n sanitizeStructuredContent,\n} from './privacy.js';\n\n// Re-export constants and SDK_VERSION for public API\nexport * from './constants.js';\n\nfunction validateRequiredStr(value: unknown, fieldName: string): void {\n if (typeof value !== 'string' || !value) {\n throw new ValidationError(\n `${fieldName} must be a non-empty string, got ${String(value)}`,\n );\n }\n}\n\nfunction validateNonNegative(value: unknown, fieldName: string): void {\n if (typeof value === 'number' && value < 0) {\n throw new ValidationError(`${fieldName} must be >= 0, got ${value}`);\n }\n}\n\nfunction validateNumeric(value: unknown, fieldName: string): void {\n if (typeof value !== 'number') {\n throw new ValidationError(\n `${fieldName} must be numeric, got ${typeof value}`,\n );\n }\n}\n\nexport function serializeToJsonString(\n value: unknown,\n maxLength = MAX_SERIALIZED_LENGTH,\n): string {\n let serialized: string;\n try {\n serialized = JSON.stringify(value);\n } catch {\n serialized = String(value);\n }\n\n if (serialized.length > maxLength) {\n const truncateAt = Math.max(0, maxLength - 14);\n return `${serialized.slice(0, truncateAt)}...[truncated]`;\n }\n return serialized;\n}\n\nfunction withSdkManagedProperties(\n eventProperties: Record<string, unknown> | null | undefined,\n managedProperties: Record<string, unknown>,\n): Record<string, unknown> {\n // SDK-managed keys must win over caller-provided eventProperties.\n return { ...(eventProperties ?? {}), ...managedProperties };\n}\n\n// --------------------------------------------------------\n// track_user_message\n// --------------------------------------------------------\n\nexport interface TrackUserMessageOptions {\n amplitude: AmplitudeLike;\n userId: string;\n messageContent: string;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number;\n messageId?: string | null;\n conversationId?: string | null;\n env?: string | null;\n locale?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n isRegeneration?: boolean;\n isEdit?: boolean;\n editedMessageId?: string | null;\n attachments?: Attachment[] | null;\n labels?: MessageLabel[] | null;\n eventProperties?: Record<string, unknown> | null;\n userProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackUserMessage(opts: TrackUserMessageOptions): string {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateRequiredStr(opts.sessionId, 'sessionId');\n }\n\n const messageId = opts.messageId || randomUUID();\n const contentData = pc.sanitizeContent(opts.messageContent);\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_TURN_ID]: opts.turnId ?? 1,\n [PROP_MESSAGE_ID]: messageId,\n [PROP_COMPONENT_TYPE]: 'user_input',\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.sessionId) properties[PROP_SESSION_ID] = opts.sessionId;\n if (opts.traceId) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.conversationId && !opts.sessionId)\n properties[PROP_SESSION_ID] = opts.conversationId;\n if (opts.env) properties[PROP_ENV] = opts.env;\n if (opts.locale) properties[PROP_LOCALE] = opts.locale;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n\n if (opts.isRegeneration) properties[PROP_IS_REGENERATION] = true;\n if (opts.isEdit) properties[PROP_IS_EDIT] = true;\n if (opts.editedMessageId)\n properties[PROP_EDITED_MESSAGE_ID] = opts.editedMessageId;\n\n if (opts.attachments?.length) {\n properties[PROP_HAS_ATTACHMENTS] = true;\n properties[PROP_ATTACHMENT_COUNT] = opts.attachments.length;\n const types = [\n ...new Set(opts.attachments.map((a) => String(a.type ?? 'unknown'))),\n ];\n properties[PROP_ATTACHMENT_TYPES] = types;\n const totalSize = opts.attachments.reduce(\n (sum, a) => sum + (typeof a.size_bytes === 'number' ? a.size_bytes : 0),\n 0,\n );\n if (totalSize > 0) properties[PROP_TOTAL_ATTACHMENT_SIZE] = totalSize;\n properties[PROP_ATTACHMENTS] = serializeToJsonString(opts.attachments);\n }\n\n if (opts.labels?.length) {\n properties[PROP_MESSAGE_LABELS] = serializeToJsonString(\n opts.labels.map((lbl) => lbl.toDict()),\n );\n }\n\n Object.assign(properties, contentData);\n\n const event: AmplitudeEvent = {\n event_type: EVENT_USER_MESSAGE,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.userProperties) event.user_properties = opts.userProperties;\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_USER_MESSAGE} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(\n `Failed to track ${EVENT_USER_MESSAGE}: ${e}`,\n );\n }\n\n return messageId;\n}\n\n// --------------------------------------------------------\n// track_ai_message\n// --------------------------------------------------------\n\nexport interface TrackAiMessageOptions {\n amplitude: AmplitudeLike;\n userId: string;\n modelName: string;\n provider: string;\n responseContent: string;\n latencyMs: number;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number;\n messageId?: string | null;\n conversationId?: string | null;\n inputTokens?: number | null;\n outputTokens?: number | null;\n totalTokens?: number | null;\n reasoningTokens?: number | null;\n cacheReadInputTokens?: number | null;\n cacheCreationInputTokens?: number | null;\n totalCostUsd?: number | null;\n providerTtfbMs?: number | null;\n isError?: boolean;\n errorMessage?: string | null;\n finishReason?: string | null;\n toolCalls?: Array<ToolCallShape | Record<string, unknown>> | null;\n reasoningContent?: string | null;\n systemPrompt?: string | null;\n temperature?: number | null;\n maxOutputTokens?: number | null;\n topP?: number | null;\n isStreaming?: boolean | null;\n promptId?: string | null;\n wasCopied?: boolean;\n wasCached?: boolean;\n modelTier?: string | null;\n attachments?: Attachment[] | null;\n labels?: MessageLabel[] | null;\n env?: string | null;\n locale?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n spanKind?: string | null;\n eventProperties?: Record<string, unknown> | null;\n userProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackAiMessage(opts: TrackAiMessageOptions): string {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateRequiredStr(opts.modelName, 'model');\n validateNonNegative(opts.latencyMs, 'latencyMs');\n }\n\n const messageId = opts.messageId || randomUUID();\n const contentData = pc.sanitizeContent(opts.responseContent);\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_TURN_ID]: opts.turnId ?? 2,\n [PROP_MESSAGE_ID]: messageId,\n [PROP_MODEL_NAME]: opts.modelName,\n [PROP_PROVIDER]: opts.provider,\n [PROP_LATENCY_MS]: opts.latencyMs,\n [PROP_IS_ERROR]: opts.isError ?? false,\n [PROP_COMPONENT_TYPE]: 'llm',\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.sessionId) properties[PROP_SESSION_ID] = opts.sessionId;\n if (opts.traceId) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.conversationId && !opts.sessionId)\n properties[PROP_SESSION_ID] = opts.conversationId;\n if (opts.env) properties[PROP_ENV] = opts.env;\n if (opts.locale) properties[PROP_LOCALE] = opts.locale;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.spanKind) properties[PROP_SPAN_KIND] = opts.spanKind;\n\n if (opts.wasCopied) properties[PROP_WAS_COPIED] = true;\n if (opts.wasCached) properties[PROP_WAS_CACHED] = true;\n\n // Model tier (user override or auto-inferred)\n if (opts.modelTier != null) {\n properties[PROP_MODEL_TIER] = opts.modelTier;\n } else {\n properties[PROP_MODEL_TIER] = inferModelTier(opts.modelName);\n }\n\n Object.assign(properties, contentData);\n\n // Token usage\n if (opts.inputTokens != null)\n properties[PROP_INPUT_TOKENS] = opts.inputTokens;\n if (opts.outputTokens != null)\n properties[PROP_OUTPUT_TOKENS] = opts.outputTokens;\n if (opts.totalTokens != null)\n properties[PROP_TOTAL_TOKENS] = opts.totalTokens;\n if (opts.reasoningTokens != null)\n properties[PROP_REASONING_TOKENS] = opts.reasoningTokens;\n if (opts.cacheReadInputTokens != null)\n properties[PROP_CACHE_READ_TOKENS] = opts.cacheReadInputTokens;\n if (opts.cacheCreationInputTokens != null)\n properties[PROP_CACHE_CREATION_TOKENS] = opts.cacheCreationInputTokens;\n\n if (opts.totalCostUsd != null) properties[PROP_COST_USD] = opts.totalCostUsd;\n if (opts.providerTtfbMs != null)\n properties[PROP_TTFB_MS] = opts.providerTtfbMs;\n if (opts.finishReason != null)\n properties[PROP_FINISH_REASON] = opts.finishReason;\n if (opts.errorMessage != null)\n properties[PROP_ERROR_MESSAGE] = opts.errorMessage;\n if (opts.toolCalls != null)\n properties[PROP_TOOL_CALLS] = serializeToJsonString(opts.toolCalls);\n\n // Reasoning content\n const reasoningProps = pc.sanitizeReasoningContent(\n opts.reasoningContent ?? null,\n opts.reasoningTokens,\n );\n Object.assign(properties, reasoningProps);\n\n // System prompt\n const systemPromptProps = pc.sanitizeSystemPrompt(opts.systemPrompt ?? null);\n Object.assign(properties, systemPromptProps);\n\n if (opts.temperature != null) properties[PROP_TEMPERATURE] = opts.temperature;\n if (opts.maxOutputTokens != null)\n properties[PROP_MAX_OUTPUT_TOKENS] = opts.maxOutputTokens;\n if (opts.topP != null) properties[PROP_TOP_P] = opts.topP;\n if (opts.isStreaming != null)\n properties[PROP_IS_STREAMING] = opts.isStreaming;\n if (opts.promptId != null) properties[PROP_PROMPT_ID] = opts.promptId;\n\n if (opts.attachments?.length) {\n properties[PROP_HAS_ATTACHMENTS] = true;\n properties[PROP_ATTACHMENT_COUNT] = opts.attachments.length;\n const types = [\n ...new Set(opts.attachments.map((a) => String(a.type ?? 'unknown'))),\n ];\n properties[PROP_ATTACHMENT_TYPES] = types;\n const totalSize = opts.attachments.reduce(\n (sum, a) => sum + (typeof a.size_bytes === 'number' ? a.size_bytes : 0),\n 0,\n );\n if (totalSize > 0) properties[PROP_TOTAL_ATTACHMENT_SIZE] = totalSize;\n properties[PROP_ATTACHMENTS] = serializeToJsonString(opts.attachments);\n }\n\n if (opts.labels?.length) {\n properties[PROP_MESSAGE_LABELS] = serializeToJsonString(\n opts.labels.map((lbl) => lbl.toDict()),\n );\n }\n\n const event: AmplitudeEvent = {\n event_type: EVENT_AI_RESPONSE,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.userProperties) event.user_properties = opts.userProperties;\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_AI_RESPONSE} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(\n `Failed to track ${EVENT_AI_RESPONSE}: ${e}`,\n );\n }\n\n return messageId;\n}\n\n// --------------------------------------------------------\n// track_tool_call\n// --------------------------------------------------------\n\nexport interface TrackToolCallOptions {\n amplitude: AmplitudeLike;\n userId: string;\n toolName: string;\n success: boolean;\n latencyMs: number;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number;\n toolInput?: unknown;\n toolOutput?: unknown;\n invocationId?: string | null;\n conversationId?: string | null;\n parentMessageId?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n errorMessage?: string | null;\n env?: string | null;\n locale?: string | null;\n spanKind?: string | null;\n eventProperties?: Record<string, unknown> | null;\n userProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackToolCall(opts: TrackToolCallOptions): string {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateRequiredStr(opts.toolName, 'toolName');\n validateNonNegative(opts.latencyMs, 'latencyMs');\n }\n\n const invocationId = opts.invocationId || randomUUID();\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_TURN_ID]: opts.turnId ?? 1,\n [PROP_INVOCATION_ID]: invocationId,\n [PROP_TOOL_NAME]: opts.toolName,\n [PROP_TOOL_SUCCESS]: opts.success,\n [PROP_IS_ERROR]: !opts.success,\n [PROP_LATENCY_MS]: opts.latencyMs,\n [PROP_COMPONENT_TYPE]: 'tool',\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.sessionId) properties[PROP_SESSION_ID] = opts.sessionId;\n if (opts.traceId) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.conversationId && !opts.sessionId)\n properties[PROP_SESSION_ID] = opts.conversationId;\n if (opts.parentMessageId)\n properties[PROP_PARENT_MESSAGE_ID] = opts.parentMessageId;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.errorMessage) properties[PROP_ERROR_MESSAGE] = opts.errorMessage;\n if (opts.env) properties[PROP_ENV] = opts.env;\n if (opts.locale) properties[PROP_LOCALE] = opts.locale;\n if (opts.spanKind) properties[PROP_SPAN_KIND] = opts.spanKind;\n\n let effectiveMode = pc.contentMode;\n if (effectiveMode == null)\n effectiveMode = pc.privacyMode ? 'metadata_only' : 'full';\n\n if (opts.toolInput != null && effectiveMode === 'full') {\n const sanitized = sanitizeStructuredContent(opts.toolInput, pc.redactPii);\n properties[PROP_TOOL_INPUT] = serializeToJsonString(sanitized);\n }\n\n if (opts.toolOutput != null && effectiveMode === 'full') {\n const sanitized = sanitizeStructuredContent(opts.toolOutput, pc.redactPii);\n properties[PROP_TOOL_OUTPUT] = serializeToJsonString(sanitized);\n }\n\n const event: AmplitudeEvent = {\n event_type: EVENT_TOOL_CALL,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.userProperties) event.user_properties = opts.userProperties;\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_TOOL_CALL} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(`Failed to track ${EVENT_TOOL_CALL}: ${e}`);\n }\n\n return invocationId;\n}\n\n// --------------------------------------------------------\n// track_conversation\n// --------------------------------------------------------\n\nexport interface TrackConversationOptions {\n amplitude: AmplitudeLike;\n userId: string;\n messages: Array<Record<string, unknown>>;\n sessionId?: string | null;\n conversationId?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n userProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackConversation(opts: TrackConversationOptions): void {\n const effectiveSessionId =\n opts.sessionId ?? opts.conversationId ?? randomUUID();\n let turnId = 1;\n\n for (const message of opts.messages) {\n const role = String(message.role ?? '');\n const content = String(message.content ?? '');\n\n if (role === 'user') {\n trackUserMessage({\n amplitude: opts.amplitude,\n userId: opts.userId,\n messageContent: content,\n sessionId: effectiveSessionId,\n turnId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n context: opts.context,\n env: opts.env,\n eventProperties: opts.eventProperties,\n userProperties: opts.userProperties,\n groups: opts.groups,\n privacyConfig: opts.privacyConfig,\n });\n } else if (role === 'assistant' || role === 'ai') {\n trackAiMessage({\n amplitude: opts.amplitude,\n userId: opts.userId,\n modelName: String(message.model ?? 'unknown'),\n provider: String(message.provider ?? 'unknown'),\n responseContent: content,\n latencyMs: Number(message.latency_ms ?? 0),\n sessionId: effectiveSessionId,\n turnId,\n inputTokens: message.input_tokens as number | undefined,\n outputTokens: message.output_tokens as number | undefined,\n totalTokens: message.total_tokens as number | undefined,\n totalCostUsd: message.total_cost_usd as number | undefined,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n context: opts.context,\n env: opts.env,\n eventProperties: opts.eventProperties,\n userProperties: opts.userProperties,\n groups: opts.groups,\n privacyConfig: opts.privacyConfig,\n });\n }\n\n turnId++;\n }\n}\n\n// --------------------------------------------------------\n// track_embedding\n// --------------------------------------------------------\n\nexport interface TrackEmbeddingOptions {\n amplitude: AmplitudeLike;\n userId: string;\n model: string;\n provider: string;\n latencyMs: number;\n inputTokens?: number | null;\n dimensions?: number | null;\n totalCostUsd?: number | null;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackEmbedding(opts: TrackEmbeddingOptions): string {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateNonNegative(opts.latencyMs, 'latencyMs');\n }\n\n const spanId = randomUUID();\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_SPAN_ID]: spanId,\n [PROP_MODEL_NAME]: opts.model,\n [PROP_PROVIDER]: opts.provider,\n [PROP_LATENCY_MS]: opts.latencyMs,\n [PROP_COMPONENT_TYPE]: 'embedding',\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.sessionId) properties[PROP_SESSION_ID] = opts.sessionId;\n if (opts.traceId != null) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.turnId != null) properties[PROP_TURN_ID] = opts.turnId;\n if (opts.inputTokens != null)\n properties[PROP_INPUT_TOKENS] = opts.inputTokens;\n if (opts.dimensions != null)\n properties[PROP_EMBEDDING_DIMENSIONS] = opts.dimensions;\n if (opts.totalCostUsd != null) properties[PROP_COST_USD] = opts.totalCostUsd;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.env) properties[PROP_ENV] = opts.env;\n\n const event: AmplitudeEvent = {\n event_type: EVENT_EMBEDDING,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_EMBEDDING} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(`Failed to track ${EVENT_EMBEDDING}: ${e}`);\n }\n\n return spanId;\n}\n\n// --------------------------------------------------------\n// track_span\n// --------------------------------------------------------\n\nexport interface TrackSpanOptions {\n amplitude: AmplitudeLike;\n userId: string;\n spanName: string;\n traceId: string;\n latencyMs: number;\n inputState?: Record<string, unknown> | null;\n outputState?: Record<string, unknown> | null;\n parentSpanId?: string | null;\n isError?: boolean;\n errorMessage?: string | null;\n sessionId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackSpan(opts: TrackSpanOptions): string {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateNonNegative(opts.latencyMs, 'latencyMs');\n }\n\n const spanId = randomUUID();\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_SPAN_ID]: spanId,\n [PROP_SPAN_NAME]: opts.spanName,\n [PROP_TRACE_ID]: opts.traceId,\n [PROP_LATENCY_MS]: opts.latencyMs,\n [PROP_IS_ERROR]: opts.isError ?? false,\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.sessionId) properties[PROP_SESSION_ID] = opts.sessionId;\n if (opts.turnId != null) properties[PROP_TURN_ID] = opts.turnId;\n if (opts.parentSpanId) properties[PROP_PARENT_SPAN_ID] = opts.parentSpanId;\n if (opts.errorMessage) properties[PROP_ERROR_MESSAGE] = opts.errorMessage;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.env) properties[PROP_ENV] = opts.env;\n\n let effectiveMode = pc.contentMode;\n if (effectiveMode == null)\n effectiveMode = pc.privacyMode ? 'metadata_only' : 'full';\n\n if (opts.inputState != null && effectiveMode === 'full') {\n const sanitized = sanitizeStructuredContent(opts.inputState, pc.redactPii);\n properties[PROP_INPUT_STATE] = serializeToJsonString(sanitized);\n }\n\n if (opts.outputState != null && effectiveMode === 'full') {\n const sanitized = sanitizeStructuredContent(opts.outputState, pc.redactPii);\n properties[PROP_OUTPUT_STATE] = serializeToJsonString(sanitized);\n }\n\n const event: AmplitudeEvent = {\n event_type: EVENT_SPAN,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_SPAN} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(`Failed to track ${EVENT_SPAN}: ${e}`);\n }\n\n return spanId;\n}\n\n// --------------------------------------------------------\n// track_session_end\n// --------------------------------------------------------\n\nexport interface TrackSessionEndOptions {\n amplitude: AmplitudeLike;\n userId: string;\n sessionId: string;\n enrichments?: SessionEnrichments | null;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n abandonmentTurn?: number | null;\n idleTimeoutMinutes?: number | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackSessionEnd(opts: TrackSessionEndOptions): void {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateRequiredStr(opts.sessionId, 'sessionId');\n }\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_SESSION_ID]: opts.sessionId,\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.traceId != null) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.turnId != null) properties[PROP_TURN_ID] = opts.turnId;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.env) properties[PROP_ENV] = opts.env;\n if (opts.abandonmentTurn != null)\n properties[PROP_ABANDONMENT_TURN] = opts.abandonmentTurn;\n if (opts.idleTimeoutMinutes != null)\n properties[PROP_IDLE_TIMEOUT_MINUTES] = opts.idleTimeoutMinutes;\n\n if (opts.enrichments != null) {\n const enrichmentDict =\n typeof opts.enrichments.toDict === 'function'\n ? opts.enrichments.toDict()\n : opts.enrichments;\n properties[PROP_ENRICHMENTS] = serializeToJsonString(enrichmentDict);\n }\n\n const event: AmplitudeEvent = {\n event_type: EVENT_SESSION_END,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_SESSION_END} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(\n `Failed to track ${EVENT_SESSION_END}: ${e}`,\n );\n }\n}\n\n// --------------------------------------------------------\n// track_session_enrichment\n// --------------------------------------------------------\n\nexport interface TrackSessionEnrichmentOptions {\n amplitude: AmplitudeLike;\n userId: string;\n sessionId: string;\n enrichments: SessionEnrichments;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackSessionEnrichment(\n opts: TrackSessionEnrichmentOptions,\n): void {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateRequiredStr(opts.sessionId, 'sessionId');\n }\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_SESSION_ID]: opts.sessionId,\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.traceId != null) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.turnId != null) properties[PROP_TURN_ID] = opts.turnId;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.env) properties[PROP_ENV] = opts.env;\n\n const enrichmentDict =\n typeof opts.enrichments.toDict === 'function'\n ? opts.enrichments.toDict()\n : opts.enrichments;\n properties[PROP_ENRICHMENTS] = serializeToJsonString(enrichmentDict);\n\n const event: AmplitudeEvent = {\n event_type: EVENT_SESSION_ENRICHMENT,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_SESSION_ENRICHMENT} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(\n `Failed to track ${EVENT_SESSION_ENRICHMENT}: ${e}`,\n );\n }\n}\n\n// --------------------------------------------------------\n// track_score\n// --------------------------------------------------------\n\nexport interface TrackScoreOptions {\n amplitude: AmplitudeLike;\n userId: string;\n name: string;\n value: number;\n targetId: string;\n targetType?: string;\n source?: string;\n comment?: string | null;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackScore(opts: TrackScoreOptions): void {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateNumeric(opts.value, 'value');\n }\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_SCORE_NAME]: opts.name,\n [PROP_SCORE_VALUE]: opts.value,\n [PROP_TARGET_ID]: opts.targetId,\n [PROP_TARGET_TYPE]: opts.targetType ?? 'message',\n [PROP_EVALUATION_SOURCE]: opts.source ?? 'user',\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.sessionId) properties[PROP_SESSION_ID] = opts.sessionId;\n if (opts.traceId != null) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.turnId != null) properties[PROP_TURN_ID] = opts.turnId;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.env) properties[PROP_ENV] = opts.env;\n\n // Comment respects content_mode\n if (opts.comment != null) {\n const commentData = pc.sanitizeContent(opts.comment);\n if ('$llm_message' in commentData) {\n const msg = commentData.$llm_message as Record<string, unknown>;\n properties[PROP_COMMENT] = getTextFromLlmMessage(msg);\n }\n }\n\n const event: AmplitudeEvent = {\n event_type: EVENT_SCORE,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_SCORE} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(`Failed to track ${EVENT_SCORE}: ${e}`);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tracking.js","names":["serialized: string","properties: Record<string, unknown>","event: AmplitudeEvent"],"sources":["../../src/core/tracking.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { ValidationError } from '../exceptions.js';\nimport type {\n AmplitudeEvent,\n AmplitudeLike,\n Attachment,\n ToolCallShape,\n} from '../types.js';\nimport { getLogger } from '../utils/logger.js';\nimport { inferModelTier } from '../utils/model-tiers.js';\nimport {\n EVENT_AI_RESPONSE,\n EVENT_EMBEDDING,\n EVENT_SCORE,\n EVENT_SESSION_END,\n EVENT_SESSION_ENRICHMENT,\n EVENT_SPAN,\n EVENT_TOOL_CALL,\n EVENT_USER_MESSAGE,\n MAX_SERIALIZED_LENGTH,\n PROP_ABANDONMENT_TURN,\n PROP_AGENT_DESCRIPTION,\n PROP_AGENT_ID,\n PROP_AGENT_VERSION,\n PROP_ATTACHMENT_COUNT,\n PROP_ATTACHMENT_TYPES,\n PROP_ATTACHMENTS,\n PROP_CACHE_CREATION_TOKENS,\n PROP_CACHE_READ_TOKENS,\n PROP_COMMENT,\n PROP_COMPONENT_TYPE,\n PROP_CONTEXT,\n PROP_COST_USD,\n PROP_CUSTOMER_ORG_ID,\n PROP_EDITED_MESSAGE_ID,\n PROP_EMBEDDING_DIMENSIONS,\n PROP_ENRICHMENTS,\n PROP_ENV,\n PROP_ERROR_MESSAGE,\n PROP_EVALUATION_SOURCE,\n PROP_FINISH_REASON,\n PROP_HAS_ATTACHMENTS,\n PROP_IDLE_TIMEOUT_MINUTES,\n PROP_INPUT_STATE,\n PROP_INPUT_TOKENS,\n PROP_INVOCATION_ID,\n PROP_IS_EDIT,\n PROP_IS_ERROR,\n PROP_IS_REGENERATION,\n PROP_IS_STREAMING,\n PROP_LATENCY_MS,\n PROP_LOCALE,\n PROP_MAX_OUTPUT_TOKENS,\n PROP_MESSAGE_ID,\n PROP_MESSAGE_LABELS,\n PROP_MESSAGE_SOURCE,\n PROP_MODEL_NAME,\n PROP_MODEL_TIER,\n PROP_OUTPUT_STATE,\n PROP_OUTPUT_TOKENS,\n PROP_PARENT_AGENT_ID,\n PROP_PARENT_MESSAGE_ID,\n PROP_PARENT_SPAN_ID,\n PROP_PROMPT_ID,\n PROP_PROVIDER,\n PROP_REASONING_TOKENS,\n PROP_RUNTIME,\n PROP_SCORE_NAME,\n PROP_SCORE_VALUE,\n PROP_SDK_VERSION,\n PROP_SESSION_ID,\n PROP_SPAN_ID,\n PROP_SPAN_KIND,\n PROP_SPAN_NAME,\n PROP_TARGET_ID,\n PROP_TARGET_TYPE,\n PROP_TEMPERATURE,\n PROP_TOOL_CALLS,\n PROP_TOOL_INPUT,\n PROP_TOOL_NAME,\n PROP_TOOL_OUTPUT,\n PROP_TOOL_SUCCESS,\n PROP_TOP_P,\n PROP_TOTAL_ATTACHMENT_SIZE,\n PROP_TOTAL_TOKENS,\n PROP_TRACE_ID,\n PROP_TTFB_MS,\n PROP_TURN_ID,\n PROP_WAS_CACHED,\n PROP_WAS_COPIED,\n SDK_RUNTIME,\n SDK_VERSION,\n} from './constants.js';\nimport type { MessageLabel, SessionEnrichments } from './enrichments.js';\nimport {\n getTextFromLlmMessage,\n PrivacyConfig,\n sanitizeStructuredContent,\n} from './privacy.js';\n\n// Re-export constants and SDK_VERSION for public API\nexport * from './constants.js';\n\nfunction validateRequiredStr(value: unknown, fieldName: string): void {\n if (typeof value !== 'string' || !value) {\n throw new ValidationError(\n `${fieldName} must be a non-empty string, got ${String(value)}`,\n );\n }\n}\n\nfunction validateNonNegative(value: unknown, fieldName: string): void {\n if (typeof value === 'number' && value < 0) {\n throw new ValidationError(`${fieldName} must be >= 0, got ${value}`);\n }\n}\n\nfunction validateNumeric(value: unknown, fieldName: string): void {\n if (typeof value !== 'number') {\n throw new ValidationError(\n `${fieldName} must be numeric, got ${typeof value}`,\n );\n }\n}\n\nexport function serializeToJsonString(\n value: unknown,\n maxLength = MAX_SERIALIZED_LENGTH,\n): string {\n let serialized: string;\n try {\n serialized = JSON.stringify(value);\n } catch {\n serialized = String(value);\n }\n\n if (serialized.length > maxLength) {\n const truncateAt = Math.max(0, maxLength - 14);\n return `${serialized.slice(0, truncateAt)}...[truncated]`;\n }\n return serialized;\n}\n\nfunction withSdkManagedProperties(\n eventProperties: Record<string, unknown> | null | undefined,\n managedProperties: Record<string, unknown>,\n): Record<string, unknown> {\n // SDK-managed keys must win over caller-provided eventProperties.\n return { ...(eventProperties ?? {}), ...managedProperties };\n}\n\n// --------------------------------------------------------\n// track_user_message\n// --------------------------------------------------------\n\nexport interface TrackUserMessageOptions {\n amplitude: AmplitudeLike;\n userId: string;\n messageContent: string;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number;\n messageId?: string | null;\n conversationId?: string | null;\n env?: string | null;\n locale?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n isRegeneration?: boolean;\n isEdit?: boolean;\n editedMessageId?: string | null;\n attachments?: Attachment[] | null;\n messageSource?: string | null;\n labels?: MessageLabel[] | null;\n eventProperties?: Record<string, unknown> | null;\n userProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackUserMessage(opts: TrackUserMessageOptions): string {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateRequiredStr(opts.sessionId, 'sessionId');\n }\n\n const messageId = opts.messageId || randomUUID();\n const contentData = pc.sanitizeContent(opts.messageContent);\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_TURN_ID]: opts.turnId ?? 1,\n [PROP_MESSAGE_ID]: messageId,\n [PROP_COMPONENT_TYPE]: 'user_input',\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.sessionId) properties[PROP_SESSION_ID] = opts.sessionId;\n if (opts.traceId) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.conversationId && !opts.sessionId)\n properties[PROP_SESSION_ID] = opts.conversationId;\n if (opts.env) properties[PROP_ENV] = opts.env;\n if (opts.locale) properties[PROP_LOCALE] = opts.locale;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.description) properties[PROP_AGENT_DESCRIPTION] = opts.description;\n if (opts.messageSource) properties[PROP_MESSAGE_SOURCE] = opts.messageSource;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n\n if (opts.isRegeneration) properties[PROP_IS_REGENERATION] = true;\n if (opts.isEdit) properties[PROP_IS_EDIT] = true;\n if (opts.editedMessageId)\n properties[PROP_EDITED_MESSAGE_ID] = opts.editedMessageId;\n\n if (opts.attachments?.length) {\n properties[PROP_HAS_ATTACHMENTS] = true;\n properties[PROP_ATTACHMENT_COUNT] = opts.attachments.length;\n const types = [\n ...new Set(opts.attachments.map((a) => String(a.type ?? 'unknown'))),\n ];\n properties[PROP_ATTACHMENT_TYPES] = types;\n const totalSize = opts.attachments.reduce(\n (sum, a) => sum + (typeof a.size_bytes === 'number' ? a.size_bytes : 0),\n 0,\n );\n if (totalSize > 0) properties[PROP_TOTAL_ATTACHMENT_SIZE] = totalSize;\n properties[PROP_ATTACHMENTS] = serializeToJsonString(opts.attachments);\n }\n\n if (opts.labels?.length) {\n properties[PROP_MESSAGE_LABELS] = serializeToJsonString(\n opts.labels.map((lbl) => lbl.toDict()),\n );\n }\n\n Object.assign(properties, contentData);\n\n const event: AmplitudeEvent = {\n event_type: EVENT_USER_MESSAGE,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.userProperties) event.user_properties = opts.userProperties;\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_USER_MESSAGE} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(\n `Failed to track ${EVENT_USER_MESSAGE}: ${e}`,\n );\n }\n\n return messageId;\n}\n\n// --------------------------------------------------------\n// track_ai_message\n// --------------------------------------------------------\n\nexport interface TrackAiMessageOptions {\n amplitude: AmplitudeLike;\n userId: string;\n modelName: string;\n provider: string;\n responseContent: string;\n latencyMs: number;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number;\n messageId?: string | null;\n conversationId?: string | null;\n inputTokens?: number | null;\n outputTokens?: number | null;\n totalTokens?: number | null;\n reasoningTokens?: number | null;\n cacheReadInputTokens?: number | null;\n cacheCreationInputTokens?: number | null;\n totalCostUsd?: number | null;\n providerTtfbMs?: number | null;\n isError?: boolean;\n errorMessage?: string | null;\n finishReason?: string | null;\n toolCalls?: Array<ToolCallShape | Record<string, unknown>> | null;\n reasoningContent?: string | null;\n systemPrompt?: string | null;\n temperature?: number | null;\n maxOutputTokens?: number | null;\n topP?: number | null;\n isStreaming?: boolean | null;\n promptId?: string | null;\n wasCopied?: boolean;\n wasCached?: boolean;\n modelTier?: string | null;\n attachments?: Attachment[] | null;\n labels?: MessageLabel[] | null;\n env?: string | null;\n locale?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n spanKind?: string | null;\n eventProperties?: Record<string, unknown> | null;\n userProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackAiMessage(opts: TrackAiMessageOptions): string {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateRequiredStr(opts.modelName, 'model');\n validateNonNegative(opts.latencyMs, 'latencyMs');\n }\n\n const messageId = opts.messageId || randomUUID();\n const contentData = pc.sanitizeContent(opts.responseContent);\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_TURN_ID]: opts.turnId ?? 2,\n [PROP_MESSAGE_ID]: messageId,\n [PROP_MODEL_NAME]: opts.modelName,\n [PROP_PROVIDER]: opts.provider,\n [PROP_LATENCY_MS]: opts.latencyMs,\n [PROP_IS_ERROR]: opts.isError ?? false,\n [PROP_COMPONENT_TYPE]: 'llm',\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.sessionId) properties[PROP_SESSION_ID] = opts.sessionId;\n if (opts.traceId) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.conversationId && !opts.sessionId)\n properties[PROP_SESSION_ID] = opts.conversationId;\n if (opts.env) properties[PROP_ENV] = opts.env;\n if (opts.locale) properties[PROP_LOCALE] = opts.locale;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.description) properties[PROP_AGENT_DESCRIPTION] = opts.description;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.spanKind) properties[PROP_SPAN_KIND] = opts.spanKind;\n\n if (opts.wasCopied) properties[PROP_WAS_COPIED] = true;\n if (opts.wasCached) properties[PROP_WAS_CACHED] = true;\n\n // Model tier (user override or auto-inferred)\n if (opts.modelTier != null) {\n properties[PROP_MODEL_TIER] = opts.modelTier;\n } else {\n properties[PROP_MODEL_TIER] = inferModelTier(opts.modelName);\n }\n\n Object.assign(properties, contentData);\n\n // Token usage\n if (opts.inputTokens != null)\n properties[PROP_INPUT_TOKENS] = opts.inputTokens;\n if (opts.outputTokens != null)\n properties[PROP_OUTPUT_TOKENS] = opts.outputTokens;\n if (opts.totalTokens != null)\n properties[PROP_TOTAL_TOKENS] = opts.totalTokens;\n if (opts.reasoningTokens != null)\n properties[PROP_REASONING_TOKENS] = opts.reasoningTokens;\n if (opts.cacheReadInputTokens != null)\n properties[PROP_CACHE_READ_TOKENS] = opts.cacheReadInputTokens;\n if (opts.cacheCreationInputTokens != null)\n properties[PROP_CACHE_CREATION_TOKENS] = opts.cacheCreationInputTokens;\n\n if (opts.totalCostUsd != null) properties[PROP_COST_USD] = opts.totalCostUsd;\n if (opts.providerTtfbMs != null)\n properties[PROP_TTFB_MS] = opts.providerTtfbMs;\n if (opts.finishReason != null)\n properties[PROP_FINISH_REASON] = opts.finishReason;\n if (opts.errorMessage != null)\n properties[PROP_ERROR_MESSAGE] = opts.errorMessage;\n if (opts.toolCalls != null)\n properties[PROP_TOOL_CALLS] = serializeToJsonString(opts.toolCalls);\n\n // Reasoning content\n const reasoningProps = pc.sanitizeReasoningContent(\n opts.reasoningContent ?? null,\n opts.reasoningTokens,\n );\n Object.assign(properties, reasoningProps);\n\n // System prompt\n const systemPromptProps = pc.sanitizeSystemPrompt(opts.systemPrompt ?? null);\n Object.assign(properties, systemPromptProps);\n\n if (opts.temperature != null) properties[PROP_TEMPERATURE] = opts.temperature;\n if (opts.maxOutputTokens != null)\n properties[PROP_MAX_OUTPUT_TOKENS] = opts.maxOutputTokens;\n if (opts.topP != null) properties[PROP_TOP_P] = opts.topP;\n if (opts.isStreaming != null)\n properties[PROP_IS_STREAMING] = opts.isStreaming;\n if (opts.promptId != null) properties[PROP_PROMPT_ID] = opts.promptId;\n\n if (opts.attachments?.length) {\n properties[PROP_HAS_ATTACHMENTS] = true;\n properties[PROP_ATTACHMENT_COUNT] = opts.attachments.length;\n const types = [\n ...new Set(opts.attachments.map((a) => String(a.type ?? 'unknown'))),\n ];\n properties[PROP_ATTACHMENT_TYPES] = types;\n const totalSize = opts.attachments.reduce(\n (sum, a) => sum + (typeof a.size_bytes === 'number' ? a.size_bytes : 0),\n 0,\n );\n if (totalSize > 0) properties[PROP_TOTAL_ATTACHMENT_SIZE] = totalSize;\n properties[PROP_ATTACHMENTS] = serializeToJsonString(opts.attachments);\n }\n\n if (opts.labels?.length) {\n properties[PROP_MESSAGE_LABELS] = serializeToJsonString(\n opts.labels.map((lbl) => lbl.toDict()),\n );\n }\n\n const event: AmplitudeEvent = {\n event_type: EVENT_AI_RESPONSE,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.userProperties) event.user_properties = opts.userProperties;\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_AI_RESPONSE} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(\n `Failed to track ${EVENT_AI_RESPONSE}: ${e}`,\n );\n }\n\n return messageId;\n}\n\n// --------------------------------------------------------\n// track_tool_call\n// --------------------------------------------------------\n\nexport interface TrackToolCallOptions {\n amplitude: AmplitudeLike;\n userId: string;\n toolName: string;\n success: boolean;\n latencyMs: number;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number;\n toolInput?: unknown;\n toolOutput?: unknown;\n invocationId?: string | null;\n conversationId?: string | null;\n parentMessageId?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n errorMessage?: string | null;\n env?: string | null;\n locale?: string | null;\n spanKind?: string | null;\n eventProperties?: Record<string, unknown> | null;\n userProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackToolCall(opts: TrackToolCallOptions): string {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateRequiredStr(opts.toolName, 'toolName');\n validateNonNegative(opts.latencyMs, 'latencyMs');\n }\n\n const invocationId = opts.invocationId || randomUUID();\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_TURN_ID]: opts.turnId ?? 1,\n [PROP_INVOCATION_ID]: invocationId,\n [PROP_TOOL_NAME]: opts.toolName,\n [PROP_TOOL_SUCCESS]: opts.success,\n [PROP_IS_ERROR]: !opts.success,\n [PROP_LATENCY_MS]: opts.latencyMs,\n [PROP_COMPONENT_TYPE]: 'tool',\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.sessionId) properties[PROP_SESSION_ID] = opts.sessionId;\n if (opts.traceId) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.conversationId && !opts.sessionId)\n properties[PROP_SESSION_ID] = opts.conversationId;\n if (opts.parentMessageId)\n properties[PROP_PARENT_MESSAGE_ID] = opts.parentMessageId;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.description) properties[PROP_AGENT_DESCRIPTION] = opts.description;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.errorMessage) properties[PROP_ERROR_MESSAGE] = opts.errorMessage;\n if (opts.env) properties[PROP_ENV] = opts.env;\n if (opts.locale) properties[PROP_LOCALE] = opts.locale;\n if (opts.spanKind) properties[PROP_SPAN_KIND] = opts.spanKind;\n\n let effectiveMode = pc.contentMode;\n if (effectiveMode == null)\n effectiveMode = pc.privacyMode ? 'metadata_only' : 'full';\n\n if (opts.toolInput != null && effectiveMode === 'full') {\n const sanitized = sanitizeStructuredContent(opts.toolInput, pc.redactPii);\n properties[PROP_TOOL_INPUT] = serializeToJsonString(sanitized);\n }\n\n if (opts.toolOutput != null && effectiveMode === 'full') {\n const sanitized = sanitizeStructuredContent(opts.toolOutput, pc.redactPii);\n properties[PROP_TOOL_OUTPUT] = serializeToJsonString(sanitized);\n }\n\n const event: AmplitudeEvent = {\n event_type: EVENT_TOOL_CALL,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.userProperties) event.user_properties = opts.userProperties;\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_TOOL_CALL} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(`Failed to track ${EVENT_TOOL_CALL}: ${e}`);\n }\n\n return invocationId;\n}\n\n// --------------------------------------------------------\n// track_conversation\n// --------------------------------------------------------\n\nexport interface TrackConversationOptions {\n amplitude: AmplitudeLike;\n userId: string;\n messages: Array<Record<string, unknown>>;\n sessionId?: string | null;\n conversationId?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n userProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackConversation(opts: TrackConversationOptions): void {\n const effectiveSessionId =\n opts.sessionId ?? opts.conversationId ?? randomUUID();\n let turnId = 1;\n\n for (const message of opts.messages) {\n const role = String(message.role ?? '');\n const content = String(message.content ?? '');\n\n if (role === 'user') {\n trackUserMessage({\n amplitude: opts.amplitude,\n userId: opts.userId,\n messageContent: content,\n sessionId: effectiveSessionId,\n turnId,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n eventProperties: opts.eventProperties,\n userProperties: opts.userProperties,\n groups: opts.groups,\n privacyConfig: opts.privacyConfig,\n });\n } else if (role === 'assistant' || role === 'ai') {\n trackAiMessage({\n amplitude: opts.amplitude,\n userId: opts.userId,\n modelName: String(message.model ?? 'unknown'),\n provider: String(message.provider ?? 'unknown'),\n responseContent: content,\n latencyMs: Number(message.latency_ms ?? 0),\n sessionId: effectiveSessionId,\n turnId,\n inputTokens: message.input_tokens as number | undefined,\n outputTokens: message.output_tokens as number | undefined,\n totalTokens: message.total_tokens as number | undefined,\n totalCostUsd: message.total_cost_usd as number | undefined,\n agentId: opts.agentId,\n parentAgentId: opts.parentAgentId,\n customerOrgId: opts.customerOrgId,\n agentVersion: opts.agentVersion,\n description: opts.description,\n context: opts.context,\n env: opts.env,\n eventProperties: opts.eventProperties,\n userProperties: opts.userProperties,\n groups: opts.groups,\n privacyConfig: opts.privacyConfig,\n });\n }\n\n turnId++;\n }\n}\n\n// --------------------------------------------------------\n// track_embedding\n// --------------------------------------------------------\n\nexport interface TrackEmbeddingOptions {\n amplitude: AmplitudeLike;\n userId: string;\n model: string;\n provider: string;\n latencyMs: number;\n inputTokens?: number | null;\n dimensions?: number | null;\n totalCostUsd?: number | null;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackEmbedding(opts: TrackEmbeddingOptions): string {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateNonNegative(opts.latencyMs, 'latencyMs');\n }\n\n const spanId = randomUUID();\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_SPAN_ID]: spanId,\n [PROP_MODEL_NAME]: opts.model,\n [PROP_PROVIDER]: opts.provider,\n [PROP_LATENCY_MS]: opts.latencyMs,\n [PROP_COMPONENT_TYPE]: 'embedding',\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.sessionId) properties[PROP_SESSION_ID] = opts.sessionId;\n if (opts.traceId != null) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.turnId != null) properties[PROP_TURN_ID] = opts.turnId;\n if (opts.inputTokens != null)\n properties[PROP_INPUT_TOKENS] = opts.inputTokens;\n if (opts.dimensions != null)\n properties[PROP_EMBEDDING_DIMENSIONS] = opts.dimensions;\n if (opts.totalCostUsd != null) properties[PROP_COST_USD] = opts.totalCostUsd;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.description) properties[PROP_AGENT_DESCRIPTION] = opts.description;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.env) properties[PROP_ENV] = opts.env;\n\n const event: AmplitudeEvent = {\n event_type: EVENT_EMBEDDING,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_EMBEDDING} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(`Failed to track ${EVENT_EMBEDDING}: ${e}`);\n }\n\n return spanId;\n}\n\n// --------------------------------------------------------\n// track_span\n// --------------------------------------------------------\n\nexport interface TrackSpanOptions {\n amplitude: AmplitudeLike;\n userId: string;\n spanName: string;\n traceId: string;\n latencyMs: number;\n inputState?: Record<string, unknown> | null;\n outputState?: Record<string, unknown> | null;\n parentSpanId?: string | null;\n isError?: boolean;\n errorMessage?: string | null;\n sessionId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackSpan(opts: TrackSpanOptions): string {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateNonNegative(opts.latencyMs, 'latencyMs');\n }\n\n const spanId = randomUUID();\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_SPAN_ID]: spanId,\n [PROP_SPAN_NAME]: opts.spanName,\n [PROP_TRACE_ID]: opts.traceId,\n [PROP_LATENCY_MS]: opts.latencyMs,\n [PROP_IS_ERROR]: opts.isError ?? false,\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.sessionId) properties[PROP_SESSION_ID] = opts.sessionId;\n if (opts.turnId != null) properties[PROP_TURN_ID] = opts.turnId;\n if (opts.parentSpanId) properties[PROP_PARENT_SPAN_ID] = opts.parentSpanId;\n if (opts.errorMessage) properties[PROP_ERROR_MESSAGE] = opts.errorMessage;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.description) properties[PROP_AGENT_DESCRIPTION] = opts.description;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.env) properties[PROP_ENV] = opts.env;\n\n let effectiveMode = pc.contentMode;\n if (effectiveMode == null)\n effectiveMode = pc.privacyMode ? 'metadata_only' : 'full';\n\n if (opts.inputState != null && effectiveMode === 'full') {\n const sanitized = sanitizeStructuredContent(opts.inputState, pc.redactPii);\n properties[PROP_INPUT_STATE] = serializeToJsonString(sanitized);\n }\n\n if (opts.outputState != null && effectiveMode === 'full') {\n const sanitized = sanitizeStructuredContent(opts.outputState, pc.redactPii);\n properties[PROP_OUTPUT_STATE] = serializeToJsonString(sanitized);\n }\n\n const event: AmplitudeEvent = {\n event_type: EVENT_SPAN,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_SPAN} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(`Failed to track ${EVENT_SPAN}: ${e}`);\n }\n\n return spanId;\n}\n\n// --------------------------------------------------------\n// track_session_end\n// --------------------------------------------------------\n\nexport interface TrackSessionEndOptions {\n amplitude: AmplitudeLike;\n userId: string;\n sessionId: string;\n enrichments?: SessionEnrichments | null;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n abandonmentTurn?: number | null;\n idleTimeoutMinutes?: number | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackSessionEnd(opts: TrackSessionEndOptions): void {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateRequiredStr(opts.sessionId, 'sessionId');\n }\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_SESSION_ID]: opts.sessionId,\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.traceId != null) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.turnId != null) properties[PROP_TURN_ID] = opts.turnId;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.description) properties[PROP_AGENT_DESCRIPTION] = opts.description;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.env) properties[PROP_ENV] = opts.env;\n if (opts.abandonmentTurn != null)\n properties[PROP_ABANDONMENT_TURN] = opts.abandonmentTurn;\n if (opts.idleTimeoutMinutes != null)\n properties[PROP_IDLE_TIMEOUT_MINUTES] = opts.idleTimeoutMinutes;\n\n if (opts.enrichments != null) {\n const enrichmentDict =\n typeof opts.enrichments.toDict === 'function'\n ? opts.enrichments.toDict()\n : opts.enrichments;\n properties[PROP_ENRICHMENTS] = serializeToJsonString(enrichmentDict);\n }\n\n const event: AmplitudeEvent = {\n event_type: EVENT_SESSION_END,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_SESSION_END} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(\n `Failed to track ${EVENT_SESSION_END}: ${e}`,\n );\n }\n}\n\n// --------------------------------------------------------\n// track_session_enrichment\n// --------------------------------------------------------\n\nexport interface TrackSessionEnrichmentOptions {\n amplitude: AmplitudeLike;\n userId: string;\n sessionId: string;\n enrichments: SessionEnrichments;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackSessionEnrichment(\n opts: TrackSessionEnrichmentOptions,\n): void {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateRequiredStr(opts.sessionId, 'sessionId');\n }\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_SESSION_ID]: opts.sessionId,\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.traceId != null) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.turnId != null) properties[PROP_TURN_ID] = opts.turnId;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.description) properties[PROP_AGENT_DESCRIPTION] = opts.description;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.env) properties[PROP_ENV] = opts.env;\n\n const enrichmentDict =\n typeof opts.enrichments.toDict === 'function'\n ? opts.enrichments.toDict()\n : opts.enrichments;\n properties[PROP_ENRICHMENTS] = serializeToJsonString(enrichmentDict);\n\n const event: AmplitudeEvent = {\n event_type: EVENT_SESSION_ENRICHMENT,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_SESSION_ENRICHMENT} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(\n `Failed to track ${EVENT_SESSION_ENRICHMENT}: ${e}`,\n );\n }\n}\n\n// --------------------------------------------------------\n// track_score\n// --------------------------------------------------------\n\nexport interface TrackScoreOptions {\n amplitude: AmplitudeLike;\n userId: string;\n name: string;\n value: number;\n targetId: string;\n targetType?: string;\n source?: string;\n comment?: string | null;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n description?: string | null;\n context?: Record<string, unknown> | null;\n env?: string | null;\n eventProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\nexport function trackScore(opts: TrackScoreOptions): void {\n const pc = opts.privacyConfig ?? new PrivacyConfig();\n if (pc.validate) {\n validateRequiredStr(opts.userId, 'userId');\n validateNumeric(opts.value, 'value');\n }\n\n const properties: Record<string, unknown> = withSdkManagedProperties(\n opts.eventProperties,\n {\n [PROP_SCORE_NAME]: opts.name,\n [PROP_SCORE_VALUE]: opts.value,\n [PROP_TARGET_ID]: opts.targetId,\n [PROP_TARGET_TYPE]: opts.targetType ?? 'message',\n [PROP_EVALUATION_SOURCE]: opts.source ?? 'user',\n [PROP_SDK_VERSION]: SDK_VERSION,\n [PROP_RUNTIME]: SDK_RUNTIME,\n },\n );\n\n if (opts.sessionId) properties[PROP_SESSION_ID] = opts.sessionId;\n if (opts.traceId != null) properties[PROP_TRACE_ID] = opts.traceId;\n if (opts.turnId != null) properties[PROP_TURN_ID] = opts.turnId;\n if (opts.agentId) properties[PROP_AGENT_ID] = opts.agentId;\n if (opts.parentAgentId) properties[PROP_PARENT_AGENT_ID] = opts.parentAgentId;\n if (opts.customerOrgId) properties[PROP_CUSTOMER_ORG_ID] = opts.customerOrgId;\n if (opts.agentVersion) properties[PROP_AGENT_VERSION] = opts.agentVersion;\n if (opts.description) properties[PROP_AGENT_DESCRIPTION] = opts.description;\n if (opts.context)\n properties[PROP_CONTEXT] = serializeToJsonString(opts.context);\n if (opts.env) properties[PROP_ENV] = opts.env;\n\n // Comment respects content_mode\n if (opts.comment != null) {\n const commentData = pc.sanitizeContent(opts.comment);\n if ('$llm_message' in commentData) {\n const msg = commentData.$llm_message as Record<string, unknown>;\n properties[PROP_COMMENT] = getTextFromLlmMessage(msg);\n }\n }\n\n const event: AmplitudeEvent = {\n event_type: EVENT_SCORE,\n user_id: opts.userId,\n event_properties: properties,\n };\n if (opts.groups) event.groups = opts.groups;\n\n try {\n opts.amplitude.track(event);\n getLogger(opts.amplitude).debug(\n `Tracked ${EVENT_SCORE} for user ${opts.userId}`,\n );\n } catch (e) {\n getLogger(opts.amplitude).error(`Failed to track ${EVENT_SCORE}: ${e}`);\n }\n}\n"],"mappings":"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"}
|
package/dist/decorators.d.ts
CHANGED
|
@@ -58,7 +58,7 @@ interface ToolOptions {
|
|
|
58
58
|
timeoutMs?: number | null;
|
|
59
59
|
onError?: ((error: Error, toolName: string) => void) | null;
|
|
60
60
|
}
|
|
61
|
-
type AnyFn = (...args:
|
|
61
|
+
type AnyFn = (...args: any[]) => any;
|
|
62
62
|
/**
|
|
63
63
|
* Converts a function's return type to Promise-wrapped if not already.
|
|
64
64
|
* Reflects the fact that tool() always returns an async wrapper.
|
package/dist/decorators.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","names":[],"sources":["../src/decorators.ts"],"sourcesContent":[],"mappings":";;;;;AAsC0B,cAdb,eAAA,CAca;EACR,OAAA,UAAA,EAdG,aAcH,GAAA,IAAA;EAGH,OAAA,OAAA,EAAA,MAAA,GAAA,IAAA;EAWC,OAAA,UAAA,EAAA,MAAA,GAAA,IAAA;EACM,OAAA,QAAA,EAAA,MAAA,GAAA,IAAA;EACE,OAAA,OAAA,EAAA,MAAA;EACD,OAAA,IAAA,EAAA,MAAA,GAAA,IAAA;EACR,OAAA,QAAA,EAAA,MAAA,GAAA,IAAA;EAAM,OAAA,cAAA,EAAA,MAAA,GAAA,IAAA;EAiDX,OAAA,cAAW,EAAA,MAAA,GAAA,IAAA;EAEP,OAAA,aAAA,EAAA,MAAA,GAAA,IAAA;EAUF,OAAA,QAAA,EAnFO,MAmFP,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EACM,OAAA,cAAA,EAnFO,aAmFP,GAAA,IAAA;EACE,OAAA,gBAAA,EAnFO,MAmFP,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EACD,OAAA,eAAA,EAnFO,MAmFP,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EACR,OAAA,OAAA,EAnFO,MAmFP,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,IAAA;EACK,OAAA,YAAA,CAAA,SAAA,EAjFD,aAiFC,EAAA,MAAA,EAAA,MAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","names":[],"sources":["../src/decorators.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/decorators.js
CHANGED
|
@@ -74,7 +74,7 @@ function _resolveContextFields(opts) {
|
|
|
74
74
|
return null;
|
|
75
75
|
}
|
|
76
76
|
return {
|
|
77
|
-
amplitude: opts.amplitude ?? ToolCallTracker._amplitude ?? null,
|
|
77
|
+
amplitude: opts.amplitude ?? ctx?.amplitude ?? ToolCallTracker._amplitude ?? null,
|
|
78
78
|
userId: resolve(opts.userId, ToolCallTracker._userId, ctx?.userId),
|
|
79
79
|
sessionId: resolve(opts.sessionId, ToolCallTracker._sessionId, ctx?.sessionId),
|
|
80
80
|
traceId: resolve(opts.traceId, ToolCallTracker._traceId, ctx?.traceId),
|
|
@@ -182,7 +182,7 @@ function observe(fnOrOpts, maybeOpts) {
|
|
|
182
182
|
function _resolveObserveParams(opts) {
|
|
183
183
|
const ctx = getActiveContext();
|
|
184
184
|
return {
|
|
185
|
-
amplitude: opts.amplitude ?? ToolCallTracker._amplitude ?? null,
|
|
185
|
+
amplitude: opts.amplitude ?? ctx?.amplitude ?? ToolCallTracker._amplitude ?? null,
|
|
186
186
|
userId: opts.userId ?? ctx?.userId ?? ToolCallTracker._userId ?? "",
|
|
187
187
|
agentId: opts.agentId ?? ctx?.agentId ?? ToolCallTracker._agentId ?? null,
|
|
188
188
|
env: opts.env ?? ctx?.env ?? ToolCallTracker._env ?? null,
|
|
@@ -263,7 +263,8 @@ function _wrapObserve(fn, opts) {
|
|
|
263
263
|
sessionId,
|
|
264
264
|
userId: params.userId,
|
|
265
265
|
agentId: params.agentId || spanName,
|
|
266
|
-
env: params.env
|
|
266
|
+
env: params.env,
|
|
267
|
+
amplitude: params.amplitude
|
|
267
268
|
});
|
|
268
269
|
return _sessionStorage.run(newCtx, runFn);
|
|
269
270
|
}
|
package/dist/decorators.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","names":["errorMsg: string | null","result: unknown","extraProps: Record<string, unknown>","timer: ReturnType<typeof setTimeout> | undefined","errorMessage: string | null"],"sources":["../src/decorators.ts"],"sourcesContent":["/**\n * Higher-order functions for automatic tracking of function calls as tool and span events.\n *\n * TypeScript equivalent of Python's @tool and @observe decorators.\n * Since TS/JS does not have native decorators with the same power as Python,\n * these are implemented as HOFs (higher-order functions) that wrap callables.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport {\n _sessionStorage,\n getActiveContext,\n SessionContext,\n} from './context.js';\nimport type { PrivacyConfig } from './core/privacy.js';\nimport { trackSessionEnd, trackSpan, trackToolCall } from './core/tracking.js';\nimport type { AmplitudeLike } from './types.js';\nimport { getLogger } from './utils/logger.js';\n\n// ---------------------------------------------------------------------------\n// ToolCallTracker — global config singleton (parity with Python)\n// ---------------------------------------------------------------------------\n\n// biome-ignore lint/complexity/noStaticOnlyClass: mirrors Python SDK's ToolCallTracker API\nexport class ToolCallTracker {\n static _amplitude: AmplitudeLike | null = null;\n static _userId: string | null = null;\n static _sessionId: string | null = null;\n static _traceId: string | null = null;\n static _turnId = 1;\n static _env: string | null = null;\n static _agentId: string | null = null;\n static _parentAgentId: string | null = null;\n static _customerOrgId: string | null = null;\n static _agentVersion: string | null = null;\n static _context: Record<string, unknown> | null = null;\n static _privacyConfig: PrivacyConfig | null = null;\n static _eventProperties: Record<string, unknown> | null = null;\n static _userProperties: Record<string, unknown> | null = null;\n static _groups: Record<string, unknown> | null = null;\n\n static setAmplitude(\n amplitude: AmplitudeLike,\n userId: string,\n opts: {\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number;\n env?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n eventProperties?: Record<string, unknown> | null;\n userProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n } = {},\n ): void {\n ToolCallTracker._amplitude = amplitude;\n ToolCallTracker._userId = userId;\n ToolCallTracker._sessionId = opts.sessionId ?? null;\n ToolCallTracker._traceId = opts.traceId ?? null;\n ToolCallTracker._turnId = opts.turnId ?? 1;\n ToolCallTracker._env = opts.env ?? null;\n ToolCallTracker._agentId = opts.agentId ?? null;\n ToolCallTracker._parentAgentId = opts.parentAgentId ?? null;\n ToolCallTracker._customerOrgId = opts.customerOrgId ?? null;\n ToolCallTracker._agentVersion = opts.agentVersion ?? null;\n ToolCallTracker._context = opts.context ?? null;\n ToolCallTracker._privacyConfig = opts.privacyConfig ?? null;\n ToolCallTracker._eventProperties = opts.eventProperties ?? null;\n ToolCallTracker._userProperties = opts.userProperties ?? null;\n ToolCallTracker._groups = opts.groups ?? null;\n }\n\n static clear(): void {\n ToolCallTracker._amplitude = null;\n ToolCallTracker._userId = null;\n ToolCallTracker._sessionId = null;\n ToolCallTracker._traceId = null;\n ToolCallTracker._turnId = 1;\n ToolCallTracker._env = null;\n ToolCallTracker._agentId = null;\n ToolCallTracker._parentAgentId = null;\n ToolCallTracker._customerOrgId = null;\n ToolCallTracker._agentVersion = null;\n ToolCallTracker._context = null;\n ToolCallTracker._privacyConfig = null;\n ToolCallTracker._eventProperties = null;\n ToolCallTracker._userProperties = null;\n ToolCallTracker._groups = null;\n }\n\n static isConfigured(): boolean {\n return (\n ToolCallTracker._amplitude != null && ToolCallTracker._userId != null\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Context resolution (merges runtime overrides > explicit opts > session ctx > global)\n// ---------------------------------------------------------------------------\n\ninterface ToolOptions {\n name?: string;\n amplitude?: AmplitudeLike | null;\n userId?: string | null;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number | null;\n env?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n eventProperties?: Record<string, unknown> | null;\n userProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n inputSchema?: Record<string, unknown> | null;\n timeoutMs?: number | null;\n onError?: ((error: Error, toolName: string) => void) | null;\n}\n\ninterface ResolvedContext {\n amplitude: AmplitudeLike | null;\n userId: string | null;\n sessionId: string | null;\n traceId: string | null;\n turnId: number;\n env: string | null;\n agentId: string | null;\n parentAgentId: string | null;\n customerOrgId: string | null;\n agentVersion: string | null;\n context: Record<string, unknown> | null;\n privacyConfig: PrivacyConfig | null;\n eventProperties: Record<string, unknown> | null;\n userProperties: Record<string, unknown> | null;\n groups: Record<string, unknown> | null;\n}\n\nfunction _resolveContextFields(opts: ToolOptions): ResolvedContext {\n const ctx = getActiveContext();\n\n function resolve(\n decoratorVal: unknown,\n trackerVal: unknown,\n ctxVal: unknown = null,\n ): unknown {\n if (decoratorVal !== undefined && decoratorVal !== null)\n return decoratorVal;\n if (ctxVal !== undefined && ctxVal !== null) return ctxVal;\n if (trackerVal !== undefined && trackerVal !== null) return trackerVal;\n return null;\n }\n\n return {\n amplitude: opts.amplitude ?? ToolCallTracker._amplitude ?? null,\n userId: resolve(opts.userId, ToolCallTracker._userId, ctx?.userId) as\n | string\n | null,\n sessionId: resolve(\n opts.sessionId,\n ToolCallTracker._sessionId,\n ctx?.sessionId,\n ) as string | null,\n traceId: resolve(opts.traceId, ToolCallTracker._traceId, ctx?.traceId) as\n | string\n | null,\n turnId: opts.turnId ?? ToolCallTracker._turnId,\n env: resolve(opts.env, ToolCallTracker._env, ctx?.env) as string | null,\n agentId: resolve(opts.agentId, ToolCallTracker._agentId, ctx?.agentId) as\n | string\n | null,\n parentAgentId: resolve(\n opts.parentAgentId,\n ToolCallTracker._parentAgentId,\n ctx?.parentAgentId,\n ) as string | null,\n customerOrgId: resolve(\n opts.customerOrgId,\n ToolCallTracker._customerOrgId,\n ctx?.customerOrgId,\n ) as string | null,\n agentVersion: resolve(\n opts.agentVersion,\n ToolCallTracker._agentVersion,\n ctx?.agentVersion,\n ) as string | null,\n context: resolve(\n opts.context,\n ToolCallTracker._context,\n ctx?.context,\n ) as Record<string, unknown> | null,\n privacyConfig: resolve(\n opts.privacyConfig,\n ToolCallTracker._privacyConfig,\n ) as PrivacyConfig | null,\n eventProperties: resolve(\n opts.eventProperties,\n ToolCallTracker._eventProperties,\n ) as Record<string, unknown> | null,\n userProperties: resolve(\n opts.userProperties,\n ToolCallTracker._userProperties,\n ) as Record<string, unknown> | null,\n groups: resolve(\n opts.groups,\n ToolCallTracker._groups,\n ctx?.groups,\n ) as Record<string, unknown> | null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// tool() HOF — wraps a function to auto-track as [Agent] Tool Call\n// ---------------------------------------------------------------------------\n\ntype AnyFn = (...args: unknown[]) => unknown;\ntype AsyncFn = (...args: unknown[]) => Promise<unknown>;\n\n/**\n * Converts a function's return type to Promise-wrapped if not already.\n * Reflects the fact that tool() always returns an async wrapper.\n */\nexport type ToolWrapped<T extends AnyFn> = T extends (\n ...args: infer A\n) => infer R\n ? R extends Promise<unknown>\n ? (...args: A) => R\n : (...args: A) => Promise<R>\n : T;\n\n/**\n * Wraps a function and emits one `[Agent] Tool Call` event per invocation.\n *\n * Supports both forms:\n * - `tool(fn, opts?)`\n * - `tool(opts)(fn)`\n *\n * Resolution order for tracking context is:\n * runtime overrides > decorator opts > active session context > `ToolCallTracker`.\n * If tracking is not configured (`amplitude`/`userId` missing), the wrapped function\n * still executes and no tracking event is emitted.\n */\nexport function tool<T extends AnyFn>(\n fn: T,\n opts?: ToolOptions,\n): ToolWrapped<T>;\nexport function tool(\n opts: ToolOptions,\n): <T extends AnyFn>(fn: T) => ToolWrapped<T>;\nexport function tool<T extends AnyFn>(\n fnOrOpts: T | ToolOptions,\n maybeOpts?: ToolOptions,\n): ToolWrapped<T> | (<U extends AnyFn>(fn: U) => ToolWrapped<U>) {\n if (typeof fnOrOpts === 'function') {\n return _wrapTool(fnOrOpts as T, maybeOpts ?? {}) as ToolWrapped<T>;\n }\n return <U extends AnyFn>(fn: U): ToolWrapped<U> =>\n _wrapTool(fn, fnOrOpts) as ToolWrapped<U>;\n}\n\nfunction _wrapTool<T extends AnyFn>(fn: T, opts: ToolOptions): ToolWrapped<T> {\n const toolName = opts.name || fn.name || 'anonymous';\n const schemaJson = opts.inputSchema ? JSON.stringify(opts.inputSchema) : null;\n\n const wrapper = async function (\n this: unknown,\n ...args: unknown[]\n ): Promise<unknown> {\n const r = _resolveContextFields(opts);\n\n if (r.amplitude == null || r.userId == null) {\n getLogger().warn(\n `Tool '${toolName}' called but tracking not configured. Call ToolCallTracker.setAmplitude() or pass amplitude/userId to tool().`,\n );\n return fn.apply(this, args);\n }\n\n const toolInput =\n args.length === 1 && typeof args[0] === 'object' && args[0] != null\n ? args[0]\n : args.length > 0\n ? { args }\n : undefined;\n\n const startTime = performance.now();\n let success = true;\n let errorMsg: string | null = null;\n let result: unknown = undefined;\n\n try {\n if (opts.timeoutMs != null) {\n result = await _runWithTimeout(\n fn.bind(this, ...args) as AsyncFn,\n opts.timeoutMs,\n toolName,\n );\n } else {\n result = await fn.apply(this, args);\n }\n return result;\n } catch (e) {\n success = false;\n errorMsg = e instanceof Error ? e.message : String(e);\n if (opts.onError != null) {\n try {\n opts.onError(e instanceof Error ? e : new Error(String(e)), toolName);\n } catch {\n // swallow callback errors\n }\n }\n getLogger().error(`Tool '${toolName}' failed: ${errorMsg}`);\n throw e;\n } finally {\n const latencyMs = performance.now() - startTime;\n\n const extraProps: Record<string, unknown> = {};\n if (schemaJson != null) {\n extraProps['[Agent] Tool Input Schema'] = schemaJson;\n }\n\n const mergedEvtProps = {\n ...(r.eventProperties ?? {}),\n ...extraProps,\n };\n\n try {\n trackToolCall({\n amplitude: r.amplitude,\n userId: r.userId,\n toolName,\n success,\n latencyMs,\n sessionId: r.sessionId,\n traceId: r.traceId,\n turnId: r.turnId ?? undefined,\n toolInput,\n toolOutput: success ? result : undefined,\n errorMessage: errorMsg,\n env: r.env,\n agentId: r.agentId,\n parentAgentId: r.parentAgentId,\n customerOrgId: r.customerOrgId,\n agentVersion: r.agentVersion,\n context: r.context,\n eventProperties:\n Object.keys(extraProps).length > 0\n ? mergedEvtProps\n : r.eventProperties,\n userProperties: r.userProperties,\n groups: r.groups,\n privacyConfig: r.privacyConfig,\n });\n } catch (trackError) {\n getLogger().error(\n `Failed to track tool call '${toolName}': ${trackError}`,\n );\n }\n }\n } as unknown as ToolWrapped<T>;\n\n Object.defineProperty(wrapper, 'name', {\n value: fn.name,\n configurable: true,\n });\n return wrapper;\n}\n\nasync function _runWithTimeout(\n fn: AsyncFn,\n timeoutMs: number,\n toolName: string,\n): Promise<unknown> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () =>\n reject(new Error(`Tool '${toolName}' exceeded ${timeoutMs}ms timeout`)),\n timeoutMs,\n );\n });\n\n try {\n return await Promise.race([fn(), timeoutPromise]);\n } finally {\n clearTimeout(timer);\n }\n}\n\n// ---------------------------------------------------------------------------\n// observe() HOF — wraps a function to auto-track as [Agent] Span\n// ---------------------------------------------------------------------------\n\ninterface ObserveOptions {\n name?: string;\n amplitude?: AmplitudeLike | null;\n userId?: string | null;\n agentId?: string | null;\n env?: string | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\n/**\n * Converts a function's return type to Promise-wrapped if not already.\n * Reflects the fact that observe() always returns an async wrapper.\n */\nexport type ObserveWrapped<T extends AnyFn> = T extends (\n ...args: infer A\n) => infer R\n ? R extends Promise<unknown>\n ? (...args: A) => R\n : (...args: A) => Promise<R>\n : T;\n\n/**\n * Wraps a function and emits one `[Agent] Span` event per invocation.\n *\n * Supports both forms:\n * - `observe(fn, opts?)`\n * - `observe(opts)(fn)`\n *\n * If called inside an active session context, spans attach to that session.\n * If no context is active, observe creates a short-lived session boundary and\n * emits a session-end event when the wrapped function completes.\n */\nexport function observe<T extends AnyFn>(\n fn: T,\n opts?: ObserveOptions,\n): ObserveWrapped<T>;\nexport function observe(\n opts: ObserveOptions,\n): <T extends AnyFn>(fn: T) => ObserveWrapped<T>;\nexport function observe<T extends AnyFn>(\n fnOrOpts: T | ObserveOptions,\n maybeOpts?: ObserveOptions,\n): ObserveWrapped<T> | (<U extends AnyFn>(fn: U) => ObserveWrapped<U>) {\n if (typeof fnOrOpts === 'function') {\n return _wrapObserve(fnOrOpts as T, maybeOpts ?? {}) as ObserveWrapped<T>;\n }\n return <U extends AnyFn>(fn: U): ObserveWrapped<U> =>\n _wrapObserve(fn, fnOrOpts) as ObserveWrapped<U>;\n}\n\ninterface ResolvedObserveParams {\n amplitude: AmplitudeLike | null;\n userId: string;\n agentId: string | null;\n env: string | null;\n privacyConfig: PrivacyConfig | null;\n context: SessionContext | null;\n}\n\nfunction _resolveObserveParams(opts: ObserveOptions): ResolvedObserveParams {\n const ctx = getActiveContext();\n return {\n amplitude: opts.amplitude ?? ToolCallTracker._amplitude ?? null,\n userId: opts.userId ?? ctx?.userId ?? ToolCallTracker._userId ?? '',\n agentId: opts.agentId ?? ctx?.agentId ?? ToolCallTracker._agentId ?? null,\n env: opts.env ?? ctx?.env ?? ToolCallTracker._env ?? null,\n privacyConfig: opts.privacyConfig ?? ToolCallTracker._privacyConfig ?? null,\n context: ctx,\n };\n}\n\nfunction _serializeState(\n value: unknown,\n pc: PrivacyConfig | null,\n): Record<string, unknown> | null {\n if (value == null) return null;\n if (pc != null) {\n const mode = pc.contentMode;\n if (mode === 'metadata_only' || (mode == null && pc.privacyMode))\n return null;\n }\n if (typeof value === 'object' && !Array.isArray(value))\n return value as Record<string, unknown>;\n return { value: String(value) };\n}\n\nfunction _wrapObserve<T extends AnyFn>(fn: T, opts: ObserveOptions): T {\n const spanName = opts.name || fn.name || 'anonymous';\n\n const wrapper = async function (\n this: unknown,\n ...args: unknown[]\n ): Promise<unknown> {\n const params = _resolveObserveParams(opts);\n const ctx = getActiveContext();\n const ownsSession = ctx == null;\n const sessionId = ctx?.sessionId ?? randomUUID();\n\n const runFn = async (): Promise<unknown> => {\n const inputState = _serializeState(\n args.length === 1 ? args[0] : args.length > 0 ? { args } : null,\n params.privacyConfig,\n );\n\n const start = performance.now();\n let isError = false;\n let errorMessage: string | null = null;\n let result: unknown = undefined;\n\n try {\n result = await fn.apply(this, args);\n return result;\n } catch (exc) {\n isError = true;\n errorMessage = exc instanceof Error ? exc.message : String(exc);\n throw exc;\n } finally {\n const latencyMs = performance.now() - start;\n const outputState = _serializeState(result, params.privacyConfig);\n const activeCtx = getActiveContext();\n\n if (params.amplitude != null) {\n try {\n trackSpan({\n amplitude: params.amplitude,\n userId: params.userId,\n spanName,\n traceId: activeCtx?.traceId ?? randomUUID(),\n latencyMs,\n inputState,\n outputState,\n isError,\n errorMessage,\n sessionId,\n agentId: params.agentId || spanName,\n env: params.env,\n privacyConfig: params.privacyConfig,\n });\n } catch (e) {\n getLogger().error(\n `Failed to track @observe span '${spanName}': ${e}`,\n );\n }\n\n if (ownsSession) {\n try {\n trackSessionEnd({\n amplitude: params.amplitude,\n userId: params.userId,\n sessionId,\n env: params.env,\n agentId: params.agentId || spanName,\n privacyConfig: params.privacyConfig,\n });\n } catch (e) {\n getLogger().error(\n `Failed to end @observe session '${spanName}': ${e}`,\n );\n }\n }\n }\n }\n };\n\n if (ownsSession) {\n const newCtx = new SessionContext({\n sessionId,\n userId: params.userId,\n agentId: params.agentId || spanName,\n env: params.env,\n });\n return _sessionStorage.run(newCtx, runFn);\n }\n return runFn();\n } as unknown as T;\n\n Object.defineProperty(wrapper, 'name', {\n value: fn.name,\n configurable: true,\n });\n return wrapper;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"decorators.js","names":["errorMsg: string | null","result: unknown","extraProps: Record<string, unknown>","timer: ReturnType<typeof setTimeout> | undefined","errorMessage: string | null"],"sources":["../src/decorators.ts"],"sourcesContent":["/**\n * Higher-order functions for automatic tracking of function calls as tool and span events.\n *\n * TypeScript equivalent of Python's @tool and @observe decorators.\n * Since TS/JS does not have native decorators with the same power as Python,\n * these are implemented as HOFs (higher-order functions) that wrap callables.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport {\n _sessionStorage,\n getActiveContext,\n SessionContext,\n} from './context.js';\nimport type { PrivacyConfig } from './core/privacy.js';\nimport { trackSessionEnd, trackSpan, trackToolCall } from './core/tracking.js';\nimport type { AmplitudeLike } from './types.js';\nimport { getLogger } from './utils/logger.js';\n\n// ---------------------------------------------------------------------------\n// ToolCallTracker — global config singleton (parity with Python)\n// ---------------------------------------------------------------------------\n\n// biome-ignore lint/complexity/noStaticOnlyClass: mirrors Python SDK's ToolCallTracker API\nexport class ToolCallTracker {\n static _amplitude: AmplitudeLike | null = null;\n static _userId: string | null = null;\n static _sessionId: string | null = null;\n static _traceId: string | null = null;\n static _turnId = 1;\n static _env: string | null = null;\n static _agentId: string | null = null;\n static _parentAgentId: string | null = null;\n static _customerOrgId: string | null = null;\n static _agentVersion: string | null = null;\n static _context: Record<string, unknown> | null = null;\n static _privacyConfig: PrivacyConfig | null = null;\n static _eventProperties: Record<string, unknown> | null = null;\n static _userProperties: Record<string, unknown> | null = null;\n static _groups: Record<string, unknown> | null = null;\n\n static setAmplitude(\n amplitude: AmplitudeLike,\n userId: string,\n opts: {\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number;\n env?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n eventProperties?: Record<string, unknown> | null;\n userProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n } = {},\n ): void {\n ToolCallTracker._amplitude = amplitude;\n ToolCallTracker._userId = userId;\n ToolCallTracker._sessionId = opts.sessionId ?? null;\n ToolCallTracker._traceId = opts.traceId ?? null;\n ToolCallTracker._turnId = opts.turnId ?? 1;\n ToolCallTracker._env = opts.env ?? null;\n ToolCallTracker._agentId = opts.agentId ?? null;\n ToolCallTracker._parentAgentId = opts.parentAgentId ?? null;\n ToolCallTracker._customerOrgId = opts.customerOrgId ?? null;\n ToolCallTracker._agentVersion = opts.agentVersion ?? null;\n ToolCallTracker._context = opts.context ?? null;\n ToolCallTracker._privacyConfig = opts.privacyConfig ?? null;\n ToolCallTracker._eventProperties = opts.eventProperties ?? null;\n ToolCallTracker._userProperties = opts.userProperties ?? null;\n ToolCallTracker._groups = opts.groups ?? null;\n }\n\n static clear(): void {\n ToolCallTracker._amplitude = null;\n ToolCallTracker._userId = null;\n ToolCallTracker._sessionId = null;\n ToolCallTracker._traceId = null;\n ToolCallTracker._turnId = 1;\n ToolCallTracker._env = null;\n ToolCallTracker._agentId = null;\n ToolCallTracker._parentAgentId = null;\n ToolCallTracker._customerOrgId = null;\n ToolCallTracker._agentVersion = null;\n ToolCallTracker._context = null;\n ToolCallTracker._privacyConfig = null;\n ToolCallTracker._eventProperties = null;\n ToolCallTracker._userProperties = null;\n ToolCallTracker._groups = null;\n }\n\n static isConfigured(): boolean {\n return (\n ToolCallTracker._amplitude != null && ToolCallTracker._userId != null\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Context resolution (merges runtime overrides > explicit opts > session ctx > global)\n// ---------------------------------------------------------------------------\n\ninterface ToolOptions {\n name?: string;\n amplitude?: AmplitudeLike | null;\n userId?: string | null;\n sessionId?: string | null;\n traceId?: string | null;\n turnId?: number | null;\n env?: string | null;\n agentId?: string | null;\n parentAgentId?: string | null;\n customerOrgId?: string | null;\n agentVersion?: string | null;\n context?: Record<string, unknown> | null;\n privacyConfig?: PrivacyConfig | null;\n eventProperties?: Record<string, unknown> | null;\n userProperties?: Record<string, unknown> | null;\n groups?: Record<string, unknown> | null;\n inputSchema?: Record<string, unknown> | null;\n timeoutMs?: number | null;\n onError?: ((error: Error, toolName: string) => void) | null;\n}\n\ninterface ResolvedContext {\n amplitude: AmplitudeLike | null;\n userId: string | null;\n sessionId: string | null;\n traceId: string | null;\n turnId: number;\n env: string | null;\n agentId: string | null;\n parentAgentId: string | null;\n customerOrgId: string | null;\n agentVersion: string | null;\n context: Record<string, unknown> | null;\n privacyConfig: PrivacyConfig | null;\n eventProperties: Record<string, unknown> | null;\n userProperties: Record<string, unknown> | null;\n groups: Record<string, unknown> | null;\n}\n\nfunction _resolveContextFields(opts: ToolOptions): ResolvedContext {\n const ctx = getActiveContext();\n\n function resolve(\n decoratorVal: unknown,\n trackerVal: unknown,\n ctxVal: unknown = null,\n ): unknown {\n if (decoratorVal !== undefined && decoratorVal !== null)\n return decoratorVal;\n if (ctxVal !== undefined && ctxVal !== null) return ctxVal;\n if (trackerVal !== undefined && trackerVal !== null) return trackerVal;\n return null;\n }\n\n return {\n amplitude: opts.amplitude ?? ctx?.amplitude ?? ToolCallTracker._amplitude ?? null,\n userId: resolve(opts.userId, ToolCallTracker._userId, ctx?.userId) as\n | string\n | null,\n sessionId: resolve(\n opts.sessionId,\n ToolCallTracker._sessionId,\n ctx?.sessionId,\n ) as string | null,\n traceId: resolve(opts.traceId, ToolCallTracker._traceId, ctx?.traceId) as\n | string\n | null,\n turnId: opts.turnId ?? ToolCallTracker._turnId,\n env: resolve(opts.env, ToolCallTracker._env, ctx?.env) as string | null,\n agentId: resolve(opts.agentId, ToolCallTracker._agentId, ctx?.agentId) as\n | string\n | null,\n parentAgentId: resolve(\n opts.parentAgentId,\n ToolCallTracker._parentAgentId,\n ctx?.parentAgentId,\n ) as string | null,\n customerOrgId: resolve(\n opts.customerOrgId,\n ToolCallTracker._customerOrgId,\n ctx?.customerOrgId,\n ) as string | null,\n agentVersion: resolve(\n opts.agentVersion,\n ToolCallTracker._agentVersion,\n ctx?.agentVersion,\n ) as string | null,\n context: resolve(\n opts.context,\n ToolCallTracker._context,\n ctx?.context,\n ) as Record<string, unknown> | null,\n privacyConfig: resolve(\n opts.privacyConfig,\n ToolCallTracker._privacyConfig,\n ) as PrivacyConfig | null,\n eventProperties: resolve(\n opts.eventProperties,\n ToolCallTracker._eventProperties,\n ) as Record<string, unknown> | null,\n userProperties: resolve(\n opts.userProperties,\n ToolCallTracker._userProperties,\n ) as Record<string, unknown> | null,\n groups: resolve(\n opts.groups,\n ToolCallTracker._groups,\n ctx?.groups,\n ) as Record<string, unknown> | null,\n };\n}\n\n// ---------------------------------------------------------------------------\n// tool() HOF — wraps a function to auto-track as [Agent] Tool Call\n// ---------------------------------------------------------------------------\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n// biome-ignore lint/suspicious/noExplicitAny: must accept any function signature\ntype AnyFn = (...args: any[]) => any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n// biome-ignore lint/suspicious/noExplicitAny: must accept any async function signature\ntype AsyncFn = (...args: any[]) => Promise<any>;\n\n/**\n * Converts a function's return type to Promise-wrapped if not already.\n * Reflects the fact that tool() always returns an async wrapper.\n */\nexport type ToolWrapped<T extends AnyFn> = T extends (\n ...args: infer A\n) => infer R\n ? R extends Promise<unknown>\n ? (...args: A) => R\n : (...args: A) => Promise<R>\n : T;\n\n/**\n * Wraps a function and emits one `[Agent] Tool Call` event per invocation.\n *\n * Supports both forms:\n * - `tool(fn, opts?)`\n * - `tool(opts)(fn)`\n *\n * Resolution order for tracking context is:\n * runtime overrides > decorator opts > active session context > `ToolCallTracker`.\n * If tracking is not configured (`amplitude`/`userId` missing), the wrapped function\n * still executes and no tracking event is emitted.\n */\nexport function tool<T extends AnyFn>(\n fn: T,\n opts?: ToolOptions,\n): ToolWrapped<T>;\nexport function tool(\n opts: ToolOptions,\n): <T extends AnyFn>(fn: T) => ToolWrapped<T>;\nexport function tool<T extends AnyFn>(\n fnOrOpts: T | ToolOptions,\n maybeOpts?: ToolOptions,\n): ToolWrapped<T> | (<U extends AnyFn>(fn: U) => ToolWrapped<U>) {\n if (typeof fnOrOpts === 'function') {\n return _wrapTool(fnOrOpts as T, maybeOpts ?? {}) as ToolWrapped<T>;\n }\n return <U extends AnyFn>(fn: U): ToolWrapped<U> =>\n _wrapTool(fn, fnOrOpts) as ToolWrapped<U>;\n}\n\nfunction _wrapTool<T extends AnyFn>(fn: T, opts: ToolOptions): ToolWrapped<T> {\n const toolName = opts.name || fn.name || 'anonymous';\n const schemaJson = opts.inputSchema ? JSON.stringify(opts.inputSchema) : null;\n\n const wrapper = async function (\n this: unknown,\n ...args: unknown[]\n ): Promise<unknown> {\n const r = _resolveContextFields(opts);\n\n if (r.amplitude == null || r.userId == null) {\n getLogger().warn(\n `Tool '${toolName}' called but tracking not configured. Call ToolCallTracker.setAmplitude() or pass amplitude/userId to tool().`,\n );\n return fn.apply(this, args);\n }\n\n const toolInput =\n args.length === 1 && typeof args[0] === 'object' && args[0] != null\n ? args[0]\n : args.length > 0\n ? { args }\n : undefined;\n\n const startTime = performance.now();\n let success = true;\n let errorMsg: string | null = null;\n let result: unknown = undefined;\n\n try {\n if (opts.timeoutMs != null) {\n result = await _runWithTimeout(\n fn.bind(this, ...args) as AsyncFn,\n opts.timeoutMs,\n toolName,\n );\n } else {\n result = await fn.apply(this, args);\n }\n return result;\n } catch (e) {\n success = false;\n errorMsg = e instanceof Error ? e.message : String(e);\n if (opts.onError != null) {\n try {\n opts.onError(e instanceof Error ? e : new Error(String(e)), toolName);\n } catch {\n // swallow callback errors\n }\n }\n getLogger().error(`Tool '${toolName}' failed: ${errorMsg}`);\n throw e;\n } finally {\n const latencyMs = performance.now() - startTime;\n\n const extraProps: Record<string, unknown> = {};\n if (schemaJson != null) {\n extraProps['[Agent] Tool Input Schema'] = schemaJson;\n }\n\n const mergedEvtProps = {\n ...(r.eventProperties ?? {}),\n ...extraProps,\n };\n\n try {\n trackToolCall({\n amplitude: r.amplitude,\n userId: r.userId,\n toolName,\n success,\n latencyMs,\n sessionId: r.sessionId,\n traceId: r.traceId,\n turnId: r.turnId ?? undefined,\n toolInput,\n toolOutput: success ? result : undefined,\n errorMessage: errorMsg,\n env: r.env,\n agentId: r.agentId,\n parentAgentId: r.parentAgentId,\n customerOrgId: r.customerOrgId,\n agentVersion: r.agentVersion,\n context: r.context,\n eventProperties:\n Object.keys(extraProps).length > 0\n ? mergedEvtProps\n : r.eventProperties,\n userProperties: r.userProperties,\n groups: r.groups,\n privacyConfig: r.privacyConfig,\n });\n } catch (trackError) {\n getLogger().error(\n `Failed to track tool call '${toolName}': ${trackError}`,\n );\n }\n }\n } as unknown as ToolWrapped<T>;\n\n Object.defineProperty(wrapper, 'name', {\n value: fn.name,\n configurable: true,\n });\n return wrapper;\n}\n\nasync function _runWithTimeout(\n fn: AsyncFn,\n timeoutMs: number,\n toolName: string,\n): Promise<unknown> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () =>\n reject(new Error(`Tool '${toolName}' exceeded ${timeoutMs}ms timeout`)),\n timeoutMs,\n );\n });\n\n try {\n return await Promise.race([fn(), timeoutPromise]);\n } finally {\n clearTimeout(timer);\n }\n}\n\n// ---------------------------------------------------------------------------\n// observe() HOF — wraps a function to auto-track as [Agent] Span\n// ---------------------------------------------------------------------------\n\ninterface ObserveOptions {\n name?: string;\n amplitude?: AmplitudeLike | null;\n userId?: string | null;\n agentId?: string | null;\n env?: string | null;\n privacyConfig?: PrivacyConfig | null;\n}\n\n/**\n * Converts a function's return type to Promise-wrapped if not already.\n * Reflects the fact that observe() always returns an async wrapper.\n */\nexport type ObserveWrapped<T extends AnyFn> = T extends (\n ...args: infer A\n) => infer R\n ? R extends Promise<unknown>\n ? (...args: A) => R\n : (...args: A) => Promise<R>\n : T;\n\n/**\n * Wraps a function and emits one `[Agent] Span` event per invocation.\n *\n * Supports both forms:\n * - `observe(fn, opts?)`\n * - `observe(opts)(fn)`\n *\n * If called inside an active session context, spans attach to that session.\n * If no context is active, observe creates a short-lived session boundary and\n * emits a session-end event when the wrapped function completes.\n */\nexport function observe<T extends AnyFn>(\n fn: T,\n opts?: ObserveOptions,\n): ObserveWrapped<T>;\nexport function observe(\n opts: ObserveOptions,\n): <T extends AnyFn>(fn: T) => ObserveWrapped<T>;\nexport function observe<T extends AnyFn>(\n fnOrOpts: T | ObserveOptions,\n maybeOpts?: ObserveOptions,\n): ObserveWrapped<T> | (<U extends AnyFn>(fn: U) => ObserveWrapped<U>) {\n if (typeof fnOrOpts === 'function') {\n return _wrapObserve(fnOrOpts as T, maybeOpts ?? {}) as ObserveWrapped<T>;\n }\n return <U extends AnyFn>(fn: U): ObserveWrapped<U> =>\n _wrapObserve(fn, fnOrOpts) as ObserveWrapped<U>;\n}\n\ninterface ResolvedObserveParams {\n amplitude: AmplitudeLike | null;\n userId: string;\n agentId: string | null;\n env: string | null;\n privacyConfig: PrivacyConfig | null;\n context: SessionContext | null;\n}\n\nfunction _resolveObserveParams(opts: ObserveOptions): ResolvedObserveParams {\n const ctx = getActiveContext();\n return {\n amplitude: opts.amplitude ?? ctx?.amplitude ?? ToolCallTracker._amplitude ?? null,\n userId: opts.userId ?? ctx?.userId ?? ToolCallTracker._userId ?? '',\n agentId: opts.agentId ?? ctx?.agentId ?? ToolCallTracker._agentId ?? null,\n env: opts.env ?? ctx?.env ?? ToolCallTracker._env ?? null,\n privacyConfig: opts.privacyConfig ?? ToolCallTracker._privacyConfig ?? null,\n context: ctx,\n };\n}\n\nfunction _serializeState(\n value: unknown,\n pc: PrivacyConfig | null,\n): Record<string, unknown> | null {\n if (value == null) return null;\n if (pc != null) {\n const mode = pc.contentMode;\n if (mode === 'metadata_only' || (mode == null && pc.privacyMode))\n return null;\n }\n if (typeof value === 'object' && !Array.isArray(value))\n return value as Record<string, unknown>;\n return { value: String(value) };\n}\n\nfunction _wrapObserve<T extends AnyFn>(fn: T, opts: ObserveOptions): T {\n const spanName = opts.name || fn.name || 'anonymous';\n\n const wrapper = async function (\n this: unknown,\n ...args: unknown[]\n ): Promise<unknown> {\n const params = _resolveObserveParams(opts);\n const ctx = getActiveContext();\n const ownsSession = ctx == null;\n const sessionId = ctx?.sessionId ?? randomUUID();\n\n const runFn = async (): Promise<unknown> => {\n const inputState = _serializeState(\n args.length === 1 ? args[0] : args.length > 0 ? { args } : null,\n params.privacyConfig,\n );\n\n const start = performance.now();\n let isError = false;\n let errorMessage: string | null = null;\n let result: unknown = undefined;\n\n try {\n result = await fn.apply(this, args);\n return result;\n } catch (exc) {\n isError = true;\n errorMessage = exc instanceof Error ? exc.message : String(exc);\n throw exc;\n } finally {\n const latencyMs = performance.now() - start;\n const outputState = _serializeState(result, params.privacyConfig);\n const activeCtx = getActiveContext();\n\n if (params.amplitude != null) {\n try {\n trackSpan({\n amplitude: params.amplitude,\n userId: params.userId,\n spanName,\n traceId: activeCtx?.traceId ?? randomUUID(),\n latencyMs,\n inputState,\n outputState,\n isError,\n errorMessage,\n sessionId,\n agentId: params.agentId || spanName,\n env: params.env,\n privacyConfig: params.privacyConfig,\n });\n } catch (e) {\n getLogger().error(\n `Failed to track @observe span '${spanName}': ${e}`,\n );\n }\n\n if (ownsSession) {\n try {\n trackSessionEnd({\n amplitude: params.amplitude,\n userId: params.userId,\n sessionId,\n env: params.env,\n agentId: params.agentId || spanName,\n privacyConfig: params.privacyConfig,\n });\n } catch (e) {\n getLogger().error(\n `Failed to end @observe session '${spanName}': ${e}`,\n );\n }\n }\n }\n }\n };\n\n if (ownsSession) {\n const newCtx = new SessionContext({\n sessionId,\n userId: params.userId,\n agentId: params.agentId || spanName,\n env: params.env,\n amplitude: params.amplitude,\n });\n return _sessionStorage.run(newCtx, runFn);\n }\n return runFn();\n } as unknown as T;\n\n Object.defineProperty(wrapper, 'name', {\n value: fn.name,\n configurable: true,\n });\n return wrapper;\n}\n"],"mappings":";;;;;;;;;;;;;AAwBA,IAAa,kBAAb,MAAa,gBAAgB;CAC3B,OAAO,aAAmC;CAC1C,OAAO,UAAyB;CAChC,OAAO,aAA4B;CACnC,OAAO,WAA0B;CACjC,OAAO,UAAU;CACjB,OAAO,OAAsB;CAC7B,OAAO,WAA0B;CACjC,OAAO,iBAAgC;CACvC,OAAO,iBAAgC;CACvC,OAAO,gBAA+B;CACtC,OAAO,WAA2C;CAClD,OAAO,iBAAuC;CAC9C,OAAO,mBAAmD;CAC1D,OAAO,kBAAkD;CACzD,OAAO,UAA0C;CAEjD,OAAO,aACL,WACA,QACA,OAcI,EAAE,EACA;AACN,kBAAgB,aAAa;AAC7B,kBAAgB,UAAU;AAC1B,kBAAgB,aAAa,KAAK,aAAa;AAC/C,kBAAgB,WAAW,KAAK,WAAW;AAC3C,kBAAgB,UAAU,KAAK,UAAU;AACzC,kBAAgB,OAAO,KAAK,OAAO;AACnC,kBAAgB,WAAW,KAAK,WAAW;AAC3C,kBAAgB,iBAAiB,KAAK,iBAAiB;AACvD,kBAAgB,iBAAiB,KAAK,iBAAiB;AACvD,kBAAgB,gBAAgB,KAAK,gBAAgB;AACrD,kBAAgB,WAAW,KAAK,WAAW;AAC3C,kBAAgB,iBAAiB,KAAK,iBAAiB;AACvD,kBAAgB,mBAAmB,KAAK,mBAAmB;AAC3D,kBAAgB,kBAAkB,KAAK,kBAAkB;AACzD,kBAAgB,UAAU,KAAK,UAAU;;CAG3C,OAAO,QAAc;AACnB,kBAAgB,aAAa;AAC7B,kBAAgB,UAAU;AAC1B,kBAAgB,aAAa;AAC7B,kBAAgB,WAAW;AAC3B,kBAAgB,UAAU;AAC1B,kBAAgB,OAAO;AACvB,kBAAgB,WAAW;AAC3B,kBAAgB,iBAAiB;AACjC,kBAAgB,iBAAiB;AACjC,kBAAgB,gBAAgB;AAChC,kBAAgB,WAAW;AAC3B,kBAAgB,iBAAiB;AACjC,kBAAgB,mBAAmB;AACnC,kBAAgB,kBAAkB;AAClC,kBAAgB,UAAU;;CAG5B,OAAO,eAAwB;AAC7B,SACE,gBAAgB,cAAc,QAAQ,gBAAgB,WAAW;;;AAiDvE,SAAS,sBAAsB,MAAoC;CACjE,MAAM,MAAM,kBAAkB;CAE9B,SAAS,QACP,cACA,YACA,SAAkB,MACT;AACT,MAAI,iBAAiB,UAAa,iBAAiB,KACjD,QAAO;AACT,MAAI,WAAW,UAAa,WAAW,KAAM,QAAO;AACpD,MAAI,eAAe,UAAa,eAAe,KAAM,QAAO;AAC5D,SAAO;;AAGT,QAAO;EACL,WAAW,KAAK,aAAa,KAAK,aAAa,gBAAgB,cAAc;EAC7E,QAAQ,QAAQ,KAAK,QAAQ,gBAAgB,SAAS,KAAK,OAAO;EAGlE,WAAW,QACT,KAAK,WACL,gBAAgB,YAChB,KAAK,UACN;EACD,SAAS,QAAQ,KAAK,SAAS,gBAAgB,UAAU,KAAK,QAAQ;EAGtE,QAAQ,KAAK,UAAU,gBAAgB;EACvC,KAAK,QAAQ,KAAK,KAAK,gBAAgB,MAAM,KAAK,IAAI;EACtD,SAAS,QAAQ,KAAK,SAAS,gBAAgB,UAAU,KAAK,QAAQ;EAGtE,eAAe,QACb,KAAK,eACL,gBAAgB,gBAChB,KAAK,cACN;EACD,eAAe,QACb,KAAK,eACL,gBAAgB,gBAChB,KAAK,cACN;EACD,cAAc,QACZ,KAAK,cACL,gBAAgB,eAChB,KAAK,aACN;EACD,SAAS,QACP,KAAK,SACL,gBAAgB,UAChB,KAAK,QACN;EACD,eAAe,QACb,KAAK,eACL,gBAAgB,eACjB;EACD,iBAAiB,QACf,KAAK,iBACL,gBAAgB,iBACjB;EACD,gBAAgB,QACd,KAAK,gBACL,gBAAgB,gBACjB;EACD,QAAQ,QACN,KAAK,QACL,gBAAgB,SAChB,KAAK,OACN;EACF;;AA6CH,SAAgB,KACd,UACA,WAC+D;AAC/D,KAAI,OAAO,aAAa,WACtB,QAAO,UAAU,UAAe,aAAa,EAAE,CAAC;AAElD,SAAyB,OACvB,UAAU,IAAI,SAAS;;AAG3B,SAAS,UAA2B,IAAO,MAAmC;CAC5E,MAAM,WAAW,KAAK,QAAQ,GAAG,QAAQ;CACzC,MAAM,aAAa,KAAK,cAAc,KAAK,UAAU,KAAK,YAAY,GAAG;CAEzE,MAAM,UAAU,eAEd,GAAG,MACe;EAClB,MAAM,IAAI,sBAAsB,KAAK;AAErC,MAAI,EAAE,aAAa,QAAQ,EAAE,UAAU,MAAM;AAC3C,cAAW,CAAC,KACV,SAAS,SAAS,+GACnB;AACD,UAAO,GAAG,MAAM,MAAM,KAAK;;EAG7B,MAAM,YACJ,KAAK,WAAW,KAAK,OAAO,KAAK,OAAO,YAAY,KAAK,MAAM,OAC3D,KAAK,KACL,KAAK,SAAS,IACZ,EAAE,MAAM,GACR;EAER,MAAM,YAAY,YAAY,KAAK;EACnC,IAAI,UAAU;EACd,IAAIA,WAA0B;EAC9B,IAAIC,SAAkB;AAEtB,MAAI;AACF,OAAI,KAAK,aAAa,KACpB,UAAS,MAAM,gBACb,GAAG,KAAK,MAAM,GAAG,KAAK,EACtB,KAAK,WACL,SACD;OAED,UAAS,MAAM,GAAG,MAAM,MAAM,KAAK;AAErC,UAAO;WACA,GAAG;AACV,aAAU;AACV,cAAW,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AACrD,OAAI,KAAK,WAAW,KAClB,KAAI;AACF,SAAK,QAAQ,aAAa,QAAQ,IAAI,IAAI,MAAM,OAAO,EAAE,CAAC,EAAE,SAAS;WAC/D;AAIV,cAAW,CAAC,MAAM,SAAS,SAAS,YAAY,WAAW;AAC3D,SAAM;YACE;GACR,MAAM,YAAY,YAAY,KAAK,GAAG;GAEtC,MAAMC,aAAsC,EAAE;AAC9C,OAAI,cAAc,KAChB,YAAW,+BAA+B;GAG5C,MAAM,iBAAiB;IACrB,GAAI,EAAE,mBAAmB,EAAE;IAC3B,GAAG;IACJ;AAED,OAAI;AACF,kBAAc;KACZ,WAAW,EAAE;KACb,QAAQ,EAAE;KACV;KACA;KACA;KACA,WAAW,EAAE;KACb,SAAS,EAAE;KACX,QAAQ,EAAE,UAAU;KACpB;KACA,YAAY,UAAU,SAAS;KAC/B,cAAc;KACd,KAAK,EAAE;KACP,SAAS,EAAE;KACX,eAAe,EAAE;KACjB,eAAe,EAAE;KACjB,cAAc,EAAE;KAChB,SAAS,EAAE;KACX,iBACE,OAAO,KAAK,WAAW,CAAC,SAAS,IAC7B,iBACA,EAAE;KACR,gBAAgB,EAAE;KAClB,QAAQ,EAAE;KACV,eAAe,EAAE;KAClB,CAAC;YACK,YAAY;AACnB,eAAW,CAAC,MACV,8BAA8B,SAAS,KAAK,aAC7C;;;;AAKP,QAAO,eAAe,SAAS,QAAQ;EACrC,OAAO,GAAG;EACV,cAAc;EACf,CAAC;AACF,QAAO;;AAGT,eAAe,gBACb,IACA,WACA,UACkB;CAClB,IAAIC;CACJ,MAAM,iBAAiB,IAAI,SAAgB,UAAU,WAAW;AAC9D,UAAQ,iBAEJ,uBAAO,IAAI,MAAM,SAAS,SAAS,aAAa,UAAU,YAAY,CAAC,EACzE,UACD;GACD;AAEF,KAAI;AACF,SAAO,MAAM,QAAQ,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC;WACzC;AACR,eAAa,MAAM;;;AA+CvB,SAAgB,QACd,UACA,WACqE;AACrE,KAAI,OAAO,aAAa,WACtB,QAAO,aAAa,UAAe,aAAa,EAAE,CAAC;AAErD,SAAyB,OACvB,aAAa,IAAI,SAAS;;AAY9B,SAAS,sBAAsB,MAA6C;CAC1E,MAAM,MAAM,kBAAkB;AAC9B,QAAO;EACL,WAAW,KAAK,aAAa,KAAK,aAAa,gBAAgB,cAAc;EAC7E,QAAQ,KAAK,UAAU,KAAK,UAAU,gBAAgB,WAAW;EACjE,SAAS,KAAK,WAAW,KAAK,WAAW,gBAAgB,YAAY;EACrE,KAAK,KAAK,OAAO,KAAK,OAAO,gBAAgB,QAAQ;EACrD,eAAe,KAAK,iBAAiB,gBAAgB,kBAAkB;EACvE,SAAS;EACV;;AAGH,SAAS,gBACP,OACA,IACgC;AAChC,KAAI,SAAS,KAAM,QAAO;AAC1B,KAAI,MAAM,MAAM;EACd,MAAM,OAAO,GAAG;AAChB,MAAI,SAAS,mBAAoB,QAAQ,QAAQ,GAAG,YAClD,QAAO;;AAEX,KAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,CACpD,QAAO;AACT,QAAO,EAAE,OAAO,OAAO,MAAM,EAAE;;AAGjC,SAAS,aAA8B,IAAO,MAAyB;CACrE,MAAM,WAAW,KAAK,QAAQ,GAAG,QAAQ;CAEzC,MAAM,UAAU,eAEd,GAAG,MACe;EAClB,MAAM,SAAS,sBAAsB,KAAK;EAC1C,MAAM,MAAM,kBAAkB;EAC9B,MAAM,cAAc,OAAO;EAC3B,MAAM,YAAY,KAAK,aAAa,YAAY;EAEhD,MAAM,QAAQ,YAA8B;GAC1C,MAAM,aAAa,gBACjB,KAAK,WAAW,IAAI,KAAK,KAAK,KAAK,SAAS,IAAI,EAAE,MAAM,GAAG,MAC3D,OAAO,cACR;GAED,MAAM,QAAQ,YAAY,KAAK;GAC/B,IAAI,UAAU;GACd,IAAIC,eAA8B;GAClC,IAAIH,SAAkB;AAEtB,OAAI;AACF,aAAS,MAAM,GAAG,MAAM,MAAM,KAAK;AACnC,WAAO;YACA,KAAK;AACZ,cAAU;AACV,mBAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC/D,UAAM;aACE;IACR,MAAM,YAAY,YAAY,KAAK,GAAG;IACtC,MAAM,cAAc,gBAAgB,QAAQ,OAAO,cAAc;IACjE,MAAM,YAAY,kBAAkB;AAEpC,QAAI,OAAO,aAAa,MAAM;AAC5B,SAAI;AACF,gBAAU;OACR,WAAW,OAAO;OAClB,QAAQ,OAAO;OACf;OACA,SAAS,WAAW,WAAW,YAAY;OAC3C;OACA;OACA;OACA;OACA;OACA;OACA,SAAS,OAAO,WAAW;OAC3B,KAAK,OAAO;OACZ,eAAe,OAAO;OACvB,CAAC;cACK,GAAG;AACV,iBAAW,CAAC,MACV,kCAAkC,SAAS,KAAK,IACjD;;AAGH,SAAI,YACF,KAAI;AACF,sBAAgB;OACd,WAAW,OAAO;OAClB,QAAQ,OAAO;OACf;OACA,KAAK,OAAO;OACZ,SAAS,OAAO,WAAW;OAC3B,eAAe,OAAO;OACvB,CAAC;cACK,GAAG;AACV,iBAAW,CAAC,MACV,mCAAmC,SAAS,KAAK,IAClD;;;;;AAOX,MAAI,aAAa;GACf,MAAM,SAAS,IAAI,eAAe;IAChC;IACA,QAAQ,OAAO;IACf,SAAS,OAAO,WAAW;IAC3B,KAAK,OAAO;IACZ,WAAW,OAAO;IACnB,CAAC;AACF,UAAO,gBAAgB,IAAI,QAAQ,MAAM;;AAE3C,SAAO,OAAO;;AAGhB,QAAO,eAAe,SAAS,QAAQ;EACrC,OAAO,GAAG;EACV,cAAc;EACf,CAAC;AACF,QAAO"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,15 +4,18 @@ import { EvidenceQuote, MessageLabel, RubricScore, SessionEnrichments, TopicClas
|
|
|
4
4
|
import { TenantHandle } from "./tenant.js";
|
|
5
5
|
import { AmplitudeAILike, AmplitudeClientLike, AmplitudeEvent, AmplitudeLike, AmplitudeOrAI, AnthropicParams, AnthropicResponse, Attachment, BedrockConverseParams, BedrockConverseResponse, ChatCompletionParams, ChatCompletionResponse, ChatMessage, ContentBlock, MistralChatParams, MistralChatResponse, ToolCallShape, TrackCallOptions, TrackFn, resolveAmplitude } from "./types.js";
|
|
6
6
|
import { AmplitudeAI } from "./client.js";
|
|
7
|
-
import { Session } from "./session.js";
|
|
8
|
-
import { AiMessageOpts, BoundAgent, EmbeddingOpts, ScoreOpts, SessionEndOpts, SessionEnrichmentOpts, SpanOpts, ToolCallOpts, UserMessageOpts } from "./bound-agent.js";
|
|
7
|
+
import { Session, SessionOptions } from "./session.js";
|
|
8
|
+
import { AgentOptions, AiMessageOpts, BoundAgent, EmbeddingOpts, ScoreOpts, SessionEndOpts, SessionEnrichmentOpts, SpanOpts, ToolCallOpts, UserMessageOpts } from "./bound-agent.js";
|
|
9
9
|
import { SessionContext, getActiveContext, runWithContext, runWithContextAsync } from "./context.js";
|
|
10
|
-
import { EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, MAX_SERIALIZED_LENGTH, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, SDK_RUNTIME, SDK_VERSION } from "./core/constants.js";
|
|
10
|
+
import { EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, MAX_SERIALIZED_LENGTH, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_DESCRIPTION, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MESSAGE_SOURCE, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, SDK_RUNTIME, SDK_VERSION } from "./core/constants.js";
|
|
11
11
|
import { serializeToJsonString, trackAiMessage, trackConversation, trackEmbedding, trackScore, trackSessionEnd, trackSessionEnrichment, trackSpan, trackToolCall, trackUserMessage } from "./core/tracking.js";
|
|
12
12
|
import { ObserveWrapped, ToolCallTracker, ToolWrapped, observe, tool } from "./decorators.js";
|
|
13
13
|
import { AmplitudeAIError, ConfigurationError, ProviderError, TrackingError, ValidationError } from "./exceptions.js";
|
|
14
|
+
import { isServerless } from "./serverless.js";
|
|
14
15
|
import { MockAmplitudeAI } from "./testing.js";
|
|
15
16
|
import { GENERATED_FILES, MCP_PROMPTS, MCP_RESOURCES, MCP_SERVER_NAME, MCP_TOOLS } from "./mcp/contract.js";
|
|
17
|
+
import { generateVerifyTest } from "./mcp/generate-verify-test.js";
|
|
18
|
+
import { InstrumentFileOptions, instrumentFile } from "./mcp/instrument-file.js";
|
|
16
19
|
import { extractContext, injectContext } from "./propagation.js";
|
|
17
20
|
import { MiddlewareOptions, createAmplitudeAIMiddleware } from "./middleware.js";
|
|
18
21
|
import { StreamingAccumulator } from "./utils/streaming.js";
|
|
@@ -34,4 +37,4 @@ import { inferProviderFromModel } from "./utils/providers.js";
|
|
|
34
37
|
import { calculateCost, enableLivePriceUpdates, getGenaiPriceLookupCandidates, inferProvider, stripProviderPrefix } from "./utils/costs.js";
|
|
35
38
|
import { countMessageTokens, countTokens, estimateTokens } from "./utils/tokens.js";
|
|
36
39
|
import { TIER_FAST, TIER_REASONING, TIER_STANDARD, inferModelTier } from "./utils/model-tiers.js";
|
|
37
|
-
export { AIConfig, type AIConfigOptions, ANTHROPIC_AVAILABLE, OPENAI_AVAILABLE as AZURE_OPENAI_AVAILABLE, type AiMessageOpts, AmplitudeAI, AmplitudeAIError, type AmplitudeAILike, AmplitudeAIWrapError, AmplitudeAgentExporter, AmplitudeCallbackHandler, type AmplitudeClientLike, AmplitudeCrewAIHooks, type AmplitudeEvent, AmplitudeGenAIExporter, type AmplitudeLike, AmplitudeLlamaIndexHandler, type AmplitudeOrAI, AmplitudeSpanExporter, AmplitudeToolLoop, AmplitudeTracingProcessor, Anthropic, type AnthropicParams, type AnthropicResponse, type Attachment, AzureOpenAI, BEDROCK_AVAILABLE, Bedrock, type BedrockConverseParams, type BedrockConverseResponse, BoundAgent, type ChatCompletionParams, type ChatCompletionResponse, type ChatMessage, ConfigurationError, type ContentBlock, ContentMode, EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, type EmbeddingOpts, EvidenceQuote, GEMINI_AVAILABLE, GENERATED_FILES, Gemini, MAX_SERIALIZED_LENGTH, MCP_PROMPTS, MCP_RESOURCES, MCP_SERVER_NAME, MCP_TOOLS, MISTRAL_AVAILABLE, MessageLabel, type MiddlewareOptions, Mistral, type MistralChatParams, type MistralChatResponse, MockAmplitudeAI, OPENAI_AVAILABLE, type ObserveWrapped, OpenAI, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, PrivacyConfig, ProviderError, RubricScore, SDK_RUNTIME, SDK_VERSION, type ScoreOpts, Session, SessionContext, type SessionEndOpts, type SessionEnrichmentOpts, SessionEnrichments, type SpanOpts, StreamingAccumulator, TIER_FAST, TIER_REASONING, TIER_STANDARD, TenantHandle, type ToolCallOpts, type ToolCallShape, ToolCallTracker, type ToolWrapped, TopicClassification, type TrackCallOptions, type TrackFn, TrackingError, type UserMessageOpts, ValidationError, WrappedResponses, calculateCost, countMessageTokens, countTokens, createAmplitudeAIMiddleware, createAmplitudeCallback, createAmplitudeLlamaIndexHandler, enableLivePriceUpdates, estimateTokens, extractAnthropicContent, extractAnthropicSystemPrompt, extractBedrockResponse, extractContext, extractGeminiResponse, extractSystemPrompt, getActiveContext, getGenaiPriceLookupCandidates, inferModelTier, inferProvider, inferProviderFromModel, injectContext, observe, patch, patchAnthropic, patchAzureOpenAI, patchBedrock, patchGemini, patchMistral, patchOpenAI, patchedProviders, resolveAmplitude, runWithContext, runWithContextAsync, serializeToJsonString, stripProviderPrefix, tool, trackAiMessage, trackConversation, trackEmbedding, trackScore, trackSessionEnd, trackSessionEnrichment, trackSpan, trackToolCall, trackUserMessage, unpatch, unpatchAnthropic, unpatchAzureOpenAI, unpatchBedrock, unpatchGemini, unpatchMistral, unpatchOpenAI, wrap };
|
|
40
|
+
export { AIConfig, type AIConfigOptions, ANTHROPIC_AVAILABLE, OPENAI_AVAILABLE as AZURE_OPENAI_AVAILABLE, type AgentOptions, type AiMessageOpts, AmplitudeAI, AmplitudeAIError, type AmplitudeAILike, AmplitudeAIWrapError, AmplitudeAgentExporter, AmplitudeCallbackHandler, type AmplitudeClientLike, AmplitudeCrewAIHooks, type AmplitudeEvent, AmplitudeGenAIExporter, type AmplitudeLike, AmplitudeLlamaIndexHandler, type AmplitudeOrAI, AmplitudeSpanExporter, AmplitudeToolLoop, AmplitudeTracingProcessor, Anthropic, type AnthropicParams, type AnthropicResponse, type Attachment, AzureOpenAI, BEDROCK_AVAILABLE, Bedrock, type BedrockConverseParams, type BedrockConverseResponse, BoundAgent, type ChatCompletionParams, type ChatCompletionResponse, type ChatMessage, ConfigurationError, type ContentBlock, ContentMode, EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, type EmbeddingOpts, EvidenceQuote, GEMINI_AVAILABLE, GENERATED_FILES, Gemini, type InstrumentFileOptions, MAX_SERIALIZED_LENGTH, MCP_PROMPTS, MCP_RESOURCES, MCP_SERVER_NAME, MCP_TOOLS, MISTRAL_AVAILABLE, MessageLabel, type MiddlewareOptions, Mistral, type MistralChatParams, type MistralChatResponse, MockAmplitudeAI, OPENAI_AVAILABLE, type ObserveWrapped, OpenAI, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_DESCRIPTION, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MESSAGE_SOURCE, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, PrivacyConfig, ProviderError, RubricScore, SDK_RUNTIME, SDK_VERSION, type ScoreOpts, Session, SessionContext, type SessionEndOpts, type SessionEnrichmentOpts, SessionEnrichments, type SessionOptions, type SpanOpts, StreamingAccumulator, TIER_FAST, TIER_REASONING, TIER_STANDARD, TenantHandle, type ToolCallOpts, type ToolCallShape, ToolCallTracker, type ToolWrapped, TopicClassification, type TrackCallOptions, type TrackFn, TrackingError, type UserMessageOpts, ValidationError, WrappedResponses, calculateCost, countMessageTokens, countTokens, createAmplitudeAIMiddleware, createAmplitudeCallback, createAmplitudeLlamaIndexHandler, enableLivePriceUpdates, estimateTokens, extractAnthropicContent, extractAnthropicSystemPrompt, extractBedrockResponse, extractContext, extractGeminiResponse, extractSystemPrompt, generateVerifyTest, getActiveContext, getGenaiPriceLookupCandidates, inferModelTier, inferProvider, inferProviderFromModel, injectContext, instrumentFile, isServerless, observe, patch, patchAnthropic, patchAzureOpenAI, patchBedrock, patchGemini, patchMistral, patchOpenAI, patchedProviders, resolveAmplitude, runWithContext, runWithContextAsync, serializeToJsonString, stripProviderPrefix, tool, trackAiMessage, trackConversation, trackEmbedding, trackScore, trackSessionEnd, trackSessionEnrichment, trackSpan, trackToolCall, trackUserMessage, unpatch, unpatchAnthropic, unpatchAzureOpenAI, unpatchBedrock, unpatchGemini, unpatchMistral, unpatchOpenAI, wrap };
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { AmplitudeAIError, ConfigurationError, ProviderError, TrackingError, ValidationError } from "./exceptions.js";
|
|
2
2
|
import { TIER_FAST, TIER_REASONING, TIER_STANDARD, inferModelTier } from "./utils/model-tiers.js";
|
|
3
|
-
import { EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, MAX_SERIALIZED_LENGTH, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, SDK_RUNTIME, SDK_VERSION } from "./core/constants.js";
|
|
3
|
+
import { EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, MAX_SERIALIZED_LENGTH, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_DESCRIPTION, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MESSAGE_SOURCE, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, SDK_RUNTIME, SDK_VERSION } from "./core/constants.js";
|
|
4
4
|
import { PrivacyConfig } from "./core/privacy.js";
|
|
5
5
|
import { serializeToJsonString, trackAiMessage, trackConversation, trackEmbedding, trackScore, trackSessionEnd, trackSessionEnrichment, trackSpan, trackToolCall, trackUserMessage } from "./core/tracking.js";
|
|
6
6
|
import { SessionContext, getActiveContext, runWithContext, runWithContextAsync } from "./context.js";
|
|
7
|
+
import { isServerless } from "./serverless.js";
|
|
7
8
|
import { Session } from "./session.js";
|
|
8
9
|
import { BoundAgent } from "./bound-agent.js";
|
|
9
10
|
import { AIConfig, ContentMode } from "./config.js";
|
|
@@ -24,6 +25,8 @@ import { ToolCallTracker, observe, tool } from "./decorators.js";
|
|
|
24
25
|
import { EvidenceQuote, MessageLabel, RubricScore, SessionEnrichments, TopicClassification } from "./core/enrichments.js";
|
|
25
26
|
import { MockAmplitudeAI } from "./testing.js";
|
|
26
27
|
import { GENERATED_FILES, MCP_PROMPTS, MCP_RESOURCES, MCP_SERVER_NAME, MCP_TOOLS } from "./mcp/contract.js";
|
|
28
|
+
import { generateVerifyTest } from "./mcp/generate-verify-test.js";
|
|
29
|
+
import { instrumentFile } from "./mcp/instrument-file.js";
|
|
27
30
|
import { createAmplitudeAIMiddleware } from "./middleware.js";
|
|
28
31
|
import { AzureOpenAI } from "./providers/azure-openai.js";
|
|
29
32
|
import { AmplitudeAIWrapError, wrap } from "./wrappers.js";
|
|
@@ -35,4 +38,4 @@ import { AmplitudeToolLoop } from "./integrations/anthropic-tools.js";
|
|
|
35
38
|
import { AmplitudeCrewAIHooks } from "./integrations/crewai.js";
|
|
36
39
|
import { countMessageTokens, countTokens, estimateTokens } from "./utils/tokens.js";
|
|
37
40
|
|
|
38
|
-
export { AIConfig, ANTHROPIC_AVAILABLE, OPENAI_AVAILABLE as AZURE_OPENAI_AVAILABLE, AmplitudeAI, AmplitudeAIError, AmplitudeAIWrapError, AmplitudeAgentExporter, AmplitudeCallbackHandler, AmplitudeCrewAIHooks, AmplitudeGenAIExporter, AmplitudeLlamaIndexHandler, AmplitudeSpanExporter, AmplitudeToolLoop, AmplitudeTracingProcessor, Anthropic, AzureOpenAI, BEDROCK_AVAILABLE, Bedrock, BoundAgent, ConfigurationError, ContentMode, EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, EvidenceQuote, GEMINI_AVAILABLE, GENERATED_FILES, Gemini, MAX_SERIALIZED_LENGTH, MCP_PROMPTS, MCP_RESOURCES, MCP_SERVER_NAME, MCP_TOOLS, MISTRAL_AVAILABLE, MessageLabel, Mistral, MockAmplitudeAI, OPENAI_AVAILABLE, OpenAI, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, PrivacyConfig, ProviderError, RubricScore, SDK_RUNTIME, SDK_VERSION, Session, SessionContext, SessionEnrichments, StreamingAccumulator, TIER_FAST, TIER_REASONING, TIER_STANDARD, TenantHandle, ToolCallTracker, TopicClassification, TrackingError, ValidationError, WrappedResponses, calculateCost, countMessageTokens, countTokens, createAmplitudeAIMiddleware, createAmplitudeCallback, createAmplitudeLlamaIndexHandler, enableLivePriceUpdates, estimateTokens, extractAnthropicContent, extractAnthropicSystemPrompt, extractBedrockResponse, extractContext, extractGeminiResponse, extractSystemPrompt, getActiveContext, getGenaiPriceLookupCandidates, inferModelTier, inferProvider, inferProviderFromModel, injectContext, observe, patch, patchAnthropic, patchAzureOpenAI, patchBedrock, patchGemini, patchMistral, patchOpenAI, patchedProviders, resolveAmplitude, runWithContext, runWithContextAsync, serializeToJsonString, stripProviderPrefix, tool, trackAiMessage, trackConversation, trackEmbedding, trackScore, trackSessionEnd, trackSessionEnrichment, trackSpan, trackToolCall, trackUserMessage, unpatch, unpatchAnthropic, unpatchAzureOpenAI, unpatchBedrock, unpatchGemini, unpatchMistral, unpatchOpenAI, wrap };
|
|
41
|
+
export { AIConfig, ANTHROPIC_AVAILABLE, OPENAI_AVAILABLE as AZURE_OPENAI_AVAILABLE, AmplitudeAI, AmplitudeAIError, AmplitudeAIWrapError, AmplitudeAgentExporter, AmplitudeCallbackHandler, AmplitudeCrewAIHooks, AmplitudeGenAIExporter, AmplitudeLlamaIndexHandler, AmplitudeSpanExporter, AmplitudeToolLoop, AmplitudeTracingProcessor, Anthropic, AzureOpenAI, BEDROCK_AVAILABLE, Bedrock, BoundAgent, ConfigurationError, ContentMode, EVENT_AI_RESPONSE, EVENT_EMBEDDING, EVENT_SCORE, EVENT_SESSION_END, EVENT_SESSION_ENRICHMENT, EVENT_SPAN, EVENT_TOOL_CALL, EVENT_USER_MESSAGE, EvidenceQuote, GEMINI_AVAILABLE, GENERATED_FILES, Gemini, MAX_SERIALIZED_LENGTH, MCP_PROMPTS, MCP_RESOURCES, MCP_SERVER_NAME, MCP_TOOLS, MISTRAL_AVAILABLE, MessageLabel, Mistral, MockAmplitudeAI, OPENAI_AVAILABLE, OpenAI, PROP_ABANDONMENT_TURN, PROP_AGENT_CHAIN, PROP_AGENT_DESCRIPTION, PROP_AGENT_ID, PROP_AGENT_VERSION, PROP_ATTACHMENTS, PROP_ATTACHMENT_COUNT, PROP_ATTACHMENT_TYPES, PROP_CACHE_CREATION_TOKENS, PROP_CACHE_READ_TOKENS, PROP_COMMENT, PROP_COMPONENT_TYPE, PROP_CONTEXT, PROP_COST_USD, PROP_CUSTOMER_ORG_ID, PROP_EDITED_MESSAGE_ID, PROP_EMBEDDING_DIMENSIONS, PROP_ENRICHMENTS, PROP_ENV, PROP_ERROR_MESSAGE, PROP_EVALUATION_SOURCE, PROP_FINISH_REASON, PROP_HAS_ATTACHMENTS, PROP_HAS_REASONING, PROP_IDLE_TIMEOUT_MINUTES, PROP_INPUT_STATE, PROP_INPUT_TOKENS, PROP_INVOCATION_ID, PROP_IS_EDIT, PROP_IS_ERROR, PROP_IS_REGENERATION, PROP_IS_STREAMING, PROP_LATENCY_MS, PROP_LOCALE, PROP_MAX_OUTPUT_TOKENS, PROP_MESSAGE_ID, PROP_MESSAGE_LABELS, PROP_MESSAGE_LABEL_MAP, PROP_MESSAGE_SOURCE, PROP_MODEL_NAME, PROP_MODEL_TIER, PROP_OUTPUT_STATE, PROP_OUTPUT_TOKENS, PROP_PARENT_AGENT_ID, PROP_PARENT_MESSAGE_ID, PROP_PARENT_SPAN_ID, PROP_PROMPT_ID, PROP_PROVIDER, PROP_QUALITY_SCORE, PROP_REASONING_CONTENT, PROP_REASONING_TOKENS, PROP_REQUEST_COMPLEXITY, PROP_ROOT_AGENT_NAME, PROP_RUNTIME, PROP_SCORE_NAME, PROP_SCORE_VALUE, PROP_SDK_VERSION, PROP_SENTIMENT_SCORE, PROP_SESSION_ID, PROP_SESSION_REPLAY_ID, PROP_SPAN_ID, PROP_SPAN_KIND, PROP_SPAN_NAME, PROP_SYSTEM_PROMPT, PROP_SYSTEM_PROMPT_LENGTH, PROP_TARGET_ID, PROP_TARGET_TYPE, PROP_TASK_FAILURE_REASON, PROP_TASK_FAILURE_TYPE, PROP_TEMPERATURE, PROP_TOOL_CALLS, PROP_TOOL_INPUT, PROP_TOOL_NAME, PROP_TOOL_OUTPUT, PROP_TOOL_SUCCESS, PROP_TOP_P, PROP_TOTAL_ATTACHMENT_SIZE, PROP_TOTAL_TOKENS, PROP_TRACE_ID, PROP_TTFB_MS, PROP_TURN_ID, PROP_WAS_CACHED, PROP_WAS_COPIED, PrivacyConfig, ProviderError, RubricScore, SDK_RUNTIME, SDK_VERSION, Session, SessionContext, SessionEnrichments, StreamingAccumulator, TIER_FAST, TIER_REASONING, TIER_STANDARD, TenantHandle, ToolCallTracker, TopicClassification, TrackingError, ValidationError, WrappedResponses, calculateCost, countMessageTokens, countTokens, createAmplitudeAIMiddleware, createAmplitudeCallback, createAmplitudeLlamaIndexHandler, enableLivePriceUpdates, estimateTokens, extractAnthropicContent, extractAnthropicSystemPrompt, extractBedrockResponse, extractContext, extractGeminiResponse, extractSystemPrompt, generateVerifyTest, getActiveContext, getGenaiPriceLookupCandidates, inferModelTier, inferProvider, inferProviderFromModel, injectContext, instrumentFile, isServerless, observe, patch, patchAnthropic, patchAzureOpenAI, patchBedrock, patchGemini, patchMistral, patchOpenAI, patchedProviders, resolveAmplitude, runWithContext, runWithContextAsync, serializeToJsonString, stripProviderPrefix, tool, trackAiMessage, trackConversation, trackEmbedding, trackScore, trackSessionEnd, trackSessionEnrichment, trackSpan, trackToolCall, trackUserMessage, unpatch, unpatchAnthropic, unpatchAzureOpenAI, unpatchBedrock, unpatchGemini, unpatchMistral, unpatchOpenAI, wrap };
|
package/dist/mcp/contract.d.ts
CHANGED
|
@@ -7,10 +7,14 @@ declare const MCP_TOOLS: {
|
|
|
7
7
|
readonly suggestInstrumentation: "suggest_instrumentation";
|
|
8
8
|
readonly validateFile: "validate_file";
|
|
9
9
|
readonly searchDocs: "search_docs";
|
|
10
|
+
readonly scanProject: "scan_project";
|
|
11
|
+
readonly generateVerifyTest: "generate_verify_test";
|
|
12
|
+
readonly instrumentFile: "instrument_file";
|
|
10
13
|
};
|
|
11
14
|
declare const MCP_RESOURCES: {
|
|
12
15
|
readonly eventSchema: "amplitude-ai://event-schema";
|
|
13
16
|
readonly integrationPatterns: "amplitude-ai://integration-patterns";
|
|
17
|
+
readonly instrumentGuide: "amplitude-ai://instrument-guide";
|
|
14
18
|
};
|
|
15
19
|
declare const MCP_PROMPTS: {
|
|
16
20
|
readonly instrumentApp: "instrument_app";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","names":[],"sources":["../../src/mcp/contract.ts"],"sourcesContent":[],"mappings":";cAAa,eAAA;AAAA,cAEA,SAFe,EAAA;EAEf,SAAA,
|
|
1
|
+
{"version":3,"file":"contract.d.ts","names":[],"sources":["../../src/mcp/contract.ts"],"sourcesContent":[],"mappings":";cAAa,eAAA;AAAA,cAEA,SAFe,EAAA;EAEf,SAAA,cAUH,EAAA,kBAAA;EAEG,SAAA,qBAIH,EAAA,yBAAA;EAEG,SAAA,aAEH,EAAA,gBAAA;EAEG,SAAA,sBAKH,EAAA,yBAAA;EAEE,SAAA,YAAS,EAAA,eAAmC;;;;;;cAjB3C;;;;;cAMA;;;cAIA;;;;;;KAOD,SAAA,WAAoB,wBAAwB"}
|
package/dist/mcp/contract.js
CHANGED
|
@@ -6,11 +6,15 @@ const MCP_TOOLS = {
|
|
|
6
6
|
validateSetup: "validate_setup",
|
|
7
7
|
suggestInstrumentation: "suggest_instrumentation",
|
|
8
8
|
validateFile: "validate_file",
|
|
9
|
-
searchDocs: "search_docs"
|
|
9
|
+
searchDocs: "search_docs",
|
|
10
|
+
scanProject: "scan_project",
|
|
11
|
+
generateVerifyTest: "generate_verify_test",
|
|
12
|
+
instrumentFile: "instrument_file"
|
|
10
13
|
};
|
|
11
14
|
const MCP_RESOURCES = {
|
|
12
15
|
eventSchema: "amplitude-ai://event-schema",
|
|
13
|
-
integrationPatterns: "amplitude-ai://integration-patterns"
|
|
16
|
+
integrationPatterns: "amplitude-ai://integration-patterns",
|
|
17
|
+
instrumentGuide: "amplitude-ai://instrument-guide"
|
|
14
18
|
};
|
|
15
19
|
const MCP_PROMPTS = { instrumentApp: "instrument_app" };
|
|
16
20
|
const GENERATED_FILES = {
|
package/dist/mcp/contract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.js","names":[],"sources":["../../src/mcp/contract.ts"],"sourcesContent":["export const MCP_SERVER_NAME = 'amplitude-ai-mcp';\n\nexport const MCP_TOOLS = {\n getEventSchema: 'get_event_schema',\n getIntegrationPattern: 'get_integration_pattern',\n validateSetup: 'validate_setup',\n suggestInstrumentation: 'suggest_instrumentation',\n validateFile: 'validate_file',\n searchDocs: 'search_docs',\n} as const;\n\nexport const MCP_RESOURCES = {\n eventSchema: 'amplitude-ai://event-schema',\n integrationPatterns: 'amplitude-ai://integration-patterns',\n} as const;\n\nexport const MCP_PROMPTS = {\n instrumentApp: 'instrument_app',\n} as const;\n\nexport const GENERATED_FILES = {\n agents: 'AGENTS.md',\n llms: 'llms.txt',\n llmsFull: 'llms-full.txt',\n mcpSchema: 'mcp.schema.json',\n} as const;\n\nexport type MToolName = (typeof MCP_TOOLS)[keyof typeof MCP_TOOLS];\n"],"mappings":";AAAA,MAAa,kBAAkB;AAE/B,MAAa,YAAY;CACvB,gBAAgB;CAChB,uBAAuB;CACvB,eAAe;CACf,wBAAwB;CACxB,cAAc;CACd,YAAY;CACb;AAED,MAAa,gBAAgB;CAC3B,aAAa;CACb,qBAAqB;
|
|
1
|
+
{"version":3,"file":"contract.js","names":[],"sources":["../../src/mcp/contract.ts"],"sourcesContent":["export const MCP_SERVER_NAME = 'amplitude-ai-mcp';\n\nexport const MCP_TOOLS = {\n getEventSchema: 'get_event_schema',\n getIntegrationPattern: 'get_integration_pattern',\n validateSetup: 'validate_setup',\n suggestInstrumentation: 'suggest_instrumentation',\n validateFile: 'validate_file',\n searchDocs: 'search_docs',\n scanProject: 'scan_project',\n generateVerifyTest: 'generate_verify_test',\n instrumentFile: 'instrument_file',\n} as const;\n\nexport const MCP_RESOURCES = {\n eventSchema: 'amplitude-ai://event-schema',\n integrationPatterns: 'amplitude-ai://integration-patterns',\n instrumentGuide: 'amplitude-ai://instrument-guide',\n} as const;\n\nexport const MCP_PROMPTS = {\n instrumentApp: 'instrument_app',\n} as const;\n\nexport const GENERATED_FILES = {\n agents: 'AGENTS.md',\n llms: 'llms.txt',\n llmsFull: 'llms-full.txt',\n mcpSchema: 'mcp.schema.json',\n} as const;\n\nexport type MToolName = (typeof MCP_TOOLS)[keyof typeof MCP_TOOLS];\n"],"mappings":";AAAA,MAAa,kBAAkB;AAE/B,MAAa,YAAY;CACvB,gBAAgB;CAChB,uBAAuB;CACvB,eAAe;CACf,wBAAwB;CACxB,cAAc;CACd,YAAY;CACZ,aAAa;CACb,oBAAoB;CACpB,gBAAgB;CACjB;AAED,MAAa,gBAAgB;CAC3B,aAAa;CACb,qBAAqB;CACrB,iBAAiB;CAClB;AAED,MAAa,cAAc,EACzB,eAAe,kBAChB;AAED,MAAa,kBAAkB;CAC7B,QAAQ;CACR,MAAM;CACN,UAAU;CACV,WAAW;CACZ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-verify-test.d.ts","names":[],"sources":["../../src/mcp/generate-verify-test.ts"],"sourcesContent":[],"mappings":";;;iBAMgB,kBAAA,aAA+B"}
|