@morsehq-dev/sdk 0.5.0 → 0.6.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/README.md +11 -10
- package/dist/anthropic/index.cjs +11 -11
- package/dist/anthropic/index.d.cts +1 -1
- package/dist/anthropic/index.d.ts +1 -1
- package/dist/anthropic/index.js +4 -4
- package/dist/anthropic-agent-sdk/index.cjs +44 -40
- package/dist/anthropic-agent-sdk/index.cjs.map +1 -1
- package/dist/anthropic-agent-sdk/index.d.cts +1 -1
- package/dist/anthropic-agent-sdk/index.d.ts +1 -1
- package/dist/anthropic-agent-sdk/index.js +10 -6
- package/dist/anthropic-agent-sdk/index.js.map +1 -1
- package/dist/browser/anthropic/index.cjs +11 -11
- package/dist/browser/anthropic/index.js +4 -4
- package/dist/browser/anthropic-agent-sdk/index.cjs +44 -40
- package/dist/browser/anthropic-agent-sdk/index.cjs.map +1 -1
- package/dist/browser/anthropic-agent-sdk/index.js +10 -6
- package/dist/browser/anthropic-agent-sdk/index.js.map +1 -1
- package/dist/browser/{chunk-ELQ4LGAS.cjs → chunk-33WDUUKZ.cjs} +18 -18
- package/dist/browser/{chunk-ELQ4LGAS.cjs.map → chunk-33WDUUKZ.cjs.map} +1 -1
- package/dist/browser/{chunk-TV7TRP5O.cjs → chunk-3I7IGP3P.cjs} +5 -5
- package/dist/browser/chunk-3I7IGP3P.cjs.map +1 -0
- package/dist/browser/{chunk-YYUDZTHI.js → chunk-3OYHDDOJ.js} +27 -5
- package/dist/browser/chunk-3OYHDDOJ.js.map +1 -0
- package/dist/browser/{chunk-6BNMYEMW.cjs → chunk-4IUHXUCJ.cjs} +49 -9
- package/dist/browser/chunk-4IUHXUCJ.cjs.map +1 -0
- package/dist/browser/{chunk-BUCIE3DR.js → chunk-5TYTCLKA.js} +4 -4
- package/dist/browser/{chunk-BUCIE3DR.js.map → chunk-5TYTCLKA.js.map} +1 -1
- package/dist/browser/{chunk-VIOT3AOP.js → chunk-6JHMFFPE.js} +3 -3
- package/dist/browser/chunk-6JHMFFPE.js.map +1 -0
- package/dist/browser/{chunk-BIP66M44.cjs → chunk-FKYI3N5N.cjs} +7 -7
- package/dist/browser/{chunk-BIP66M44.cjs.map → chunk-FKYI3N5N.cjs.map} +1 -1
- package/dist/browser/{chunk-NU74H55W.js → chunk-FPTUHYDJ.js} +3 -3
- package/dist/browser/{chunk-NU74H55W.js.map → chunk-FPTUHYDJ.js.map} +1 -1
- package/dist/browser/{chunk-52JTU4LH.cjs → chunk-IDKQZ4X5.cjs} +38 -15
- package/dist/browser/chunk-IDKQZ4X5.cjs.map +1 -0
- package/dist/browser/{chunk-2X64OY2L.cjs → chunk-LIP3XCTK.cjs} +12 -12
- package/dist/browser/{chunk-2X64OY2L.cjs.map → chunk-LIP3XCTK.cjs.map} +1 -1
- package/dist/browser/{chunk-T6Z6UIBN.js → chunk-OUQAH27A.js} +3 -3
- package/dist/browser/{chunk-T6Z6UIBN.js.map → chunk-OUQAH27A.js.map} +1 -1
- package/dist/browser/{chunk-4CMVMTFB.cjs → chunk-PSNZZBQJ.cjs} +6 -6
- package/dist/browser/{chunk-4CMVMTFB.cjs.map → chunk-PSNZZBQJ.cjs.map} +1 -1
- package/dist/browser/{chunk-6T6ZPOKZ.js → chunk-PXHTLCEU.js} +49 -10
- package/dist/browser/chunk-PXHTLCEU.js.map +1 -0
- package/dist/browser/{chunk-KZFG23MO.js → chunk-TRVACYUN.js} +5 -5
- package/dist/browser/{chunk-KZFG23MO.js.map → chunk-TRVACYUN.js.map} +1 -1
- package/dist/browser/index.cjs +189 -124
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +111 -46
- 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 +28 -26
- package/dist/browser/langchain/index.cjs.map +1 -1
- package/dist/browser/langchain/index.js +13 -11
- package/dist/browser/langchain/index.js.map +1 -1
- package/dist/browser/langgraph/index.cjs +32 -30
- package/dist/browser/langgraph/index.cjs.map +1 -1
- package/dist/browser/langgraph/index.js +10 -8
- package/dist/browser/langgraph/index.js.map +1 -1
- package/dist/browser/openai/index.cjs +11 -11
- package/dist/browser/openai/index.js +2 -2
- package/dist/browser/openai-agents/index.cjs +63 -35
- package/dist/browser/openai-agents/index.cjs.map +1 -1
- package/dist/browser/openai-agents/index.js +33 -5
- package/dist/browser/openai-agents/index.js.map +1 -1
- package/dist/browser/vercel-ai/index.cjs +14 -14
- package/dist/browser/vercel-ai/index.js +3 -3
- package/dist/{chunk-KMBKZLXH.cjs → chunk-7DALGJL2.cjs} +100 -25
- package/dist/chunk-7DALGJL2.cjs.map +1 -0
- package/dist/{chunk-D5NTF54A.cjs → chunk-B7TGG62X.cjs} +12 -12
- package/dist/{chunk-D5NTF54A.cjs.map → chunk-B7TGG62X.cjs.map} +1 -1
- package/dist/{chunk-LPLL2OXI.cjs → chunk-COZFARLL.cjs} +5 -5
- package/dist/chunk-COZFARLL.cjs.map +1 -0
- package/dist/{chunk-GTPKPUAV.cjs → chunk-DXTNU2KT.cjs} +38 -15
- package/dist/chunk-DXTNU2KT.cjs.map +1 -0
- package/dist/{chunk-6FLGLD72.js → chunk-ERH3TNXZ.js} +3 -3
- package/dist/{chunk-6FLGLD72.js.map → chunk-ERH3TNXZ.js.map} +1 -1
- package/dist/{chunk-7HYFOHM3.cjs → chunk-ESJJXXB6.cjs} +6 -6
- package/dist/{chunk-7HYFOHM3.cjs.map → chunk-ESJJXXB6.cjs.map} +1 -1
- package/dist/{chunk-SUEBUMHL.cjs → chunk-ETRNCI5Z.cjs} +18 -18
- package/dist/{chunk-SUEBUMHL.cjs.map → chunk-ETRNCI5Z.cjs.map} +1 -1
- package/dist/{chunk-KWOSUW7B.js → chunk-GULJAURY.js} +27 -5
- package/dist/chunk-GULJAURY.js.map +1 -0
- package/dist/{chunk-ZIMGB7IT.js → chunk-HJV35HWL.js} +100 -26
- package/dist/chunk-HJV35HWL.js.map +1 -0
- package/dist/{chunk-3ONFIKKC.js → chunk-L7AD4KUD.js} +3 -3
- package/dist/chunk-L7AD4KUD.js.map +1 -0
- package/dist/{chunk-SFI36VWW.js → chunk-QBDTQTMN.js} +3 -3
- package/dist/{chunk-SFI36VWW.js.map → chunk-QBDTQTMN.js.map} +1 -1
- package/dist/{chunk-NMARCV3R.cjs → chunk-WG4H5JC6.cjs} +7 -7
- package/dist/{chunk-NMARCV3R.cjs.map → chunk-WG4H5JC6.cjs.map} +1 -1
- package/dist/{chunk-J5FEPM7L.js → chunk-XS4P7XPV.js} +5 -5
- package/dist/{chunk-J5FEPM7L.js.map → chunk-XS4P7XPV.js.map} +1 -1
- package/dist/{chunk-ZZSVPAXM.js → chunk-YVLEDBN7.js} +4 -4
- package/dist/{chunk-ZZSVPAXM.js.map → chunk-YVLEDBN7.js.map} +1 -1
- package/dist/index.cjs +199 -134
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -2
- package/dist/index.d.ts +13 -2
- package/dist/index.js +112 -47
- 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 +28 -26
- package/dist/langchain/index.cjs.map +1 -1
- package/dist/langchain/index.d.cts +3 -3
- package/dist/langchain/index.d.ts +3 -3
- package/dist/langchain/index.js +13 -11
- package/dist/langchain/index.js.map +1 -1
- package/dist/langgraph/index.cjs +32 -30
- package/dist/langgraph/index.cjs.map +1 -1
- package/dist/langgraph/index.d.cts +3 -3
- package/dist/langgraph/index.d.ts +3 -3
- package/dist/langgraph/index.js +10 -8
- package/dist/langgraph/index.js.map +1 -1
- package/dist/openai/index.cjs +11 -11
- package/dist/openai/index.js +2 -2
- package/dist/openai-agents/index.cjs +63 -35
- package/dist/openai-agents/index.cjs.map +1 -1
- package/dist/openai-agents/index.d.cts +13 -4
- package/dist/openai-agents/index.d.ts +13 -4
- package/dist/openai-agents/index.js +33 -5
- package/dist/openai-agents/index.js.map +1 -1
- package/dist/{spans-DZtMuBvc.d.cts → spans-CBMWNg2C.d.cts} +1 -0
- package/dist/{spans-DZtMuBvc.d.ts → spans-CBMWNg2C.d.ts} +1 -0
- package/dist/{tracing-J8ZgxVzU.d.ts → tracing-BMWTyexr.d.ts} +1 -1
- package/dist/{tracing-CNlre8TK.d.cts → tracing-Bh-cbvr6.d.cts} +1 -1
- package/dist/vercel-ai/index.cjs +14 -14
- package/dist/vercel-ai/index.js +3 -3
- package/package.json +1 -1
- package/dist/browser/chunk-52JTU4LH.cjs.map +0 -1
- package/dist/browser/chunk-6BNMYEMW.cjs.map +0 -1
- package/dist/browser/chunk-6T6ZPOKZ.js.map +0 -1
- package/dist/browser/chunk-TV7TRP5O.cjs.map +0 -1
- package/dist/browser/chunk-VIOT3AOP.js.map +0 -1
- package/dist/browser/chunk-YYUDZTHI.js.map +0 -1
- package/dist/chunk-3ONFIKKC.js.map +0 -1
- package/dist/chunk-GTPKPUAV.cjs.map +0 -1
- package/dist/chunk-KMBKZLXH.cjs.map +0 -1
- package/dist/chunk-KWOSUW7B.js.map +0 -1
- package/dist/chunk-LPLL2OXI.cjs.map +0 -1
- package/dist/chunk-ZIMGB7IT.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/_internal/auto-detect.browser.ts","../../src/index.ts","../../src/_internal/db-capture.browser.ts","../../src/_internal/transport.ts"],"names":["run","span","setContext","startSpan","spanAsync","quotaState","_resetForTesting"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Browser replacement for `auto-detect.ts` (MHQ-482 follow-up).\n *\n * `auto-detect.ts` already no-ops at RUNTIME outside Node — its own\n * docstring says so — but it reaches for `node:module`'s `createRequire` /\n * `Module` in a static top-level import, so a bundler still had to resolve\n * `module` for the browser graph. The runtime guard was never the problem;\n * the import was.\n *\n * Nothing here is a behaviour change: zero-config adapter auto-detect works\n * by hooking `require()` to patch LLM SDKs as they load, and a browser has\n * no `require` to hook. See `otel-provider.browser.ts` for the full\n * rationale and the build wiring.\n */\n\n/** No-op: there is no `require` to hook in a browser. */\nexport async function installAdapters(): Promise<void> {}\n\n/** No state to reset in the browser build. */\nexport function _resetForTesting(): void {}\n","/**\n * `@morsehq-dev/sdk` — TypeScript SDK for Morse observability.\n *\n * V2 module-level singleton API:\n *\n * ```ts\n * import * as morse from \"@morsehq-dev/sdk\";\n *\n * // Three-step zero-setup integration:\n * // 1. Generate an API key in the Morse dashboard.\n * // 2. npm install @morsehq-dev/sdk\n * // 3. Set MORSE_API_KEY in your environment.\n *\n * morse.track({ agentId: \"lead-qualifier\", runData: { success: true } });\n *\n * // Or call init() explicitly to override env-var resolution:\n * morse.init({\n * apiKey: \"mhq_xxx\", // pragma: allowlist secret — placeholder, not a key\n * endpoint: \"https://api.morsehq.dev/api/v1/traces/batch\",\n * flushIntervalSeconds: 2,\n * });\n * ```\n *\n * Non-invasive guarantee: every public function is wrapped with\n * `absorbErrors`. Telemetry never throws back at the caller; internal\n * errors are reported out-of-band to Morse's own diagnostics endpoint.\n *\n * The internal `BatchTransport` and `TraceState` types back the singleton\n * but are NOT part of the public API. Customers should never reach into\n * the `_internal` directory.\n */\n\nimport {\n installAdapters as _installAdapters,\n _resetForTesting as _resetAutoDetectForTesting,\n} from \"./_internal/auto-detect\";\nimport { absorbErrorsAsync, absorbErrorsSync } from \"./_internal/errors\";\nimport {\n DEFAULT_ENDPOINT,\n getApiKey as readApiKeyFromEnv,\n getEndpoint as readEndpointFromEnv,\n getFlushIntervalSeconds,\n getInternalSource as readInternalSourceFromEnv,\n getMaxBatchSize,\n getMaxFieldBytes,\n getMaxQueueSize,\n getSampleRate,\n isDisabled as readIsDisabled,\n isValidInternalSource,\n} from \"./_internal/env\";\nimport { maybeEnableDbCaptureFromEnv } from \"./_internal/db-capture\";\nimport { getEngine as getOtelEngine } from \"./_internal/otel-provider\";\nimport {\n buildRedactionConfig,\n type RedactionConfig,\n type RedactionOptions,\n redactValue,\n} from \"./_internal/redaction\";\nimport {\n BatchTransport,\n SDK_VERSION,\n type TelemetryEvent,\n getQuotaState as _getQuotaState,\n _resetQuotaStateForTesting,\n type QuotaState,\n} from \"./_internal/transport\";\nimport {\n getActiveTraceState as _getActiveTraceState,\n getLastTrace as _getLastTrace,\n runAsync as _runAsync,\n runSync as _runSync,\n sendTrace as _sendTrace,\n setContext as _setContext,\n setRedactionConfig,\n setSource as _setSource,\n setTransport,\n startSpan as _startSpan,\n type RunHandle,\n type RunOptions,\n type SpanHandle,\n type SpanOptions,\n spanAsync as _spanAsync,\n spanSync as _spanSync,\n _resetForTesting as _resetTracingForTesting,\n} from \"./_internal/tracing\";\nimport {\n report,\n setDiagnosticsClientConfig,\n flushOnce as flushDiagnosticsOnce,\n _resetForTesting as _resetDiagnosticsForTesting,\n} from \"./_internal/diagnostics\";\nimport { _setEnsureInitialized as _setLogEnsureInitialized } from \"./log\";\nimport {\n buildTraceEntry,\n generateSpanId,\n generateTraceId,\n nowIso,\n SpanType,\n type SpanData,\n type TraceFields,\n} from \"./_internal/spans\";\n\nexport type { SpanData, SpanType, SpanStatus, ContextSegment } from \"./_internal/spans\";\nexport type { RunHandle, RunOptions, SpanHandle, SpanOptions };\nexport type { QuotaState };\nexport type { RedactionOptions, RedactionConfig } from \"./_internal/redaction\";\nexport {\n extractTraceparent,\n formatTraceparent,\n injectTraceparent,\n injectIntoRequestInit,\n W3C_TRACEPARENT_HEADER,\n} from \"./propagation\";\nexport {\n extractAnthropicSegments,\n instrumentAnthropic,\n isAnthropicWrapped,\n uninstallAnthropic,\n wrapAnthropic,\n MAX_SEGMENT_CONTENT_BYTES,\n} from \"./anthropic\";\nexport type {\n AnthropicClientLike,\n AnthropicContentBlockParam,\n AnthropicMessageCreateParams,\n AnthropicMessageParam,\n AnthropicMessageResponse,\n AnthropicTextBlockParam,\n AnthropicToolParam,\n AnthropicToolResultBlockParam,\n AnthropicToolUseBlockParam,\n AnthropicUsage,\n InstrumentAnthropicOptions,\n} from \"./anthropic\";\nexport { log } from \"./log\";\nexport type { LogOptions, LogSeverity } from \"./log\";\n\nexport const version = SDK_VERSION;\n\n/* ------------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------------ */\n\n/** Options accepted by `init()`. Mirrors Python's `init(...)` kwargs. */\nexport interface InitOptions {\n /** API key (starts with \"mhq_\"). Required if no `MORSE_API_KEY` env var. */\n apiKey?: string;\n /** Full ingestion URL. Defaults to the production Railway endpoint. */\n endpoint?: string;\n /** Seconds between batch flushes. Default: 2. */\n flushIntervalSeconds?: number;\n /**\n * Client-side PII redaction. Default-on with the canonical eight-pattern\n * catalogue. Set `enabled: false` to opt out (the server-side mandatory\n * floor still applies). Mandatory patterns (`api_key_prefixed`, `jwt`,\n * `credit_card`, `ssn_us`) cannot be added to `disabledPatterns` —\n * `init()` throws on that.\n */\n redaction?: RedactionOptions;\n /**\n * INTERNAL USE ONLY — resource-level source label for Morse's own\n * dogfood emitters. Mirrors the Python SDK's `init(source=...)` kwarg\n * (PR #90). Accepted values: `\"copilot\" | \"investigator\" | \"refagent\"\n * | \"ui-bot\"`. Any other value (including misspellings) is silently\n * dropped — falls back to the `MORSE_INTERNAL_SOURCE` env var.\n * Customers should not set this.\n */\n source?: string;\n}\n\n/** Single agent-run payload accepted by `track()`. */\nexport interface TrackOptions {\n /** User-defined agent name (e.g., \"lead-qualifier\"). */\n agentId: string;\n /** Run-data dict. Shape mirrors backend Run model. */\n runData: Record<string, unknown>;\n}\n\n/** High-level outcome shape accepted by `record()` (V1 ergonomic API). */\nexport interface RunRecord {\n agent: string;\n success?: boolean;\n outcome?: string;\n cost?: number;\n model?: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n durationMs?: number;\n errorMessage?: string;\n metadata?: Record<string, unknown>;\n status?: \"completed\" | \"failed\" | \"timed_out\";\n}\n\n/* ------------------------------------------------------------------------ */\n/* Module-level singleton state */\n/* ------------------------------------------------------------------------ */\n\ninterface SingletonState {\n apiKey: string;\n endpoint: string;\n transport: BatchTransport;\n redaction: RedactionConfig;\n}\n\nlet singleton: SingletonState | null = null;\nlet transportFactory: (opts: {\n apiKey: string;\n endpoint: string;\n flushIntervalSeconds: number;\n}) => BatchTransport = (opts) => new BatchTransport(opts);\n\nlet noApiKeyWarningEmitted = false;\nlet lastLoggedEndpoint: string | null = null;\n\nfunction logger(level: \"info\" | \"warn\", message: string): void {\n const out = level === \"warn\" ? console.warn : console.info;\n out.call(console, message);\n}\n\nfunction logDestinationOnce(endpoint: string): void {\n if (endpoint === lastLoggedEndpoint) return;\n lastLoggedEndpoint = endpoint;\n logger(\n \"info\",\n `morse: Morse SDK initialized — sending to ${endpoint} (sdk version ${SDK_VERSION})`,\n );\n}\n\nfunction resolveEndpoint(explicit?: string): string {\n if (explicit && explicit.length > 0) return explicit;\n const fromEnv = readEndpointFromEnv();\n if (fromEnv) return fromEnv;\n return DEFAULT_ENDPOINT;\n}\n\nconst OTLP_TRACES_PATH = \"/api/v1/otlp/v1/traces\";\n\n/**\n * Derive the OTLP ingest URL from the legacy JSON traces batch URL. Keeps\n * host/scheme; replaces the path — mirrors the Python SDK's\n * `client.py::_derive_otlp_endpoint` and this file's own\n * `transport.ts::deriveLogsEndpoint`.\n */\nfunction deriveOtlpEndpoint(tracesEndpoint: string): string {\n try {\n const u = new URL(tracesEndpoint);\n u.pathname = OTLP_TRACES_PATH;\n u.search = \"\";\n u.hash = \"\";\n return u.toString();\n } catch {\n return tracesEndpoint.replace(/\\/api\\/v1\\/.*$/, OTLP_TRACES_PATH);\n }\n}\n\nfunction buildSingleton(opts: InitOptions, redaction: RedactionConfig): SingletonState | null {\n if (readIsDisabled()) {\n return null;\n }\n const apiKey = opts.apiKey ?? readApiKeyFromEnv();\n if (!apiKey) {\n if (!noApiKeyWarningEmitted) {\n logger(\n \"warn\",\n \"morse: not initialized — set MORSE_API_KEY or call morse.init({ apiKey }) (this warning prints once per process; SDK calls are silent no-ops)\",\n );\n noApiKeyWarningEmitted = true;\n }\n return null;\n }\n const endpoint = resolveEndpoint(opts.endpoint);\n const flushIntervalSeconds = opts.flushIntervalSeconds ?? getFlushIntervalSeconds();\n const transport = transportFactory({ apiKey, endpoint, flushIntervalSeconds });\n setTransport(transport);\n setRedactionConfig(redaction);\n // MHQ-927: diagnostics resolves its own target and cannot see this config\n // otherwise — env-only resolution silently dropped every diagnostic for\n // consumers who call init({ apiKey, endpoint }) without env vars.\n setDiagnosticsClientConfig({ apiKey, endpoint });\n // Resolve the internal source label: explicit kwarg wins, then env.\n // Invalid values are silently dropped so a typo never tags customer\n // data as dogfood.\n const explicitSource = isValidInternalSource(opts.source) ? opts.source! : undefined;\n const resolvedSource = explicitSource ?? readInternalSourceFromEnv() ?? null;\n _setSource(resolvedSource);\n logDestinationOnce(endpoint);\n\n // MHQ-482: run()/span()/runTraced()'s real emission pipeline — real OTel\n // spans over OTLP protobuf+gzip. Configured unconditionally (even under\n // MORSE_LEGACY_TRANSPORT=1) so the engine is ready if the flag flips at\n // runtime; the flag only affects which pipeline `tracing.ts::sendTrace()`\n // feeds. Mirrors the Python SDK's `_Client.__init__`.\n try {\n getOtelEngine().configure({\n endpoint: deriveOtlpEndpoint(endpoint),\n apiKey,\n sampleRate: getSampleRate(),\n scheduleDelayMillis: flushIntervalSeconds * 1000,\n maxQueueSize: getMaxQueueSize(),\n maxExportBatchSize: getMaxBatchSize(),\n maxFieldBytes: getMaxFieldBytes(),\n // 10s (not the exporter's un-overridden 30s ceiling): a genuine\n // network blip still gets several retries with backoff; a fully dead\n // endpoint fails within a bounded, shutdown-friendly window instead\n // of the library's full 30s ceiling. Mirrors the Python SDK.\n timeoutMillis: 10_000,\n redactionConfig: redaction,\n });\n } catch (err) {\n report(err, { fingerprint: \"morse.otel_provider.configure\" });\n }\n\n // MHQ-482: zero-config adapter auto-detect (mirrors Python's\n // `auto_detect.install_adapters()` call in `_ensure_initialized` /\n // `_init_impl`). Fire-and-forget — telemetry setup must never block or\n // throw back into the customer's init() / first SDK call. Runs AFTER the\n // OTel engine above is configured so any span an auto-installed adapter\n // emits immediately has a working pipeline to flow through.\n void _installAdapters().catch(() => {\n // installAdapters() already absorbs adapter-level failures; this is a\n // defensive backstop so a totally unexpected rejection never surfaces.\n });\n\n // MHQ-482: DB auto-capture (opt-in — MORSE_CAPTURE_DB / MORSE_CAPTURE_INFRA,\n // mirrors the Python SDK's `infra_capture.py::maybe_enable_from_env`).\n // MUST run after `getOtelEngine().configure()` above — instrumentation\n // registration needs the `NodeTracerProvider` that call just built.\n try {\n maybeEnableDbCaptureFromEnv();\n } catch (err) {\n report(err, { fingerprint: \"morse.db_capture.register\" });\n }\n\n return { apiKey, endpoint, transport, redaction };\n}\n\nfunction ensureInitialized(): SingletonState | null {\n if (readIsDisabled()) return null;\n if (singleton !== null) return singleton;\n // Lazy default-init: defaults are safe (default-on redaction).\n singleton = buildSingleton({}, buildRedactionConfig());\n return singleton;\n}\n\n// Wire the lazy-init hook into log.ts so `log()` participates in the\n// same env-driven auto-init flow as `track()` / `record()`. Discards\n// the return value — log.ts only needs the side-effect of populating\n// the module-level singleton + transport.\n_setLogEnsureInitialized(() => {\n ensureInitialized();\n});\n\n/* ------------------------------------------------------------------------ */\n/* Public API — wrapped at the module surface */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Initialize the Morse SDK singleton. Call once at application\n * startup. After this call, `track()`, `batchTrack()`, `run()`, and\n * `flush()` are wired up to the configured endpoint.\n *\n * `endpoint` is optional — when omitted, the SDK resolves in this order:\n * 1. `MORSE_ENDPOINT` env var (if set)\n * 2. The default Railway production URL.\n *\n * `MORSE_DISABLED=1` overrides everything: `init()` is a no-op.\n *\n * Calling `init()` a second time replaces the singleton — the previous\n * transport is shut down cleanly and a new one is constructed.\n *\n * Validation errors (e.g., disabling a mandatory redaction pattern, an\n * uncompilable extra pattern) are deliberately NOT absorbed — they\n * propagate as `Error`s so the developer sees the misconfiguration at\n * application startup. All other errors raised from internal SDK paths\n * are absorbed via the per-call wrappers downstream.\n */\nexport function init(options: InitOptions = {}): void {\n if (readIsDisabled()) {\n logger(\"info\", \"morse: MORSE_DISABLED=1 — SDK is a no-op\");\n return;\n }\n // Validate redaction options FIRST — must throw before we mutate any\n // singleton state, so a misconfigured init leaves the previous client\n // intact and the spec scenario \"no Client is constructed\" holds.\n const redaction = buildRedactionConfig(options.redaction);\n\n try {\n if (singleton !== null) {\n void singleton.transport.shutdown();\n singleton = null;\n }\n singleton = buildSingleton(options, redaction);\n } catch (err) {\n report(err, { fingerprint: \"morse.init\" });\n }\n}\n\n/**\n * Submit a single agent run to the ingestion endpoint. Non-blocking;\n * returns immediately. Silently no-ops if the SDK isn't initialised.\n */\nexport const track = absorbErrorsSync(\n (options: TrackOptions): void => {\n const state = ensureInitialized();\n if (!state) return;\n const payload = {\n agent_id: options.agentId,\n ...options.runData,\n };\n const redacted = redactValue(payload, state.redaction) as TelemetryEvent;\n state.transport.track(redacted);\n },\n { fingerprint: \"morse.track\" },\n);\n\n/** Submit multiple agent runs in bulk. Silently no-ops if uninitialised. */\nexport const batchTrack = absorbErrorsSync(\n (runs: Array<Record<string, unknown>>): void => {\n const state = ensureInitialized();\n if (!state) return;\n for (const run of runs) {\n const redacted = redactValue(run, state.redaction) as TelemetryEvent;\n state.transport.track(redacted);\n }\n },\n { fingerprint: \"morse.batch_track\" },\n);\n\n/**\n * High-level convenience: record an agent outcome with named fields.\n *\n * Builds a synthetic single-span `agent`-type trace and submits it through\n * the same `traces`-shaped emission path `run()`/`span()` use (MHQ-746) —\n * mirrors Python's `client.py::record()`. The live dev-api backend has no\n * `runs` ingest route; sending through `state.transport.track()` (the\n * shape `track()`/`batchTrack()` still use, matching Python's equally\n * unmigrated `track()`/`batch_track()`) 422s silently. See MHQ-746.\n */\nexport const record = absorbErrorsSync(\n (rec: RunRecord): void => {\n const state = ensureInitialized();\n if (!state) return;\n\n const traceId = generateTraceId();\n const now = nowIso();\n const resolvedStatus = rec.errorMessage ? \"failed\" : (rec.status ?? \"completed\");\n\n const span: SpanData = {\n trace_id: traceId,\n span_id: generateSpanId(),\n type: SpanType.AGENT,\n name: rec.agent,\n started_at: now,\n ended_at: now,\n status: resolvedStatus,\n duration_ms: rec.durationMs,\n model: rec.model,\n input_tokens: rec.inputTokens,\n output_tokens: rec.outputTokens,\n total_tokens: rec.totalTokens,\n cost_usd: rec.cost,\n error_message: rec.errorMessage,\n metadata: rec.metadata,\n };\n\n const traceFields: TraceFields = {\n trace_id: traceId,\n agent: rec.agent,\n status: resolvedStatus,\n started_at: now,\n ended_at: now,\n duration_ms: rec.durationMs,\n error_message: rec.errorMessage,\n success: rec.success,\n outcome: rec.outcome,\n };\n\n const entry = buildTraceEntry(traceFields, [span]);\n const redacted = redactValue(entry, state.redaction) as {\n trace: Record<string, unknown>;\n spans: Record<string, unknown>[];\n };\n _sendTrace(redacted);\n },\n { fingerprint: \"morse.record\" },\n);\n\n/**\n * Open a traced agent run, executing `fn` inside the trace context.\n * Mirrors Python's `morse.run(...)` context manager.\n *\n * Two overloads are supported:\n * - `run(name, fn)` — quick form with default options.\n * - `run({ agentName, incomingTraceparent }, fn)` — full options.\n *\n * Async callers receive a Promise; sync callers receive the value\n * directly. The function's return value is forwarded to the caller.\n */\nexport function run<T>(name: string, fn: (handle: RunHandle) => T): T | undefined;\nexport function run<T>(options: RunOptions, fn: (handle: RunHandle) => T): T | undefined;\nexport function run<T>(\n nameOrOpts: string | RunOptions,\n fn: (handle: RunHandle) => T,\n): T | undefined {\n const opts = typeof nameOrOpts === \"string\" ? { agentName: nameOrOpts } : nameOrOpts;\n // Make sure the SDK is initialised so spans get sent. Failure to init\n // is fine — `_runSync` records to `lastTrace` regardless, useful for tests.\n ensureInitialized();\n // We can't reliably detect async vs sync up front in TypeScript, so we\n // route through `_runSync` and, if the user's `fn` returns a promise,\n // the wrapping trace ends synchronously after the promise is created.\n // For correct async lifecycle, callers should use `runTraced` instead\n // (it awaits the promise inside the `als.run` scope so the trace\n // closes when the promise resolves).\n return _runSync(opts, fn);\n}\n\n/** Async variant of `run` — exported for callers who want explicit typing. */\nexport function runTraced<T>(\n options: RunOptions,\n fn: (handle: RunHandle) => Promise<T>,\n): Promise<T | undefined> {\n ensureInitialized();\n return _runAsync(options, fn);\n}\n\n/**\n * Attach cost-attribution dimensions to the active trace (MHQ-751). Call\n * once per request (e.g. in middleware) to propagate `customerId`,\n * `feature`, `env`, `team`, etc. to all child spans downstream. Values are\n * coerced to strings. No-op outside an active trace — never throws.\n * Mirrors Python's `morse_ai.set_context(**dims)`.\n */\nexport function setContext(dims: Record<string, unknown>): void {\n _setContext(dims);\n}\n\n/** Start a child span under the active trace. Returns null if no trace. */\nexport function startSpan(options: SpanOptions): SpanHandle | null {\n return _startSpan(options);\n}\n\n/** Run `fn` inside a child span. No-op if no trace is active. */\nexport function span<T>(options: SpanOptions, fn: (handle: SpanHandle | null) => T): T {\n return _spanSync(options, fn);\n}\n\n/** Async variant of `span`. */\nexport function spanAsync<T>(\n options: SpanOptions,\n fn: (handle: SpanHandle | null) => Promise<T>,\n): Promise<T> {\n return _spanAsync(options, fn);\n}\n\n/** Block until all queued events have been sent. Silent on uninit / errors. */\nexport const flush = absorbErrorsAsync(\n async (): Promise<void> => {\n if (singleton !== null) {\n await singleton.transport.flush();\n await getOtelEngine().flush();\n }\n },\n { fingerprint: \"morse.flush\" },\n);\n\n/**\n * Latest ingest quota / rate-limit state observed by the SDK, or `null`.\n *\n * TQE-04 (MHQ-676/MHQ-749): when the Morse backend answers a telemetry\n * batch with HTTP 429 — the monthly event limit (`event_limit_exceeded`)\n * or the per-second ingest rate limit (`RATE_LIMIT_INGEST`) — the\n * transport parses the response and stores it. This function exposes\n * that state so host applications can alert on quota exhaustion instead\n * of discovering it from missing telemetry. Mirrors Python's\n * `morse_ai.quota_state()`.\n *\n * Returns `null` when the SDK is uninitialized or no 429 has been\n * observed. The object includes at least `kind` (`\"event_limit\"`,\n * `\"rate_limit\"`, or `\"unknown\"`), `status`, and `receivedAt` (epoch\n * seconds); event-limit states add `currentCount` / `limitCount` /\n * `planId` / `periodStart` / `upgradeUrl`.\n */\nexport const quotaState = absorbErrorsSync(\n (): QuotaState | null => {\n if (singleton === null) return null;\n return _getQuotaState();\n },\n { fingerprint: \"morse.quota_state\" },\n);\n\n/** Flush and stop the background transport. Call on app exit. */\nexport const shutdown = absorbErrorsAsync(\n async (): Promise<void> => {\n if (singleton !== null) {\n await singleton.transport.shutdown();\n await getOtelEngine().flush();\n getOtelEngine().shutdown();\n // MHQ-927: diagnostics has its OWN buffer and timer, deliberately\n // separate from the transport so a diagnostic storm can never evict\n // customer telemetry. The timer fires every 5s and is `unref()`d so it\n // cannot hold the event loop open — which means a short-lived process\n // (a script, a CLI, a serverless invocation, every driver in the\n // adapter matrix) exits with its buffer unsent. Nothing else drains it,\n // so those diagnostics were simply lost.\n //\n // Drained AFTER the transport and OTel shutdown above: those can\n // themselves report internal errors, and this is the last chance to\n // send them.\n await flushDiagnosticsOnce();\n singleton = null;\n setTransport(null);\n }\n },\n { fingerprint: \"morse.shutdown\" },\n);\n\n/* ------------------------------------------------------------------------ */\n/* Test-only hooks (private) */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Reset the module-level singleton for tests. Customer code must NOT\n * call this — the singleton is meant to live for the process lifetime.\n *\n * @internal\n */\nexport function _resetForTesting(): void {\n if (singleton !== null) {\n void singleton.transport.shutdown();\n singleton = null;\n setTransport(null);\n }\n getOtelEngine().resetForTesting();\n noApiKeyWarningEmitted = false;\n lastLoggedEndpoint = null;\n _setSource(null);\n _resetTracingForTesting();\n _resetDiagnosticsForTesting();\n _resetAutoDetectForTesting();\n _resetQuotaStateForTesting();\n // Reset the transport factory back to the default.\n transportFactory = (opts) => new BatchTransport(opts);\n}\n\n/**\n * Inject an alternate transport factory for tests (e.g., a mock that\n * captures sent payloads instead of opening a fetch).\n *\n * @internal\n */\nexport function _setTransportFactoryForTesting(\n factory: (opts: {\n apiKey: string;\n endpoint: string;\n flushIntervalSeconds: number;\n }) => BatchTransport,\n): void {\n transportFactory = factory;\n}\n\n/**\n * Read the most recently completed trace entry, for test assertions.\n *\n * @internal\n */\nexport function _getLastTraceForTesting(): { trace: unknown; spans: unknown[] } | null {\n return _getLastTrace();\n}\n\n/**\n * Read the active trace state, for test assertions.\n *\n * @internal\n */\nexport function _getActiveTraceStateForTesting(): unknown {\n return _getActiveTraceState();\n}\n","/**\n * Browser replacement for `db-capture.ts` (MHQ-482 follow-up).\n *\n * `db-capture.ts` statically imports `@opentelemetry/instrumentation-pg`,\n * `-mysql2` and `@opentelemetry/instrumentation` (which reaches for node's\n * `module` via require-in-the-middle). A browser has no pg/mysql2 driver to\n * patch, so the whole module is inert there — but the static imports still\n * dragged those packages, and node `module`, into the browser graph.\n *\n * Swapped in by the esbuild plugin in `tsup.config.ts`; see\n * `otel-provider.browser.ts` for the full rationale. Only the symbols\n * `index.ts` imports need to exist here.\n */\n\n/**\n * No-op: there is no database driver to instrument in a browser.\n *\n * Deliberately silent. `otel-provider.browser.ts::noteBrowserRuntime()`\n * already states that DB capture is Node-only, and it fires on\n * `configure()` — which `index.ts` always calls before this. A second\n * message would be noise, and this function runs even when the customer\n * never asked for DB capture.\n */\nexport function maybeEnableDbCaptureFromEnv(): void {}\n","/**\n * Background batched HTTP transport.\n *\n * Mirrors the Python SDK's `transport.py` semantics:\n *\n * - Async batching: 2-second flush interval (configurable), 100-event\n * max batch size (configurable). Whichever fires first triggers a\n * flush.\n * - Network failures are silently dropped with a debug log — never\n * thrown to the caller.\n * - The caller's thread / event loop is never blocked: `track()`\n * enqueues and returns immediately.\n *\n * The transport speaks two payload shapes (matching Python):\n *\n * - V2 trace events: `{ traces: [{ trace, spans }, ...] }`\n * - V1 legacy runs: `{ runs: [{ ... }, ...] }`\n *\n * Wire-format routing checks for a `traces` key on each enqueued event.\n *\n * Browser vs Node:\n * - Both runtimes ship `fetch` (Node 18+ / all evergreens).\n * - In Node we can run a `setInterval` and call it a day.\n * - In the browser the same approach works; we don't currently flush\n * on `pagehide` / `beforeunload` — Phase 6c spec doesn't require it.\n * A future change can add `navigator.sendBeacon` for last-gasp delivery.\n */\n\nimport {\n recordDrop,\n report,\n setLevel,\n REASON_QUEUE_FULL,\n REASON_QUOTA_REJECTED,\n REASON_RETRY_EXHAUSTED,\n REASON_SHUTDOWN_DROP,\n} from \"./diagnostics\";\n\n// Injected at build time by tsup from package.json — see tsup.config.ts.\n// The version is declared in exactly one place (package.json); a copy here\n// would drift the moment a release bumped one and not the other, and the\n// stale value rides out on the User-Agent and on every span's `sdk_version`.\n// `__SDK_VERSION__` is undefined when running straight from source (vitest,\n// ts-node), hence the fallback.\ndeclare const __SDK_VERSION__: string | undefined;\n\nexport const SDK_VERSION = typeof __SDK_VERSION__ === \"string\" ? __SDK_VERSION__ : \"0.0.0-dev\";\n\nexport interface BatchTransportOptions {\n endpoint: string;\n apiKey: string;\n /** Max wait between flushes, in seconds. Default: 2.0. */\n flushIntervalSeconds?: number;\n /** Max events per batch. Default: 100. */\n maxBatchSize?: number;\n /** Max queued events before drop. Default: 10_000. */\n maxQueueSize?: number;\n /** Timeout for the underlying fetch, in ms. Default: 5_000. */\n fetchTimeoutMs?: number;\n /**\n * Pluggable fetch implementation. Defaults to `globalThis.fetch`.\n * Useful for tests.\n */\n fetchImpl?: typeof fetch;\n}\n\n/**\n * Wire shape for a single log record. Mirrors the Python SDK payload at\n * `apps/sdk/python/src/morse/client.py:191-211` and the backend\n * `SimpleLogsIngestController.ingest` contract\n * (`apps/api/apps/logs/controllers.py:66-134`).\n */\nexport interface LogRecordPayload {\n timestamp: string;\n severity: string;\n service_name: string;\n body: string;\n attributes: Record<string, unknown>;\n trace_id: string | null;\n span_id: string | null;\n}\n\nexport type TelemetryEvent =\n | { traces: unknown[] }\n | { logs: LogRecordPayload[] }\n | Record<string, unknown>;\n\n/**\n * Quota / rate-limit state parsed from a 429 batch-POST response.\n *\n * Mirrors Python's `transport.py::BatchTransport._record_quota_state` /\n * `quota_state()` (TQE-04 / MHQ-676) field-for-field, camelCased per this\n * codebase's convention (`received_at` -> `receivedAt`, etc.). Two known\n * body shapes:\n *\n * - `event_limit_exceeded` (traces controllers) — flat body with\n * `current_count` / `limit_count` / `plan_id` / `period_start` /\n * `upgrade_url` / `sample_rate_url`.\n * - `RATE_LIMIT_INGEST` (ingest rate-limit middleware) — nested\n * `{ error: { code, message, details: { limit, plan } } }`.\n *\n * Anything else is recorded as `kind: \"unknown\"` so the state surface\n * still reflects that ingest is throttled even when the body doesn't\n * parse into a known shape.\n */\nexport interface QuotaState {\n kind: \"event_limit\" | \"rate_limit\" | \"unknown\";\n status: number;\n /** Epoch seconds, matching Python's `time.time()`. */\n receivedAt: number;\n message?: string;\n currentCount?: number;\n limitCount?: number;\n planId?: string;\n periodStart?: string;\n upgradeUrl?: string;\n sampleRateUrl?: string;\n quotaLimit?: number;\n quotaRemaining?: number;\n quotaReset?: number;\n retryAfterSeconds?: number;\n}\n\n// `Retry-After` values above this are clamped, mirroring Python's\n// `_RETRY_AFTER_CAP_SECONDS` — a background flush loop must never commit\n// to reporting minutes-long waits from one batch.\nconst RETRY_AFTER_CAP_SECONDS = 30.0;\n\n/**\n * Parse a `Retry-After` header (seconds form only), capped.\n *\n * Mirrors Python's `transport.py::_parse_retry_after`. HTTP-date form\n * isn't worth supporting — Morse's own 429s always use the seconds form.\n * Unparseable / negative values return `null`.\n */\nfunction parseRetryAfter(value: string | null): number | null {\n if (!value) return null;\n const seconds = Number(value);\n if (!Number.isFinite(seconds) || seconds < 0) return null;\n return Math.min(seconds, RETRY_AFTER_CAP_SECONDS);\n}\n\n// Module-level, matching the `lastTrace` test-introspection pattern in\n// `_internal/tracing.ts` — the latest quota/rate-limit state observed on\n// a 429 response, exposed via `quotaState()` / `morse.quotaState()`. Not\n// cleared on a subsequent successful POST (mirrors Python: it persists\n// until overwritten by a newer 429, so a host app can see \"quota was\n// exceeded recently\" even after the queue drains — see\n// `test_429_recovers_when_retry_succeeds` in the Python test suite,\n// which only asserts no drop-warning, never that state was cleared).\nlet quotaState: QuotaState | null = null;\n\n/**\n * Latest quota/rate-limit state observed on a 429, or `null` if none has\n * been observed yet. Returns a shallow copy — callers can't mutate\n * transport-internal state. Mirrors Python's `BatchTransport.quota_state()`.\n *\n * @internal\n */\nexport function getQuotaState(): QuotaState | null {\n return quotaState ? { ...quotaState } : null;\n}\n\n/**\n * Reset the module-level quota state between test files/cases.\n *\n * @internal\n */\nexport function _resetQuotaStateForTesting(): void {\n quotaState = null;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction numberFromHeader(raw: string | null): number | undefined {\n if (raw === null) return undefined;\n const n = Number(raw);\n return Number.isFinite(n) ? n : undefined;\n}\n\n/**\n * Parse a 429 response into the module-level quota state. Never throws —\n * defensively parses two known body shapes (see `QuotaState`), falling\n * back to `kind: \"unknown\"` for anything else. Mirrors Python's\n * `_record_quota_state`.\n */\nasync function recordQuotaState(resp: Response): Promise<void> {\n try {\n const state: QuotaState = {\n kind: \"unknown\",\n status: 429,\n receivedAt: Date.now() / 1000,\n };\n\n let data: unknown = null;\n try {\n data = await resp.clone().json();\n } catch {\n data = null;\n }\n\n if (data !== null && typeof data === \"object\") {\n const body = data as Record<string, unknown>;\n const err = body.error;\n if (err === \"event_limit_exceeded\") {\n state.kind = \"event_limit\";\n state.message = asString(body.message);\n state.currentCount = asNumber(body.current_count);\n state.limitCount = asNumber(body.limit_count);\n state.planId = asString(body.plan_id);\n state.periodStart = asString(body.period_start);\n state.upgradeUrl = asString(body.upgrade_url);\n state.sampleRateUrl = asString(body.sample_rate_url);\n } else if (\n err !== null &&\n typeof err === \"object\" &&\n (err as Record<string, unknown>).code === \"RATE_LIMIT_INGEST\"\n ) {\n const errObj = err as Record<string, unknown>;\n const details =\n errObj.details !== null && typeof errObj.details === \"object\"\n ? (errObj.details as Record<string, unknown>)\n : {};\n state.kind = \"rate_limit\";\n state.message = asString(errObj.message);\n state.limitCount = asNumber(details.limit);\n state.planId = asString(details.plan);\n }\n }\n\n // TQE-05 headers, emitted by the server on every ingest response.\n const quotaLimit = numberFromHeader(resp.headers.get(\"X-Morse-Quota-Limit\"));\n if (quotaLimit !== undefined) state.quotaLimit = quotaLimit;\n const quotaRemaining = numberFromHeader(resp.headers.get(\"X-Morse-Quota-Remaining\"));\n if (quotaRemaining !== undefined) state.quotaRemaining = quotaRemaining;\n const quotaReset = numberFromHeader(resp.headers.get(\"X-Morse-Quota-Reset\"));\n if (quotaReset !== undefined) state.quotaReset = quotaReset;\n const retryAfter = parseRetryAfter(resp.headers.get(\"Retry-After\"));\n if (retryAfter !== null) state.retryAfterSeconds = retryAfter;\n\n quotaState = state;\n } catch {\n // Never let state capture break the send path.\n }\n}\n\nexport class BatchTransport {\n private readonly endpoint: string;\n private readonly apiKey: string;\n private readonly flushIntervalSeconds: number;\n private readonly maxBatchSize: number;\n private readonly maxQueueSize: number;\n private readonly fetchTimeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n\n private queue: TelemetryEvent[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushing = false;\n private closed = false;\n private inflight: Promise<void> | null = null;\n\n constructor(opts: BatchTransportOptions) {\n this.endpoint = opts.endpoint;\n this.apiKey = opts.apiKey;\n this.flushIntervalSeconds = opts.flushIntervalSeconds ?? 2.0;\n this.maxBatchSize = opts.maxBatchSize ?? 100;\n this.maxQueueSize = opts.maxQueueSize ?? 10_000;\n this.fetchTimeoutMs = opts.fetchTimeoutMs ?? 5_000;\n this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);\n\n // setInterval keeps the Node event loop alive. We mark it `unref`\n // when available so a process-exit isn't blocked by a quiet flusher.\n const intervalMs = Math.max(50, Math.round(this.flushIntervalSeconds * 1000));\n this.timer = setInterval(() => {\n void this.tick();\n }, intervalMs);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const t = this.timer as any;\n if (typeof t?.unref === \"function\") {\n t.unref();\n }\n }\n\n /** Enqueue an event. Non-blocking. Returns false if the queue is full. */\n track(event: TelemetryEvent): boolean {\n if (this.closed) {\n recordDrop(REASON_SHUTDOWN_DROP, \"trace\");\n return false;\n }\n if (this.queue.length >= this.maxQueueSize) {\n // SDKDIAG-09: previously a bare `return false` — sustained telemetry loss\n // was invisible to both us and the customer. Now counted and logged.\n recordDrop(REASON_QUEUE_FULL, \"trace\");\n return false;\n }\n this.queue.push(event);\n if (this.queue.length >= this.maxBatchSize) {\n void this.tick();\n }\n return true;\n }\n\n /** Block until all currently-queued events have been sent. */\n async flush(): Promise<void> {\n // Drain in one-batch chunks until empty, then await the in-flight send.\n while (this.queue.length > 0) {\n await this.tick();\n }\n if (this.inflight) {\n try {\n await this.inflight;\n } catch {\n // Swallow — caller observes nothing.\n }\n }\n }\n\n /** Stop the background timer. After this call, `track()` is a no-op. */\n async shutdown(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n if (this.timer !== null) {\n clearInterval(this.timer);\n this.timer = null;\n }\n await this.flush();\n }\n\n private async tick(): Promise<void> {\n if (this.flushing) return;\n if (this.queue.length === 0) return;\n this.flushing = true;\n try {\n const batch = this.queue.splice(0, this.maxBatchSize);\n this.inflight = this.sendBatch(batch);\n await this.inflight;\n this.inflight = null;\n } finally {\n this.flushing = false;\n }\n }\n\n private async sendBatch(batch: TelemetryEvent[]): Promise<void> {\n const traceEntries: unknown[] = [];\n const runEntries: Record<string, unknown>[] = [];\n const logEntries: LogRecordPayload[] = [];\n for (const event of batch) {\n if (typeof event === \"object\" && event !== null && \"traces\" in event) {\n const e = event as { traces: unknown[] };\n if (Array.isArray(e.traces)) {\n traceEntries.push(...e.traces);\n }\n } else if (typeof event === \"object\" && event !== null && \"logs\" in event) {\n const e = event as { logs: LogRecordPayload[] };\n if (Array.isArray(e.logs)) {\n logEntries.push(...e.logs);\n }\n } else {\n runEntries.push(event as Record<string, unknown>);\n }\n }\n if (traceEntries.length > 0) {\n await this.post(this.endpoint, { traces: traceEntries });\n }\n if (runEntries.length > 0) {\n await this.post(this.endpoint, { runs: runEntries });\n }\n if (logEntries.length > 0) {\n // Phase 12.5 Tier 1.2 — logs go to a derived `/api/v1/logs/ingest`\n // endpoint on the same host as the traces batch URL. Mirrors the\n // Python SDK's URL derivation in\n // `apps/sdk/python/src/morse/client.py:187-190`.\n await this.post(deriveLogsEndpoint(this.endpoint), { logs: logEntries });\n }\n }\n\n private async post(url: string, payload: Record<string, unknown>): Promise<void> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.fetchTimeoutMs);\n try {\n const resp = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": `morse-typescript/${SDK_VERSION}`,\n },\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n // SDKDIAG-05: the server pushes the SDK's self-reporting verbosity on a\n // response we are already receiving — no config round-trip.\n setLevel(resp.headers.get(\"X-Morse-Diagnostics\"));\n\n const droppedCount = countPayloadEntries(payload);\n const droppedCategory = categoryOf(payload);\n\n if (resp.status === 429) {\n // TQE-04 (MHQ-676) parity: surface quota/rate-limit state instead\n // of silently dropping telemetry. `resp.clone()` inside so the\n // body-snippet read below still works off the original response.\n await recordQuotaState(resp);\n recordDrop(REASON_QUOTA_REJECTED, droppedCategory, droppedCount);\n }\n if (!resp.ok) {\n // Drain a few hundred chars of the body for diagnostics.\n let bodySnippet = \"\";\n try {\n const text = await resp.text();\n bodySnippet = text.slice(0, 200);\n } catch {\n // ignore\n }\n if (resp.status !== 429) {\n recordDrop(REASON_RETRY_EXHAUSTED, droppedCategory, droppedCount);\n }\n report(new Error(`morse: batch POST returned ${resp.status} ${bodySnippet}`), {\n fingerprint: \"morse.transport.post.non_2xx\",\n extra: {\n endpoint_host: hostnameOf(url),\n sdk_version: SDK_VERSION,\n },\n });\n }\n } catch (err) {\n // Network errors / aborts / timeouts — silent drop, out-of-band report.\n recordDrop(REASON_RETRY_EXHAUSTED, categoryOf(payload), countPayloadEntries(payload));\n report(err, {\n fingerprint: \"morse.transport.post.network\",\n extra: {\n endpoint_host: hostnameOf(url),\n sdk_version: SDK_VERSION,\n },\n });\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n\nfunction hostnameOf(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return \"<invalid>\";\n }\n}\n\n/**\n * Derive the logs ingest URL from the traces batch endpoint. Mirrors the\n * Python SDK helper: replace the path with `/api/v1/logs/ingest` and drop\n * any query/fragment.\n *\n * Exported for tests. Customer code should not call this directly.\n *\n * @internal\n */\nexport function deriveLogsEndpoint(tracesEndpoint: string): string {\n try {\n const u = new URL(tracesEndpoint);\n u.pathname = \"/api/v1/logs/ingest\";\n u.search = \"\";\n u.hash = \"\";\n return u.toString();\n } catch {\n // Fall back to a string replace on the most common shape.\n return tracesEndpoint.replace(/\\/api\\/v1\\/.*$/, \"/api/v1/logs/ingest\");\n }\n}\n\n/** How many telemetry entries a failed POST just cost the customer. */\nfunction countPayloadEntries(payload: Record<string, unknown>): number {\n let total = 0;\n for (const value of Object.values(payload)) {\n if (Array.isArray(value)) total += value.length;\n }\n return total || 1;\n}\n\n/** Which counter category a payload belongs to (SDKDIAG-09). */\nfunction categoryOf(payload: Record<string, unknown>): string {\n if (\"traces\" in payload) return \"trace\";\n if (\"logs\" in payload) return \"log\";\n return \"record\";\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/_internal/auto-detect.browser.ts","../../src/index.ts","../../src/_internal/db-capture.browser.ts","../../src/_internal/transport.ts"],"names":["run","span","setContext","startSpan","spanAsync","quotaState","_resetForTesting"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Browser replacement for `auto-detect.ts` (MHQ-482 follow-up).\n *\n * `auto-detect.ts` already no-ops at RUNTIME outside Node — its own\n * docstring says so — but it reaches for `node:module`'s `createRequire` /\n * `Module` in a static top-level import, so a bundler still had to resolve\n * `module` for the browser graph. The runtime guard was never the problem;\n * the import was.\n *\n * Nothing here is a behaviour change: zero-config adapter auto-detect works\n * by hooking `require()` to patch LLM SDKs as they load, and a browser has\n * no `require` to hook. See `otel-provider.browser.ts` for the full\n * rationale and the build wiring.\n */\n\n/** No-op: there is no `require` to hook in a browser. */\nexport async function installAdapters(): Promise<void> {}\n\n/** No state to reset in the browser build. */\nexport function _resetForTesting(): void {}\n","/**\n * `@morsehq-dev/sdk` — TypeScript SDK for Morse observability.\n *\n * V2 module-level singleton API:\n *\n * ```ts\n * import * as morse from \"@morsehq-dev/sdk\";\n *\n * // Three-step zero-setup integration:\n * // 1. Generate an API key in the Morse dashboard.\n * // 2. npm install @morsehq-dev/sdk\n * // 3. Set MORSE_API_KEY in your environment.\n *\n * morse.track({ agentId: \"lead-qualifier\", runData: { success: true } });\n *\n * // Or call init() explicitly to override env-var resolution:\n * morse.init({\n * apiKey: \"mhq_xxx\", // pragma: allowlist secret — placeholder, not a key\n * endpoint: \"https://api.morsehq.dev/api/v1/traces/batch\",\n * flushIntervalSeconds: 2,\n * });\n * ```\n *\n * Non-invasive guarantee: every public function is wrapped with\n * `absorbErrors`. Telemetry never throws back at the caller; internal\n * errors are reported out-of-band to Morse's own diagnostics endpoint.\n *\n * The internal `BatchTransport` and `TraceState` types back the singleton\n * but are NOT part of the public API. Customers should never reach into\n * the `_internal` directory.\n */\n\nimport {\n installAdapters as _installAdapters,\n _resetForTesting as _resetAutoDetectForTesting,\n} from \"./_internal/auto-detect\";\nimport { absorbErrorsAsync, absorbErrorsSync } from \"./_internal/errors\";\nimport {\n DEFAULT_ENDPOINT,\n getApiKey as readApiKeyFromEnv,\n getEndpoint as readEndpointFromEnv,\n getFlushIntervalSeconds,\n getInternalSource as readInternalSourceFromEnv,\n getMaxBatchSize,\n getMaxFieldBytes,\n getMaxQueueSize,\n getSampleRate,\n isDisabled as readIsDisabled,\n isValidInternalSource,\n} from \"./_internal/env\";\nimport { maybeEnableDbCaptureFromEnv } from \"./_internal/db-capture\";\nimport { getEngine as getOtelEngine } from \"./_internal/otel-provider\";\nimport {\n buildRedactionConfig,\n type RedactionConfig,\n type RedactionOptions,\n redactValue,\n} from \"./_internal/redaction\";\nimport {\n BatchTransport,\n SDK_VERSION,\n type TelemetryEvent,\n getQuotaState as _getQuotaState,\n _resetQuotaStateForTesting,\n type QuotaState,\n} from \"./_internal/transport\";\nimport {\n getActiveTraceState as _getActiveTraceState,\n getLastTrace as _getLastTrace,\n runAsync as _runAsync,\n runSync as _runSync,\n sendTrace as _sendTrace,\n setContext as _setContext,\n setRedactionConfig,\n setSource as _setSource,\n setTransport,\n startSpan as _startSpan,\n type RunHandle,\n type RunOptions,\n type SpanHandle,\n type SpanOptions,\n spanAsync as _spanAsync,\n spanSync as _spanSync,\n _resetForTesting as _resetTracingForTesting,\n} from \"./_internal/tracing\";\nimport {\n report,\n setDiagnosticsClientConfig,\n flushOnce as flushDiagnosticsOnce,\n _resetForTesting as _resetDiagnosticsForTesting,\n} from \"./_internal/diagnostics\";\nimport { _setEnsureInitialized as _setLogEnsureInitialized } from \"./log\";\nimport {\n buildTraceEntry,\n generateSpanId,\n generateTraceId,\n nowIso,\n SpanType,\n type SpanData,\n type TraceFields,\n} from \"./_internal/spans\";\n\nexport type { SpanData, SpanType, SpanStatus, ContextSegment } from \"./_internal/spans\";\nexport type { RunHandle, RunOptions, SpanHandle, SpanOptions };\nexport type { QuotaState };\nexport type { RedactionOptions, RedactionConfig } from \"./_internal/redaction\";\nexport {\n extractTraceparent,\n formatTraceparent,\n injectTraceparent,\n injectIntoRequestInit,\n W3C_TRACEPARENT_HEADER,\n} from \"./propagation\";\nexport {\n extractAnthropicSegments,\n instrumentAnthropic,\n isAnthropicWrapped,\n uninstallAnthropic,\n wrapAnthropic,\n MAX_SEGMENT_CONTENT_BYTES,\n} from \"./anthropic\";\nexport type {\n AnthropicClientLike,\n AnthropicContentBlockParam,\n AnthropicMessageCreateParams,\n AnthropicMessageParam,\n AnthropicMessageResponse,\n AnthropicTextBlockParam,\n AnthropicToolParam,\n AnthropicToolResultBlockParam,\n AnthropicToolUseBlockParam,\n AnthropicUsage,\n InstrumentAnthropicOptions,\n} from \"./anthropic\";\nexport { log } from \"./log\";\nexport type { LogOptions, LogSeverity } from \"./log\";\n\nexport const version = SDK_VERSION;\n\n/* ------------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------------ */\n\n/** Options accepted by `init()`. Mirrors Python's `init(...)` kwargs. */\nexport interface InitOptions {\n /** API key (starts with \"mhq_\"). Required if no `MORSE_API_KEY` env var. */\n apiKey?: string;\n /** Full ingestion URL. Defaults to the production Railway endpoint. */\n endpoint?: string;\n /** Seconds between batch flushes. Default: 2. */\n flushIntervalSeconds?: number;\n /**\n * Client-side PII redaction. Default-on with the canonical eight-pattern\n * catalogue. Set `enabled: false` to opt out (the server-side mandatory\n * floor still applies). Mandatory patterns (`api_key_prefixed`, `jwt`,\n * `credit_card`, `ssn_us`) cannot be added to `disabledPatterns` —\n * `init()` throws on that.\n */\n redaction?: RedactionOptions;\n /**\n * INTERNAL USE ONLY — resource-level source label for Morse's own\n * dogfood emitters. Mirrors the Python SDK's `init(source=...)` kwarg\n * (PR #90). Accepted values: `\"copilot\" | \"investigator\" | \"refagent\"\n * | \"ui-bot\"`. Any other value (including misspellings) is silently\n * dropped — falls back to the `MORSE_INTERNAL_SOURCE` env var.\n * Customers should not set this.\n */\n source?: string;\n}\n\n/** Single agent-run payload accepted by `track()`. */\nexport interface TrackOptions {\n /** User-defined agent name (e.g., \"lead-qualifier\"). */\n agentId: string;\n /** Run-data dict. Shape mirrors backend Run model. */\n runData: Record<string, unknown>;\n}\n\n/** High-level outcome shape accepted by `record()` (V1 ergonomic API). */\nexport interface RunRecord {\n agent: string;\n success?: boolean;\n outcome?: string;\n cost?: number;\n model?: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n durationMs?: number;\n errorMessage?: string;\n metadata?: Record<string, unknown>;\n status?: \"completed\" | \"failed\" | \"timed_out\";\n}\n\n/* ------------------------------------------------------------------------ */\n/* Module-level singleton state */\n/* ------------------------------------------------------------------------ */\n\ninterface SingletonState {\n apiKey: string;\n endpoint: string;\n transport: BatchTransport;\n redaction: RedactionConfig;\n}\n\nlet singleton: SingletonState | null = null;\nlet transportFactory: (opts: {\n apiKey: string;\n endpoint: string;\n flushIntervalSeconds: number;\n}) => BatchTransport = (opts) => new BatchTransport(opts);\n\nlet noApiKeyWarningEmitted = false;\nlet lastLoggedEndpoint: string | null = null;\n\nfunction logger(level: \"info\" | \"warn\", message: string): void {\n const out = level === \"warn\" ? console.warn : console.info;\n out.call(console, message);\n}\n\nfunction logDestinationOnce(endpoint: string): void {\n if (endpoint === lastLoggedEndpoint) return;\n lastLoggedEndpoint = endpoint;\n logger(\n \"info\",\n `morse: Morse SDK initialized — sending to ${endpoint} (sdk version ${SDK_VERSION})`,\n );\n}\n\nfunction resolveEndpoint(explicit?: string): string {\n if (explicit && explicit.length > 0) return explicit;\n const fromEnv = readEndpointFromEnv();\n if (fromEnv) return fromEnv;\n return DEFAULT_ENDPOINT;\n}\n\nconst OTLP_TRACES_PATH = \"/api/v1/otlp/v1/traces\";\n\n/**\n * Derive the OTLP ingest URL from the legacy JSON traces batch URL. Keeps\n * host/scheme; replaces the path — mirrors the Python SDK's\n * `client.py::_derive_otlp_endpoint` and this file's own\n * `transport.ts::deriveLogsEndpoint`.\n */\nfunction deriveOtlpEndpoint(tracesEndpoint: string): string {\n try {\n const u = new URL(tracesEndpoint);\n u.pathname = OTLP_TRACES_PATH;\n u.search = \"\";\n u.hash = \"\";\n return u.toString();\n } catch {\n return tracesEndpoint.replace(/\\/api\\/v1\\/.*$/, OTLP_TRACES_PATH);\n }\n}\n\nfunction buildSingleton(opts: InitOptions, redaction: RedactionConfig): SingletonState | null {\n if (readIsDisabled()) {\n return null;\n }\n const apiKey = opts.apiKey ?? readApiKeyFromEnv();\n if (!apiKey) {\n if (!noApiKeyWarningEmitted) {\n logger(\n \"warn\",\n \"morse: not initialized — set MORSE_API_KEY or call morse.init({ apiKey }) (this warning prints once per process; SDK calls are silent no-ops)\",\n );\n noApiKeyWarningEmitted = true;\n }\n return null;\n }\n const endpoint = resolveEndpoint(opts.endpoint);\n const flushIntervalSeconds = opts.flushIntervalSeconds ?? getFlushIntervalSeconds();\n const transport = transportFactory({ apiKey, endpoint, flushIntervalSeconds });\n setTransport(transport);\n setRedactionConfig(redaction);\n // MHQ-927: diagnostics resolves its own target and cannot see this config\n // otherwise — env-only resolution silently dropped every diagnostic for\n // consumers who call init({ apiKey, endpoint }) without env vars.\n setDiagnosticsClientConfig({ apiKey, endpoint });\n // Resolve the internal source label: explicit kwarg wins, then env.\n // Invalid values are silently dropped so a typo never tags customer\n // data as dogfood.\n const explicitSource = isValidInternalSource(opts.source) ? opts.source! : undefined;\n const resolvedSource = explicitSource ?? readInternalSourceFromEnv() ?? null;\n _setSource(resolvedSource);\n logDestinationOnce(endpoint);\n\n // MHQ-482: run()/span()/runTraced()'s real emission pipeline — real OTel\n // spans over OTLP protobuf+gzip. Configured unconditionally (even under\n // MORSE_LEGACY_TRANSPORT=1) so the engine is ready if the flag flips at\n // runtime; the flag only affects which pipeline `tracing.ts::sendTrace()`\n // feeds. Mirrors the Python SDK's `_Client.__init__`.\n try {\n getOtelEngine().configure({\n endpoint: deriveOtlpEndpoint(endpoint),\n apiKey,\n sampleRate: getSampleRate(),\n scheduleDelayMillis: flushIntervalSeconds * 1000,\n maxQueueSize: getMaxQueueSize(),\n maxExportBatchSize: getMaxBatchSize(),\n maxFieldBytes: getMaxFieldBytes(),\n // 10s (not the exporter's un-overridden 30s ceiling): a genuine\n // network blip still gets several retries with backoff; a fully dead\n // endpoint fails within a bounded, shutdown-friendly window instead\n // of the library's full 30s ceiling. Mirrors the Python SDK.\n timeoutMillis: 10_000,\n redactionConfig: redaction,\n });\n } catch (err) {\n report(err, { fingerprint: \"morse.otel_provider.configure\" });\n }\n\n // MHQ-482: zero-config adapter auto-detect (mirrors Python's\n // `auto_detect.install_adapters()` call in `_ensure_initialized` /\n // `_init_impl`). Fire-and-forget — telemetry setup must never block or\n // throw back into the customer's init() / first SDK call. Runs AFTER the\n // OTel engine above is configured so any span an auto-installed adapter\n // emits immediately has a working pipeline to flow through.\n void _installAdapters().catch(() => {\n // installAdapters() already absorbs adapter-level failures; this is a\n // defensive backstop so a totally unexpected rejection never surfaces.\n });\n\n // MHQ-482: DB auto-capture (opt-in — MORSE_CAPTURE_DB / MORSE_CAPTURE_INFRA,\n // mirrors the Python SDK's `infra_capture.py::maybe_enable_from_env`).\n // MUST run after `getOtelEngine().configure()` above — instrumentation\n // registration needs the `NodeTracerProvider` that call just built.\n try {\n maybeEnableDbCaptureFromEnv();\n } catch (err) {\n report(err, { fingerprint: \"morse.db_capture.register\" });\n }\n\n return { apiKey, endpoint, transport, redaction };\n}\n\nfunction ensureInitialized(): SingletonState | null {\n if (readIsDisabled()) return null;\n if (singleton !== null) return singleton;\n // Lazy default-init: defaults are safe (default-on redaction).\n singleton = buildSingleton({}, buildRedactionConfig());\n return singleton;\n}\n\n// Wire the lazy-init hook into log.ts so `log()` participates in the\n// same env-driven auto-init flow as `track()` / `record()`. Discards\n// the return value — log.ts only needs the side-effect of populating\n// the module-level singleton + transport.\n_setLogEnsureInitialized(() => {\n ensureInitialized();\n});\n\n/* ------------------------------------------------------------------------ */\n/* Public API — wrapped at the module surface */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Initialize the Morse SDK singleton. Call once at application\n * startup. After this call, `track()`, `batchTrack()`, `run()`, and\n * `flush()` are wired up to the configured endpoint.\n *\n * `endpoint` is optional — when omitted, the SDK resolves in this order:\n * 1. `MORSE_ENDPOINT` env var (if set)\n * 2. The default Railway production URL.\n *\n * `MORSE_DISABLED=1` overrides everything: `init()` is a no-op.\n *\n * Calling `init()` a second time replaces the singleton — the previous\n * transport is shut down cleanly and a new one is constructed.\n *\n * Validation errors (e.g., disabling a mandatory redaction pattern, an\n * uncompilable extra pattern) are deliberately NOT absorbed — they\n * propagate as `Error`s so the developer sees the misconfiguration at\n * application startup. All other errors raised from internal SDK paths\n * are absorbed via the per-call wrappers downstream.\n */\nexport function init(options: InitOptions = {}): void {\n if (readIsDisabled()) {\n logger(\"info\", \"morse: MORSE_DISABLED=1 — SDK is a no-op\");\n return;\n }\n // Validate redaction options FIRST — must throw before we mutate any\n // singleton state, so a misconfigured init leaves the previous client\n // intact and the spec scenario \"no Client is constructed\" holds.\n const redaction = buildRedactionConfig(options.redaction);\n\n try {\n if (singleton !== null) {\n void singleton.transport.shutdown();\n singleton = null;\n }\n singleton = buildSingleton(options, redaction);\n } catch (err) {\n report(err, { fingerprint: \"morse.init\" });\n }\n}\n\n/**\n * Submit a single agent run to the ingestion endpoint. Non-blocking;\n * returns immediately. Silently no-ops if the SDK isn't initialised.\n */\nexport const track = absorbErrorsSync(\n (options: TrackOptions): void => {\n const state = ensureInitialized();\n if (!state) return;\n const payload = {\n agent_id: options.agentId,\n ...options.runData,\n };\n const redacted = redactValue(payload, state.redaction) as TelemetryEvent;\n state.transport.track(redacted);\n },\n { fingerprint: \"morse.track\" },\n);\n\n/** Submit multiple agent runs in bulk. Silently no-ops if uninitialised. */\nexport const batchTrack = absorbErrorsSync(\n (runs: Array<Record<string, unknown>>): void => {\n const state = ensureInitialized();\n if (!state) return;\n for (const run of runs) {\n const redacted = redactValue(run, state.redaction) as TelemetryEvent;\n state.transport.track(redacted);\n }\n },\n { fingerprint: \"morse.batch_track\" },\n);\n\n/**\n * High-level convenience: record an agent outcome with named fields.\n *\n * Builds a synthetic single-span `agent`-type trace and submits it through\n * the same `traces`-shaped emission path `run()`/`span()` use (MHQ-746) —\n * mirrors Python's `client.py::record()`. The live dev-api backend has no\n * `runs` ingest route; sending through `state.transport.track()` (the\n * shape `track()`/`batchTrack()` still use, matching Python's equally\n * unmigrated `track()`/`batch_track()`) 422s silently. See MHQ-746.\n */\nexport const record = absorbErrorsSync(\n (rec: RunRecord): void => {\n const state = ensureInitialized();\n if (!state) return;\n\n const traceId = generateTraceId();\n const now = nowIso();\n const resolvedStatus = rec.errorMessage ? \"failed\" : (rec.status ?? \"completed\");\n\n const span: SpanData = {\n trace_id: traceId,\n span_id: generateSpanId(),\n type: SpanType.AGENT,\n name: rec.agent,\n started_at: now,\n ended_at: now,\n status: resolvedStatus,\n duration_ms: rec.durationMs,\n model: rec.model,\n input_tokens: rec.inputTokens,\n output_tokens: rec.outputTokens,\n total_tokens: rec.totalTokens,\n cost_usd: rec.cost,\n error_message: rec.errorMessage,\n metadata: rec.metadata,\n };\n\n const traceFields: TraceFields = {\n trace_id: traceId,\n agent: rec.agent,\n status: resolvedStatus,\n started_at: now,\n ended_at: now,\n duration_ms: rec.durationMs,\n error_message: rec.errorMessage,\n success: rec.success,\n outcome: rec.outcome,\n };\n\n const entry = buildTraceEntry(traceFields, [span]);\n const redacted = redactValue(entry, state.redaction) as {\n trace: Record<string, unknown>;\n spans: Record<string, unknown>[];\n };\n _sendTrace(redacted);\n },\n { fingerprint: \"morse.record\" },\n);\n\n/**\n * Open a traced agent run, executing `fn` inside the trace context.\n * Mirrors Python's `morse.run(...)` context manager.\n *\n * Two overloads are supported:\n * - `run(name, fn)` — quick form with default options.\n * - `run({ agentName, incomingTraceparent }, fn)` — full options.\n *\n * Async callers receive a Promise; sync callers receive the value\n * directly. The function's return value is forwarded to the caller.\n */\nexport function run<T>(name: string, fn: (handle: RunHandle) => T): T | undefined;\nexport function run<T>(options: RunOptions, fn: (handle: RunHandle) => T): T | undefined;\nexport function run<T>(\n nameOrOpts: string | RunOptions,\n fn: (handle: RunHandle) => T,\n): T | undefined {\n const opts = typeof nameOrOpts === \"string\" ? { agentName: nameOrOpts } : nameOrOpts;\n // Make sure the SDK is initialised so spans get sent. Failure to init\n // is fine — `_runSync` records to `lastTrace` regardless, useful for tests.\n ensureInitialized();\n // We can't reliably detect async vs sync up front in TypeScript, so we\n // route through `_runSync` and, if the user's `fn` returns a promise,\n // the wrapping trace ends synchronously after the promise is created.\n // For correct async lifecycle, callers should use `runTraced` instead\n // (it awaits the promise inside the `als.run` scope so the trace\n // closes when the promise resolves).\n return _runSync(opts, fn);\n}\n\n/** Async variant of `run` — exported for callers who want explicit typing. */\nexport function runTraced<T>(\n options: RunOptions,\n fn: (handle: RunHandle) => Promise<T>,\n): Promise<T | undefined> {\n ensureInitialized();\n return _runAsync(options, fn);\n}\n\n/**\n * Attach cost-attribution dimensions to the active trace (MHQ-751). Call\n * once per request (e.g. in middleware) to propagate `customerId`,\n * `feature`, `env`, `team`, etc. to all child spans downstream. Values are\n * coerced to strings. No-op outside an active trace — never throws.\n * Mirrors Python's `morse_ai.set_context(**dims)`.\n */\nexport function setContext(dims: Record<string, unknown>): void {\n _setContext(dims);\n}\n\n/** Start a child span under the active trace. Returns null if no trace. */\nexport function startSpan(options: SpanOptions): SpanHandle | null {\n return _startSpan(options);\n}\n\n/** Run `fn` inside a child span. No-op if no trace is active. */\nexport function span<T>(options: SpanOptions, fn: (handle: SpanHandle | null) => T): T {\n return _spanSync(options, fn);\n}\n\n/** Async variant of `span`. */\nexport function spanAsync<T>(\n options: SpanOptions,\n fn: (handle: SpanHandle | null) => Promise<T>,\n): Promise<T> {\n return _spanAsync(options, fn);\n}\n\n/** Block until all queued events have been sent. Silent on uninit / errors. */\nexport const flush = absorbErrorsAsync(\n async (): Promise<void> => {\n if (singleton !== null) {\n await singleton.transport.flush();\n await getOtelEngine().flush();\n }\n },\n { fingerprint: \"morse.flush\" },\n);\n\n/**\n * Latest ingest quota / rate-limit state observed by the SDK, or `null`.\n *\n * TQE-04 (MHQ-676/MHQ-749): when the Morse backend answers a telemetry\n * batch with HTTP 429 — the monthly event limit (`event_limit_exceeded`)\n * or the per-second ingest rate limit (`RATE_LIMIT_INGEST`) — the\n * transport parses the response and stores it. This function exposes\n * that state so host applications can alert on quota exhaustion instead\n * of discovering it from missing telemetry. Mirrors Python's\n * `morse_ai.quota_state()`.\n *\n * Returns `null` when the SDK is uninitialized or no 429 has been\n * observed. The object includes at least `kind` (`\"event_limit\"`,\n * `\"rate_limit\"`, or `\"unknown\"`), `status`, and `receivedAt` (epoch\n * seconds); event-limit states add `currentCount` / `limitCount` /\n * `planId` / `periodStart` / `upgradeUrl`.\n */\nexport const quotaState = absorbErrorsSync(\n (): QuotaState | null => {\n if (singleton === null) return null;\n return _getQuotaState();\n },\n { fingerprint: \"morse.quota_state\" },\n);\n\n/** Flush and stop the background transport. Call on app exit. */\nexport const shutdown = absorbErrorsAsync(\n async (): Promise<void> => {\n if (singleton !== null) {\n await singleton.transport.shutdown();\n await getOtelEngine().flush();\n getOtelEngine().shutdown();\n // MHQ-927: diagnostics has its OWN buffer and timer, deliberately\n // separate from the transport so a diagnostic storm can never evict\n // customer telemetry. The timer fires every 5s and is `unref()`d so it\n // cannot hold the event loop open — which means a short-lived process\n // (a script, a CLI, a serverless invocation, every driver in the\n // adapter matrix) exits with its buffer unsent. Nothing else drains it,\n // so those diagnostics were simply lost.\n //\n // Drained AFTER the transport and OTel shutdown above: those can\n // themselves report internal errors, and this is the last chance to\n // send them.\n await flushDiagnosticsOnce();\n singleton = null;\n setTransport(null);\n }\n },\n { fingerprint: \"morse.shutdown\" },\n);\n\n/* ------------------------------------------------------------------------ */\n/* Test-only hooks (private) */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Reset the module-level singleton for tests. Customer code must NOT\n * call this — the singleton is meant to live for the process lifetime.\n *\n * @internal\n */\nexport function _resetForTesting(): void {\n if (singleton !== null) {\n void singleton.transport.shutdown();\n singleton = null;\n setTransport(null);\n }\n getOtelEngine().resetForTesting();\n noApiKeyWarningEmitted = false;\n lastLoggedEndpoint = null;\n _setSource(null);\n _resetTracingForTesting();\n _resetDiagnosticsForTesting();\n _resetAutoDetectForTesting();\n _resetQuotaStateForTesting();\n // Reset the transport factory back to the default.\n transportFactory = (opts) => new BatchTransport(opts);\n}\n\n/**\n * Inject an alternate transport factory for tests (e.g., a mock that\n * captures sent payloads instead of opening a fetch).\n *\n * @internal\n */\nexport function _setTransportFactoryForTesting(\n factory: (opts: {\n apiKey: string;\n endpoint: string;\n flushIntervalSeconds: number;\n }) => BatchTransport,\n): void {\n transportFactory = factory;\n}\n\n/**\n * Read the most recently completed trace entry, for test assertions.\n *\n * @internal\n */\nexport function _getLastTraceForTesting(): { trace: unknown; spans: unknown[] } | null {\n return _getLastTrace();\n}\n\n/**\n * Read the active trace state, for test assertions.\n *\n * @internal\n */\nexport function _getActiveTraceStateForTesting(): unknown {\n return _getActiveTraceState();\n}\n","/**\n * Browser replacement for `db-capture.ts` (MHQ-482 follow-up).\n *\n * `db-capture.ts` statically imports `@opentelemetry/instrumentation-pg`,\n * `-mysql2` and `@opentelemetry/instrumentation` (which reaches for node's\n * `module` via require-in-the-middle). A browser has no pg/mysql2 driver to\n * patch, so the whole module is inert there — but the static imports still\n * dragged those packages, and node `module`, into the browser graph.\n *\n * Swapped in by the esbuild plugin in `tsup.config.ts`; see\n * `otel-provider.browser.ts` for the full rationale. Only the symbols\n * `index.ts` imports need to exist here.\n */\n\n/**\n * No-op: there is no database driver to instrument in a browser.\n *\n * Deliberately silent. `otel-provider.browser.ts::noteBrowserRuntime()`\n * already states that DB capture is Node-only, and it fires on\n * `configure()` — which `index.ts` always calls before this. A second\n * message would be noise, and this function runs even when the customer\n * never asked for DB capture.\n */\nexport function maybeEnableDbCaptureFromEnv(): void {}\n","/**\n * Background batched HTTP transport.\n *\n * Mirrors the Python SDK's `transport.py` semantics:\n *\n * - Async batching: 2-second flush interval (configurable), 100-event\n * max batch size (configurable). Whichever fires first triggers a\n * flush.\n * - Network failures are silently dropped with a debug log — never\n * thrown to the caller.\n * - The caller's thread / event loop is never blocked: `track()`\n * enqueues and returns immediately.\n *\n * The transport speaks two payload shapes (matching Python):\n *\n * - V2 trace events: `{ traces: [{ trace, spans }, ...] }`\n * - V1 legacy runs: `{ runs: [{ ... }, ...] }`\n *\n * Wire-format routing checks for a `traces` key on each enqueued event.\n *\n * Browser vs Node:\n * - Both runtimes ship `fetch` (Node 18+ / all evergreens).\n * - In Node we can run a `setInterval` and call it a day.\n * - In the browser the same approach works; we don't currently flush\n * on `pagehide` / `beforeunload` — Phase 6c spec doesn't require it.\n * A future change can add `navigator.sendBeacon` for last-gasp delivery.\n */\n\nimport {\n recordDrop,\n report,\n setLevel,\n REASON_AUTH_REJECTED,\n REASON_ENCODE_FAILED,\n REASON_ENDPOINT_REJECTED,\n REASON_QUEUE_FULL,\n REASON_QUOTA_REJECTED,\n REASON_RETRY_EXHAUSTED,\n REASON_SEND_FAILED,\n REASON_SHUTDOWN_DROP,\n} from \"./diagnostics\";\n\n// Injected at build time by tsup from package.json — see tsup.config.ts.\n// The version is declared in exactly one place (package.json); a copy here\n// would drift the moment a release bumped one and not the other, and the\n// stale value rides out on the User-Agent and on every span's `sdk_version`.\n// `__SDK_VERSION__` is undefined when running straight from source (vitest,\n// ts-node), hence the fallback.\ndeclare const __SDK_VERSION__: string | undefined;\n\nexport const SDK_VERSION = typeof __SDK_VERSION__ === \"string\" ? __SDK_VERSION__ : \"0.0.0-dev\";\n\nexport interface BatchTransportOptions {\n endpoint: string;\n apiKey: string;\n /** Max wait between flushes, in seconds. Default: 2.0. */\n flushIntervalSeconds?: number;\n /** Max events per batch. Default: 100. */\n maxBatchSize?: number;\n /** Max queued events before drop. Default: 10_000. */\n maxQueueSize?: number;\n /** Timeout for the underlying fetch, in ms. Default: 5_000. */\n fetchTimeoutMs?: number;\n /**\n * Ceiling on a caller-awaited `flush()` / `shutdown()`, in ms. Default:\n * 10_000. Retries stop once it elapses, and anything still queued is counted\n * as a drop rather than silently held (MHQ-1001).\n *\n * NOT yet reachable from the public `init()` — that would widen the published\n * SDK contract, which is a founder call. Constructor-only for now, which is\n * still strictly better than the unbounded wait this replaces.\n */\n flushTimeoutMs?: number;\n /**\n * Pluggable fetch implementation. Defaults to `globalThis.fetch`.\n * Useful for tests.\n */\n fetchImpl?: typeof fetch;\n}\n\n/**\n * Wire shape for a single log record. Mirrors the Python SDK payload at\n * `apps/sdk/python/src/morse/client.py:191-211` and the backend\n * `SimpleLogsIngestController.ingest` contract\n * (`apps/api/apps/logs/controllers.py:66-134`).\n */\nexport interface LogRecordPayload {\n timestamp: string;\n severity: string;\n service_name: string;\n body: string;\n attributes: Record<string, unknown>;\n trace_id: string | null;\n span_id: string | null;\n}\n\nexport type TelemetryEvent =\n | { traces: unknown[] }\n | { logs: LogRecordPayload[] }\n | Record<string, unknown>;\n\n/**\n * Quota / rate-limit state parsed from a 429 batch-POST response.\n *\n * Mirrors Python's `transport.py::BatchTransport._record_quota_state` /\n * `quota_state()` (TQE-04 / MHQ-676) field-for-field, camelCased per this\n * codebase's convention (`received_at` -> `receivedAt`, etc.). Two known\n * body shapes:\n *\n * - `event_limit_exceeded` (traces controllers) — flat body with\n * `current_count` / `limit_count` / `plan_id` / `period_start` /\n * `upgrade_url` / `sample_rate_url`.\n * - `RATE_LIMIT_INGEST` (ingest rate-limit middleware) — nested\n * `{ error: { code, message, details: { limit, plan } } }`.\n *\n * Anything else is recorded as `kind: \"unknown\"` so the state surface\n * still reflects that ingest is throttled even when the body doesn't\n * parse into a known shape.\n */\nexport interface QuotaState {\n kind: \"event_limit\" | \"rate_limit\" | \"unknown\";\n status: number;\n /** Epoch seconds, matching Python's `time.time()`. */\n receivedAt: number;\n message?: string;\n currentCount?: number;\n limitCount?: number;\n planId?: string;\n periodStart?: string;\n upgradeUrl?: string;\n sampleRateUrl?: string;\n quotaLimit?: number;\n quotaRemaining?: number;\n quotaReset?: number;\n retryAfterSeconds?: number;\n}\n\n// `Retry-After` values above this are clamped, mirroring Python's\n// `_RETRY_AFTER_CAP_SECONDS` — a background flush loop must never commit\n// to reporting minutes-long waits from one batch.\nconst RETRY_AFTER_CAP_SECONDS = 30.0;\n\n// --- Retry/backoff (MHQ-1001) ----------------------------------------------\n//\n// Mirrors Python's `transport.py`: 3 attempts, jittered exponential backoff,\n// 4xx never retried except 429, Retry-After honoured and capped.\n//\n// The bound is NOT mirrored, deliberately. Python retries on a background\n// daemon thread and its `flush()` polls with a 30s deadline, so the caller is\n// insulated. Here `flush()`/`shutdown()` are awaited by the caller, which in\n// this SDK is very often a serverless handler (Vercel AI / Next.js) finishing a\n// request. A faithful 30s port would put up to ~20s of backoff inside somebody's\n// request path, so the drain gets its own, smaller deadline below.\nconst MAX_SEND_ATTEMPTS = 3;\nconst BACKOFF_BASE_MS = 500;\nconst BACKOFF_MAX_MS = 10_000;\n/** Overall ceiling on a caller-awaited `flush()` / `shutdown()`. */\nconst DEFAULT_FLUSH_TIMEOUT_MS = 10_000;\n\n/** Jittered exponential backoff for a 1-based attempt. Mirrors `_backoff_delay`. */\nfunction backoffDelayMs(attempt: number): number {\n const base = Math.min(BACKOFF_MAX_MS, BACKOFF_BASE_MS * 2 ** (attempt - 1));\n return base * (0.5 + Math.random());\n}\n\n/**\n * Which reason a retryable failure ends up reported as.\n *\n * The three are genuinely different and a reader acts on each differently:\n * - `shutdown_drop` the process is going away; delivery was never possible\n * - `send_failed` one attempt, no retry possible (no budget left)\n * - `retry_exhausted` attempts were made and used up\n *\n * Keeping `send_failed` reachable matters: MHQ-972 was exactly a reason code\n * with no call site, and adding the retry loop nearly orphaned this one.\n */\nfunction dropReasonFor(attempt: number, closed: boolean, deadline: number): string {\n if (closed) return REASON_SHUTDOWN_DROP;\n if (attempt === 1 && Date.now() >= deadline) return REASON_SEND_FAILED;\n return REASON_RETRY_EXHAUSTED;\n}\n\n/**\n * Resolve `promise`, or reject once `deadline` passes — whichever comes first.\n *\n * `fetchTimeoutMs` already aborts a conforming `fetch`, so in the normal case\n * this never fires. It exists because the deadline is otherwise only checked\n * BETWEEN attempts: a `fetchImpl` that ignores `AbortSignal` (a stub, a buggy\n * polyfill) would hang inside a single attempt and the caller would wait\n * forever. Serverless is the motivating case, so the bound has to hold even\n * when the injected fetch misbehaves. The abandoned request may still complete\n * in the background — we cannot cancel it, only stop waiting on it.\n */\nfunction withDeadline<T>(promise: Promise<T>, deadline: number): Promise<T> {\n const remaining = Math.max(0, deadline - Date.now());\n let timer: ReturnType<typeof setTimeout>;\n return Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(\"morse: flush deadline exceeded\")), remaining);\n }),\n ]).finally(() => clearTimeout(timer)) as Promise<T>;\n}\n\n/** Sleep that resolves early once `deadline` passes, so shutdown can't hang. */\nfunction sleepUntil(ms: number, deadline: number): Promise<void> {\n const remaining = Math.max(0, Math.min(ms, deadline - Date.now()));\n return new Promise((resolve) => setTimeout(resolve, remaining));\n}\n\n/**\n * Parse a `Retry-After` header (seconds form only), capped.\n *\n * Mirrors Python's `transport.py::_parse_retry_after`. HTTP-date form\n * isn't worth supporting — Morse's own 429s always use the seconds form.\n * Unparseable / negative values return `null`.\n */\nfunction parseRetryAfter(value: string | null): number | null {\n if (!value) return null;\n const seconds = Number(value);\n if (!Number.isFinite(seconds) || seconds < 0) return null;\n return Math.min(seconds, RETRY_AFTER_CAP_SECONDS);\n}\n\n// Module-level, matching the `lastTrace` test-introspection pattern in\n// `_internal/tracing.ts` — the latest quota/rate-limit state observed on\n// a 429 response, exposed via `quotaState()` / `morse.quotaState()`. Not\n// cleared on a subsequent successful POST (mirrors Python: it persists\n// until overwritten by a newer 429, so a host app can see \"quota was\n// exceeded recently\" even after the queue drains — see\n// `test_429_recovers_when_retry_succeeds` in the Python test suite,\n// which only asserts no drop-warning, never that state was cleared).\nlet quotaState: QuotaState | null = null;\n\n/**\n * Latest quota/rate-limit state observed on a 429, or `null` if none has\n * been observed yet. Returns a shallow copy — callers can't mutate\n * transport-internal state. Mirrors Python's `BatchTransport.quota_state()`.\n *\n * @internal\n */\nexport function getQuotaState(): QuotaState | null {\n return quotaState ? { ...quotaState } : null;\n}\n\n/**\n * Reset the module-level quota state between test files/cases.\n *\n * @internal\n */\nexport function _resetQuotaStateForTesting(): void {\n quotaState = null;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction numberFromHeader(raw: string | null): number | undefined {\n if (raw === null) return undefined;\n const n = Number(raw);\n return Number.isFinite(n) ? n : undefined;\n}\n\n/**\n * Parse a 429 response into the module-level quota state. Never throws —\n * defensively parses two known body shapes (see `QuotaState`), falling\n * back to `kind: \"unknown\"` for anything else. Mirrors Python's\n * `_record_quota_state`.\n */\nasync function recordQuotaState(resp: Response): Promise<void> {\n try {\n const state: QuotaState = {\n kind: \"unknown\",\n status: 429,\n receivedAt: Date.now() / 1000,\n };\n\n let data: unknown = null;\n try {\n data = await resp.clone().json();\n } catch {\n data = null;\n }\n\n if (data !== null && typeof data === \"object\") {\n const body = data as Record<string, unknown>;\n const err = body.error;\n if (err === \"event_limit_exceeded\") {\n state.kind = \"event_limit\";\n state.message = asString(body.message);\n state.currentCount = asNumber(body.current_count);\n state.limitCount = asNumber(body.limit_count);\n state.planId = asString(body.plan_id);\n state.periodStart = asString(body.period_start);\n state.upgradeUrl = asString(body.upgrade_url);\n state.sampleRateUrl = asString(body.sample_rate_url);\n } else if (\n err !== null &&\n typeof err === \"object\" &&\n (err as Record<string, unknown>).code === \"RATE_LIMIT_INGEST\"\n ) {\n const errObj = err as Record<string, unknown>;\n const details =\n errObj.details !== null && typeof errObj.details === \"object\"\n ? (errObj.details as Record<string, unknown>)\n : {};\n state.kind = \"rate_limit\";\n state.message = asString(errObj.message);\n state.limitCount = asNumber(details.limit);\n state.planId = asString(details.plan);\n }\n }\n\n // TQE-05 headers, emitted by the server on every ingest response.\n const quotaLimit = numberFromHeader(resp.headers.get(\"X-Morse-Quota-Limit\"));\n if (quotaLimit !== undefined) state.quotaLimit = quotaLimit;\n const quotaRemaining = numberFromHeader(resp.headers.get(\"X-Morse-Quota-Remaining\"));\n if (quotaRemaining !== undefined) state.quotaRemaining = quotaRemaining;\n const quotaReset = numberFromHeader(resp.headers.get(\"X-Morse-Quota-Reset\"));\n if (quotaReset !== undefined) state.quotaReset = quotaReset;\n const retryAfter = parseRetryAfter(resp.headers.get(\"Retry-After\"));\n if (retryAfter !== null) state.retryAfterSeconds = retryAfter;\n\n quotaState = state;\n } catch {\n // Never let state capture break the send path.\n }\n}\n\nexport class BatchTransport {\n private readonly endpoint: string;\n private readonly apiKey: string;\n private readonly flushIntervalSeconds: number;\n private readonly maxBatchSize: number;\n private readonly maxQueueSize: number;\n private readonly fetchTimeoutMs: number;\n private readonly flushTimeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n\n private queue: TelemetryEvent[] = [];\n private timer: ReturnType<typeof setInterval> | null = null;\n private flushing = false;\n private closed = false;\n private inflight: Promise<void> | null = null;\n\n constructor(opts: BatchTransportOptions) {\n this.endpoint = opts.endpoint;\n this.apiKey = opts.apiKey;\n this.flushIntervalSeconds = opts.flushIntervalSeconds ?? 2.0;\n this.maxBatchSize = opts.maxBatchSize ?? 100;\n this.maxQueueSize = opts.maxQueueSize ?? 10_000;\n this.fetchTimeoutMs = opts.fetchTimeoutMs ?? 5_000;\n this.flushTimeoutMs = opts.flushTimeoutMs ?? DEFAULT_FLUSH_TIMEOUT_MS;\n this.fetchImpl = opts.fetchImpl ?? globalThis.fetch.bind(globalThis);\n\n // setInterval keeps the Node event loop alive. We mark it `unref`\n // when available so a process-exit isn't blocked by a quiet flusher.\n const intervalMs = Math.max(50, Math.round(this.flushIntervalSeconds * 1000));\n this.timer = setInterval(() => {\n void this.tick();\n }, intervalMs);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const t = this.timer as any;\n if (typeof t?.unref === \"function\") {\n t.unref();\n }\n }\n\n /** Enqueue an event. Non-blocking. Returns false if the queue is full. */\n track(event: TelemetryEvent): boolean {\n if (this.closed) {\n recordDrop(REASON_SHUTDOWN_DROP, \"trace\");\n return false;\n }\n if (this.queue.length >= this.maxQueueSize) {\n // SDKDIAG-09: previously a bare `return false` — sustained telemetry loss\n // was invisible to both us and the customer. Now counted and logged.\n recordDrop(REASON_QUEUE_FULL, \"trace\");\n return false;\n }\n this.queue.push(event);\n if (this.queue.length >= this.maxBatchSize) {\n void this.tick();\n }\n return true;\n }\n\n /** Block until all currently-queued events have been sent. */\n async flush(): Promise<void> {\n // Drain in one-batch chunks until empty, then await the in-flight send.\n while (this.queue.length > 0) {\n await this.tick();\n }\n if (this.inflight) {\n try {\n await this.inflight;\n } catch {\n // Swallow — caller observes nothing.\n }\n }\n }\n\n /** Stop the background timer. After this call, `track()` is a no-op. */\n async shutdown(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n if (this.timer !== null) {\n clearInterval(this.timer);\n this.timer = null;\n }\n await this.flush();\n }\n\n private async tick(): Promise<void> {\n if (this.flushing) return;\n if (this.queue.length === 0) return;\n this.flushing = true;\n try {\n const batch = this.queue.splice(0, this.maxBatchSize);\n this.inflight = this.sendBatch(batch);\n await this.inflight;\n this.inflight = null;\n } finally {\n this.flushing = false;\n }\n }\n\n private async sendBatch(batch: TelemetryEvent[]): Promise<void> {\n const traceEntries: unknown[] = [];\n const runEntries: Record<string, unknown>[] = [];\n const logEntries: LogRecordPayload[] = [];\n for (const event of batch) {\n if (typeof event === \"object\" && event !== null && \"traces\" in event) {\n const e = event as { traces: unknown[] };\n if (Array.isArray(e.traces)) {\n traceEntries.push(...e.traces);\n }\n } else if (typeof event === \"object\" && event !== null && \"logs\" in event) {\n const e = event as { logs: LogRecordPayload[] };\n if (Array.isArray(e.logs)) {\n logEntries.push(...e.logs);\n }\n } else {\n runEntries.push(event as Record<string, unknown>);\n }\n }\n if (traceEntries.length > 0) {\n await this.post(this.endpoint, { traces: traceEntries });\n }\n if (runEntries.length > 0) {\n await this.post(this.endpoint, { runs: runEntries });\n }\n if (logEntries.length > 0) {\n // Phase 12.5 Tier 1.2 — logs go to a derived `/api/v1/logs/ingest`\n // endpoint on the same host as the traces batch URL. Mirrors the\n // Python SDK's URL derivation in\n // `apps/sdk/python/src/morse/client.py:187-190`.\n await this.post(deriveLogsEndpoint(this.endpoint), { logs: logEntries });\n }\n }\n\n private async post(\n url: string,\n payload: Record<string, unknown>,\n deadline: number = Date.now() + this.flushTimeoutMs,\n ): Promise<void> {\n // MHQ-972: serialise BEFORE the try that owns the network call. Inside it,\n // a JSON.stringify throw (a circular ref, a BigInt, a hostile toJSON) fell\n // into the network catch and was counted as a transport failure — so the\n // one reason code that names a payload bug had no reachable call site.\n let body: string;\n try {\n body = JSON.stringify(payload);\n } catch (err) {\n recordDrop(REASON_ENCODE_FAILED, categoryOf(payload), countPayloadEntries(payload));\n report(err, {\n fingerprint: \"morse.transport.post.encode\",\n extra: { endpoint_host: hostnameOf(url), sdk_version: SDK_VERSION },\n });\n return;\n }\n\n const droppedCount = countPayloadEntries(payload);\n const droppedCategory = categoryOf(payload);\n\n // MHQ-1001: 3 attempts, jittered backoff, 4xx never retried except 429.\n // Every `return` below is a terminal outcome; `continue` is the only path\n // that retries, and it always checks the deadline first.\n for (let attempt = 1; attempt <= MAX_SEND_ATTEMPTS; attempt++) {\n const lastAttempt = attempt >= MAX_SEND_ATTEMPTS;\n const outOfTime = Date.now() >= deadline;\n if (outOfTime && attempt > 1) {\n // The drain ran out of budget mid-retry. Report it as exhausted rather\n // than send_failed: attempts WERE made, we just stopped early.\n recordDrop(REASON_RETRY_EXHAUSTED, droppedCategory, droppedCount);\n return;\n }\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.fetchTimeoutMs);\n try {\n const resp = await withDeadline(\n this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": `morse-typescript/${SDK_VERSION}`,\n },\n body,\n signal: controller.signal,\n }),\n deadline,\n );\n // SDKDIAG-05: the server pushes the SDK's self-reporting verbosity on a\n // response we are already receiving — no config round-trip.\n setLevel(resp.headers.get(\"X-Morse-Diagnostics\"));\n\n if (resp.ok) return;\n\n // Order matters: recordQuotaState reads `resp.clone().json()`, and a\n // clone cannot be taken once the body has been consumed. Draining the\n // snippet first silently degrades every 429 to `kind: \"unknown\"` — which\n // is exactly what four quota-state tests caught when this was reordered.\n if (resp.status === 429) await recordQuotaState(resp);\n\n // Drain a few hundred chars of the body for diagnostics.\n let bodySnippet = \"\";\n try {\n bodySnippet = (await resp.text()).slice(0, 200);\n } catch {\n // ignore\n }\n report(new Error(`morse: batch POST returned ${resp.status} ${bodySnippet}`), {\n fingerprint: \"morse.transport.post.non_2xx\",\n extra: { endpoint_host: hostnameOf(url), sdk_version: SDK_VERSION },\n });\n\n if (resp.status === 429) {\n if (lastAttempt) {\n recordDrop(REASON_QUOTA_REJECTED, droppedCategory, droppedCount);\n return;\n }\n const retryAfter = parseRetryAfter(resp.headers.get(\"Retry-After\"));\n await sleepUntil((retryAfter ?? 0) * 1000 + backoffDelayMs(attempt), deadline);\n continue;\n }\n\n if (resp.status < 500) {\n // Non-429 4xx: retrying cannot help. WHY it cannot differs, and the\n // remedies are unrelated (MHQ-971).\n recordDrop(\n resp.status === 401 || resp.status === 403\n ? REASON_AUTH_REJECTED\n : REASON_ENDPOINT_REJECTED,\n droppedCategory,\n droppedCount,\n );\n return;\n }\n\n // 5xx — retryable.\n if (lastAttempt || this.closed || Date.now() >= deadline) {\n recordDrop(dropReasonFor(attempt, this.closed, deadline), droppedCategory, droppedCount);\n return;\n }\n await sleepUntil(backoffDelayMs(attempt), deadline);\n continue;\n } catch (err) {\n // Network error / abort / timeout — retryable, same as Python.\n report(err, {\n fingerprint: \"morse.transport.post.network\",\n extra: { endpoint_host: hostnameOf(url), sdk_version: SDK_VERSION },\n });\n if (lastAttempt || this.closed || Date.now() >= deadline) {\n recordDrop(dropReasonFor(attempt, this.closed, deadline), droppedCategory, droppedCount);\n return;\n }\n await sleepUntil(backoffDelayMs(attempt), deadline);\n continue;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n }\n}\n\nfunction hostnameOf(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return \"<invalid>\";\n }\n}\n\n/**\n * Derive the logs ingest URL from the traces batch endpoint. Mirrors the\n * Python SDK helper: replace the path with `/api/v1/logs/ingest` and drop\n * any query/fragment.\n *\n * Exported for tests. Customer code should not call this directly.\n *\n * @internal\n */\nexport function deriveLogsEndpoint(tracesEndpoint: string): string {\n try {\n const u = new URL(tracesEndpoint);\n u.pathname = \"/api/v1/logs/ingest\";\n u.search = \"\";\n u.hash = \"\";\n return u.toString();\n } catch {\n // Fall back to a string replace on the most common shape.\n return tracesEndpoint.replace(/\\/api\\/v1\\/.*$/, \"/api/v1/logs/ingest\");\n }\n}\n\n/** How many telemetry entries a failed POST just cost the customer. */\nfunction countPayloadEntries(payload: Record<string, unknown>): number {\n let total = 0;\n for (const value of Object.values(payload)) {\n if (Array.isArray(value)) total += value.length;\n }\n return total || 1;\n}\n\n/** Which counter category a payload belongs to (SDKDIAG-09). */\nfunction categoryOf(payload: Record<string, unknown>): string {\n if (\"traces\" in payload) return \"trace\";\n if (\"logs\" in payload) return \"log\";\n return \"record\";\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('../chunk-
|
|
5
|
-
require('../chunk-
|
|
3
|
+
var chunkLIP3XCTK_cjs = require('../chunk-LIP3XCTK.cjs');
|
|
4
|
+
require('../chunk-PSNZZBQJ.cjs');
|
|
5
|
+
require('../chunk-4IUHXUCJ.cjs');
|
|
6
6
|
var stream = require('stream');
|
|
7
7
|
|
|
8
8
|
function pinoLevelToSeverity(level) {
|
|
@@ -36,7 +36,7 @@ function forwardPinoRecord(record) {
|
|
|
36
36
|
const msg = typeof record.msg === "string" ? record.msg : "";
|
|
37
37
|
const serviceName = typeof record.name === "string" && record.name.length > 0 ? record.name : void 0;
|
|
38
38
|
const attributes = pickAttributes(record);
|
|
39
|
-
|
|
39
|
+
chunkLIP3XCTK_cjs.log(msg, {
|
|
40
40
|
severity,
|
|
41
41
|
attributes,
|
|
42
42
|
...serviceName ? { serviceName } : {}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { log } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
1
|
+
import { log } from '../chunk-5TYTCLKA.js';
|
|
2
|
+
import '../chunk-OUQAH27A.js';
|
|
3
|
+
import '../chunk-PXHTLCEU.js';
|
|
4
4
|
import { Writable } from 'stream';
|
|
5
5
|
|
|
6
6
|
function pinoLevelToSeverity(level) {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkPSNZZBQJ_cjs = require('../chunk-PSNZZBQJ.cjs');
|
|
4
4
|
var chunkRBNCTHK3_cjs = require('../chunk-RBNCTHK3.cjs');
|
|
5
|
-
var
|
|
5
|
+
var chunk4IUHXUCJ_cjs = require('../chunk-4IUHXUCJ.cjs');
|
|
6
6
|
|
|
7
7
|
// src/langchain/callback-handler.ts
|
|
8
|
-
|
|
8
|
+
chunk4IUHXUCJ_cjs.init_tracing();
|
|
9
9
|
var ADAPTER = "langchain-js";
|
|
10
10
|
var HANDLER_NAME = "morse_callback_handler";
|
|
11
11
|
var DEFAULT_AGENT_NAME = "langchain-agent";
|
|
@@ -205,7 +205,7 @@ var MorseCallbackHandler = class {
|
|
|
205
205
|
openSpan(runId, name, type, inputData, extraMetadata) {
|
|
206
206
|
if (typeof runId !== "string" || runId.length === 0) return null;
|
|
207
207
|
const metadata = { ...extraMetadata ?? {}, adapter: ADAPTER };
|
|
208
|
-
const handle =
|
|
208
|
+
const handle = chunk4IUHXUCJ_cjs.startSpan({ name, type, metadata });
|
|
209
209
|
if (handle === null) return null;
|
|
210
210
|
const wrapped = coerceStateValue(inputData);
|
|
211
211
|
if (wrapped !== void 0) handle.span.input_data = wrapped;
|
|
@@ -229,17 +229,18 @@ var MorseCallbackHandler = class {
|
|
|
229
229
|
/* ---------------------------------------------------------------------- */
|
|
230
230
|
/* Chain callbacks */
|
|
231
231
|
/* ---------------------------------------------------------------------- */
|
|
232
|
-
// NOTE: trailing `
|
|
233
|
-
//
|
|
234
|
-
//
|
|
235
|
-
//
|
|
236
|
-
//
|
|
232
|
+
// NOTE: trailing `runType`/`runName` parameters from
|
|
233
|
+
// `CallbackHandlerSurface` are intentionally omitted below (not just
|
|
234
|
+
// underscore-prefixed) — this adapter doesn't use them, and TypeScript
|
|
235
|
+
// structural typing allows an implementing function to declare fewer
|
|
236
|
+
// parameters than its interface signature. Declaring-then-ignoring
|
|
237
237
|
// trailing unused params trips `@typescript-eslint/no-unused-vars`'s
|
|
238
238
|
// default `args: "after-used"` mode (only params before the last *used*
|
|
239
239
|
// one are exempt); omitting them entirely is both lint-clean and reads
|
|
240
|
-
// as "these truly aren't consulted."
|
|
241
|
-
|
|
242
|
-
|
|
240
|
+
// as "these truly aren't consulted." `metadata` IS consulted as of
|
|
241
|
+
// MHQ-1029, so it and the params before it are declared.
|
|
242
|
+
handleChainStart(chain, inputs, runId, _parentRunId, _tags, metadata) {
|
|
243
|
+
_handleChainStart(this, chain, inputs, runId, metadata);
|
|
243
244
|
}
|
|
244
245
|
handleChainEnd(outputs, runId) {
|
|
245
246
|
_handleChainEnd(this, outputs, runId);
|
|
@@ -302,26 +303,27 @@ var MorseCallbackHandler = class {
|
|
|
302
303
|
return this.spanStack.get(runId);
|
|
303
304
|
}
|
|
304
305
|
};
|
|
305
|
-
var _handleChainStart =
|
|
306
|
-
(self, chain, inputs, runId) => {
|
|
306
|
+
var _handleChainStart = chunkPSNZZBQJ_cjs.absorbErrorsSync(
|
|
307
|
+
(self, chain, inputs, runId, metadata) => {
|
|
307
308
|
const chainName = resolveNameIdFirst(chain, "chain");
|
|
308
309
|
self._openSpan(runId, chainName, "agent", inputs);
|
|
310
|
+
if (metadata) chunk4IUHXUCJ_cjs.adoptThreadId(metadata.thread_id ?? metadata.threadId);
|
|
309
311
|
},
|
|
310
312
|
{ fingerprint: "morse.langchain.handleChainStart" }
|
|
311
313
|
);
|
|
312
|
-
var _handleChainEnd =
|
|
314
|
+
var _handleChainEnd = chunkPSNZZBQJ_cjs.absorbErrorsSync(
|
|
313
315
|
(self, outputs, runId) => {
|
|
314
316
|
self._closeSpan(runId, outputs);
|
|
315
317
|
},
|
|
316
318
|
{ fingerprint: "morse.langchain.handleChainEnd" }
|
|
317
319
|
);
|
|
318
|
-
var _handleChainError =
|
|
320
|
+
var _handleChainError = chunkPSNZZBQJ_cjs.absorbErrorsSync(
|
|
319
321
|
(self, err, runId) => {
|
|
320
322
|
self._closeSpan(runId, void 0, err ?? new Error("langchain chain error"));
|
|
321
323
|
},
|
|
322
324
|
{ fingerprint: "morse.langchain.handleChainError" }
|
|
323
325
|
);
|
|
324
|
-
var _handleLLMStart =
|
|
326
|
+
var _handleLLMStart = chunkPSNZZBQJ_cjs.absorbErrorsSync(
|
|
325
327
|
(self, llm, prompts, runId, extraParams) => {
|
|
326
328
|
const llmName = resolveNameIdFirst(llm, "llm");
|
|
327
329
|
const invocationParams = extraParams?.invocation_params;
|
|
@@ -354,7 +356,7 @@ function toolsFromExtra(extra) {
|
|
|
354
356
|
const invocationParams = extra?.invocation_params;
|
|
355
357
|
return invocationParams?.tools;
|
|
356
358
|
}
|
|
357
|
-
var _handleChatModelStart =
|
|
359
|
+
var _handleChatModelStart = chunkPSNZZBQJ_cjs.absorbErrorsSync(
|
|
358
360
|
(self, llm, messages, runId, extraParams) => {
|
|
359
361
|
const llmName = resolveNameIdFirst(llm, "llm");
|
|
360
362
|
const invocationParams = extraParams?.invocation_params;
|
|
@@ -369,7 +371,7 @@ var _handleChatModelStart = chunk4CMVMTFB_cjs.absorbErrorsSync(
|
|
|
369
371
|
},
|
|
370
372
|
{ fingerprint: "morse.langchain.handleChatModelStart" }
|
|
371
373
|
);
|
|
372
|
-
var _handleLLMEnd =
|
|
374
|
+
var _handleLLMEnd = chunkPSNZZBQJ_cjs.absorbErrorsSync(
|
|
373
375
|
(self, response, runId) => {
|
|
374
376
|
const handle = self._getSpan(runId);
|
|
375
377
|
const outputText = extractOutputText(response);
|
|
@@ -392,32 +394,32 @@ var _handleLLMEnd = chunk4CMVMTFB_cjs.absorbErrorsSync(
|
|
|
392
394
|
},
|
|
393
395
|
{ fingerprint: "morse.langchain.handleLLMEnd" }
|
|
394
396
|
);
|
|
395
|
-
var _handleLLMError =
|
|
397
|
+
var _handleLLMError = chunkPSNZZBQJ_cjs.absorbErrorsSync(
|
|
396
398
|
(self, err, runId) => {
|
|
397
399
|
self._closeSpan(runId, void 0, err ?? new Error("langchain llm error"));
|
|
398
400
|
},
|
|
399
401
|
{ fingerprint: "morse.langchain.handleLLMError" }
|
|
400
402
|
);
|
|
401
|
-
var _handleToolStart =
|
|
403
|
+
var _handleToolStart = chunkPSNZZBQJ_cjs.absorbErrorsSync(
|
|
402
404
|
(self, tool, input, runId) => {
|
|
403
405
|
const toolName = resolveNameNameFirst(tool, "tool");
|
|
404
406
|
self._openSpan(runId, toolName, "tool", { input });
|
|
405
407
|
},
|
|
406
408
|
{ fingerprint: "morse.langchain.handleToolStart" }
|
|
407
409
|
);
|
|
408
|
-
var _handleToolEnd =
|
|
410
|
+
var _handleToolEnd = chunkPSNZZBQJ_cjs.absorbErrorsSync(
|
|
409
411
|
(self, output, runId) => {
|
|
410
412
|
self._closeSpan(runId, { output: String(output) });
|
|
411
413
|
},
|
|
412
414
|
{ fingerprint: "morse.langchain.handleToolEnd" }
|
|
413
415
|
);
|
|
414
|
-
var _handleToolError =
|
|
416
|
+
var _handleToolError = chunkPSNZZBQJ_cjs.absorbErrorsSync(
|
|
415
417
|
(self, err, runId) => {
|
|
416
418
|
self._closeSpan(runId, void 0, err ?? new Error("langchain tool error"));
|
|
417
419
|
},
|
|
418
420
|
{ fingerprint: "morse.langchain.handleToolError" }
|
|
419
421
|
);
|
|
420
|
-
var _handleRetrieverStart =
|
|
422
|
+
var _handleRetrieverStart = chunkPSNZZBQJ_cjs.absorbErrorsSync(
|
|
421
423
|
(self, retriever, query, runId) => {
|
|
422
424
|
const idPath = retriever?.id;
|
|
423
425
|
const retrieverName = (Array.isArray(idPath) && idPath.length > 0 ? idPath[idPath.length - 1] : void 0) || "retriever";
|
|
@@ -425,7 +427,7 @@ var _handleRetrieverStart = chunk4CMVMTFB_cjs.absorbErrorsSync(
|
|
|
425
427
|
},
|
|
426
428
|
{ fingerprint: "morse.langchain.handleRetrieverStart" }
|
|
427
429
|
);
|
|
428
|
-
var _handleRetrieverEnd =
|
|
430
|
+
var _handleRetrieverEnd = chunkPSNZZBQJ_cjs.absorbErrorsSync(
|
|
429
431
|
(self, documents, runId) => {
|
|
430
432
|
const docsOut = [];
|
|
431
433
|
for (const doc of documents ?? []) {
|
|
@@ -455,7 +457,7 @@ var _handleRetrieverEnd = chunk4CMVMTFB_cjs.absorbErrorsSync(
|
|
|
455
457
|
},
|
|
456
458
|
{ fingerprint: "morse.langchain.handleRetrieverEnd" }
|
|
457
459
|
);
|
|
458
|
-
var _handleRetrieverError =
|
|
460
|
+
var _handleRetrieverError = chunkPSNZZBQJ_cjs.absorbErrorsSync(
|
|
459
461
|
(self, err, runId) => {
|
|
460
462
|
self._closeSpan(runId, void 0, err ?? new Error("langchain retriever error"));
|
|
461
463
|
},
|