@morsehq-dev/sdk 0.4.1 → 0.5.0-rc.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/dist/anthropic/index.cjs +12 -10
- package/dist/anthropic/index.js +5 -3
- package/dist/anthropic-agent-sdk/index.cjs +52 -34
- package/dist/anthropic-agent-sdk/index.cjs.map +1 -1
- package/dist/anthropic-agent-sdk/index.js +25 -7
- package/dist/anthropic-agent-sdk/index.js.map +1 -1
- package/dist/browser/anthropic/index.cjs +12 -10
- package/dist/browser/anthropic/index.js +5 -3
- package/dist/browser/anthropic-agent-sdk/index.cjs +52 -34
- package/dist/browser/anthropic-agent-sdk/index.cjs.map +1 -1
- package/dist/browser/anthropic-agent-sdk/index.js +25 -7
- package/dist/browser/anthropic-agent-sdk/index.js.map +1 -1
- package/dist/browser/chunk-32U547L3.js +118 -0
- package/dist/browser/chunk-32U547L3.js.map +1 -0
- package/dist/{chunk-SBGY5NS4.js → browser/chunk-454FDWBM.js} +6 -4
- package/dist/browser/chunk-454FDWBM.js.map +1 -0
- package/dist/browser/{chunk-EFUQVASI.cjs → chunk-5EFKNOO7.cjs} +17 -15
- package/dist/browser/chunk-5EFKNOO7.cjs.map +1 -0
- package/dist/browser/{chunk-DOLWR7LD.js → chunk-5IWGFPKQ.js} +4 -4
- package/dist/browser/{chunk-DOLWR7LD.js.map → chunk-5IWGFPKQ.js.map} +1 -1
- package/dist/browser/{chunk-F3B4UR64.js → chunk-6DOP3MTY.js} +386 -53
- package/dist/browser/chunk-6DOP3MTY.js.map +1 -0
- package/dist/browser/{chunk-GWJYOQNC.js → chunk-A7P3ZBZX.js} +10 -4
- package/dist/browser/chunk-A7P3ZBZX.js.map +1 -0
- package/dist/browser/{chunk-M2GZJ3RS.cjs → chunk-AV35EOER.cjs} +20 -14
- package/dist/browser/chunk-AV35EOER.cjs.map +1 -0
- package/dist/browser/{chunk-AYNX24P5.js → chunk-AZ3SVK3K.js} +3 -3
- package/dist/browser/{chunk-AYNX24P5.js.map → chunk-AZ3SVK3K.js.map} +1 -1
- package/dist/browser/chunk-FNZWJU64.cjs +31 -0
- package/dist/browser/chunk-FNZWJU64.cjs.map +1 -0
- package/dist/browser/chunk-HZZK2EMO.cjs +126 -0
- package/dist/browser/chunk-HZZK2EMO.cjs.map +1 -0
- package/dist/browser/{chunk-QWRQJO57.js → chunk-MLDVXMQD.js} +3 -3
- package/dist/browser/{chunk-QWRQJO57.js.map → chunk-MLDVXMQD.js.map} +1 -1
- package/dist/{chunk-Y7SVGUKY.cjs → browser/chunk-NT37C2TK.cjs} +7 -7
- package/dist/browser/{chunk-YNUZGKUA.cjs.map → chunk-NT37C2TK.cjs.map} +1 -1
- package/dist/browser/{chunk-3643DC7K.cjs → chunk-RBNCTHK3.cjs} +5 -2
- package/dist/browser/{chunk-3643DC7K.cjs.map → chunk-RBNCTHK3.cjs.map} +1 -1
- package/dist/browser/chunk-VFNNU3AX.js +28 -0
- package/dist/browser/chunk-VFNNU3AX.js.map +1 -0
- package/dist/browser/{chunk-HGN7J3EU.cjs → chunk-WY2VLKRR.cjs} +12 -12
- package/dist/browser/{chunk-HGN7J3EU.cjs.map → chunk-WY2VLKRR.cjs.map} +1 -1
- package/dist/browser/{chunk-DXWHT3HK.cjs → chunk-ZGYZZCUK.cjs} +391 -55
- package/dist/browser/chunk-ZGYZZCUK.cjs.map +1 -0
- package/dist/browser/index.cjs +112 -82
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +40 -10
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/integrations/pino.cjs +4 -4
- package/dist/browser/integrations/pino.js +3 -3
- package/dist/browser/langchain/index.cjs +19 -19
- package/dist/browser/langchain/index.js +3 -3
- package/dist/browser/langgraph/index.cjs +34 -26
- package/dist/browser/langgraph/index.cjs.map +1 -1
- package/dist/browser/langgraph/index.js +16 -8
- package/dist/browser/langgraph/index.js.map +1 -1
- package/dist/browser/openai/index.cjs +22 -8
- package/dist/browser/openai/index.cjs.map +1 -1
- package/dist/browser/openai/index.js +17 -3
- package/dist/browser/openai/index.js.map +1 -1
- package/dist/browser/openai-agents/index.cjs +42 -34
- package/dist/browser/openai-agents/index.cjs.map +1 -1
- package/dist/browser/openai-agents/index.js +13 -5
- package/dist/browser/openai-agents/index.js.map +1 -1
- package/dist/browser/vercel-ai/index.cjs +16 -16
- package/dist/browser/vercel-ai/index.js +4 -4
- package/dist/{chunk-4R4SHGOK.js → chunk-4JPZV2VZ.js} +3 -3
- package/dist/{chunk-4R4SHGOK.js.map → chunk-4JPZV2VZ.js.map} +1 -1
- package/dist/{chunk-HNCWTENX.cjs → chunk-5B3IUESN.cjs} +415 -70
- package/dist/chunk-5B3IUESN.cjs.map +1 -0
- package/dist/chunk-5RXSICEJ.js +118 -0
- package/dist/chunk-5RXSICEJ.js.map +1 -0
- package/dist/chunk-7A2EWXZK.cjs +31 -0
- package/dist/chunk-7A2EWXZK.cjs.map +1 -0
- package/dist/{chunk-STK4KJQ6.js → chunk-AAR4FYFO.js} +10 -4
- package/dist/chunk-AAR4FYFO.js.map +1 -0
- package/dist/{chunk-LQI63FHF.cjs → chunk-ADRVMGAW.cjs} +20 -14
- package/dist/chunk-ADRVMGAW.cjs.map +1 -0
- package/dist/{chunk-V5J6J4ZR.js → chunk-CECVNM7R.js} +4 -4
- package/dist/{chunk-V5J6J4ZR.js.map → chunk-CECVNM7R.js.map} +1 -1
- package/dist/{chunk-KJEO52QS.cjs → chunk-HICEJ4LV.cjs} +5 -2
- package/dist/{chunk-KJEO52QS.cjs.map → chunk-HICEJ4LV.cjs.map} +1 -1
- package/dist/{chunk-QXRJUPDP.cjs → chunk-HSY7V4RG.cjs} +12 -12
- package/dist/{chunk-QXRJUPDP.cjs.map → chunk-HSY7V4RG.cjs.map} +1 -1
- package/dist/chunk-LB6ZLJUR.js +28 -0
- package/dist/chunk-LB6ZLJUR.js.map +1 -0
- package/dist/{browser/chunk-F7BGQ26H.js → chunk-O3Q5L2HY.js} +6 -4
- package/dist/chunk-O3Q5L2HY.js.map +1 -0
- package/dist/{chunk-5D6SBSEI.cjs → chunk-RF7NI5VN.cjs} +17 -15
- package/dist/chunk-RF7NI5VN.cjs.map +1 -0
- package/dist/{chunk-AEFUXEKV.js → chunk-TP3N3S2D.js} +3 -3
- package/dist/{chunk-AEFUXEKV.js.map → chunk-TP3N3S2D.js.map} +1 -1
- package/dist/{chunk-LTKGLXAE.js → chunk-UEKQIRRA.js} +410 -68
- package/dist/chunk-UEKQIRRA.js.map +1 -0
- package/dist/{browser/chunk-YNUZGKUA.cjs → chunk-UWQPOWJQ.cjs} +7 -7
- package/dist/{chunk-Y7SVGUKY.cjs.map → chunk-UWQPOWJQ.cjs.map} +1 -1
- package/dist/chunk-VD3KRXSP.cjs +126 -0
- package/dist/chunk-VD3KRXSP.cjs.map +1 -0
- package/dist/index.cjs +119 -89
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +41 -11
- package/dist/index.js.map +1 -1
- package/dist/integrations/pino.cjs +4 -4
- package/dist/integrations/pino.js +3 -3
- package/dist/langchain/index.cjs +19 -19
- package/dist/langchain/index.d.cts +1 -1
- package/dist/langchain/index.d.ts +1 -1
- package/dist/langchain/index.js +3 -3
- package/dist/langgraph/index.cjs +34 -26
- package/dist/langgraph/index.cjs.map +1 -1
- package/dist/langgraph/index.d.cts +1 -1
- package/dist/langgraph/index.d.ts +1 -1
- package/dist/langgraph/index.js +16 -8
- package/dist/langgraph/index.js.map +1 -1
- package/dist/openai/index.cjs +22 -8
- package/dist/openai/index.cjs.map +1 -1
- package/dist/openai/index.js +17 -3
- package/dist/openai/index.js.map +1 -1
- package/dist/openai-agents/index.cjs +42 -34
- package/dist/openai-agents/index.cjs.map +1 -1
- package/dist/openai-agents/index.js +13 -5
- package/dist/openai-agents/index.js.map +1 -1
- package/dist/{tracing-BYAqjT5Q.d.cts → tracing-CNlre8TK.d.cts} +1 -0
- package/dist/{tracing-rz9cWQ8d.d.ts → tracing-J8ZgxVzU.d.ts} +1 -0
- package/dist/vercel-ai/index.cjs +16 -16
- package/dist/vercel-ai/index.js +4 -4
- package/package.json +1 -9
- package/dist/browser/chunk-3BGG7GH3.cjs +0 -183
- package/dist/browser/chunk-3BGG7GH3.cjs.map +0 -1
- package/dist/browser/chunk-DXWHT3HK.cjs.map +0 -1
- package/dist/browser/chunk-EFUQVASI.cjs.map +0 -1
- package/dist/browser/chunk-F3B4UR64.js.map +0 -1
- package/dist/browser/chunk-F7BGQ26H.js.map +0 -1
- package/dist/browser/chunk-GWJYOQNC.js.map +0 -1
- package/dist/browser/chunk-M2GZJ3RS.cjs.map +0 -1
- package/dist/browser/chunk-YHV5GL32.js +0 -178
- package/dist/browser/chunk-YHV5GL32.js.map +0 -1
- package/dist/chunk-5D6SBSEI.cjs.map +0 -1
- package/dist/chunk-HNCWTENX.cjs.map +0 -1
- package/dist/chunk-LQI63FHF.cjs.map +0 -1
- package/dist/chunk-LTKGLXAE.js.map +0 -1
- package/dist/chunk-POCQNSVD.js +0 -178
- package/dist/chunk-POCQNSVD.js.map +0 -1
- package/dist/chunk-SBGY5NS4.js.map +0 -1
- package/dist/chunk-STK4KJQ6.js.map +0 -1
- package/dist/chunk-T2KW3P23.cjs +0 -183
- package/dist/chunk-T2KW3P23.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/_internal/env.ts","../../src/_internal/otel-provider.browser.ts","../../src/_internal/redaction.ts","../../src/_internal/spans.ts","../../src/_internal/tracing.ts","../../src/propagation.ts"],"names":["out","extractTraceparent"],"mappings":"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","file":"chunk-F3B4UR64.js","sourcesContent":["/**\n * Environment variable resolution for SDK auto-init.\n *\n * The V2 TS SDK supports zero-setup integration: the customer sets\n * `MORSE_API_KEY` in their process environment (Node) or supplies\n * it via build-time replacement (browser bundler), and the SDK\n * auto-initializes on first use. This module centralises the env-var\n * contract so the rules stay in one place.\n *\n * Env vars (all optional unless noted) — must mirror the Python SDK's\n * `_internal/env.py`:\n *\n * - `MORSE_API_KEY` — triggers auto-init when set; absent = SDK dormant\n * - `MORSE_ENDPOINT` — override default ingestion URL\n * - `MORSE_FLUSH_INTERVAL_SECONDS` — override default 2.0s flush interval\n * - `MORSE_DISABLED` — \"1\"/\"true\" makes all SDK calls no-op\n * - `MORSE_SDK_DEBUG` — \"1\"/\"true\" raises internal-error log level\n * - `MORSE_SDK_DISABLE_TELEMETRY` — \"1\"/\"true\" suppresses out-of-band Sentry reports\n * - `MORSE_DISABLE_AUTO_DETECT` — (MHQ-482, mirrors Python's `MORSE_DISABLE_AUTO_DETECT`)\n * \"1\"/\"true\" skips the zero-config adapter auto-detect scan\n * - `MORSE_SAMPLE_RATE` — (MHQ-482, mirrors Python MHQ-668/671) deterministic\n * trace-ID head sampling rate in [0.0, 1.0], default 1.0.\n * - `MORSE_MAX_FIELD_BYTES` — (MHQ-482) byte cap applied to input_data / output_data /\n * context_segments / custom metadata at attribute-set\n * time, default 65536.\n * - `MORSE_MAX_QUEUE_SIZE` — (MHQ-482) OTel BatchSpanProcessor queue size, default\n * 2048 (OTel SDK default).\n * - `MORSE_MAX_BATCH_SIZE` — (MHQ-482) OTel BatchSpanProcessor max export batch\n * size, default 512 (OTel SDK default).\n * - `MORSE_LEGACY_TRANSPORT` — (MHQ-482) \"1\"/\"true\" reverts run()/span()/runTraced()\n * to the pre-OTel JSON batch transport instead of OTLP.\n * Escape hatch for the migration window only;\n * record()/log() always use the JSON path.\n * - `MORSE_CAPTURE_DB` — (MHQ-482, mirrors Python's `infra_capture.py`)\n * \"1\"/\"true\" enables zero-config `db` span\n * auto-capture (pg / mysql2 / better-sqlite3).\n * Opt-in, same as the Python SDK.\n * - `MORSE_CAPTURE_INFRA` — (MHQ-482) \"1\"/\"true\" convenience alias that enables\n * ALL infra auto-capture (currently just DB — mirrors\n * Python's combined flag; HTTP capture is a separate\n * port not yet landed in the TS SDK).\n */\n\n/**\n * Default ingestion endpoint.\n *\n * Phase 6c targets the Railway dev URL until the custom domain is wired up\n * in Phase 6d. Mirrors the Python SDK constant in\n * `apps/sdk/python/src/morse/client.py`.\n */\nexport const DEFAULT_ENDPOINT = \"https://api.morsehq.dev/api/v1/traces/batch\";\n\n/**\n * Read an env var in a runtime-agnostic way.\n *\n * Handles Node (`process.env`), Deno (`Deno.env`), and browser\n * environments where `process` is undefined. In the browser the value\n * typically comes from a bundler-time replacement (Next.js inlines\n * `process.env.MORSE_API_KEY` at build time when the var is\n * exposed via `next.config.ts`).\n */\nfunction readEnv(key: string): string | undefined {\n // Node / Next.js (server / build-time replaced)\n if (typeof process !== \"undefined\" && process.env) {\n const v = process.env[key];\n if (typeof v === \"string\") return v;\n }\n // Deno\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const denoGlobal = (globalThis as any).Deno as\n | { env: { get(k: string): string | undefined } }\n | undefined;\n if (denoGlobal?.env?.get) {\n try {\n const v = denoGlobal.env.get(key);\n if (typeof v === \"string\") return v;\n } catch {\n // Permission denied — fall through.\n }\n }\n return undefined;\n}\n\nfunction truthy(value: string | undefined): boolean {\n if (!value) return false;\n return [\"1\", \"true\", \"yes\", \"on\"].includes(value.trim().toLowerCase());\n}\n\nexport function getApiKey(): string | undefined {\n const raw = readEnv(\"MORSE_API_KEY\");\n if (!raw) return undefined;\n const trimmed = raw.trim();\n return trimmed || undefined;\n}\n\nexport function getEndpoint(): string | undefined {\n const raw = readEnv(\"MORSE_ENDPOINT\");\n if (!raw) return undefined;\n const trimmed = raw.trim();\n return trimmed || undefined;\n}\n\nexport function getFlushIntervalSeconds(defaultSeconds = 2.0): number {\n const raw = readEnv(\"MORSE_FLUSH_INTERVAL_SECONDS\");\n if (!raw) return defaultSeconds;\n const parsed = Number.parseFloat(raw.trim());\n if (!Number.isFinite(parsed) || parsed <= 0) return defaultSeconds;\n return parsed;\n}\n\nexport function isDisabled(): boolean {\n return truthy(readEnv(\"MORSE_DISABLED\"));\n}\n\nexport function isDebug(): boolean {\n return truthy(readEnv(\"MORSE_SDK_DEBUG\"));\n}\n\nexport function isTelemetryDisabled(): boolean {\n return truthy(readEnv(\"MORSE_SDK_DISABLE_TELEMETRY\"));\n}\n\n/**\n * True when `MORSE_DISABLE_AUTO_DETECT=1` — the zero-config adapter scan\n * (`_internal/auto-detect.ts`) is skipped entirely. Mirrors the Python SDK's\n * `is_auto_detect_disabled()`. Customers can still call the adapter\n * `wrapX()` / `instrumentX()` functions directly.\n */\nexport function isAutoDetectDisabled(): boolean {\n return truthy(readEnv(\"MORSE_DISABLE_AUTO_DETECT\"));\n}\n\n/**\n * Resource-level \"source\" label for Morse's own dogfood emitters.\n *\n * Mirrors the Python SDK's `get_internal_source()` (PR #90). Only the\n * accepted whitelist values are honoured — any other value is treated\n * as unset so a typo in a customer's environment never accidentally\n * tags their data as internal.\n */\nconst VALID_INTERNAL_SOURCES = new Set([\"copilot\", \"investigator\", \"refagent\", \"ui-bot\"]);\n\nexport function getInternalSource(): string | undefined {\n const raw = readEnv(\"MORSE_INTERNAL_SOURCE\");\n if (!raw) return undefined;\n const trimmed = raw.trim().toLowerCase();\n if (!trimmed) return undefined;\n return VALID_INTERNAL_SOURCES.has(trimmed) ? trimmed : undefined;\n}\n\nexport function isValidInternalSource(value: string | null | undefined): boolean {\n return typeof value === \"string\" && VALID_INTERNAL_SOURCES.has(value);\n}\n\n/**\n * Deterministic trace-ID head sampling rate for the OTel export pipeline\n * (MHQ-482, mirrors Python `_internal/env.py::get_sample_rate`). Out-of-range\n * or unparseable values fall back to `default`.\n */\nexport function getSampleRate(defaultRate = 1.0): number {\n const raw = readEnv(\"MORSE_SAMPLE_RATE\");\n if (!raw) return defaultRate;\n const parsed = Number.parseFloat(raw.trim());\n if (!Number.isFinite(parsed) || parsed < 0.0 || parsed > 1.0) return defaultRate;\n return parsed;\n}\n\n/** Byte cap for input_data/output_data/context_segments/metadata attribute values. */\nexport function getMaxFieldBytes(defaultBytes = 65536): number {\n const raw = readEnv(\"MORSE_MAX_FIELD_BYTES\");\n if (!raw) return defaultBytes;\n const parsed = Number.parseInt(raw.trim(), 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : defaultBytes;\n}\n\n/** OTel BatchSpanProcessor queue size (OTel SDK default: 2048). */\nexport function getMaxQueueSize(defaultSize = 2048): number {\n const raw = readEnv(\"MORSE_MAX_QUEUE_SIZE\");\n if (!raw) return defaultSize;\n const parsed = Number.parseInt(raw.trim(), 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : defaultSize;\n}\n\n/** OTel BatchSpanProcessor max export batch size (OTel SDK default: 512). */\nexport function getMaxBatchSize(defaultSize = 512): number {\n const raw = readEnv(\"MORSE_MAX_BATCH_SIZE\");\n if (!raw) return defaultSize;\n const parsed = Number.parseInt(raw.trim(), 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : defaultSize;\n}\n\n/**\n * Escape hatch: `run()`/`span()`/`runTraced()` revert to the pre-OTel JSON\n * batch transport instead of OTLP when set. `record()`/`log()` always use\n * the JSON path regardless of this flag.\n */\nexport function isLegacyTransport(): boolean {\n return truthy(readEnv(\"MORSE_LEGACY_TRANSPORT\"));\n}\n\n/**\n * DB auto-capture opt-in (MHQ-482, mirrors Python's `infra_capture.py`'s\n * `MORSE_CAPTURE_DB` / `MORSE_CAPTURE_INFRA` env flags — see\n * `maybe_enable_from_env`). Opt-in while the approach is proven across\n * drivers, same posture as the Python SDK.\n */\nexport function isDbCaptureEnabled(): boolean {\n return truthy(readEnv(\"MORSE_CAPTURE_DB\")) || truthy(readEnv(\"MORSE_CAPTURE_INFRA\"));\n}\n","/**\n * Browser replacement for `otel-provider.ts` (MHQ-482 follow-up).\n *\n * Why this file exists\n * --------------------\n * `otel-provider.ts` is Node-only by construction — it statically imports\n * `@opentelemetry/sdk-trace-node`, `@opentelemetry/context-async-hooks`\n * (`async_hooks`), `@opentelemetry/instrumentation` (node `module`) and the\n * proto exporter's Node build. Because `index.ts` -> `tracing.ts` ->\n * `otel-provider.ts` is a static chain, ANY bundler targeting the browser\n * pulled those Node built-ins into the browser graph and failed to resolve\n * them. `tracing.ts`'s own docstring flagged this as a deferred decision\n * (\"a future browser-targeted build would need ... to keep the JSON path as\n * the browser default\"); this module is that decision, taken.\n *\n * The build swaps this module in for `otel-provider.ts` via the esbuild\n * plugin in `tsup.config.ts`, and `package.json`'s `\"browser\"` export\n * condition points browser bundlers at the resulting `dist/browser/*`. No\n * consumer configuration is involved — webpack, Turbopack, Vite, Rollup and\n * esbuild all honour the condition automatically.\n *\n * Behaviour, not a black hole\n * ---------------------------\n * Tracing still WORKS in the browser: `isOtelAvailable()` returns false, so\n * `tracing.ts::sendTrace` routes traces down the legacy JSON transport\n * (the same path `MORSE_LEGACY_TRANSPORT=1` selects in Node) instead of\n * dropping them. What is genuinely unavailable in a browser is the OTLP\n * span pipeline and DB-driver instrumentation; `noteBrowserRuntime()` says\n * so once, out loud, rather than leaving an integrator to wonder why their\n * spans look different from the Node docs.\n */\n\n/** Public surface mirrors `otel-provider.ts` exactly — see that module. */\nexport interface OtelEngineConfigureOptions {\n apiKey?: string | undefined;\n endpoint?: string | undefined;\n sampleRate?: number | undefined;\n maxFieldBytes?: number | undefined;\n redaction?: unknown;\n [key: string]: unknown;\n}\n\nexport interface TraceEntryLike {\n trace: Record<string, unknown>;\n spans: Record<string, unknown>[];\n}\n\nlet warned = false;\n\n/**\n * Emit the one-time \"you are on the browser build\" notice.\n *\n * Deliberately `console.info`, not `warn`: nothing is broken and nothing\n * needs fixing — a warning here would train integrators to ignore the\n * console. Fires only once per bundle, and only when the SDK is actually\n * configured (i.e. the app really did initialize Morse), so a page that\n * merely imports the SDK stays silent.\n */\nfunction noteBrowserRuntime(): void {\n if (warned) return;\n warned = true;\n try {\n console.info(\n \"[morse] Browser build active: OpenTelemetry span export and database \" +\n \"capture are Node-only, so traces are sent via Morse's JSON transport \" +\n \"instead. Everything else — run()/span()/track() and W3C traceparent \" +\n \"propagation — behaves identically. Server-side code (Next.js route \" +\n \"handlers, RSC, Node services) automatically gets the full OTel pipeline.\",\n );\n } catch {\n // A console-less runtime is not a reason to fail a customer's app.\n }\n}\n\n/**\n * Browser stand-in for `OtelEngine`. Every method is a safe no-op with the\n * same signature, so `index.ts` needs no `typeof window` branches.\n */\nexport class OtelEngine {\n // Params are declared (not dropped) so this class stays signature-compatible\n // with the real `OtelEngine` — the build swaps the modules, but anything\n // type-checking against this one must see the same shape. `void x` marks the\n // deliberate non-use for @typescript-eslint/no-unused-vars.\n configure(opts: OtelEngineConfigureOptions): void {\n void opts;\n noteBrowserRuntime();\n }\n\n shutdown(): void {}\n\n resetForTesting(): void {\n warned = false;\n }\n\n async flush(): Promise<void> {}\n\n resolveSampled(traceIdHex: string): boolean {\n void traceIdHex;\n // Sampling in the browser is decided by the JSON transport path, which\n // applies its own rate — claiming \"sampled\" here would double-apply it.\n return true;\n }\n\n registerInstrumentations(instrumentations: unknown[]): (() => void) | null {\n void instrumentations;\n // DB-driver instrumentation requires `require-in-the-middle`; there is\n // nothing to hook in a browser.\n return null;\n }\n}\n\nconst engine = new OtelEngine();\n\nexport function getEngine(): OtelEngine {\n return engine;\n}\n\n/**\n * False in the browser build — `tracing.ts::sendTrace` reads this to pick\n * the JSON transport instead of the (absent) OTLP pipeline.\n */\nexport function isOtelAvailable(): boolean {\n return false;\n}\n\n/**\n * Never called: `sendTrace` checks `isOtelAvailable()` first. Kept so the\n * module's shape matches `otel-provider.ts` (a shape mismatch would only\n * surface as a bundler error in a customer's build), and defensive — if it\n * ever IS reached, dropping the trace silently is the one outcome that must\n * not happen, so it reports rather than returning quietly.\n */\nexport function emitTraceEntry(entry: TraceEntryLike): void {\n void entry;\n noteBrowserRuntime();\n throw new Error(\"morse: OTLP export is unavailable in the browser build\");\n}\n\n/** No live OTel context to enter in a browser — run `fn` unchanged. */\nexport function withOtelSpanContext<T>(traceIdHex: string, spanIdHex: string, fn: () => T): T {\n void traceIdHex;\n void spanIdHex;\n return fn();\n}\n","/**\n * Client-side PII redaction for the TypeScript SDK.\n *\n * Phase 6f Wave B G-02. Mirrors:\n * - `apps/sdk/python/src/morse/redaction.py` (Python SDK)\n * - `apps/api/apps/core/redaction/patterns.py` (server-side floor)\n *\n * The eight pattern catalogue is canonical across all three implementations.\n * The parity corpus at\n * `openspec/changes/phase-6f-g02-pii-redaction/tests/parity_corpus.json`\n * pins identical input → output behaviour on every row.\n *\n * Redaction runs default-on inside the SDK process so that sensitive strings\n * never leave the customer's runtime. Customers can:\n * - disable the whole SDK layer (`redaction.enabled = false`),\n * - turn off non-mandatory built-ins (`disabledPatterns`),\n * - inject custom regexes (`extraPatterns`).\n *\n * The four mandatory keys (`api_key_prefixed`, `jwt`, `credit_card`,\n * `ssn_us`) cannot be disabled at the SDK — attempting to do so throws at\n * `init()`. Disabling everything at the SDK still leaves the server-side\n * mandatory floor in place.\n */\n\n/* ------------------------------------------------------------------------ */\n/* Pattern catalogue */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Canonical pattern keys. The redactor walks them in this order; once a\n * substring is replaced by a `[REDACTED:...]` marker, later patterns see\n * the replacement and don't re-match digit/word fragments inside it.\n *\n * Order MUST match `apps/api/apps/core/redaction/patterns.py` and\n * `apps/sdk/python/.../redaction.py` so the parity corpus produces\n * identical output across implementations.\n */\nexport const PATTERN_ORDER: readonly string[] = [\n \"api_key_prefixed\",\n \"jwt\",\n \"credit_card\",\n \"email\",\n \"phone_us\",\n \"phone_e164\",\n \"ssn_us\",\n \"ip_address\",\n] as const;\n\n/** Patterns that customers cannot disable at the SDK layer. */\nexport const MANDATORY_PATTERNS: ReadonlySet<string> = new Set([\n \"api_key_prefixed\",\n \"jwt\",\n \"credit_card\",\n \"ssn_us\",\n]);\n\n/** Patterns that ship disabled by default (opt-in). */\nexport const DEFAULT_OFF_PATTERNS: ReadonlySet<string> = new Set([\"ip_address\"]);\n\n/**\n * Short replacement keys. The replacement format is `[REDACTED:<short>]`.\n * `phone_us` and `phone_e164` collapse to `phone`.\n */\nconst SHORT_KEYS: Record<string, string> = {\n api_key_prefixed: \"api_key\",\n jwt: \"jwt\",\n credit_card: \"credit_card\",\n email: \"email\",\n phone_us: \"phone\",\n phone_e164: \"phone\",\n ssn_us: \"ssn\",\n ip_address: \"ip\",\n};\n\n/**\n * Compiled regexes for each pattern. The `g` flag is required so the\n * `String.replace(regex, ...)` call walks the whole string. `i` flag is\n * applied where the canonical Python form is case-insensitive (email,\n * ip_address) for lowercase IPv6 + uppercase email parity.\n *\n * NB: the Luhn-validating credit_card pattern returns *candidate* matches;\n * `redactString` runs Luhn before deciding to replace.\n */\nconst PATTERNS: Record<string, RegExp> = {\n api_key_prefixed: new RegExp(\n \"\\\\b(?:\" +\n \"sk-[A-Za-z0-9_-]{20,}\" +\n \"|sk_(?:live|test)_[A-Za-z0-9]{20,}\" +\n \"|mhq_[A-Za-z0-9]{20,}\" +\n \"|av_[A-Za-z0-9]{20,}\" +\n \"|ghp_[A-Za-z0-9]{36}\" +\n \"|gho_[A-Za-z0-9]{36}\" +\n \"|ghu_[A-Za-z0-9]{36}\" +\n \"|ghs_[A-Za-z0-9]{36}\" +\n \"|ghr_[A-Za-z0-9]{36}\" +\n \"|xox[bopsa]-[0-9A-Za-z\\\\-]{10,}\" +\n \"|(?:AKIA|ASIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASCA)[0-9A-Z]{16}\" +\n \")\\\\b\",\n \"g\",\n ),\n jwt: new RegExp(\n \"\\\\beyJ[A-Za-z0-9_=-]{16,}\\\\.eyJ[A-Za-z0-9_=-]{16,}\\\\.[A-Za-z0-9_=-]{16,}\\\\b\",\n \"g\",\n ),\n credit_card: new RegExp(\"\\\\b(?:\\\\d[ -]?){12,18}\\\\d\\\\b\", \"g\"),\n email: new RegExp(\"\\\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}\\\\b\", \"gi\"),\n // The leading `(?<!\\d)` and trailing `(?!\\d)` lookarounds prevent\n // the phone matcher from carving a 10-digit substring out of a longer\n // continuous digit run (e.g., a 16-digit credit-card-shaped number that\n // failed Luhn). Without them, `1234567890123456` would emit a\n // `[REDACTED:phone]` for digits 7-16 even though the whole run was\n // never a real phone number. The canonical Python regex needs the same\n // shim — see redaction.py.\n phone_us: new RegExp(\n \"(?<!\\\\d)(?:\\\\+?1[ \\\\-.])?\\\\(?[2-9]\\\\d{2}\\\\)?[ \\\\-.]?\\\\d{3}[ \\\\-.]?\\\\d{4}(?!\\\\d)\",\n \"g\",\n ),\n phone_e164: new RegExp(\"(?<!\\\\d)\\\\+(?:[0-9][ \\\\-.]?){8,14}[0-9](?!\\\\d)\", \"g\"),\n ssn_us: new RegExp(\n \"\\\\b(?!000|666|9\\\\d{2})\\\\d{3}[ \\\\-.](?!00)\\\\d{2}[ \\\\-.](?!0000)\\\\d{4}\\\\b\",\n \"g\",\n ),\n ip_address: new RegExp(\n \"\\\\b(?:\" +\n \"(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)\" +\n \"(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)){3}\" +\n \"|(?:[A-F0-9]{1,4}:){2,7}[A-F0-9]{1,4}\" +\n \")\\\\b\",\n \"gi\",\n ),\n};\n\n/* ------------------------------------------------------------------------ */\n/* Configuration */\n/* ------------------------------------------------------------------------ */\n\n/** Public SDK option. Mirrors `redaction` in `init()`. */\nexport interface RedactionOptions {\n /** Master switch. Default: `true`. */\n enabled?: boolean;\n /** Pattern keys to selectively disable (mandatory keys rejected). */\n disabledPatterns?: string[];\n /** Customer-supplied regex strings (ECMAScript syntax). */\n extraPatterns?: string[];\n}\n\n/** Validated, frozen config fed into `redactString` / `redactValue`. */\nexport interface RedactionConfig {\n enabled: boolean;\n /** Keys actually applied, in stable order. */\n enabledPatterns: ReadonlySet<string>;\n /** Custom compiled regexes — applied last, with `[REDACTED:custom]`. */\n extraCompiled: readonly RegExp[];\n}\n\n/** Hard caps mirroring server-side validation. */\nconst EXTRA_PATTERN_CAP = 10;\nconst EXTRA_PATTERN_CHAR_CAP = 256;\n\n/**\n * Validate raw user options and return a normalised config. Throws on:\n * - disabling a mandatory pattern,\n * - more than 10 extra patterns,\n * - any extra pattern over 256 chars,\n * - any extra pattern that fails to compile via `new RegExp(...)`.\n *\n * `enabled = false` short-circuits — no patterns are applied.\n */\nexport function buildRedactionConfig(options?: RedactionOptions): RedactionConfig {\n const opts = options ?? {};\n const enabled = opts.enabled !== false;\n\n if (!enabled) {\n return {\n enabled: false,\n enabledPatterns: new Set<string>(),\n extraCompiled: [],\n };\n }\n\n // Mandatory-pattern lock-down.\n const disabled = new Set(opts.disabledPatterns ?? []);\n for (const key of disabled) {\n if (MANDATORY_PATTERNS.has(key)) {\n throw new Error(`redaction pattern '${key}' cannot be disabled (server-side mandatory)`);\n }\n }\n\n // Active set: every catalogue key NOT in default-off NOT in disabled.\n const active = new Set<string>();\n for (const key of PATTERN_ORDER) {\n if (DEFAULT_OFF_PATTERNS.has(key)) continue;\n if (disabled.has(key)) continue;\n active.add(key);\n }\n // Re-add any default-off pattern the user explicitly opted in to via a\n // `disabledPatterns` membership check is the wrong direction — the only\n // way to enable `ip_address` from the SDK today is through a future\n // `enabledPatterns` option. The spec keeps it default-off; tests pass\n // an explicit `enabledPatterns` set via the lower-level `redactString`.\n\n // Custom regex validation.\n const extraInput = opts.extraPatterns ?? [];\n if (extraInput.length > EXTRA_PATTERN_CAP) {\n throw new Error(\n `too many redaction extra patterns: ${extraInput.length} (max ${EXTRA_PATTERN_CAP})`,\n );\n }\n const extraCompiled: RegExp[] = [];\n for (const raw of extraInput) {\n if (typeof raw !== \"string\") {\n throw new Error(`redaction extra pattern must be a string, got ${typeof raw}`);\n }\n if (raw.length > EXTRA_PATTERN_CHAR_CAP) {\n throw new Error(`redaction extra pattern exceeds ${EXTRA_PATTERN_CHAR_CAP} chars`);\n }\n let compiled: RegExp;\n try {\n compiled = new RegExp(raw, \"g\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Error(`redaction extra pattern failed to compile: ${JSON.stringify(raw)} — ${msg}`);\n }\n extraCompiled.push(compiled);\n }\n\n return {\n enabled: true,\n enabledPatterns: active,\n extraCompiled,\n };\n}\n\n/* ------------------------------------------------------------------------ */\n/* Luhn check */\n/* ------------------------------------------------------------------------ */\n\n/** Standard mod-10 Luhn check on the digits of `s` (ignores spaces/dashes). */\nfunction luhnValid(s: string): boolean {\n let sum = 0;\n let alt = false;\n let digits = 0;\n for (let i = s.length - 1; i >= 0; i--) {\n const ch = s.charCodeAt(i);\n if (ch < 48 || ch > 57) continue; // skip non-digits (spaces, dashes)\n let n = ch - 48;\n if (alt) {\n n *= 2;\n if (n > 9) n -= 9;\n }\n sum += n;\n alt = !alt;\n digits++;\n }\n if (digits < 13 || digits > 19) return false;\n return sum % 10 === 0;\n}\n\n/* ------------------------------------------------------------------------ */\n/* String redactor */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Internal: compute the active enabled set when callers pass an explicit\n * `enabledPatterns` (parity-corpus tests do this) vs. defaults.\n */\nfunction resolveEnabled(\n config: RedactionConfig,\n override?: ReadonlySet<string>,\n): ReadonlySet<string> {\n if (override !== undefined) return override;\n return config.enabledPatterns;\n}\n\n/**\n * Core redactor: walk patterns in canonical order, replace matches.\n *\n * `enabledOverride` allows tests (and the parity corpus) to specify an\n * exact enabled set, bypassing the config's default-on/off decisions.\n *\n * Customers calling through the SDK never see the override path — they\n * always pass through `RedactionConfig.enabledPatterns`.\n */\nexport function redactString(\n s: string,\n config: RedactionConfig,\n enabledOverride?: ReadonlySet<string>,\n): string {\n if (!config.enabled && enabledOverride === undefined) {\n return s;\n }\n if (s.length === 0) return s;\n\n const enabled = resolveEnabled(config, enabledOverride);\n let out = s;\n\n for (const key of PATTERN_ORDER) {\n if (!enabled.has(key)) continue;\n const re = PATTERNS[key];\n if (re === undefined) continue;\n // Reset `lastIndex` defensively (shared global regex state).\n re.lastIndex = 0;\n const replacement = `[REDACTED:${SHORT_KEYS[key]}]`;\n if (key === \"credit_card\") {\n out = out.replace(re, (m) => (luhnValid(m) ? replacement : m));\n } else {\n out = out.replace(re, replacement);\n }\n }\n\n // Custom patterns last.\n for (const re of config.extraCompiled) {\n re.lastIndex = 0;\n out = out.replace(re, \"[REDACTED:custom]\");\n }\n\n return out;\n}\n\n/* ------------------------------------------------------------------------ */\n/* JSON walker */\n/* ------------------------------------------------------------------------ */\n\nconst MAX_DEPTH = 10;\n\n/**\n * Recursively redact string leaves inside an arbitrary JSON-like value.\n * Booleans, numbers, nulls, undefined are passed through untouched.\n * Recursion is bounded at `MAX_DEPTH` to defend against pathological\n * payloads — beyond that, sub-trees are returned as-is.\n *\n * Arrays return new arrays; plain objects return new shallow-cloned\n * objects; non-plain objects (Date, Map, etc.) are returned as-is so we\n * don't accidentally serialise customer-internal types.\n */\nexport function redactValue(value: unknown, config: RedactionConfig, depth = 0): unknown {\n if (!config.enabled) return value;\n if (value === null || value === undefined) return value;\n if (typeof value === \"string\") return redactString(value, config);\n if (typeof value === \"number\" || typeof value === \"boolean\") return value;\n if (depth >= MAX_DEPTH) return value;\n\n if (Array.isArray(value)) {\n return value.map((item) => redactValue(item, config, depth + 1));\n }\n\n // Only walk plain objects (prototype is Object.prototype or null).\n if (typeof value === \"object\") {\n const proto = Object.getPrototypeOf(value);\n if (proto === Object.prototype || proto === null) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = redactValue(v, config, depth + 1);\n }\n return out;\n }\n }\n\n return value;\n}\n","/**\n * Span model — the wire format the SDK sends to Morse.\n *\n * Mirrors `apps/sdk/python/src/morse/spans.py` field-for-field. The\n * backend's `SpanType` choices are the source of truth.\n */\n\nexport const SpanType = {\n AGENT: \"agent\",\n LLM: \"llm\",\n TOOL: \"tool\",\n HTTP: \"http\",\n DB: \"db\",\n CUSTOM: \"custom\",\n MEMORY: \"memory\",\n // MHQ-482: matches Python's `SpanType.RETRIEVER` (apps/sdk/python/src/morse_ai/spans.py).\n // @beta — retriever span type is subject to change before SDK v1.0 (see\n // the plain-LangChain adapter's on_retriever_* callbacks in src/langchain/).\n RETRIEVER: \"retriever\",\n} as const;\n\nexport type SpanType = (typeof SpanType)[keyof typeof SpanType];\n\nexport type SpanStatus = \"completed\" | \"failed\" | \"timed_out\";\n\n/**\n * Wire-format shape of one context segment carried on an LLM span.\n *\n * Mirrors the Python `morse.context.ContextSegmentDict` — keep both\n * sides in lockstep with the backend `ContextSegmentIn` Pydantic schema.\n *\n * - `tokens` is intentionally optional on the wire; the server tokenizes\n * when omitted to keep client-side cost and dependency surface small.\n * - `source` accepts either underscored DB enum values (`memory_vector`)\n * or the dotted public-API form (`memory.vector`); the server\n * `normalize_segment_source` helper translates dots → underscores.\n */\nexport interface ContextSegment {\n position: number;\n source: string;\n content_hash: string;\n content?: string;\n content_truncated?: boolean;\n tokens?: number;\n tokens_estimated?: boolean;\n cache_state?: \"cold\" | \"cache_write\" | \"cache_hit\";\n attrs?: Record<string, unknown>;\n producer_span_id?: string;\n}\n\nexport interface SpanData {\n trace_id: string;\n span_id: string;\n type: SpanType;\n name: string;\n parent_span_id?: string;\n started_at: string;\n ended_at?: string;\n duration_ms?: number;\n status: SpanStatus;\n // LLM-specific\n model?: string;\n input_tokens?: number;\n output_tokens?: number;\n cached_input_tokens?: number;\n cache_write_tokens?: number;\n total_tokens?: number;\n cost_usd?: number;\n // Payload\n input_data?: unknown;\n output_data?: unknown;\n error_message?: string;\n metadata?: Record<string, unknown>;\n /**\n * Pre-segmented context profile (Anthropic / LangGraph adapters populate this).\n * `undefined` → server runs its messages-array classifier.\n * `[]` → SDK explicitly says no segments (server skips classifier).\n * Populated → server skips classification and persists as-is.\n */\n context_segments?: ContextSegment[];\n}\n\nexport interface TraceFields {\n trace_id: string;\n /** Backend `TracePayloadIn.agent` — matches Python SDK + Pydantic schema. */\n agent: string;\n status: SpanStatus;\n started_at: string;\n ended_at?: string;\n duration_ms?: number;\n error_message?: string;\n success?: boolean;\n outcome?: string;\n}\n\nexport interface TraceEntry {\n trace: TraceFields;\n spans: SpanData[];\n}\n\n/** 32-char hex (128-bit). Compatible with W3C trace_id format. */\nexport function generateTraceId(): string {\n return randomHex(32);\n}\n\n/**\n * 32-char hex (UUID4-style, 128-bit). Matches the backend's UUID-typed\n * `span_id` column and the sibling Python SDK (`uuid.uuid4().hex`).\n *\n * When the SDK emits a W3C traceparent header (see `src/propagation.ts`),\n * the first 16 hex chars are sliced off to fit the W3C `span_id` slot —\n * that interop is handled at the header-formatting layer, not here.\n *\n * Was 16 hex chars historically (W3C span_id format) until Phase 13\n * Option A dogfood surfaced silent backend rejection: the dev ingest\n * `TracePayloadIn` schema requires UUID-shaped span_ids and was tossing\n * every TS-emitted span with `Invalid span_id format (expected UUID)`.\n */\nexport function generateSpanId(): string {\n return randomHex(32);\n}\n\nfunction randomHex(chars: number): string {\n const bytes = new Uint8Array(Math.ceil(chars / 2));\n // Use Web Crypto when available (Node 19+, all browsers).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoObj = (globalThis as any).crypto as Crypto | undefined;\n if (cryptoObj?.getRandomValues) {\n cryptoObj.getRandomValues(bytes);\n } else {\n // Fallback: Math.random — non-cryptographic but acceptable for trace IDs.\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n let hex = \"\";\n for (const b of bytes) {\n hex += b.toString(16).padStart(2, \"0\");\n }\n return hex.slice(0, chars);\n}\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\n/** Serialize a SpanData, dropping undefined fields, matching Python's to_dict(). */\nexport function spanToWire(span: SpanData): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(span)) {\n if (v !== undefined && v !== null) {\n out[k] = v;\n }\n }\n return out;\n}\n\nexport function buildTraceEntry(\n fields: TraceFields,\n spans: SpanData[],\n): { trace: TraceFields; spans: Record<string, unknown>[] } {\n return {\n trace: fields,\n spans: spans.map(spanToWire),\n };\n}\n","/**\n * SDK V2 tracing core — TraceState, run(), span() context-manager-likes.\n *\n * Mirrors `apps/sdk/python/src/morse/tracing.py`. Key differences:\n *\n * - Python uses `contextvars.ContextVar` for async/coroutine isolation.\n * In Node we use `node:async_hooks.AsyncLocalStorage` when available\n * (server-side, including Next.js API routes). On the browser there\n * is no equivalent; we fall back to a module-global slot. This is\n * acceptable because in the browser there is exactly one event loop\n * and one user — no parallel traces.\n *\n * - \"Context manager\" idioms in TS use callback-style: `run(name, fn)`\n * and `span(name, type, fn)` accept a function and invoke it with\n * the active state on the stack. We keep an explicit `start/end`\n * pair on the public surface for callers who can't use callbacks\n * (e.g., when the work spans an SSE stream).\n *\n * - MHQ-482: `run()`/`span()`/`runTraced()`'s emission path now goes\n * through `./otel-provider` (real OTel spans over OTLP, Node-only —\n * mirrors the Python SDK's MHQ-668 `otel_provider.py`). This is a\n * deliberate Node-only deviation from this module's own browser\n * fallback for `AsyncLocalStorage` above: `otel-provider.ts` statically\n * imports `@opentelemetry/sdk-trace-node`, which pulls in Node built-ins\n * (`node:crypto`, `node:http`/`https`) that don't exist in a browser\n * bundle. A future browser-targeted build would need either a\n * browser-flavored OTel exporter swapped in at this call site or to\n * keep `MORSE_LEGACY_TRANSPORT=1`'s JSON path as the browser default —\n * out of scope for this port (see the PR report's deviation notes).\n *\n * - MHQ-482 (db-capture follow-up): `runSync`/`runAsync`/`spanSync`/\n * `spanAsync` now ALSO wrap `fn()` in a live OTel context via\n * `otel-provider.ts::withOtelSpanContext` (Node only — a no-op\n * passthrough everywhere else, including the browser fallback path,\n * since that helper itself no-ops when the OTel engine isn't\n * configured). This is what lets community DB-driver instrumentation\n * (`./db-capture.ts`) — which reads OTel's *global*\n * `context.active()`, not this module's `TraceState` — see the right\n * trace id and nest under the right parent span id when a query runs\n * inside an active `morse.span()`/`morse.run()` block. It's a\n * deliberately separate mechanism from `emitTraceEntry`'s\n * synthetic-parent trick: that one runs once at trace-close time over\n * already-built `SpanData`; this one runs live, for spans this module\n * never sees (they're built entirely inside the instrumentation\n * package and exported directly to the same `NodeTracerProvider`).\n */\n\nimport { isLegacyTransport, isValidInternalSource } from \"./env\";\nimport { emitTraceEntry, isOtelAvailable, withOtelSpanContext } from \"./otel-provider\";\nimport { buildRedactionConfig, type RedactionConfig, redactValue } from \"./redaction\";\nimport type { SpanData, SpanStatus, SpanType } from \"./spans\";\nimport { generateSpanId, generateTraceId, nowIso } from \"./spans\";\n\n/* ------------------------------------------------------------------------ */\n/* Internal state */\n/* ------------------------------------------------------------------------ */\n\nexport interface TraceState {\n traceId: string;\n agentName: string;\n spanStack: SpanData[];\n completedSpans: SpanData[];\n // Mutable outcome fields — set by `run()` callers via the returned handle.\n success?: boolean;\n outcome?: string;\n errorMessage?: string;\n // Multi-turn attribution (MHQ-748). threadId groups traces in the same\n // conversation; userId is the app-layer end-user identifier. Both\n // optional — mirrors Python's `_TraceState.thread_id`/`user_id`.\n threadId?: string;\n userId?: string;\n // Cost-attribution dimensions — set via `run({ userMetadata })` at\n // trace-creation time, or mutated mid-trace via `setContext()` (MHQ-751).\n // Keys/values are always strings at the SDK boundary — mirrors Python's\n // `_TraceState.user_metadata`.\n userMetadata?: Record<string, string>;\n // Per-trace override of the resource-level `morse_ai.source` tag. Wins\n // over the process-level `_source` when set — mirrors Python's\n // `_TraceState.source_override`.\n sourceOverride?: string;\n}\n\ntype AlsLike<T> = {\n getStore(): T | undefined;\n run<R>(value: T, fn: () => R): R;\n};\n\nlet als: AlsLike<TraceState> | null = null;\nlet alsLoaded = false;\nlet browserState: TraceState | null = null;\n\nfunction tryLoadAls(): AlsLike<TraceState> | null {\n if (alsLoaded) return als;\n alsLoaded = true;\n // Skip in the browser.\n if (typeof process === \"undefined\" || !process.versions?.node) {\n als = null;\n return als;\n }\n try {\n // Use a runtime-eval'd require so the browser bundler doesn't try\n // to resolve `node:async_hooks`.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dynamicRequire = Function(\"m\", \"return require(m)\") as any as (m: string) => unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mod = dynamicRequire(\"node:async_hooks\") as any;\n if (mod?.AsyncLocalStorage) {\n als = new mod.AsyncLocalStorage() as AlsLike<TraceState>;\n return als;\n }\n } catch {\n // Fall through to browser fallback.\n }\n als = null;\n return als;\n}\n\nexport function getActiveTraceState(): TraceState | null {\n const store = tryLoadAls();\n if (store) {\n return store.getStore() ?? null;\n }\n return browserState;\n}\n\nfunction setActiveTraceState(state: TraceState | null): () => void {\n // Returns a \"reset\" callback. Used only on the browser path. On Node,\n // `als.run()` handles the lifecycle.\n const previous = browserState;\n browserState = state;\n return () => {\n browserState = previous;\n };\n}\n\n/* ------------------------------------------------------------------------ */\n/* Transport injection */\n/* ------------------------------------------------------------------------ */\n\nexport interface TransportLike {\n track(event: { traces: unknown[] } | Record<string, unknown>): boolean;\n}\n\nlet transport: TransportLike | null = null;\n\nexport function setTransport(t: TransportLike | null): void {\n transport = t;\n}\n\nexport function getTransport(): TransportLike | null {\n return transport;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Redaction config — module-level, replaceable on init() */\n/* ------------------------------------------------------------------------ */\n\n// Default-on with the canonical catalogue. Replaced when `init()` runs\n// with explicit redaction options. Customers calling SDK helpers before\n// `init()` still get the default redaction floor.\nlet redactionConfig: RedactionConfig = buildRedactionConfig();\n\nexport function setRedactionConfig(config: RedactionConfig): void {\n redactionConfig = config;\n}\n\nexport function getRedactionConfig(): RedactionConfig {\n return redactionConfig;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Resource-level \"source\" label (dogfood emitter discrimination) */\n/* ------------------------------------------------------------------------ */\n\n// Process-level source tag. Lifted into each outgoing trace's `resource`\n// dict so the backend can discriminate Morse's own dogfood emitters\n// from customer traces. Mirrors the Python SDK's module-level `_source`.\nlet _source: string | null = null;\n\nexport function setSource(value: string | null | undefined): void {\n _source = value && value.length > 0 ? value : null;\n}\n\nexport function getSource(): string | null {\n return _source;\n}\n\nlet lastTrace: { trace: unknown; spans: unknown[] } | null = null;\n\nexport function getLastTrace(): { trace: unknown; spans: unknown[] } | null {\n return lastTrace;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Trace lifecycle helpers */\n/* ------------------------------------------------------------------------ */\n\nfunction nowMonotonic(): number {\n // performance.now() is available in Node >= 16 globally and in all browsers.\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction elapsedMs(startMonotonic: number): number {\n return Math.max(0, Math.round(nowMonotonic() - startMonotonic));\n}\n\nfunction finalizeSpan(\n span: SpanData,\n startMono: number,\n status: SpanStatus = \"completed\",\n errorMessage?: string,\n): void {\n span.ended_at = nowIso();\n span.duration_ms = elapsedMs(startMono);\n span.status = status;\n if (errorMessage !== undefined) {\n span.error_message = errorMessage;\n }\n}\n\n/**\n * Field allowlist for span-level redaction. Identifiers, timestamps,\n * counts, and types pass through untouched; user-supplied strings and\n * JSON blobs route through `redactValue`.\n */\nconst SPAN_REDACTABLE_FIELDS: ReadonlySet<string> = new Set([\n \"name\",\n \"input_data\",\n \"output_data\",\n \"error_message\",\n \"metadata\",\n]);\n\nconst TRACE_REDACTABLE_FIELDS: ReadonlySet<string> = new Set([\"agent\", \"outcome\", \"error_message\"]);\n\nfunction redactSpanDict(\n raw: Record<string, unknown>,\n config: RedactionConfig,\n): Record<string, unknown> {\n if (!config.enabled) return raw;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (SPAN_REDACTABLE_FIELDS.has(k)) {\n out[k] = redactValue(v, config);\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction redactTraceDict(\n raw: Record<string, unknown>,\n config: RedactionConfig,\n): Record<string, unknown> {\n if (!config.enabled) return raw;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(raw)) {\n if (TRACE_REDACTABLE_FIELDS.has(k)) {\n out[k] = redactValue(v, config);\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction buildTraceDict(\n state: TraceState,\n rootSpan: SpanData,\n): {\n trace: Record<string, unknown>;\n spans: Record<string, unknown>[];\n} {\n const trace: Record<string, unknown> = {\n trace_id: state.traceId,\n // Wire-format field is `agent` (matches backend TracePayloadIn schema +\n // sibling Python SDK). Was `agent_name` historically — the mismatch\n // caused dev ingest to reject every TS-emitted trace with a 422\n // until Phase 13 Option A dogfood surfaced it.\n agent: state.agentName,\n status: rootSpan.status,\n started_at: rootSpan.started_at,\n };\n if (rootSpan.ended_at) trace.ended_at = rootSpan.ended_at;\n if (rootSpan.duration_ms !== undefined) trace.duration_ms = rootSpan.duration_ms;\n if (rootSpan.error_message) trace.error_message = rootSpan.error_message;\n if (state.success !== undefined) trace.success = state.success;\n if (state.outcome !== undefined) trace.outcome = state.outcome;\n // MHQ-748/MHQ-751: multi-turn + cost-attribution dimensions. Field names\n // (`thread_id`/`user_id`/`user_metadata`) match the backend's\n // `TracePayloadIn` schema exactly (apps/api/apps/traces/schemas.py) and\n // the sibling Python SDK's `_build_trace_dict` — do not camelCase these.\n if (state.threadId !== undefined) trace.thread_id = state.threadId;\n if (state.userId !== undefined) trace.user_id = state.userId;\n if (state.userMetadata && Object.keys(state.userMetadata).length > 0) {\n trace.user_metadata = state.userMetadata;\n }\n\n const allSpans = [rootSpan, ...state.completedSpans];\n const spans = allSpans.map((s) => {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(s)) {\n if (v !== undefined && v !== null) {\n out[k] = v;\n }\n }\n return out;\n });\n\n const config = redactionConfig;\n const out = {\n trace: redactTraceDict(trace, config),\n spans: spans.map((s) => redactSpanDict(s, config)),\n };\n // Per-trace `sourceOverride` wins over the process-level `_source` —\n // mirrors Python's `_build_trace_dict`'s `effective_source = state.source_override or _source`.\n const effectiveSource = state.sourceOverride || _source;\n if (effectiveSource) {\n // Lift the source label onto the trace envelope so the backend can\n // route dogfood-emitter traces to the internal dashboards. Mirrors\n // Python's `resource[\"morse_ai.source\"]`.\n (out as Record<string, unknown>).resource = { \"morse_ai.source\": effectiveSource };\n }\n return out;\n}\n\n/**\n * `run()` / `span()` / `runTraced()`'s emission path: real OTel spans over\n * OTLP (MHQ-482, mirrors Python's `tracing.py::_finish_trace`, MHQ-668).\n * Always updates `lastTrace` (test/debug introspection — same bookkeeping\n * regardless of which pipeline actually ships the trace), then hands the\n * dict to `otel-provider.ts::emitTraceEntry()` — unless\n * `MORSE_LEGACY_TRANSPORT=1`, in which case it falls back to the old JSON\n * queue path instead (rollback escape hatch; never both, to avoid\n * double-ingesting the same trace).\n *\n * Exported (MHQ-746) so `index.ts::record()` can submit a synthetic\n * single-span trace through this same pipeline instead of the defunct\n * `runs`-shaped `state.transport.track()` path — mirrors the Python SDK's\n * `client.py::record()`, which builds a trace + span dict and calls this\n * module's `_send_trace()` directly rather than going through `track()`.\n */\nexport function sendTrace(entry: {\n trace: Record<string, unknown>;\n spans: Record<string, unknown>[];\n}): void {\n lastTrace = entry;\n\n // `!isOtelAvailable()` is the browser build (see `otel-provider.browser.ts`):\n // the OTLP pipeline is Node-only, so browser traces take the same JSON path\n // the legacy escape hatch uses rather than being dropped. Still never both.\n if (isLegacyTransport() || !isOtelAvailable()) {\n if (transport !== null) {\n try {\n transport.track({ traces: [entry] });\n } catch {\n // never propagate\n }\n }\n return;\n }\n\n try {\n emitTraceEntry(entry);\n } catch {\n // never propagate — mirrors the rest of the SDK's non-invasive guarantee\n }\n}\n\n/**\n * Run `fn` with the OTel-global active context set to a synthetic\n * `SpanContext` for `spanIdHex` under `traceId` (MHQ-482 db-capture\n * correlation — see the module docstring). No-op passthrough if the OTel\n * engine isn't configured (browser, uninitialized SDK, or\n * `otel-provider.ts` import failure) — never throws, mirrors the rest of\n * this module's non-invasive guarantee.\n */\nfunction withDbCaptureContext<T>(traceId: string, spanIdHex: string, fn: () => T): T {\n try {\n // OTel SpanId is 64-bit (16 hex chars); Morse's span_id is 128-bit\n // (32 hex chars) — same truncation convention `spans.ts::generateSpanId`\n // documents for W3C traceparent interop.\n return withOtelSpanContext(traceId, spanIdHex.slice(0, 16), fn);\n } catch {\n return fn();\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public-ish run() and span() — wrapped at the module surface */\n/* ------------------------------------------------------------------------ */\n\nexport interface RunOptions {\n agentName: string;\n /** W3C traceparent value to continue an upstream trace, when available. */\n incomingTraceparent?: string | null;\n /**\n * Application-layer conversation/thread identifier (MHQ-748). Groups all\n * traces from the same multi-turn session so the dashboard can show the\n * full conversation history for a thread. Mirrors Python's\n * `run(thread_id=...)`.\n */\n threadId?: string;\n /**\n * Application-layer end-user identifier (e.g. a user primary key or\n * email) (MHQ-748). Enables per-user filtering in the dashboard. Mirrors\n * Python's `run(user_id=...)`.\n */\n userId?: string;\n /**\n * Cost-attribution dimensions attached to this trace at creation time\n * (e.g. `customer_id`, `feature`, `env`, `team`) (MHQ-748). Values are\n * coerced to strings. Can also be set/merged mid-trace via\n * `setContext()` (MHQ-751). Mirrors Python's `run(user_metadata=...)`.\n */\n userMetadata?: Record<string, unknown>;\n /**\n * INTERNAL USE ONLY — per-trace override for the resource-level\n * `morse_ai.source` tag. Wins over the process-level source set at\n * `init({ source })`. Accepted values: `\"copilot\" | \"investigator\" |\n * \"refagent\" | \"ui-bot\"`; anything else is silently ignored and the\n * process-level source is used. Customer code should leave this unset.\n * Mirrors Python's `run(source=...)`.\n */\n source?: string;\n}\n\nexport interface RunHandle {\n setOutcome(success: boolean, outcome?: string): void;\n setError(message: string): void;\n /** Internal — set by `runSync`/`runAsync`. */\n _state: TraceState;\n}\n\nfunction buildRunHandle(state: TraceState): RunHandle {\n return {\n setOutcome(success, outcome) {\n state.success = success;\n if (outcome !== undefined) state.outcome = outcome;\n },\n setError(message) {\n state.errorMessage = message;\n state.success = false;\n },\n _state: state,\n };\n}\n\nfunction startTrace(opts: RunOptions): {\n state: TraceState;\n rootSpan: SpanData;\n startMono: number;\n} {\n let traceId: string | undefined;\n if (opts.incomingTraceparent) {\n // Lazy import to avoid a cycle.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { extractTraceparent } = require(\"../propagation\") as typeof import(\"../propagation\");\n const ctx = extractTraceparent(opts.incomingTraceparent);\n if (ctx) {\n traceId = ctx.traceId;\n }\n }\n if (!traceId) traceId = generateTraceId();\n\n const state: TraceState = {\n traceId,\n agentName: opts.agentName,\n spanStack: [],\n completedSpans: [],\n };\n if (opts.threadId !== undefined) state.threadId = opts.threadId;\n if (opts.userId !== undefined) state.userId = opts.userId;\n if (opts.userMetadata) {\n state.userMetadata = Object.fromEntries(\n Object.entries(opts.userMetadata).map(([k, v]) => [k, String(v)]),\n );\n }\n // Validate against the same whitelist as `init({ source })` — an invalid\n // value falls through to whatever the process has set (never throws).\n if (isValidInternalSource(opts.source)) {\n state.sourceOverride = opts.source;\n }\n const rootSpan: SpanData = {\n trace_id: traceId,\n span_id: generateSpanId(),\n type: \"agent\" as SpanType,\n name: opts.agentName,\n started_at: nowIso(),\n status: \"completed\",\n };\n state.spanStack.push(rootSpan);\n return { state, rootSpan, startMono: nowMonotonic() };\n}\n\nfunction endTrace(\n state: TraceState,\n rootSpan: SpanData,\n startMono: number,\n threwError: unknown,\n): void {\n state.spanStack.pop();\n if (threwError !== undefined) {\n const msg = state.errorMessage ?? errToString(threwError);\n finalizeSpan(rootSpan, startMono, \"failed\", msg);\n if (state.success === undefined) state.success = false;\n } else if (state.errorMessage !== undefined) {\n finalizeSpan(rootSpan, startMono, \"failed\", state.errorMessage);\n // setError() already set state.success = false.\n } else {\n finalizeSpan(rootSpan, startMono);\n if (state.success === undefined) state.success = true;\n }\n const dict = buildTraceDict(state, rootSpan);\n sendTrace(dict);\n}\n\nfunction errToString(e: unknown): string {\n if (e instanceof Error) return e.message;\n return String(e);\n}\n\n/* ------------------------------------------------------------------------ */\n/* Sync + async run() wrappers */\n/* ------------------------------------------------------------------------ */\n\nexport function runSync<T>(opts: RunOptions, fn: (handle: RunHandle) => T): T | undefined {\n const { state, rootSpan, startMono } = startTrace(opts);\n const handle = buildRunHandle(state);\n const store = tryLoadAls();\n\n const runFn = (): T => withDbCaptureContext(state.traceId, rootSpan.span_id, () => fn(handle));\n\n if (store) {\n try {\n const result = store.run(state, runFn);\n endTrace(state, rootSpan, startMono, undefined);\n return result;\n } catch (err) {\n endTrace(state, rootSpan, startMono, err);\n throw err;\n }\n } else {\n const reset = setActiveTraceState(state);\n try {\n const result = runFn();\n endTrace(state, rootSpan, startMono, undefined);\n return result;\n } catch (err) {\n endTrace(state, rootSpan, startMono, err);\n throw err;\n } finally {\n reset();\n }\n }\n}\n\nexport async function runAsync<T>(\n opts: RunOptions,\n fn: (handle: RunHandle) => Promise<T>,\n): Promise<T | undefined> {\n const { state, rootSpan, startMono } = startTrace(opts);\n const handle = buildRunHandle(state);\n const store = tryLoadAls();\n\n const runFn = (): Promise<T> =>\n withDbCaptureContext(state.traceId, rootSpan.span_id, () => fn(handle));\n\n if (store) {\n try {\n const result = await store.run(state, runFn);\n endTrace(state, rootSpan, startMono, undefined);\n return result;\n } catch (err) {\n endTrace(state, rootSpan, startMono, err);\n throw err;\n }\n } else {\n const reset = setActiveTraceState(state);\n try {\n const result = await runFn();\n endTrace(state, rootSpan, startMono, undefined);\n return result;\n } catch (err) {\n endTrace(state, rootSpan, startMono, err);\n throw err;\n } finally {\n reset();\n }\n }\n}\n\n/**\n * Attach cost-attribution dimensions to the active trace (MHQ-751).\n *\n * Call once per request (e.g. in Express/Next.js middleware) to propagate\n * `customer_id`, `feature`, `env`, `team`, etc. to all child spans\n * automatically. Mirrors Python's `morse_ai.set_context(**dims)`.\n *\n * morse.setContext({ customerId: request.customerId, feature: \"doc-qa\" });\n *\n * Values are coerced to strings via `String(v)` — mirrors Python's `str()`\n * coercion. Merges into any dimensions already set (e.g. via\n * `run({ userMetadata })`) rather than replacing them. No-op outside an\n * active trace — never throws.\n */\nexport function setContext(dims: Record<string, unknown>): void {\n const state = getActiveTraceState();\n if (state === null) return;\n if (state.userMetadata === undefined) state.userMetadata = {};\n for (const [k, v] of Object.entries(dims)) {\n state.userMetadata[k] = String(v);\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* span() child-span helpers */\n/* ------------------------------------------------------------------------ */\n\nexport interface SpanOptions {\n name: string;\n type?: SpanType;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SpanHandle {\n /** Mutate the underlying span data (e.g., set tokens / cost). */\n span: SpanData;\n end(error?: unknown): void;\n}\n\n// MHQ-806. Latches the \"no active trace\" warning to once per process — see\n// startSpan for why it warns at all, and why not on every call.\nlet spanOutsideTraceWarningEmitted = false;\n\n/** Test hook — clears the once-per-process latch. */\nexport function _resetSpanOutsideTraceWarning(): void {\n spanOutsideTraceWarningEmitted = false;\n}\n\n/** Start a child span under the active trace, returning a handle to close it. */\nexport function startSpan(opts: SpanOptions): SpanHandle | null {\n const state = getActiveTraceState();\n if (state === null) {\n // No active trace — returns null rather than throwing, because library\n // code may be instrumented but reached from an untraced path.\n //\n // The null is visible in the type here, unlike Python's context-manager\n // form, but callers routinely ignore it (`span({...}, () => { ... })`\n // never touches the handle), so the outcome is the same: no error, no\n // spans, nothing distinguishing it from working instrumentation.\n //\n // Warned once per process, matching the existing not-initialized warning\n // in index.ts — this sits inside request and agent loops, so per-call\n // logging would bury the signal. This is the single choke point for\n // startSpan / spanSync / spanAsync.\n if (!spanOutsideTraceWarningEmitted) {\n spanOutsideTraceWarningEmitted = true;\n console.warn(\n `morse: span(${JSON.stringify(opts.name)}) was called with no active trace, so nothing ` +\n `was recorded. Wrap the work in morse.run('<agent-name>', () => { ... }) — run() opens ` +\n `the trace that span() attaches to. This warning prints once per process.`,\n );\n }\n return null;\n }\n const parent = state.spanStack[state.spanStack.length - 1];\n const span: SpanData = {\n trace_id: state.traceId,\n span_id: generateSpanId(),\n type: opts.type ?? \"custom\",\n name: opts.name,\n parent_span_id: parent?.span_id,\n started_at: nowIso(),\n status: \"completed\",\n metadata: opts.metadata,\n };\n const startMono = nowMonotonic();\n state.spanStack.push(span);\n return {\n span,\n end(error?: unknown): void {\n // Pop only if still on top — defensive against out-of-order ends.\n if (state.spanStack[state.spanStack.length - 1] === span) {\n state.spanStack.pop();\n }\n if (error !== undefined) {\n finalizeSpan(span, startMono, \"failed\", errToString(error));\n } else {\n finalizeSpan(span, startMono);\n }\n state.completedSpans.push(span);\n },\n };\n}\n\n/** Sync callback wrapper for `startSpan` / `end`. No-op if no active trace. */\nexport function spanSync<T>(opts: SpanOptions, fn: (handle: SpanHandle | null) => T): T {\n const handle = startSpan(opts);\n try {\n const result = handle\n ? withDbCaptureContext(handle.span.trace_id, handle.span.span_id, () => fn(handle))\n : fn(handle);\n handle?.end();\n return result;\n } catch (err) {\n handle?.end(err);\n throw err;\n }\n}\n\n/** Async callback wrapper for `startSpan` / `end`. No-op if no active trace. */\nexport async function spanAsync<T>(\n opts: SpanOptions,\n fn: (handle: SpanHandle | null) => Promise<T>,\n): Promise<T> {\n const handle = startSpan(opts);\n try {\n const result = handle\n ? await withDbCaptureContext(handle.span.trace_id, handle.span.span_id, () => fn(handle))\n : await fn(handle);\n handle?.end();\n return result;\n } catch (err) {\n handle?.end(err);\n throw err;\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Test helpers */\n/* ------------------------------------------------------------------------ */\n\nexport function _resetForTesting(): void {\n browserState = null;\n lastTrace = null;\n redactionConfig = buildRedactionConfig();\n // We do not reset `als` because re-loading it is expensive and the\n // store is process-scoped anyway.\n}\n","/**\n * W3C Trace Context propagation — inject and extract `traceparent` headers.\n *\n * W3C traceparent format: `{version}-{trace_id}-{span_id}-{flags}`\n * - version : \"00\" (fixed)\n * - trace_id : 32 lowercase hex chars (128-bit)\n * - span_id : 16 lowercase hex chars (64-bit)\n * - flags : \"01\" (sampled, always set for Morse)\n *\n * Example: `00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01`\n *\n * References:\n * https://www.w3.org/TR/trace-context/\n */\n\nimport { getActiveTraceState } from \"./_internal/tracing\";\n\nexport const W3C_TRACEPARENT_HEADER = \"traceparent\";\nexport const W3C_VERSION = \"00\";\nexport const W3C_FLAGS_SAMPLED = \"01\";\n\nconst TRACE_ID_LEN = 32;\nconst SPAN_ID_LEN = 16;\n\n/**\n * Build a W3C traceparent value from explicit IDs.\n *\n * Useful when you have a trace_id / span_id from somewhere other than\n * the active context (e.g., re-emitting an upstream trace's IDs).\n */\nexport function formatTraceparent(traceId: string, spanId: string): string {\n // We trust the caller; the \"build then validate\" assumption is documented.\n const tid = traceId.slice(0, TRACE_ID_LEN).padStart(TRACE_ID_LEN, \"0\").toLowerCase();\n const sid = spanId.slice(0, SPAN_ID_LEN).padStart(SPAN_ID_LEN, \"0\").toLowerCase();\n return `${W3C_VERSION}-${tid}-${sid}-${W3C_FLAGS_SAMPLED}`;\n}\n\n/**\n * Inject the W3C `traceparent` header derived from the active trace\n * context into the supplied headers object. Mutates and returns the\n * object for convenience.\n *\n * No-op (returns headers unchanged) if no trace is active.\n *\n * Accepts both `Headers` (from fetch) and a plain dict.\n */\nexport function injectTraceparent<T extends HeadersLike>(headers: T): T {\n const state = getActiveTraceState();\n if (state === null) return headers;\n\n const traceId = state.traceId;\n const span =\n state.spanStack.length > 0\n ? state.spanStack[state.spanStack.length - 1]\n : state.completedSpans[state.completedSpans.length - 1];\n const rawSpanId = span?.span_id ?? traceId;\n const spanId = rawSpanId.slice(0, SPAN_ID_LEN);\n\n const value = formatTraceparent(traceId, spanId);\n setHeader(headers, W3C_TRACEPARENT_HEADER, value);\n return headers;\n}\n\nexport interface ExtractedContext {\n traceId: string;\n parentSpanId: string;\n}\n\n/**\n * Parse a W3C traceparent header and return `{ traceId, parentSpanId }`,\n * or `null` if the header is missing or malformed.\n *\n * Validation per W3C §3.2.3:\n * - exactly 4 dash-separated fields\n * - version === \"00\"\n * - trace_id is 32 lowercase hex chars (and not all-zero)\n * - span_id is 16 lowercase hex chars (and not all-zero)\n */\nexport function extractTraceparent(\n headers: HeadersLike | string | null | undefined,\n): ExtractedContext | null {\n if (headers === null || headers === undefined) return null;\n const raw = typeof headers === \"string\" ? headers : getHeader(headers, W3C_TRACEPARENT_HEADER);\n if (!raw) return null;\n const parts = raw.split(\"-\");\n if (parts.length !== 4) return null;\n const [version, traceId, spanId] = parts as [string, string, string, string];\n if (version !== W3C_VERSION) return null;\n if (traceId.length !== TRACE_ID_LEN) return null;\n if (spanId.length !== SPAN_ID_LEN) return null;\n if (!/^[0-9a-f]+$/.test(traceId)) return null;\n if (!/^[0-9a-f]+$/.test(spanId)) return null;\n if (/^0+$/.test(traceId)) return null;\n if (/^0+$/.test(spanId)) return null;\n return { traceId, parentSpanId: spanId };\n}\n\n/**\n * Convenience for Next.js API routes / generic HTTP servers: pull the\n * traceparent off an incoming Request (or a header bag).\n */\nexport function extractFromRequest(req: { headers: HeadersLike }): ExtractedContext | null {\n return extractTraceparent(req.headers);\n}\n\n/**\n * Convenience for outbound `fetch`: build a fresh `Headers` object with\n * the traceparent injected, layered on top of the caller's input.\n */\nexport function injectIntoRequestInit(init?: RequestInit): RequestInit {\n const merged = new Headers(init?.headers ?? {});\n injectTraceparent(merged);\n return { ...(init ?? {}), headers: merged };\n}\n\n/* ------------------------------------------------------------------------ */\n/* Header polymorphism helpers */\n/* ------------------------------------------------------------------------ */\n\nexport type HeadersLike =\n | Headers\n | Record<string, string | string[] | undefined>\n | { get(name: string): string | null }\n | { [key: string]: unknown };\n\nfunction getHeader(headers: HeadersLike, name: string): string | null {\n if (headers instanceof Headers) {\n return headers.get(name);\n }\n // Object that exposes get() — e.g., Node's IncomingMessage doesn't, but\n // Next.js's headers() does.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const maybeGet = (headers as any).get;\n if (typeof maybeGet === \"function\") {\n const v = maybeGet.call(headers, name);\n if (typeof v === \"string\") return v;\n if (v === null || v === undefined) return null;\n }\n // Plain dict: case-insensitive lookup.\n const lower = name.toLowerCase();\n for (const [k, v] of Object.entries(headers as Record<string, unknown>)) {\n if (k.toLowerCase() === lower) {\n if (typeof v === \"string\") return v;\n if (Array.isArray(v) && v.length > 0 && typeof v[0] === \"string\") return v[0] as string;\n return null;\n }\n }\n return null;\n}\n\nfunction setHeader(headers: HeadersLike, name: string, value: string): void {\n if (headers instanceof Headers) {\n headers.set(name, value);\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const maybeSet = (headers as any).set;\n if (typeof maybeSet === \"function\") {\n maybeSet.call(headers, name, value);\n return;\n }\n (headers as Record<string, string>)[name] = value;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/_agent-sdk-common/span-emitter.ts"],"names":[],"mappings":"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","file":"chunk-F7BGQ26H.js","sourcesContent":["/**\n * `_agent-sdk-common/span-emitter.ts` — shared span-emission helpers used by\n * all three agent-SDK adapters (`anthropic-agent-sdk`, `openai-agents`,\n * `langgraph-js`).\n *\n * Each helper:\n *\n * 1. Validates the required metadata for its logical span type.\n * 2. Calls `startSpan(...)` from `_internal/tracing.ts` to allocate the\n * wire-format span and push it onto the active trace's span stack.\n * 3. Tags `metadata.adapter` on every span so the UI can attribute spans\n * back to their adapter origin.\n * 4. Hydrates type-specific top-level fields (`model`, `input_tokens`,\n * `output_tokens`, `total_tokens`, `context_segments`) onto `SpanData`.\n * 5. Returns the `SpanHandle` so callers can later call `.end(err?)`.\n *\n * All helpers are wrapped in `absorbErrorsSync` — telemetry MUST NOT throw\n * at the caller. If `startSpan` returns `null` (no active trace), the\n * helper also returns `null`; callers must tolerate this case.\n *\n * Logical → wire `type` mapping (per `design.md` §Span schema):\n *\n * agent → \"agent\"\n * llm → \"llm\"\n * tool → \"tool\"\n * subagent → \"agent\" + metadata.spawn_kind = \"subagent\"\n * hook → \"tool\" + metadata.tool_kind = \"hook\"\n *\n * Adapter-flavoured redaction (tool-arg truncation, base64/image\n * stripping) lives in a sibling `redaction.ts` (W1.2). This file is\n * intentionally agnostic: the only redaction it applies is a minimal\n * string-length guard on free-form fields that would otherwise blow up\n * the wire payload (task descriptions, hook names, tool names).\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { ContextSegment, SpanData } from \"../_internal/spans\";\nimport { startSpan, type SpanHandle } from \"../_internal/tracing\";\n\n/* ------------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------------ */\n\nexport type AdapterName = \"anthropic-agent-sdk\" | \"openai-agents\" | \"langgraph-js\" | \"vercel-ai\";\n\n/** Soft cap for free-form identifier-ish strings (tool names, hook names, etc.). */\nconst MAX_NAME_BYTES = 256;\n\n/** Soft cap for free-form description strings (task descriptions). */\nconst MAX_DESCRIPTION_BYTES = 2048;\n\n/** Trim a string to `maxBytes` bytes (UTF-8 codepoint-safe at the JS-string level). */\nfunction truncate(value: string, maxBytes: number): string {\n if (value.length <= maxBytes) return value;\n return `${value.slice(0, maxBytes)}…[truncated]`;\n}\n\nfunction requireNonEmpty(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`morse span-emitter: ${field} must be a non-empty string`);\n }\n return value;\n}\n\n/* ------------------------------------------------------------------------ */\n/* emitAgentSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitAgentSpanOptions {\n adapter: AdapterName;\n agentName: string;\n model?: string;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitAgentSpan = (opts: EmitAgentSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const agentName = requireNonEmpty(opts.agentName, \"agentName\");\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n agent_name: agentName,\n };\n const handle = startSpan({\n name: `${adapter}.agent`,\n type: \"agent\",\n metadata,\n });\n if (handle === null) return null;\n if (typeof opts.model === \"string\" && opts.model.length > 0) {\n handle.span.model = opts.model;\n metadata.model = opts.model;\n }\n return handle;\n};\n\n/**\n * Emit a wire `type=agent` span. Returns `null` when no active trace exists\n * (callers MUST tolerate this); never throws.\n */\nexport const emitAgentSpan: (opts: EmitAgentSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitAgentSpan,\n {\n fingerprint: \"morse.adapters.shared.emitAgentSpan\",\n },\n) as (opts: EmitAgentSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitLlmSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitLlmSpanOptions {\n adapter: AdapterName;\n model: string;\n provider?: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n contextSegments?: ContextSegment[];\n attributes?: Record<string, unknown>;\n}\n\nconst _emitLlmSpan = (opts: EmitLlmSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const model = requireNonEmpty(opts.model, \"model\");\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n model,\n };\n if (typeof opts.provider === \"string\" && opts.provider.length > 0) {\n metadata.provider = opts.provider;\n }\n const handle = startSpan({\n name: `${adapter}.llm`,\n type: \"llm\",\n metadata,\n });\n if (handle === null) return null;\n const span: SpanData = handle.span;\n span.model = model;\n if (typeof opts.inputTokens === \"number\" && Number.isFinite(opts.inputTokens)) {\n span.input_tokens = opts.inputTokens;\n }\n if (typeof opts.outputTokens === \"number\" && Number.isFinite(opts.outputTokens)) {\n span.output_tokens = opts.outputTokens;\n }\n if (typeof opts.totalTokens === \"number\" && Number.isFinite(opts.totalTokens)) {\n span.total_tokens = opts.totalTokens;\n } else if (span.input_tokens !== undefined && span.output_tokens !== undefined) {\n span.total_tokens = span.input_tokens + span.output_tokens;\n }\n if (Array.isArray(opts.contextSegments)) {\n span.context_segments = opts.contextSegments;\n }\n return handle;\n};\n\n/**\n * Emit a wire `type=llm` span. Returns `null` when no active trace exists;\n * never throws. Hydrates `model`, `input_tokens`, `output_tokens`,\n * `total_tokens` (derived if absent), and `context_segments` onto the\n * underlying `SpanData` so downstream consumers see them at the top level\n * — not buried in `metadata`.\n */\nexport const emitLlmSpan: (opts: EmitLlmSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitLlmSpan,\n {\n fingerprint: \"morse.adapters.shared.emitLlmSpan\",\n },\n) as (opts: EmitLlmSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitToolSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitToolSpanOptions {\n adapter: AdapterName;\n toolName: string;\n inputSummary?: unknown;\n outputSummary?: unknown;\n durationMs?: number;\n success?: boolean;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitToolSpan = (opts: EmitToolSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const toolName = truncate(requireNonEmpty(opts.toolName, \"toolName\"), MAX_NAME_BYTES);\n const tool: Record<string, unknown> = { name: toolName };\n if (opts.inputSummary !== undefined) tool.input_summary = opts.inputSummary;\n if (opts.outputSummary !== undefined) tool.output_summary = opts.outputSummary;\n if (typeof opts.durationMs === \"number\" && Number.isFinite(opts.durationMs)) {\n tool.duration_ms = opts.durationMs;\n }\n if (typeof opts.success === \"boolean\") tool.success = opts.success;\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n tool,\n };\n return startSpan({\n name: `${adapter}.tool.${toolName}`,\n type: \"tool\",\n metadata,\n });\n};\n\n/**\n * Emit a wire `type=tool` span. Returns `null` when no active trace exists;\n * never throws.\n */\nexport const emitToolSpan: (opts: EmitToolSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitToolSpan,\n {\n fingerprint: \"morse.adapters.shared.emitToolSpan\",\n },\n) as (opts: EmitToolSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitSubagentSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitSubagentSpanOptions {\n adapter: AdapterName;\n parentAgentName: string;\n subagentName: string;\n taskDescription?: string;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitSubagentSpan = (opts: EmitSubagentSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const parentAgentName = requireNonEmpty(opts.parentAgentName, \"parentAgentName\");\n const subagentName = requireNonEmpty(opts.subagentName, \"subagentName\");\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n spawn_kind: \"subagent\",\n parent_agent_name: parentAgentName,\n subagent_name: subagentName,\n };\n if (typeof opts.taskDescription === \"string\" && opts.taskDescription.length > 0) {\n metadata.task_description = truncate(opts.taskDescription, MAX_DESCRIPTION_BYTES);\n }\n return startSpan({\n name: `${adapter}.subagent.${subagentName}`,\n type: \"agent\",\n metadata,\n });\n};\n\n/**\n * Emit a wire `type=agent` span with `metadata.spawn_kind=\"subagent\"` — the\n * UI inspects this metadata key to render subagent-spawn relationships\n * until the backend gains a native `subagent` enum value. Returns `null`\n * when no active trace exists; never throws.\n */\nexport const emitSubagentSpan: (opts: EmitSubagentSpanOptions) => SpanHandle | null =\n absorbErrorsSync(_emitSubagentSpan, {\n fingerprint: \"morse.adapters.shared.emitSubagentSpan\",\n }) as (opts: EmitSubagentSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitHookSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitHookSpanOptions {\n adapter: AdapterName;\n hookName: string;\n hookKind: \"pre_tool\" | \"post_tool\" | \"on_error\";\n durationMs?: number;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitHookSpan = (opts: EmitHookSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const hookName = truncate(requireNonEmpty(opts.hookName, \"hookName\"), MAX_NAME_BYTES);\n const hookKind = opts.hookKind;\n if (hookKind !== \"pre_tool\" && hookKind !== \"post_tool\" && hookKind !== \"on_error\") {\n throw new Error(\n `morse span-emitter: hookKind must be one of pre_tool|post_tool|on_error (got ${String(\n hookKind,\n )})`,\n );\n }\n const hook: Record<string, unknown> = { name: hookName, kind: hookKind };\n if (typeof opts.durationMs === \"number\" && Number.isFinite(opts.durationMs)) {\n hook.duration_ms = opts.durationMs;\n }\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n tool_kind: \"hook\",\n hook,\n };\n return startSpan({\n name: `${adapter}.hook.${hookKind}.${hookName}`,\n type: \"tool\",\n metadata,\n });\n};\n\n/**\n * Emit a wire `type=tool` span with `metadata.tool_kind=\"hook\"` — the UI\n * inspects this metadata key to render hook spans separately from regular\n * tool spans. Returns `null` when no active trace exists; never throws.\n */\nexport const emitHookSpan: (opts: EmitHookSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitHookSpan,\n {\n fingerprint: \"morse.adapters.shared.emitHookSpan\",\n },\n) as (opts: EmitHookSpanOptions) => SpanHandle | null;\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/anthropic/index.ts"],"names":["opts"],"mappings":"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","file":"chunk-GWJYOQNC.js","sourcesContent":["/**\n * `@morsehq-dev/sdk/anthropic` — Anthropic SDK instrumentation.\n *\n * Wraps `@anthropic-ai/sdk` `client.messages.create` so every Claude call\n * emits an `llm` span carrying pre-segmented `context_segments`. The\n * server-side classifier then skips its own messages-array partitioning\n * and persists the SDK-supplied segments verbatim.\n *\n * Two entry points:\n *\n * - `wrapAnthropic(client)` — returns a Proxy-like wrapper that\n * intercepts `messages.create`. Always succeeds. The customer keeps\n * using the wrapper as if it were the real client.\n *\n * - `instrumentAnthropic(client?)` — top-level helper. If a client is\n * passed, returns the wrapped form. If no client is passed AND the\n * `@anthropic-ai/sdk` package can be loaded, attempts to patch\n * `Messages.prototype.create` so every fresh `new Anthropic()` is\n * instrumented automatically. The prototype path is best-effort —\n * it is documented as fragile across Anthropic SDK versions, and\n * `wrapAnthropic` is the recommended public entry.\n *\n * Idempotent. `uninstallAnthropic()` restores the prototype and clears\n * the install sentinel.\n *\n * Wrapped under `absorbErrors*` so a tracing failure can never break the\n * customer's Anthropic call — at worst, calls go untraced.\n *\n * Mirrors `apps/sdk/typescript/src/vercel-ai/index.ts` in shape and\n * `openspec/changes/.../specs/observability/spec.md` (CTX-08) in\n * segmentation contract.\n */\n\nimport { absorbErrorsAsync, absorbErrorsSync } from \"../_internal/errors\";\nimport { calculateCost } from \"../_internal/pricing\";\nimport type { ContextSegment, SpanData } from \"../_internal/spans\";\nimport { generateSpanId, nowIso } from \"../_internal/spans\";\nimport { getActiveTraceState, runAsync as _runAsync, startSpan } from \"../_internal/tracing\";\n\n/* ------------------------------------------------------------------------ */\n/* Public types — minimal structural shapes, NOT a hard dep on `@anthropic-ai/sdk` */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Subset of `@anthropic-ai/sdk`'s `MessageCreateParams` we read from. We\n * deliberately decline to import the real types so the SDK works even when\n * `@anthropic-ai/sdk` isn't installed (it's an optional peer dep).\n */\nexport interface AnthropicMessageCreateParams {\n model: string;\n max_tokens?: number;\n system?: string | AnthropicTextBlockParam[];\n messages: AnthropicMessageParam[];\n tools?: AnthropicToolParam[];\n tool_choice?: unknown;\n // Allow forward-compat fields without complaint.\n [key: string]: unknown;\n}\n\nexport interface AnthropicTextBlockParam {\n type: \"text\";\n text: string;\n cache_control?: { type: \"ephemeral\" } | null;\n}\n\nexport interface AnthropicToolUseBlockParam {\n type: \"tool_use\";\n id: string;\n name: string;\n input: unknown;\n}\n\nexport interface AnthropicToolResultBlockParam {\n type: \"tool_result\";\n tool_use_id: string;\n content: string | Array<{ type: string; text?: string; [k: string]: unknown }>;\n is_error?: boolean;\n}\n\nexport type AnthropicContentBlockParam =\n | AnthropicTextBlockParam\n | AnthropicToolUseBlockParam\n | AnthropicToolResultBlockParam\n | { type: string; [k: string]: unknown };\n\nexport interface AnthropicMessageParam {\n role: \"user\" | \"assistant\" | string;\n content: string | AnthropicContentBlockParam[];\n}\n\nexport interface AnthropicToolParam {\n name: string;\n description?: string;\n input_schema?: unknown;\n // Anthropic supports custom tool types — let through.\n [key: string]: unknown;\n}\n\nexport interface AnthropicUsage {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n [key: string]: unknown;\n}\n\nexport interface AnthropicMessageResponse {\n id?: string;\n model?: string;\n usage?: AnthropicUsage;\n content?: Array<{ type: string; text?: string; [k: string]: unknown }>;\n [key: string]: unknown;\n}\n\n/**\n * Structural shape of the Anthropic client we wrap. We only require that\n * `client.messages.create` is a function returning a Promise.\n */\nexport interface AnthropicClientLike {\n messages: {\n create(\n params: AnthropicMessageCreateParams,\n options?: unknown,\n ): Promise<AnthropicMessageResponse>;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Module-level install sentinels */\n/* ------------------------------------------------------------------------ */\n\nconst WRAPPED_CLIENT = Symbol.for(\"morse.anthropic.wrapped\");\nconst INSTALL_SENTINEL = Symbol.for(\"morse.anthropic.installed\");\nconst ORIGINALS_SENTINEL = Symbol.for(\"morse.anthropic.originals\");\n\n/**\n * True once `instrumentAnthropic()` has successfully patched\n * `Messages.prototype.create` globally (called directly, or via\n * `_internal/auto-detect.ts`'s zero-config scan). Mirrors the Python SDK's\n * `wrap()` check on `anthropic._morse_ai_installed` (AGE-240 dogfood fix):\n * without this guard, a customer who lets auto-detect patch the prototype\n * AND then calls `wrapAnthropic(client)` manually on an instance would\n * record every `messages.create` call twice — once via the global patch,\n * once via the per-instance Proxy. `wrapAnthropic()` checks this flag and\n * returns the client unmodified when a global install is already active,\n * leaving the global patch as the sole recorder.\n */\nlet globalInstallActive = false;\n\ninterface OriginalsBag {\n protoCreate?: unknown;\n protoCarrier?: { prototype: { create: unknown } };\n}\n\ninterface InstalledModule {\n [INSTALL_SENTINEL]?: boolean;\n [ORIGINALS_SENTINEL]?: OriginalsBag;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------------ */\n\nexport interface InstrumentAnthropicOptions {\n /**\n * When provided, used as the parent agent span's name. Defaults to\n * `\"anthropic.messages.create\"`.\n */\n defaultAgentName?: string;\n /**\n * If a fresh Anthropic *module* import is passed (e.g.,\n * `await import(\"@anthropic-ai/sdk\")`), the adapter will best-effort\n * patch `Messages.prototype.create`. Most users should prefer\n * `wrapAnthropic(client)` instead.\n */\n anthropicModule?: unknown;\n /**\n * When `true` (MEM-11), every wrapped `messages.create` call also\n * emits a sibling `memory`-type span with\n * `metadata.memory_op_type=\"consolidate\"`, `parent_span_id` linking\n * back to the LLM span (server treats this as `producer_span_id`),\n * `metadata.summary_token_count` from the response's output_tokens,\n * and `metadata.summary_content_hash` (SHA-256 of the response's\n * first text block).\n *\n * Use this flag when the customer is calling Claude to summarize\n * their own conversation context (the customer-side compaction\n * pattern). Default `false` — existing callers see zero behavior change.\n *\n * Opt-in only. The adapter never auto-detects summarization from\n * system-prompt content (too many false positives).\n */\n summarize?: boolean;\n}\n\n/**\n * Wrap an Anthropic client so every `messages.create` call records an\n * `llm` span with `context_segments`. The wrapper preserves the rest of\n * the client's surface (other resources, helpers, etc.) via a Proxy.\n *\n * Idempotent — a previously wrapped client is returned as-is.\n */\nexport function wrapAnthropic<C extends AnthropicClientLike>(\n client: C,\n options: InstrumentAnthropicOptions = {},\n): C {\n if (!client || typeof client !== \"object\") return client;\n // Already wrapped? Pass through.\n if ((client as Record<string | symbol, unknown>)[WRAPPED_CLIENT]) return client;\n // A global install (manual `instrumentAnthropic()` or auto-detect) is\n // already recording every call at the prototype level — see\n // `globalInstallActive` doc comment above.\n if (globalInstallActive) return client;\n\n const originalCreate = client.messages?.create?.bind(client.messages);\n if (typeof originalCreate !== \"function\") return client;\n\n const patchedCreate = buildPatchedCreate(originalCreate, options);\n\n // We construct a new `messages` object that proxies to the original\n // for any non-`create` access, then a top-level proxy that returns\n // our patched `messages` while passing every other property through.\n const patchedMessages = new Proxy(client.messages, {\n get(target, prop, receiver) {\n if (prop === \"create\") return patchedCreate;\n const value = Reflect.get(target, prop, receiver);\n // Bind methods so `this` continues to point at the original.\n if (typeof value === \"function\") return (value as (...a: unknown[]) => unknown).bind(target);\n return value;\n },\n });\n\n const wrapper = new Proxy(client, {\n get(target, prop, receiver) {\n if (prop === WRAPPED_CLIENT) return true;\n if (prop === \"messages\") return patchedMessages;\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === \"function\") return (value as (...a: unknown[]) => unknown).bind(target);\n return value;\n },\n });\n\n return wrapper as C;\n}\n\n/**\n * Top-level installer. Two modes:\n *\n * - `instrumentAnthropic(client)` — equivalent to `wrapAnthropic(client)`.\n * - `instrumentAnthropic({ anthropicModule: mod })` — best-effort\n * prototype patch. Prefer the wrap form when possible.\n *\n * Always returns the wrapped client, or `undefined` if patching failed.\n * Errors are absorbed; this function never throws back at the caller.\n */\nexport const instrumentAnthropic = absorbErrorsAsync(\n async <C extends AnthropicClientLike>(\n clientOrOptions?: C | InstrumentAnthropicOptions,\n maybeOptions?: InstrumentAnthropicOptions,\n ): Promise<C | boolean> => {\n // Disambiguate the overloads.\n if (clientOrOptions && isClient(clientOrOptions)) {\n const opts = maybeOptions ?? {};\n return wrapAnthropic(clientOrOptions as C, opts);\n }\n const opts = (clientOrOptions as InstrumentAnthropicOptions | undefined) ?? {};\n const mod = await loadAnthropicModule(opts.anthropicModule);\n if (!mod) return false;\n const installed = (mod as InstalledModule)[INSTALL_SENTINEL] === true;\n if (installed) {\n globalInstallActive = true;\n return true;\n }\n\n const carrier = findMessagesPrototypeCarrier(mod);\n if (!carrier) return false;\n const originalCreate = carrier.prototype.create;\n if (typeof originalCreate !== \"function\") return false;\n\n const patchedCreate = buildPatchedCreate(function (\n this: unknown,\n params: AnthropicMessageCreateParams,\n callOptions?: unknown,\n ) {\n return (originalCreate as (...args: unknown[]) => Promise<AnthropicMessageResponse>).call(\n this,\n params,\n callOptions,\n );\n }, opts);\n carrier.prototype.create = patchedCreate as unknown as typeof carrier.prototype.create;\n (mod as InstalledModule)[ORIGINALS_SENTINEL] = {\n protoCreate: originalCreate,\n protoCarrier: carrier,\n };\n (mod as InstalledModule)[INSTALL_SENTINEL] = true;\n globalInstallActive = true;\n return true;\n },\n { fingerprint: \"morse.adapters.anthropic.install\" },\n);\n\n/**\n * Restore the prototype patch and clear the install sentinel.\n *\n * Pass the same module reference that was given to `instrumentAnthropic`\n * (or omit and the function will try to dynamic-import it). Calling\n * `uninstallAnthropic()` on a wrapped client (vs. a module) is a no-op —\n * just discard the wrapped client.\n */\nexport const uninstallAnthropic = absorbErrorsSync(\n (anthropicModule?: unknown): void => {\n if (!anthropicModule || typeof anthropicModule !== \"object\") return;\n const mod = anthropicModule as InstalledModule;\n if (!mod[INSTALL_SENTINEL]) return;\n const originals = mod[ORIGINALS_SENTINEL];\n if (originals?.protoCarrier && originals.protoCreate !== undefined) {\n originals.protoCarrier.prototype.create =\n originals.protoCreate as typeof originals.protoCarrier.prototype.create;\n }\n mod[ORIGINALS_SENTINEL] = undefined;\n mod[INSTALL_SENTINEL] = false;\n globalInstallActive = false;\n },\n { fingerprint: \"morse.adapters.anthropic.uninstall\" },\n);\n\n/**\n * Reset module-level install state for tests. Not part of the public API.\n * @internal\n */\nexport function _resetAnthropicInstallStateForTesting(): void {\n globalInstallActive = false;\n}\n\n/** True when a wrapped Anthropic client is passed in. */\nexport function isAnthropicWrapped(client: unknown): boolean {\n if (!client || typeof client !== \"object\") return false;\n return (client as Record<string | symbol, unknown>)[WRAPPED_CLIENT] === true;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Internals — module discovery */\n/* ------------------------------------------------------------------------ */\n\nfunction isClient(x: unknown): x is AnthropicClientLike {\n if (!x || typeof x !== \"object\") return false;\n const messages = (x as { messages?: { create?: unknown } }).messages;\n return !!messages && typeof messages.create === \"function\";\n}\n\nasync function loadAnthropicModule(explicit?: unknown): Promise<unknown | null> {\n if (explicit && typeof explicit === \"object\") return explicit;\n try {\n // Function-eval'd dynamic import keeps bundlers from trying to resolve\n // `@anthropic-ai/sdk` at build time when the dep isn't installed.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return await (Function(\"m\", \"return import(m)\") as any)(\"@anthropic-ai/sdk\");\n } catch {\n return null;\n }\n}\n\n/**\n * Locate the Messages class prototype on the Anthropic SDK module.\n * The SDK has historically exposed it at slightly different paths across\n * versions; we try the most common shapes.\n */\nfunction findMessagesPrototypeCarrier(mod: unknown): { prototype: { create: unknown } } | null {\n if (!mod || typeof mod !== \"object\") return null;\n const m = mod as Record<string, unknown>;\n\n // Strategy 1: `mod.Anthropic.Messages` (default-export class with static).\n const Default = m.default ?? m.Anthropic ?? m;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const candidates: any[] = [\n (Default as Record<string, unknown> | undefined)?.Messages,\n (m as Record<string, unknown>).Messages,\n (Default as { resources?: { Messages?: unknown } } | undefined)?.resources?.Messages,\n ];\n for (const c of candidates) {\n if (c && typeof c === \"function\" && c.prototype && typeof c.prototype.create === \"function\") {\n return c as { prototype: { create: unknown } };\n }\n }\n return null;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Internals — wrapper that records an `llm` span */\n/* ------------------------------------------------------------------------ */\n\nfunction buildPatchedCreate(\n original: (\n params: AnthropicMessageCreateParams,\n options?: unknown,\n ) => Promise<AnthropicMessageResponse>,\n options: InstrumentAnthropicOptions,\n): (params: AnthropicMessageCreateParams, options?: unknown) => Promise<AnthropicMessageResponse> {\n const agentName = options.defaultAgentName ?? \"anthropic.messages.create\";\n const summarizeMode = options.summarize === true;\n\n return async function patchedCreate(\n this: unknown,\n params: AnthropicMessageCreateParams,\n callOptions?: unknown,\n ): Promise<AnthropicMessageResponse> {\n const inTrace = getActiveTraceState() !== null;\n\n const work = async (): Promise<AnthropicMessageResponse> => {\n const handle = startSpan({\n name: \"anthropic.messages.create\",\n type: \"llm\",\n metadata: { model: params?.model, max_tokens: params?.max_tokens },\n });\n let response: AnthropicMessageResponse | undefined;\n try {\n response = await original.call(this, params, callOptions);\n } catch (err) {\n handle?.end(err);\n throw err;\n }\n\n // Recording is best-effort — never let it throw at the caller.\n try {\n if (handle) {\n const segments = safeExtractSegments(params, response);\n const usage = response?.usage ?? {};\n const inputTokens =\n (usage.input_tokens ?? 0) +\n (usage.cache_creation_input_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0);\n const outputTokens = usage.output_tokens ?? 0;\n handle.span.model = response?.model ?? params?.model;\n if (inputTokens > 0) handle.span.input_tokens = inputTokens;\n if (outputTokens > 0) handle.span.output_tokens = outputTokens;\n const cacheWrite = usage.cache_creation_input_tokens ?? 0;\n const cacheRead = usage.cache_read_input_tokens ?? 0;\n if (cacheWrite > 0) handle.span.cache_write_tokens = cacheWrite;\n if (cacheRead > 0) handle.span.cached_input_tokens = cacheRead;\n if (inputTokens > 0 || outputTokens > 0) {\n handle.span.total_tokens = inputTokens + outputTokens;\n }\n if (\n handle.span.cost_usd === undefined &&\n handle.span.model &&\n (inputTokens > 0 || outputTokens > 0)\n ) {\n const cost = calculateCost({\n inputTokens,\n outputTokens,\n model: handle.span.model,\n cachedInputTokens: cacheRead,\n cacheWriteTokens: cacheWrite,\n });\n if (cost !== undefined) handle.span.cost_usd = cost;\n }\n handle.span.context_segments = segments;\n }\n } catch {\n // swallow — telemetry must never break the caller\n }\n handle?.end();\n\n // MEM-11: emit sibling memory span when summarize mode is enabled.\n // Sequenced AFTER the LLM span closes so its span_id is final.\n if (summarizeMode && handle) {\n try {\n emitSummarizeMemorySpan(handle.span, response);\n } catch {\n // swallow — telemetry must never break the caller\n }\n }\n return response;\n };\n\n if (inTrace) {\n return work();\n }\n\n // No active trace — open a fresh agent span around the call so the\n // llm span has a parent. We can't return work()'s Promise from inside\n // _runAsync's callback while preserving the LLM result's typing AND\n // having the fresh trace own the lifecycle, so we wrap explicitly.\n let result: AnthropicMessageResponse | undefined;\n let thrown: unknown;\n await _runAsync({ agentName }, async (runHandle) => {\n runHandle.setOutcome(true);\n try {\n result = await work();\n } catch (err) {\n thrown = err;\n throw err;\n }\n return null;\n });\n if (thrown !== undefined) throw thrown;\n // result is set unless work() threw, in which case we already rethrew.\n return result as AnthropicMessageResponse;\n };\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public: deterministic segment extraction */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Maximum bytes of `content` we ship per segment. Long blobs are truncated\n * with `content_truncated: true`. The server further enforces its own\n * cap; we keep the SDK floor lower to stay friendly to mobile networks.\n */\nexport const MAX_SEGMENT_CONTENT_BYTES = 4096;\n\n/**\n * Extract `ContextSegment[]` from an Anthropic `messages.create` request\n * + response. The ordering is:\n *\n * 1. `tools` → one `tool_descriptions` segment, position 0.\n * 2. `system` → `system_prompt` segment.\n * 3. Each prior `user` / `assistant` message → `chat_history` segment.\n * `tool_result` blocks (always inside `user.content`) become their\n * own `tool_observation` segments.\n * `tool_use` blocks (assistant-emitted) roll into the parent\n * assistant `chat_history` segment as part of the JSON content.\n * 4. The final `user` message → `current_input`.\n *\n * Cache state heuristic:\n * - `system` blocks with `cache_control.type === \"ephemeral\"` →\n * `cache_write`.\n * - If the response reports `cache_read_input_tokens > 0`, mark the\n * `system_prompt` and `tool_descriptions` segments as `cache_hit`\n * (overrides `cache_write` — the cache HIT is more informative\n * than the cache write attempt).\n *\n * `tokens` is intentionally left undefined — the server tokenizes.\n */\nexport function extractAnthropicSegments(\n params: AnthropicMessageCreateParams,\n response?: AnthropicMessageResponse,\n): ContextSegment[] {\n const segments: ContextSegment[] = [];\n let position = 0;\n\n // 1. Tools → tool_descriptions.\n if (Array.isArray(params.tools) && params.tools.length > 0) {\n const content = canonicalJsonStringify(params.tools);\n segments.push(makeSegment(position++, \"tool_descriptions\", content));\n }\n\n // 2. System.\n let systemHadEphemeral = false;\n if (params.system !== undefined && params.system !== null) {\n let text = \"\";\n if (typeof params.system === \"string\") {\n text = params.system;\n } else if (Array.isArray(params.system)) {\n const parts: string[] = [];\n for (const block of params.system) {\n if (block && typeof block === \"object\" && block.type === \"text\") {\n parts.push(typeof block.text === \"string\" ? block.text : \"\");\n if (\n block.cache_control &&\n typeof block.cache_control === \"object\" &&\n (block.cache_control as { type?: string }).type === \"ephemeral\"\n ) {\n systemHadEphemeral = true;\n }\n }\n }\n text = parts.join(\"\\n\");\n }\n const seg = makeSegment(position++, \"system_prompt\", text);\n if (systemHadEphemeral) seg.cache_state = \"cache_write\";\n segments.push(seg);\n }\n\n // 3 + 4. Walk messages.\n const messages = Array.isArray(params.messages) ? params.messages : [];\n // Identify the index of the LAST user message so we can route only it\n // to current_input. Earlier user messages are chat_history.\n let lastUserIdx = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]?.role === \"user\") {\n lastUserIdx = i;\n break;\n }\n }\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n if (!msg) continue;\n const blocks = normalizeContent(msg.content);\n // Tool-result blocks always emit their own tool_observation segments.\n const toolResults = blocks.filter(\n (b) => b.type === \"tool_result\",\n ) as AnthropicToolResultBlockParam[];\n const nonToolResults = blocks.filter((b) => b.type !== \"tool_result\");\n\n // The non-tool-result remainder belongs to either current_input,\n // chat_history, or, if empty, nothing.\n if (nonToolResults.length > 0) {\n const text = renderBlocksAsText(nonToolResults, msg.role);\n let source: string;\n if (msg.role === \"user\" && i === lastUserIdx) {\n source = \"current_input\";\n } else {\n source = \"chat_history\";\n }\n segments.push(makeSegment(position++, source, text));\n } else if (\n typeof msg.content === \"string\" &&\n msg.role === \"user\" &&\n i === lastUserIdx &&\n msg.content.length > 0\n ) {\n // Edge case: pure-string user message that's also the last user.\n segments.push(makeSegment(position++, \"current_input\", msg.content));\n }\n\n // Each tool_result emits its own segment, in order.\n for (const tr of toolResults) {\n const text = renderToolResult(tr);\n const seg = makeSegment(position++, \"tool_observation\", text);\n seg.attrs = { tool_use_id: tr.tool_use_id };\n if (tr.is_error) {\n (seg.attrs as Record<string, unknown>).is_error = true;\n }\n segments.push(seg);\n }\n }\n\n // Cache hit override.\n const cacheRead = response?.usage?.cache_read_input_tokens ?? 0;\n if (cacheRead > 0) {\n for (const seg of segments) {\n if (seg.source === \"system_prompt\" || seg.source === \"tool_descriptions\") {\n seg.cache_state = \"cache_hit\";\n }\n }\n }\n\n return segments;\n}\n\nfunction safeExtractSegments(\n params: AnthropicMessageCreateParams,\n response?: AnthropicMessageResponse,\n): ContextSegment[] {\n try {\n return extractAnthropicSegments(params, response);\n } catch {\n return [];\n }\n}\n\n/**\n * MEM-11 — emit a sibling `memory`-type span linked to the given LLM span.\n *\n * The memory span:\n * - `type = \"memory\"`\n * - `parent_span_id = llmSpan.span_id` (server stores as producer_span_id)\n * - `metadata.memory_op_type = \"consolidate\"`\n * - `metadata.summary_token_count = response.usage.output_tokens`\n * - `metadata.summary_content_hash = SHA-256 of response.content[0].text`\n *\n * Caller is responsible for catching exceptions — telemetry must never\n * break the customer's Anthropic call.\n */\nfunction emitSummarizeMemorySpan(llmSpan: SpanData, response?: AnthropicMessageResponse): void {\n const state = getActiveTraceState();\n if (state === null) return;\n\n const summaryText = extractFirstTextBlock(response);\n const summaryHash = sha256Hex(summaryText);\n const summaryTokens = response?.usage?.output_tokens ?? 0;\n\n const startedAt = llmSpan.ended_at ?? llmSpan.started_at ?? nowIso();\n const memorySpan: SpanData = {\n trace_id: state.traceId,\n span_id: generateSpanId(),\n type: \"memory\",\n name: \"anthropic.summarize\",\n parent_span_id: llmSpan.span_id,\n started_at: startedAt,\n ended_at: startedAt,\n duration_ms: 0,\n status: \"completed\",\n metadata: {\n memory_op_type: \"consolidate\",\n summary_token_count: summaryTokens,\n summary_content_hash: summaryHash,\n },\n };\n state.completedSpans.push(memorySpan);\n}\n\n/**\n * Return the first text block of an Anthropic message response, or \"\" if\n * there is none. Best-effort; never throws.\n */\nfunction extractFirstTextBlock(response?: AnthropicMessageResponse): string {\n try {\n const content = response?.content;\n if (!Array.isArray(content)) return \"\";\n for (const block of content) {\n if (block && typeof block === \"object\" && block.type === \"text\") {\n const t = (block as { text?: unknown }).text;\n if (typeof t === \"string\" && t.length > 0) return t;\n }\n }\n return \"\";\n } catch {\n return \"\";\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Helpers — segment construction */\n/* ------------------------------------------------------------------------ */\n\nfunction makeSegment(position: number, source: string, rawContent: string): ContextSegment {\n const fullHash = sha256Hex(rawContent);\n const truncated = truncateToBytes(rawContent, MAX_SEGMENT_CONTENT_BYTES);\n const seg: ContextSegment = {\n position,\n source,\n content_hash: fullHash,\n content: truncated.text,\n cache_state: \"cold\",\n };\n if (truncated.truncated) seg.content_truncated = true;\n return seg;\n}\n\nfunction normalizeContent(content: AnthropicMessageParam[\"content\"]): AnthropicContentBlockParam[] {\n if (typeof content === \"string\") {\n return [{ type: \"text\", text: content }];\n }\n if (Array.isArray(content)) {\n return content.filter((b): b is AnthropicContentBlockParam => !!b && typeof b === \"object\");\n }\n return [];\n}\n\nfunction renderBlocksAsText(blocks: AnthropicContentBlockParam[], role: string): string {\n // For chat_history / current_input we want a deterministic, hashable\n // string. Plain `text` blocks render as their text. `tool_use` blocks\n // render as a stable JSON marker so two equivalent calls hash the same.\n const out: string[] = [];\n for (const b of blocks) {\n if (!b || typeof b !== \"object\") continue;\n if (b.type === \"text\") {\n const text = (b as AnthropicTextBlockParam).text;\n if (typeof text === \"string\") out.push(text);\n } else if (b.type === \"tool_use\") {\n const tu = b as AnthropicToolUseBlockParam;\n out.push(`[tool_use:${tu.name}:${tu.id}] ${canonicalJsonStringify(tu.input ?? null)}`);\n } else {\n // Unknown block type — best-effort serialize.\n out.push(canonicalJsonStringify(b));\n }\n }\n // Prefix with role for disambiguation in chat_history; keeps the\n // segment self-describing without bloating the hash too much.\n if (role === \"assistant\") {\n return out.length === 1 && out[0] !== undefined ? out[0] : out.join(\"\\n\");\n }\n return out.length === 1 && out[0] !== undefined ? out[0] : out.join(\"\\n\");\n}\n\nfunction renderToolResult(tr: AnthropicToolResultBlockParam): string {\n if (typeof tr.content === \"string\") return tr.content;\n if (Array.isArray(tr.content)) {\n const parts: string[] = [];\n for (const b of tr.content) {\n if (b && typeof b === \"object\") {\n if (b.type === \"text\" && typeof b.text === \"string\") parts.push(b.text);\n else parts.push(canonicalJsonStringify(b));\n }\n }\n return parts.join(\"\\n\");\n }\n return \"\";\n}\n\n/* ------------------------------------------------------------------------ */\n/* Helpers — hashing + JSON canonicalization + byte truncation */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Stringify with stable key ordering so equivalent objects hash to the\n * same content_hash regardless of property insertion order.\n */\nfunction canonicalJsonStringify(value: unknown): string {\n return JSON.stringify(value, function replacer(_key, val) {\n if (val && typeof val === \"object\" && !Array.isArray(val)) {\n const obj = val as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n for (const k of Object.keys(obj).sort()) {\n sorted[k] = obj[k];\n }\n return sorted;\n }\n return val;\n });\n}\n\n/**\n * Compute SHA-256 of `text` and return it hex-encoded. Tries Node's\n * `node:crypto` first (synchronous + zero-dep), falls back to a tiny\n * pure-TS impl when neither Node nor a Web Crypto sync API is available.\n *\n * NOTE: Web Crypto's `digest()` is async, but the segment-construction\n * path is sync. We therefore only use the Node sync API here. On the\n * browser we fall back to the pure-TS impl, which is fine for the\n * relatively short strings we hash (system prompts, tool defs, single\n * messages).\n */\nfunction sha256Hex(text: string): string {\n // Strategy 1: Node's crypto.createHash. Sync and dep-free.\n try {\n if (typeof process !== \"undefined\" && process.versions?.node) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dynamicRequire = Function(\"m\", \"return require(m)\") as any as (m: string) => unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoMod = dynamicRequire(\"node:crypto\") as any;\n if (cryptoMod?.createHash) {\n return cryptoMod.createHash(\"sha256\").update(text).digest(\"hex\");\n }\n }\n } catch {\n // fall through\n }\n // Strategy 2: pure-TS sha256 (used in browsers).\n return purejsSha256(text);\n}\n\nfunction truncateToBytes(text: string, maxBytes: number): { text: string; truncated: boolean } {\n // Fast path: cheap upper bound. 1 char ≤ 4 bytes UTF-8.\n if (text.length <= maxBytes / 4) return { text, truncated: false };\n // Build the encoded bytes once.\n const bytes = utf8Encode(text);\n if (bytes.length <= maxBytes) return { text, truncated: false };\n // Find the largest character boundary <= maxBytes.\n let cut = maxBytes;\n // Don't split a multi-byte sequence: walk back until we're at a\n // codepoint boundary (a byte where the top two bits aren't `10`).\n while (cut > 0 && (bytes[cut]! & 0xc0) === 0x80) {\n cut--;\n }\n return { text: utf8Decode(bytes.subarray(0, cut)), truncated: true };\n}\n\nfunction utf8Encode(text: string): Uint8Array {\n if (typeof TextEncoder !== \"undefined\") {\n return new TextEncoder().encode(text);\n }\n // Pure-JS fallback. Should never trigger on Node 18+ or modern browsers.\n const out: number[] = [];\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n if (code < 0x80) {\n out.push(code);\n } else if (code < 0x800) {\n out.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));\n } else {\n out.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));\n }\n }\n return new Uint8Array(out);\n}\n\nfunction utf8Decode(bytes: Uint8Array): string {\n if (typeof TextDecoder !== \"undefined\") {\n return new TextDecoder(\"utf-8\").decode(bytes);\n }\n let out = \"\";\n for (let i = 0; i < bytes.length; ) {\n const b = bytes[i]!;\n if (b < 0x80) {\n out += String.fromCharCode(b);\n i++;\n } else if (b < 0xe0) {\n out += String.fromCharCode(((b & 0x1f) << 6) | (bytes[i + 1]! & 0x3f));\n i += 2;\n } else {\n out += String.fromCharCode(\n ((b & 0x0f) << 12) | ((bytes[i + 1]! & 0x3f) << 6) | (bytes[i + 2]! & 0x3f),\n );\n i += 3;\n }\n }\n return out;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Pure-JS SHA-256 (used only when node:crypto is unavailable) */\n/* ------------------------------------------------------------------------ */\n\nfunction purejsSha256(text: string): string {\n const K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n ];\n const H = [\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n ];\n\n // Pad message.\n const msg = utf8Encode(text);\n const msgLen = msg.length;\n const bitLen = msgLen * 8;\n const padded = new Uint8Array(((msgLen + 9 + 63) >> 6) << 6);\n padded.set(msg);\n padded[msgLen] = 0x80;\n // 64-bit big-endian length. JS bitwise ops are 32-bit, so split lo/hi via /.\n const lo = (bitLen & 0xffffffff) >>> 0;\n const hi = Math.floor(bitLen / 0x100000000) >>> 0;\n padded[padded.length - 8] = (hi >>> 24) & 0xff;\n padded[padded.length - 7] = (hi >>> 16) & 0xff;\n padded[padded.length - 6] = (hi >>> 8) & 0xff;\n padded[padded.length - 5] = hi & 0xff;\n padded[padded.length - 4] = (lo >>> 24) & 0xff;\n padded[padded.length - 3] = (lo >>> 16) & 0xff;\n padded[padded.length - 2] = (lo >>> 8) & 0xff;\n padded[padded.length - 1] = lo & 0xff;\n\n const W = new Uint32Array(64);\n for (let chunk = 0; chunk < padded.length; chunk += 64) {\n for (let i = 0; i < 16; i++) {\n // `>>> 0` forces unsigned — `(byte << 24)` otherwise produces a signed\n // int when the high bit is set, which corrupts the schedule on bytes ≥ 0x80.\n W[i] =\n ((padded[chunk + i * 4]! << 24) |\n (padded[chunk + i * 4 + 1]! << 16) |\n (padded[chunk + i * 4 + 2]! << 8) |\n padded[chunk + i * 4 + 3]!) >>>\n 0;\n }\n for (let i = 16; i < 64; i++) {\n const s0 = rotr(W[i - 15]!, 7) ^ rotr(W[i - 15]!, 18) ^ (W[i - 15]! >>> 3);\n const s1 = rotr(W[i - 2]!, 17) ^ rotr(W[i - 2]!, 19) ^ (W[i - 2]! >>> 10);\n W[i] = (W[i - 16]! + s0 + W[i - 7]! + s1) >>> 0;\n }\n\n let [a, b, c, d, e, f, g, h] = H;\n\n for (let i = 0; i < 64; i++) {\n const S1 = rotr(e!, 6) ^ rotr(e!, 11) ^ rotr(e!, 25);\n const ch = (e! & f!) ^ (~e! & g!);\n const temp1 = (h! + S1 + ch + K[i]! + W[i]!) >>> 0;\n const S0 = rotr(a!, 2) ^ rotr(a!, 13) ^ rotr(a!, 22);\n const maj = (a! & b!) ^ (a! & c!) ^ (b! & c!);\n const temp2 = (S0 + maj) >>> 0;\n h = g;\n g = f;\n f = e;\n e = (d! + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n H[0] = (H[0]! + a!) >>> 0;\n H[1] = (H[1]! + b!) >>> 0;\n H[2] = (H[2]! + c!) >>> 0;\n H[3] = (H[3]! + d!) >>> 0;\n H[4] = (H[4]! + e!) >>> 0;\n H[5] = (H[5]! + f!) >>> 0;\n H[6] = (H[6]! + g!) >>> 0;\n H[7] = (H[7]! + h!) >>> 0;\n }\n\n let hex = \"\";\n for (const v of H) {\n hex += v.toString(16).padStart(8, \"0\");\n }\n return hex;\n}\n\nfunction rotr(x: number, n: number): number {\n return ((x >>> n) | (x << (32 - n))) >>> 0;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/anthropic/index.ts"],"names":["init_spans","init_tracing","absorbErrorsAsync","opts","absorbErrorsSync","getActiveTraceState","startSpan","calculateCost","runAsync","nowIso","generateSpanId"],"mappings":"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","file":"chunk-M2GZJ3RS.cjs","sourcesContent":["/**\n * `@morsehq-dev/sdk/anthropic` — Anthropic SDK instrumentation.\n *\n * Wraps `@anthropic-ai/sdk` `client.messages.create` so every Claude call\n * emits an `llm` span carrying pre-segmented `context_segments`. The\n * server-side classifier then skips its own messages-array partitioning\n * and persists the SDK-supplied segments verbatim.\n *\n * Two entry points:\n *\n * - `wrapAnthropic(client)` — returns a Proxy-like wrapper that\n * intercepts `messages.create`. Always succeeds. The customer keeps\n * using the wrapper as if it were the real client.\n *\n * - `instrumentAnthropic(client?)` — top-level helper. If a client is\n * passed, returns the wrapped form. If no client is passed AND the\n * `@anthropic-ai/sdk` package can be loaded, attempts to patch\n * `Messages.prototype.create` so every fresh `new Anthropic()` is\n * instrumented automatically. The prototype path is best-effort —\n * it is documented as fragile across Anthropic SDK versions, and\n * `wrapAnthropic` is the recommended public entry.\n *\n * Idempotent. `uninstallAnthropic()` restores the prototype and clears\n * the install sentinel.\n *\n * Wrapped under `absorbErrors*` so a tracing failure can never break the\n * customer's Anthropic call — at worst, calls go untraced.\n *\n * Mirrors `apps/sdk/typescript/src/vercel-ai/index.ts` in shape and\n * `openspec/changes/.../specs/observability/spec.md` (CTX-08) in\n * segmentation contract.\n */\n\nimport { absorbErrorsAsync, absorbErrorsSync } from \"../_internal/errors\";\nimport { calculateCost } from \"../_internal/pricing\";\nimport type { ContextSegment, SpanData } from \"../_internal/spans\";\nimport { generateSpanId, nowIso } from \"../_internal/spans\";\nimport { getActiveTraceState, runAsync as _runAsync, startSpan } from \"../_internal/tracing\";\n\n/* ------------------------------------------------------------------------ */\n/* Public types — minimal structural shapes, NOT a hard dep on `@anthropic-ai/sdk` */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Subset of `@anthropic-ai/sdk`'s `MessageCreateParams` we read from. We\n * deliberately decline to import the real types so the SDK works even when\n * `@anthropic-ai/sdk` isn't installed (it's an optional peer dep).\n */\nexport interface AnthropicMessageCreateParams {\n model: string;\n max_tokens?: number;\n system?: string | AnthropicTextBlockParam[];\n messages: AnthropicMessageParam[];\n tools?: AnthropicToolParam[];\n tool_choice?: unknown;\n // Allow forward-compat fields without complaint.\n [key: string]: unknown;\n}\n\nexport interface AnthropicTextBlockParam {\n type: \"text\";\n text: string;\n cache_control?: { type: \"ephemeral\" } | null;\n}\n\nexport interface AnthropicToolUseBlockParam {\n type: \"tool_use\";\n id: string;\n name: string;\n input: unknown;\n}\n\nexport interface AnthropicToolResultBlockParam {\n type: \"tool_result\";\n tool_use_id: string;\n content: string | Array<{ type: string; text?: string; [k: string]: unknown }>;\n is_error?: boolean;\n}\n\nexport type AnthropicContentBlockParam =\n | AnthropicTextBlockParam\n | AnthropicToolUseBlockParam\n | AnthropicToolResultBlockParam\n | { type: string; [k: string]: unknown };\n\nexport interface AnthropicMessageParam {\n role: \"user\" | \"assistant\" | string;\n content: string | AnthropicContentBlockParam[];\n}\n\nexport interface AnthropicToolParam {\n name: string;\n description?: string;\n input_schema?: unknown;\n // Anthropic supports custom tool types — let through.\n [key: string]: unknown;\n}\n\nexport interface AnthropicUsage {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n [key: string]: unknown;\n}\n\nexport interface AnthropicMessageResponse {\n id?: string;\n model?: string;\n usage?: AnthropicUsage;\n content?: Array<{ type: string; text?: string; [k: string]: unknown }>;\n [key: string]: unknown;\n}\n\n/**\n * Structural shape of the Anthropic client we wrap. We only require that\n * `client.messages.create` is a function returning a Promise.\n */\nexport interface AnthropicClientLike {\n messages: {\n create(\n params: AnthropicMessageCreateParams,\n options?: unknown,\n ): Promise<AnthropicMessageResponse>;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Module-level install sentinels */\n/* ------------------------------------------------------------------------ */\n\nconst WRAPPED_CLIENT = Symbol.for(\"morse.anthropic.wrapped\");\nconst INSTALL_SENTINEL = Symbol.for(\"morse.anthropic.installed\");\nconst ORIGINALS_SENTINEL = Symbol.for(\"morse.anthropic.originals\");\n\n/**\n * True once `instrumentAnthropic()` has successfully patched\n * `Messages.prototype.create` globally (called directly, or via\n * `_internal/auto-detect.ts`'s zero-config scan). Mirrors the Python SDK's\n * `wrap()` check on `anthropic._morse_ai_installed` (AGE-240 dogfood fix):\n * without this guard, a customer who lets auto-detect patch the prototype\n * AND then calls `wrapAnthropic(client)` manually on an instance would\n * record every `messages.create` call twice — once via the global patch,\n * once via the per-instance Proxy. `wrapAnthropic()` checks this flag and\n * returns the client unmodified when a global install is already active,\n * leaving the global patch as the sole recorder.\n */\nlet globalInstallActive = false;\n\ninterface OriginalsBag {\n protoCreate?: unknown;\n protoCarrier?: { prototype: { create: unknown } };\n}\n\ninterface InstalledModule {\n [INSTALL_SENTINEL]?: boolean;\n [ORIGINALS_SENTINEL]?: OriginalsBag;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------------ */\n\nexport interface InstrumentAnthropicOptions {\n /**\n * When provided, used as the parent agent span's name. Defaults to\n * `\"anthropic.messages.create\"`.\n */\n defaultAgentName?: string;\n /**\n * If a fresh Anthropic *module* import is passed (e.g.,\n * `await import(\"@anthropic-ai/sdk\")`), the adapter will best-effort\n * patch `Messages.prototype.create`. Most users should prefer\n * `wrapAnthropic(client)` instead.\n */\n anthropicModule?: unknown;\n /**\n * When `true` (MEM-11), every wrapped `messages.create` call also\n * emits a sibling `memory`-type span with\n * `metadata.memory_op_type=\"consolidate\"`, `parent_span_id` linking\n * back to the LLM span (server treats this as `producer_span_id`),\n * `metadata.summary_token_count` from the response's output_tokens,\n * and `metadata.summary_content_hash` (SHA-256 of the response's\n * first text block).\n *\n * Use this flag when the customer is calling Claude to summarize\n * their own conversation context (the customer-side compaction\n * pattern). Default `false` — existing callers see zero behavior change.\n *\n * Opt-in only. The adapter never auto-detects summarization from\n * system-prompt content (too many false positives).\n */\n summarize?: boolean;\n}\n\n/**\n * Wrap an Anthropic client so every `messages.create` call records an\n * `llm` span with `context_segments`. The wrapper preserves the rest of\n * the client's surface (other resources, helpers, etc.) via a Proxy.\n *\n * Idempotent — a previously wrapped client is returned as-is.\n */\nexport function wrapAnthropic<C extends AnthropicClientLike>(\n client: C,\n options: InstrumentAnthropicOptions = {},\n): C {\n if (!client || typeof client !== \"object\") return client;\n // Already wrapped? Pass through.\n if ((client as Record<string | symbol, unknown>)[WRAPPED_CLIENT]) return client;\n // A global install (manual `instrumentAnthropic()` or auto-detect) is\n // already recording every call at the prototype level — see\n // `globalInstallActive` doc comment above.\n if (globalInstallActive) return client;\n\n const originalCreate = client.messages?.create?.bind(client.messages);\n if (typeof originalCreate !== \"function\") return client;\n\n const patchedCreate = buildPatchedCreate(originalCreate, options);\n\n // We construct a new `messages` object that proxies to the original\n // for any non-`create` access, then a top-level proxy that returns\n // our patched `messages` while passing every other property through.\n const patchedMessages = new Proxy(client.messages, {\n get(target, prop, receiver) {\n if (prop === \"create\") return patchedCreate;\n const value = Reflect.get(target, prop, receiver);\n // Bind methods so `this` continues to point at the original.\n if (typeof value === \"function\") return (value as (...a: unknown[]) => unknown).bind(target);\n return value;\n },\n });\n\n const wrapper = new Proxy(client, {\n get(target, prop, receiver) {\n if (prop === WRAPPED_CLIENT) return true;\n if (prop === \"messages\") return patchedMessages;\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === \"function\") return (value as (...a: unknown[]) => unknown).bind(target);\n return value;\n },\n });\n\n return wrapper as C;\n}\n\n/**\n * Top-level installer. Two modes:\n *\n * - `instrumentAnthropic(client)` — equivalent to `wrapAnthropic(client)`.\n * - `instrumentAnthropic({ anthropicModule: mod })` — best-effort\n * prototype patch. Prefer the wrap form when possible.\n *\n * Always returns the wrapped client, or `undefined` if patching failed.\n * Errors are absorbed; this function never throws back at the caller.\n */\nexport const instrumentAnthropic = absorbErrorsAsync(\n async <C extends AnthropicClientLike>(\n clientOrOptions?: C | InstrumentAnthropicOptions,\n maybeOptions?: InstrumentAnthropicOptions,\n ): Promise<C | boolean> => {\n // Disambiguate the overloads.\n if (clientOrOptions && isClient(clientOrOptions)) {\n const opts = maybeOptions ?? {};\n return wrapAnthropic(clientOrOptions as C, opts);\n }\n const opts = (clientOrOptions as InstrumentAnthropicOptions | undefined) ?? {};\n const mod = await loadAnthropicModule(opts.anthropicModule);\n if (!mod) return false;\n const installed = (mod as InstalledModule)[INSTALL_SENTINEL] === true;\n if (installed) {\n globalInstallActive = true;\n return true;\n }\n\n const carrier = findMessagesPrototypeCarrier(mod);\n if (!carrier) return false;\n const originalCreate = carrier.prototype.create;\n if (typeof originalCreate !== \"function\") return false;\n\n const patchedCreate = buildPatchedCreate(function (\n this: unknown,\n params: AnthropicMessageCreateParams,\n callOptions?: unknown,\n ) {\n return (originalCreate as (...args: unknown[]) => Promise<AnthropicMessageResponse>).call(\n this,\n params,\n callOptions,\n );\n }, opts);\n carrier.prototype.create = patchedCreate as unknown as typeof carrier.prototype.create;\n (mod as InstalledModule)[ORIGINALS_SENTINEL] = {\n protoCreate: originalCreate,\n protoCarrier: carrier,\n };\n (mod as InstalledModule)[INSTALL_SENTINEL] = true;\n globalInstallActive = true;\n return true;\n },\n { fingerprint: \"morse.adapters.anthropic.install\" },\n);\n\n/**\n * Restore the prototype patch and clear the install sentinel.\n *\n * Pass the same module reference that was given to `instrumentAnthropic`\n * (or omit and the function will try to dynamic-import it). Calling\n * `uninstallAnthropic()` on a wrapped client (vs. a module) is a no-op —\n * just discard the wrapped client.\n */\nexport const uninstallAnthropic = absorbErrorsSync(\n (anthropicModule?: unknown): void => {\n if (!anthropicModule || typeof anthropicModule !== \"object\") return;\n const mod = anthropicModule as InstalledModule;\n if (!mod[INSTALL_SENTINEL]) return;\n const originals = mod[ORIGINALS_SENTINEL];\n if (originals?.protoCarrier && originals.protoCreate !== undefined) {\n originals.protoCarrier.prototype.create =\n originals.protoCreate as typeof originals.protoCarrier.prototype.create;\n }\n mod[ORIGINALS_SENTINEL] = undefined;\n mod[INSTALL_SENTINEL] = false;\n globalInstallActive = false;\n },\n { fingerprint: \"morse.adapters.anthropic.uninstall\" },\n);\n\n/**\n * Reset module-level install state for tests. Not part of the public API.\n * @internal\n */\nexport function _resetAnthropicInstallStateForTesting(): void {\n globalInstallActive = false;\n}\n\n/** True when a wrapped Anthropic client is passed in. */\nexport function isAnthropicWrapped(client: unknown): boolean {\n if (!client || typeof client !== \"object\") return false;\n return (client as Record<string | symbol, unknown>)[WRAPPED_CLIENT] === true;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Internals — module discovery */\n/* ------------------------------------------------------------------------ */\n\nfunction isClient(x: unknown): x is AnthropicClientLike {\n if (!x || typeof x !== \"object\") return false;\n const messages = (x as { messages?: { create?: unknown } }).messages;\n return !!messages && typeof messages.create === \"function\";\n}\n\nasync function loadAnthropicModule(explicit?: unknown): Promise<unknown | null> {\n if (explicit && typeof explicit === \"object\") return explicit;\n try {\n // Function-eval'd dynamic import keeps bundlers from trying to resolve\n // `@anthropic-ai/sdk` at build time when the dep isn't installed.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return await (Function(\"m\", \"return import(m)\") as any)(\"@anthropic-ai/sdk\");\n } catch {\n return null;\n }\n}\n\n/**\n * Locate the Messages class prototype on the Anthropic SDK module.\n * The SDK has historically exposed it at slightly different paths across\n * versions; we try the most common shapes.\n */\nfunction findMessagesPrototypeCarrier(mod: unknown): { prototype: { create: unknown } } | null {\n if (!mod || typeof mod !== \"object\") return null;\n const m = mod as Record<string, unknown>;\n\n // Strategy 1: `mod.Anthropic.Messages` (default-export class with static).\n const Default = m.default ?? m.Anthropic ?? m;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const candidates: any[] = [\n (Default as Record<string, unknown> | undefined)?.Messages,\n (m as Record<string, unknown>).Messages,\n (Default as { resources?: { Messages?: unknown } } | undefined)?.resources?.Messages,\n ];\n for (const c of candidates) {\n if (c && typeof c === \"function\" && c.prototype && typeof c.prototype.create === \"function\") {\n return c as { prototype: { create: unknown } };\n }\n }\n return null;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Internals — wrapper that records an `llm` span */\n/* ------------------------------------------------------------------------ */\n\nfunction buildPatchedCreate(\n original: (\n params: AnthropicMessageCreateParams,\n options?: unknown,\n ) => Promise<AnthropicMessageResponse>,\n options: InstrumentAnthropicOptions,\n): (params: AnthropicMessageCreateParams, options?: unknown) => Promise<AnthropicMessageResponse> {\n const agentName = options.defaultAgentName ?? \"anthropic.messages.create\";\n const summarizeMode = options.summarize === true;\n\n return async function patchedCreate(\n this: unknown,\n params: AnthropicMessageCreateParams,\n callOptions?: unknown,\n ): Promise<AnthropicMessageResponse> {\n const inTrace = getActiveTraceState() !== null;\n\n const work = async (): Promise<AnthropicMessageResponse> => {\n const handle = startSpan({\n name: \"anthropic.messages.create\",\n type: \"llm\",\n metadata: { model: params?.model, max_tokens: params?.max_tokens },\n });\n let response: AnthropicMessageResponse | undefined;\n try {\n response = await original.call(this, params, callOptions);\n } catch (err) {\n handle?.end(err);\n throw err;\n }\n\n // Recording is best-effort — never let it throw at the caller.\n try {\n if (handle) {\n const segments = safeExtractSegments(params, response);\n const usage = response?.usage ?? {};\n const inputTokens =\n (usage.input_tokens ?? 0) +\n (usage.cache_creation_input_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0);\n const outputTokens = usage.output_tokens ?? 0;\n handle.span.model = response?.model ?? params?.model;\n if (inputTokens > 0) handle.span.input_tokens = inputTokens;\n if (outputTokens > 0) handle.span.output_tokens = outputTokens;\n const cacheWrite = usage.cache_creation_input_tokens ?? 0;\n const cacheRead = usage.cache_read_input_tokens ?? 0;\n if (cacheWrite > 0) handle.span.cache_write_tokens = cacheWrite;\n if (cacheRead > 0) handle.span.cached_input_tokens = cacheRead;\n if (inputTokens > 0 || outputTokens > 0) {\n handle.span.total_tokens = inputTokens + outputTokens;\n }\n if (\n handle.span.cost_usd === undefined &&\n handle.span.model &&\n (inputTokens > 0 || outputTokens > 0)\n ) {\n const cost = calculateCost({\n inputTokens,\n outputTokens,\n model: handle.span.model,\n cachedInputTokens: cacheRead,\n cacheWriteTokens: cacheWrite,\n });\n if (cost !== undefined) handle.span.cost_usd = cost;\n }\n handle.span.context_segments = segments;\n }\n } catch {\n // swallow — telemetry must never break the caller\n }\n handle?.end();\n\n // MEM-11: emit sibling memory span when summarize mode is enabled.\n // Sequenced AFTER the LLM span closes so its span_id is final.\n if (summarizeMode && handle) {\n try {\n emitSummarizeMemorySpan(handle.span, response);\n } catch {\n // swallow — telemetry must never break the caller\n }\n }\n return response;\n };\n\n if (inTrace) {\n return work();\n }\n\n // No active trace — open a fresh agent span around the call so the\n // llm span has a parent. We can't return work()'s Promise from inside\n // _runAsync's callback while preserving the LLM result's typing AND\n // having the fresh trace own the lifecycle, so we wrap explicitly.\n let result: AnthropicMessageResponse | undefined;\n let thrown: unknown;\n await _runAsync({ agentName }, async (runHandle) => {\n runHandle.setOutcome(true);\n try {\n result = await work();\n } catch (err) {\n thrown = err;\n throw err;\n }\n return null;\n });\n if (thrown !== undefined) throw thrown;\n // result is set unless work() threw, in which case we already rethrew.\n return result as AnthropicMessageResponse;\n };\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public: deterministic segment extraction */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Maximum bytes of `content` we ship per segment. Long blobs are truncated\n * with `content_truncated: true`. The server further enforces its own\n * cap; we keep the SDK floor lower to stay friendly to mobile networks.\n */\nexport const MAX_SEGMENT_CONTENT_BYTES = 4096;\n\n/**\n * Extract `ContextSegment[]` from an Anthropic `messages.create` request\n * + response. The ordering is:\n *\n * 1. `tools` → one `tool_descriptions` segment, position 0.\n * 2. `system` → `system_prompt` segment.\n * 3. Each prior `user` / `assistant` message → `chat_history` segment.\n * `tool_result` blocks (always inside `user.content`) become their\n * own `tool_observation` segments.\n * `tool_use` blocks (assistant-emitted) roll into the parent\n * assistant `chat_history` segment as part of the JSON content.\n * 4. The final `user` message → `current_input`.\n *\n * Cache state heuristic:\n * - `system` blocks with `cache_control.type === \"ephemeral\"` →\n * `cache_write`.\n * - If the response reports `cache_read_input_tokens > 0`, mark the\n * `system_prompt` and `tool_descriptions` segments as `cache_hit`\n * (overrides `cache_write` — the cache HIT is more informative\n * than the cache write attempt).\n *\n * `tokens` is intentionally left undefined — the server tokenizes.\n */\nexport function extractAnthropicSegments(\n params: AnthropicMessageCreateParams,\n response?: AnthropicMessageResponse,\n): ContextSegment[] {\n const segments: ContextSegment[] = [];\n let position = 0;\n\n // 1. Tools → tool_descriptions.\n if (Array.isArray(params.tools) && params.tools.length > 0) {\n const content = canonicalJsonStringify(params.tools);\n segments.push(makeSegment(position++, \"tool_descriptions\", content));\n }\n\n // 2. System.\n let systemHadEphemeral = false;\n if (params.system !== undefined && params.system !== null) {\n let text = \"\";\n if (typeof params.system === \"string\") {\n text = params.system;\n } else if (Array.isArray(params.system)) {\n const parts: string[] = [];\n for (const block of params.system) {\n if (block && typeof block === \"object\" && block.type === \"text\") {\n parts.push(typeof block.text === \"string\" ? block.text : \"\");\n if (\n block.cache_control &&\n typeof block.cache_control === \"object\" &&\n (block.cache_control as { type?: string }).type === \"ephemeral\"\n ) {\n systemHadEphemeral = true;\n }\n }\n }\n text = parts.join(\"\\n\");\n }\n const seg = makeSegment(position++, \"system_prompt\", text);\n if (systemHadEphemeral) seg.cache_state = \"cache_write\";\n segments.push(seg);\n }\n\n // 3 + 4. Walk messages.\n const messages = Array.isArray(params.messages) ? params.messages : [];\n // Identify the index of the LAST user message so we can route only it\n // to current_input. Earlier user messages are chat_history.\n let lastUserIdx = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]?.role === \"user\") {\n lastUserIdx = i;\n break;\n }\n }\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n if (!msg) continue;\n const blocks = normalizeContent(msg.content);\n // Tool-result blocks always emit their own tool_observation segments.\n const toolResults = blocks.filter(\n (b) => b.type === \"tool_result\",\n ) as AnthropicToolResultBlockParam[];\n const nonToolResults = blocks.filter((b) => b.type !== \"tool_result\");\n\n // The non-tool-result remainder belongs to either current_input,\n // chat_history, or, if empty, nothing.\n if (nonToolResults.length > 0) {\n const text = renderBlocksAsText(nonToolResults, msg.role);\n let source: string;\n if (msg.role === \"user\" && i === lastUserIdx) {\n source = \"current_input\";\n } else {\n source = \"chat_history\";\n }\n segments.push(makeSegment(position++, source, text));\n } else if (\n typeof msg.content === \"string\" &&\n msg.role === \"user\" &&\n i === lastUserIdx &&\n msg.content.length > 0\n ) {\n // Edge case: pure-string user message that's also the last user.\n segments.push(makeSegment(position++, \"current_input\", msg.content));\n }\n\n // Each tool_result emits its own segment, in order.\n for (const tr of toolResults) {\n const text = renderToolResult(tr);\n const seg = makeSegment(position++, \"tool_observation\", text);\n seg.attrs = { tool_use_id: tr.tool_use_id };\n if (tr.is_error) {\n (seg.attrs as Record<string, unknown>).is_error = true;\n }\n segments.push(seg);\n }\n }\n\n // Cache hit override.\n const cacheRead = response?.usage?.cache_read_input_tokens ?? 0;\n if (cacheRead > 0) {\n for (const seg of segments) {\n if (seg.source === \"system_prompt\" || seg.source === \"tool_descriptions\") {\n seg.cache_state = \"cache_hit\";\n }\n }\n }\n\n return segments;\n}\n\nfunction safeExtractSegments(\n params: AnthropicMessageCreateParams,\n response?: AnthropicMessageResponse,\n): ContextSegment[] {\n try {\n return extractAnthropicSegments(params, response);\n } catch {\n return [];\n }\n}\n\n/**\n * MEM-11 — emit a sibling `memory`-type span linked to the given LLM span.\n *\n * The memory span:\n * - `type = \"memory\"`\n * - `parent_span_id = llmSpan.span_id` (server stores as producer_span_id)\n * - `metadata.memory_op_type = \"consolidate\"`\n * - `metadata.summary_token_count = response.usage.output_tokens`\n * - `metadata.summary_content_hash = SHA-256 of response.content[0].text`\n *\n * Caller is responsible for catching exceptions — telemetry must never\n * break the customer's Anthropic call.\n */\nfunction emitSummarizeMemorySpan(llmSpan: SpanData, response?: AnthropicMessageResponse): void {\n const state = getActiveTraceState();\n if (state === null) return;\n\n const summaryText = extractFirstTextBlock(response);\n const summaryHash = sha256Hex(summaryText);\n const summaryTokens = response?.usage?.output_tokens ?? 0;\n\n const startedAt = llmSpan.ended_at ?? llmSpan.started_at ?? nowIso();\n const memorySpan: SpanData = {\n trace_id: state.traceId,\n span_id: generateSpanId(),\n type: \"memory\",\n name: \"anthropic.summarize\",\n parent_span_id: llmSpan.span_id,\n started_at: startedAt,\n ended_at: startedAt,\n duration_ms: 0,\n status: \"completed\",\n metadata: {\n memory_op_type: \"consolidate\",\n summary_token_count: summaryTokens,\n summary_content_hash: summaryHash,\n },\n };\n state.completedSpans.push(memorySpan);\n}\n\n/**\n * Return the first text block of an Anthropic message response, or \"\" if\n * there is none. Best-effort; never throws.\n */\nfunction extractFirstTextBlock(response?: AnthropicMessageResponse): string {\n try {\n const content = response?.content;\n if (!Array.isArray(content)) return \"\";\n for (const block of content) {\n if (block && typeof block === \"object\" && block.type === \"text\") {\n const t = (block as { text?: unknown }).text;\n if (typeof t === \"string\" && t.length > 0) return t;\n }\n }\n return \"\";\n } catch {\n return \"\";\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Helpers — segment construction */\n/* ------------------------------------------------------------------------ */\n\nfunction makeSegment(position: number, source: string, rawContent: string): ContextSegment {\n const fullHash = sha256Hex(rawContent);\n const truncated = truncateToBytes(rawContent, MAX_SEGMENT_CONTENT_BYTES);\n const seg: ContextSegment = {\n position,\n source,\n content_hash: fullHash,\n content: truncated.text,\n cache_state: \"cold\",\n };\n if (truncated.truncated) seg.content_truncated = true;\n return seg;\n}\n\nfunction normalizeContent(content: AnthropicMessageParam[\"content\"]): AnthropicContentBlockParam[] {\n if (typeof content === \"string\") {\n return [{ type: \"text\", text: content }];\n }\n if (Array.isArray(content)) {\n return content.filter((b): b is AnthropicContentBlockParam => !!b && typeof b === \"object\");\n }\n return [];\n}\n\nfunction renderBlocksAsText(blocks: AnthropicContentBlockParam[], role: string): string {\n // For chat_history / current_input we want a deterministic, hashable\n // string. Plain `text` blocks render as their text. `tool_use` blocks\n // render as a stable JSON marker so two equivalent calls hash the same.\n const out: string[] = [];\n for (const b of blocks) {\n if (!b || typeof b !== \"object\") continue;\n if (b.type === \"text\") {\n const text = (b as AnthropicTextBlockParam).text;\n if (typeof text === \"string\") out.push(text);\n } else if (b.type === \"tool_use\") {\n const tu = b as AnthropicToolUseBlockParam;\n out.push(`[tool_use:${tu.name}:${tu.id}] ${canonicalJsonStringify(tu.input ?? null)}`);\n } else {\n // Unknown block type — best-effort serialize.\n out.push(canonicalJsonStringify(b));\n }\n }\n // Prefix with role for disambiguation in chat_history; keeps the\n // segment self-describing without bloating the hash too much.\n if (role === \"assistant\") {\n return out.length === 1 && out[0] !== undefined ? out[0] : out.join(\"\\n\");\n }\n return out.length === 1 && out[0] !== undefined ? out[0] : out.join(\"\\n\");\n}\n\nfunction renderToolResult(tr: AnthropicToolResultBlockParam): string {\n if (typeof tr.content === \"string\") return tr.content;\n if (Array.isArray(tr.content)) {\n const parts: string[] = [];\n for (const b of tr.content) {\n if (b && typeof b === \"object\") {\n if (b.type === \"text\" && typeof b.text === \"string\") parts.push(b.text);\n else parts.push(canonicalJsonStringify(b));\n }\n }\n return parts.join(\"\\n\");\n }\n return \"\";\n}\n\n/* ------------------------------------------------------------------------ */\n/* Helpers — hashing + JSON canonicalization + byte truncation */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Stringify with stable key ordering so equivalent objects hash to the\n * same content_hash regardless of property insertion order.\n */\nfunction canonicalJsonStringify(value: unknown): string {\n return JSON.stringify(value, function replacer(_key, val) {\n if (val && typeof val === \"object\" && !Array.isArray(val)) {\n const obj = val as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n for (const k of Object.keys(obj).sort()) {\n sorted[k] = obj[k];\n }\n return sorted;\n }\n return val;\n });\n}\n\n/**\n * Compute SHA-256 of `text` and return it hex-encoded. Tries Node's\n * `node:crypto` first (synchronous + zero-dep), falls back to a tiny\n * pure-TS impl when neither Node nor a Web Crypto sync API is available.\n *\n * NOTE: Web Crypto's `digest()` is async, but the segment-construction\n * path is sync. We therefore only use the Node sync API here. On the\n * browser we fall back to the pure-TS impl, which is fine for the\n * relatively short strings we hash (system prompts, tool defs, single\n * messages).\n */\nfunction sha256Hex(text: string): string {\n // Strategy 1: Node's crypto.createHash. Sync and dep-free.\n try {\n if (typeof process !== \"undefined\" && process.versions?.node) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dynamicRequire = Function(\"m\", \"return require(m)\") as any as (m: string) => unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cryptoMod = dynamicRequire(\"node:crypto\") as any;\n if (cryptoMod?.createHash) {\n return cryptoMod.createHash(\"sha256\").update(text).digest(\"hex\");\n }\n }\n } catch {\n // fall through\n }\n // Strategy 2: pure-TS sha256 (used in browsers).\n return purejsSha256(text);\n}\n\nfunction truncateToBytes(text: string, maxBytes: number): { text: string; truncated: boolean } {\n // Fast path: cheap upper bound. 1 char ≤ 4 bytes UTF-8.\n if (text.length <= maxBytes / 4) return { text, truncated: false };\n // Build the encoded bytes once.\n const bytes = utf8Encode(text);\n if (bytes.length <= maxBytes) return { text, truncated: false };\n // Find the largest character boundary <= maxBytes.\n let cut = maxBytes;\n // Don't split a multi-byte sequence: walk back until we're at a\n // codepoint boundary (a byte where the top two bits aren't `10`).\n while (cut > 0 && (bytes[cut]! & 0xc0) === 0x80) {\n cut--;\n }\n return { text: utf8Decode(bytes.subarray(0, cut)), truncated: true };\n}\n\nfunction utf8Encode(text: string): Uint8Array {\n if (typeof TextEncoder !== \"undefined\") {\n return new TextEncoder().encode(text);\n }\n // Pure-JS fallback. Should never trigger on Node 18+ or modern browsers.\n const out: number[] = [];\n for (let i = 0; i < text.length; i++) {\n const code = text.charCodeAt(i);\n if (code < 0x80) {\n out.push(code);\n } else if (code < 0x800) {\n out.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));\n } else {\n out.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));\n }\n }\n return new Uint8Array(out);\n}\n\nfunction utf8Decode(bytes: Uint8Array): string {\n if (typeof TextDecoder !== \"undefined\") {\n return new TextDecoder(\"utf-8\").decode(bytes);\n }\n let out = \"\";\n for (let i = 0; i < bytes.length; ) {\n const b = bytes[i]!;\n if (b < 0x80) {\n out += String.fromCharCode(b);\n i++;\n } else if (b < 0xe0) {\n out += String.fromCharCode(((b & 0x1f) << 6) | (bytes[i + 1]! & 0x3f));\n i += 2;\n } else {\n out += String.fromCharCode(\n ((b & 0x0f) << 12) | ((bytes[i + 1]! & 0x3f) << 6) | (bytes[i + 2]! & 0x3f),\n );\n i += 3;\n }\n }\n return out;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Pure-JS SHA-256 (used only when node:crypto is unavailable) */\n/* ------------------------------------------------------------------------ */\n\nfunction purejsSha256(text: string): string {\n const K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n ];\n const H = [\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n ];\n\n // Pad message.\n const msg = utf8Encode(text);\n const msgLen = msg.length;\n const bitLen = msgLen * 8;\n const padded = new Uint8Array(((msgLen + 9 + 63) >> 6) << 6);\n padded.set(msg);\n padded[msgLen] = 0x80;\n // 64-bit big-endian length. JS bitwise ops are 32-bit, so split lo/hi via /.\n const lo = (bitLen & 0xffffffff) >>> 0;\n const hi = Math.floor(bitLen / 0x100000000) >>> 0;\n padded[padded.length - 8] = (hi >>> 24) & 0xff;\n padded[padded.length - 7] = (hi >>> 16) & 0xff;\n padded[padded.length - 6] = (hi >>> 8) & 0xff;\n padded[padded.length - 5] = hi & 0xff;\n padded[padded.length - 4] = (lo >>> 24) & 0xff;\n padded[padded.length - 3] = (lo >>> 16) & 0xff;\n padded[padded.length - 2] = (lo >>> 8) & 0xff;\n padded[padded.length - 1] = lo & 0xff;\n\n const W = new Uint32Array(64);\n for (let chunk = 0; chunk < padded.length; chunk += 64) {\n for (let i = 0; i < 16; i++) {\n // `>>> 0` forces unsigned — `(byte << 24)` otherwise produces a signed\n // int when the high bit is set, which corrupts the schedule on bytes ≥ 0x80.\n W[i] =\n ((padded[chunk + i * 4]! << 24) |\n (padded[chunk + i * 4 + 1]! << 16) |\n (padded[chunk + i * 4 + 2]! << 8) |\n padded[chunk + i * 4 + 3]!) >>>\n 0;\n }\n for (let i = 16; i < 64; i++) {\n const s0 = rotr(W[i - 15]!, 7) ^ rotr(W[i - 15]!, 18) ^ (W[i - 15]! >>> 3);\n const s1 = rotr(W[i - 2]!, 17) ^ rotr(W[i - 2]!, 19) ^ (W[i - 2]! >>> 10);\n W[i] = (W[i - 16]! + s0 + W[i - 7]! + s1) >>> 0;\n }\n\n let [a, b, c, d, e, f, g, h] = H;\n\n for (let i = 0; i < 64; i++) {\n const S1 = rotr(e!, 6) ^ rotr(e!, 11) ^ rotr(e!, 25);\n const ch = (e! & f!) ^ (~e! & g!);\n const temp1 = (h! + S1 + ch + K[i]! + W[i]!) >>> 0;\n const S0 = rotr(a!, 2) ^ rotr(a!, 13) ^ rotr(a!, 22);\n const maj = (a! & b!) ^ (a! & c!) ^ (b! & c!);\n const temp2 = (S0 + maj) >>> 0;\n h = g;\n g = f;\n f = e;\n e = (d! + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n H[0] = (H[0]! + a!) >>> 0;\n H[1] = (H[1]! + b!) >>> 0;\n H[2] = (H[2]! + c!) >>> 0;\n H[3] = (H[3]! + d!) >>> 0;\n H[4] = (H[4]! + e!) >>> 0;\n H[5] = (H[5]! + f!) >>> 0;\n H[6] = (H[6]! + g!) >>> 0;\n H[7] = (H[7]! + h!) >>> 0;\n }\n\n let hex = \"\";\n for (const v of H) {\n hex += v.toString(16).padStart(8, \"0\");\n }\n return hex;\n}\n\nfunction rotr(x: number, n: number): number {\n return ((x >>> n) | (x << (32 - n))) >>> 0;\n}\n"]}
|