@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.
Files changed (142) hide show
  1. package/README.md +11 -10
  2. package/dist/anthropic/index.cjs +11 -11
  3. package/dist/anthropic/index.d.cts +1 -1
  4. package/dist/anthropic/index.d.ts +1 -1
  5. package/dist/anthropic/index.js +4 -4
  6. package/dist/anthropic-agent-sdk/index.cjs +44 -40
  7. package/dist/anthropic-agent-sdk/index.cjs.map +1 -1
  8. package/dist/anthropic-agent-sdk/index.d.cts +1 -1
  9. package/dist/anthropic-agent-sdk/index.d.ts +1 -1
  10. package/dist/anthropic-agent-sdk/index.js +10 -6
  11. package/dist/anthropic-agent-sdk/index.js.map +1 -1
  12. package/dist/browser/anthropic/index.cjs +11 -11
  13. package/dist/browser/anthropic/index.js +4 -4
  14. package/dist/browser/anthropic-agent-sdk/index.cjs +44 -40
  15. package/dist/browser/anthropic-agent-sdk/index.cjs.map +1 -1
  16. package/dist/browser/anthropic-agent-sdk/index.js +10 -6
  17. package/dist/browser/anthropic-agent-sdk/index.js.map +1 -1
  18. package/dist/browser/{chunk-ELQ4LGAS.cjs → chunk-33WDUUKZ.cjs} +18 -18
  19. package/dist/browser/{chunk-ELQ4LGAS.cjs.map → chunk-33WDUUKZ.cjs.map} +1 -1
  20. package/dist/browser/{chunk-TV7TRP5O.cjs → chunk-3I7IGP3P.cjs} +5 -5
  21. package/dist/browser/chunk-3I7IGP3P.cjs.map +1 -0
  22. package/dist/browser/{chunk-YYUDZTHI.js → chunk-3OYHDDOJ.js} +27 -5
  23. package/dist/browser/chunk-3OYHDDOJ.js.map +1 -0
  24. package/dist/browser/{chunk-6BNMYEMW.cjs → chunk-4IUHXUCJ.cjs} +49 -9
  25. package/dist/browser/chunk-4IUHXUCJ.cjs.map +1 -0
  26. package/dist/browser/{chunk-BUCIE3DR.js → chunk-5TYTCLKA.js} +4 -4
  27. package/dist/browser/{chunk-BUCIE3DR.js.map → chunk-5TYTCLKA.js.map} +1 -1
  28. package/dist/browser/{chunk-VIOT3AOP.js → chunk-6JHMFFPE.js} +3 -3
  29. package/dist/browser/chunk-6JHMFFPE.js.map +1 -0
  30. package/dist/browser/{chunk-BIP66M44.cjs → chunk-FKYI3N5N.cjs} +7 -7
  31. package/dist/browser/{chunk-BIP66M44.cjs.map → chunk-FKYI3N5N.cjs.map} +1 -1
  32. package/dist/browser/{chunk-NU74H55W.js → chunk-FPTUHYDJ.js} +3 -3
  33. package/dist/browser/{chunk-NU74H55W.js.map → chunk-FPTUHYDJ.js.map} +1 -1
  34. package/dist/browser/{chunk-52JTU4LH.cjs → chunk-IDKQZ4X5.cjs} +38 -15
  35. package/dist/browser/chunk-IDKQZ4X5.cjs.map +1 -0
  36. package/dist/browser/{chunk-2X64OY2L.cjs → chunk-LIP3XCTK.cjs} +12 -12
  37. package/dist/browser/{chunk-2X64OY2L.cjs.map → chunk-LIP3XCTK.cjs.map} +1 -1
  38. package/dist/browser/{chunk-T6Z6UIBN.js → chunk-OUQAH27A.js} +3 -3
  39. package/dist/browser/{chunk-T6Z6UIBN.js.map → chunk-OUQAH27A.js.map} +1 -1
  40. package/dist/browser/{chunk-4CMVMTFB.cjs → chunk-PSNZZBQJ.cjs} +6 -6
  41. package/dist/browser/{chunk-4CMVMTFB.cjs.map → chunk-PSNZZBQJ.cjs.map} +1 -1
  42. package/dist/browser/{chunk-6T6ZPOKZ.js → chunk-PXHTLCEU.js} +49 -10
  43. package/dist/browser/chunk-PXHTLCEU.js.map +1 -0
  44. package/dist/browser/{chunk-KZFG23MO.js → chunk-TRVACYUN.js} +5 -5
  45. package/dist/browser/{chunk-KZFG23MO.js.map → chunk-TRVACYUN.js.map} +1 -1
  46. package/dist/browser/index.cjs +189 -124
  47. package/dist/browser/index.cjs.map +1 -1
  48. package/dist/browser/index.js +111 -46
  49. package/dist/browser/index.js.map +1 -1
  50. package/dist/browser/integrations/pino.cjs +4 -4
  51. package/dist/browser/integrations/pino.js +3 -3
  52. package/dist/browser/langchain/index.cjs +28 -26
  53. package/dist/browser/langchain/index.cjs.map +1 -1
  54. package/dist/browser/langchain/index.js +13 -11
  55. package/dist/browser/langchain/index.js.map +1 -1
  56. package/dist/browser/langgraph/index.cjs +32 -30
  57. package/dist/browser/langgraph/index.cjs.map +1 -1
  58. package/dist/browser/langgraph/index.js +10 -8
  59. package/dist/browser/langgraph/index.js.map +1 -1
  60. package/dist/browser/openai/index.cjs +11 -11
  61. package/dist/browser/openai/index.js +2 -2
  62. package/dist/browser/openai-agents/index.cjs +63 -35
  63. package/dist/browser/openai-agents/index.cjs.map +1 -1
  64. package/dist/browser/openai-agents/index.js +33 -5
  65. package/dist/browser/openai-agents/index.js.map +1 -1
  66. package/dist/browser/vercel-ai/index.cjs +14 -14
  67. package/dist/browser/vercel-ai/index.js +3 -3
  68. package/dist/{chunk-KMBKZLXH.cjs → chunk-7DALGJL2.cjs} +100 -25
  69. package/dist/chunk-7DALGJL2.cjs.map +1 -0
  70. package/dist/{chunk-D5NTF54A.cjs → chunk-B7TGG62X.cjs} +12 -12
  71. package/dist/{chunk-D5NTF54A.cjs.map → chunk-B7TGG62X.cjs.map} +1 -1
  72. package/dist/{chunk-LPLL2OXI.cjs → chunk-COZFARLL.cjs} +5 -5
  73. package/dist/chunk-COZFARLL.cjs.map +1 -0
  74. package/dist/{chunk-GTPKPUAV.cjs → chunk-DXTNU2KT.cjs} +38 -15
  75. package/dist/chunk-DXTNU2KT.cjs.map +1 -0
  76. package/dist/{chunk-6FLGLD72.js → chunk-ERH3TNXZ.js} +3 -3
  77. package/dist/{chunk-6FLGLD72.js.map → chunk-ERH3TNXZ.js.map} +1 -1
  78. package/dist/{chunk-7HYFOHM3.cjs → chunk-ESJJXXB6.cjs} +6 -6
  79. package/dist/{chunk-7HYFOHM3.cjs.map → chunk-ESJJXXB6.cjs.map} +1 -1
  80. package/dist/{chunk-SUEBUMHL.cjs → chunk-ETRNCI5Z.cjs} +18 -18
  81. package/dist/{chunk-SUEBUMHL.cjs.map → chunk-ETRNCI5Z.cjs.map} +1 -1
  82. package/dist/{chunk-KWOSUW7B.js → chunk-GULJAURY.js} +27 -5
  83. package/dist/chunk-GULJAURY.js.map +1 -0
  84. package/dist/{chunk-ZIMGB7IT.js → chunk-HJV35HWL.js} +100 -26
  85. package/dist/chunk-HJV35HWL.js.map +1 -0
  86. package/dist/{chunk-3ONFIKKC.js → chunk-L7AD4KUD.js} +3 -3
  87. package/dist/chunk-L7AD4KUD.js.map +1 -0
  88. package/dist/{chunk-SFI36VWW.js → chunk-QBDTQTMN.js} +3 -3
  89. package/dist/{chunk-SFI36VWW.js.map → chunk-QBDTQTMN.js.map} +1 -1
  90. package/dist/{chunk-NMARCV3R.cjs → chunk-WG4H5JC6.cjs} +7 -7
  91. package/dist/{chunk-NMARCV3R.cjs.map → chunk-WG4H5JC6.cjs.map} +1 -1
  92. package/dist/{chunk-J5FEPM7L.js → chunk-XS4P7XPV.js} +5 -5
  93. package/dist/{chunk-J5FEPM7L.js.map → chunk-XS4P7XPV.js.map} +1 -1
  94. package/dist/{chunk-ZZSVPAXM.js → chunk-YVLEDBN7.js} +4 -4
  95. package/dist/{chunk-ZZSVPAXM.js.map → chunk-YVLEDBN7.js.map} +1 -1
  96. package/dist/index.cjs +199 -134
  97. package/dist/index.cjs.map +1 -1
  98. package/dist/index.d.cts +13 -2
  99. package/dist/index.d.ts +13 -2
  100. package/dist/index.js +112 -47
  101. package/dist/index.js.map +1 -1
  102. package/dist/integrations/pino.cjs +4 -4
  103. package/dist/integrations/pino.js +3 -3
  104. package/dist/langchain/index.cjs +28 -26
  105. package/dist/langchain/index.cjs.map +1 -1
  106. package/dist/langchain/index.d.cts +3 -3
  107. package/dist/langchain/index.d.ts +3 -3
  108. package/dist/langchain/index.js +13 -11
  109. package/dist/langchain/index.js.map +1 -1
  110. package/dist/langgraph/index.cjs +32 -30
  111. package/dist/langgraph/index.cjs.map +1 -1
  112. package/dist/langgraph/index.d.cts +3 -3
  113. package/dist/langgraph/index.d.ts +3 -3
  114. package/dist/langgraph/index.js +10 -8
  115. package/dist/langgraph/index.js.map +1 -1
  116. package/dist/openai/index.cjs +11 -11
  117. package/dist/openai/index.js +2 -2
  118. package/dist/openai-agents/index.cjs +63 -35
  119. package/dist/openai-agents/index.cjs.map +1 -1
  120. package/dist/openai-agents/index.d.cts +13 -4
  121. package/dist/openai-agents/index.d.ts +13 -4
  122. package/dist/openai-agents/index.js +33 -5
  123. package/dist/openai-agents/index.js.map +1 -1
  124. package/dist/{spans-DZtMuBvc.d.cts → spans-CBMWNg2C.d.cts} +1 -0
  125. package/dist/{spans-DZtMuBvc.d.ts → spans-CBMWNg2C.d.ts} +1 -0
  126. package/dist/{tracing-J8ZgxVzU.d.ts → tracing-BMWTyexr.d.ts} +1 -1
  127. package/dist/{tracing-CNlre8TK.d.cts → tracing-Bh-cbvr6.d.cts} +1 -1
  128. package/dist/vercel-ai/index.cjs +14 -14
  129. package/dist/vercel-ai/index.js +3 -3
  130. package/package.json +1 -1
  131. package/dist/browser/chunk-52JTU4LH.cjs.map +0 -1
  132. package/dist/browser/chunk-6BNMYEMW.cjs.map +0 -1
  133. package/dist/browser/chunk-6T6ZPOKZ.js.map +0 -1
  134. package/dist/browser/chunk-TV7TRP5O.cjs.map +0 -1
  135. package/dist/browser/chunk-VIOT3AOP.js.map +0 -1
  136. package/dist/browser/chunk-YYUDZTHI.js.map +0 -1
  137. package/dist/chunk-3ONFIKKC.js.map +0 -1
  138. package/dist/chunk-GTPKPUAV.cjs.map +0 -1
  139. package/dist/chunk-KMBKZLXH.cjs.map +0 -1
  140. package/dist/chunk-KWOSUW7B.js.map +0 -1
  141. package/dist/chunk-LPLL2OXI.cjs.map +0 -1
  142. package/dist/chunk-ZIMGB7IT.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/openai-agents/runner-wrapper.ts","../../src/openai-agents/llm-and-tool.ts","../../src/openai-agents/handoff.ts","../../src/openai-agents/guardrail.ts","../../src/openai-agents/trace-processor.ts","../../src/openai-agents/index.ts"],"names":["opts","ADAPTER","err"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * `@morsehq-dev/sdk/openai-agents` — OpenAI Agents SDK runner wrapper.\n *\n * This module implements ONLY the outer-span (agent) instrumentation around\n * `Runner.run()`. Sibling files (`llm-and-tool.ts`, `handoff.ts`,\n * `guardrail.ts`) layer the inner llm / tool / handoff / guardrail spans;\n * Wave 3-O composes them via `src/openai-agents/index.ts`.\n *\n * Two entry points (mirroring `src/anthropic-agent-sdk/client-wrapper.ts`):\n *\n * - `wrapRunner(runner)` — returns a Proxy that intercepts `run()` and\n * opens an outer `agent` span around the returned Promise. The rest of\n * the runner surface (`on`, `off`, anything else) is forwarded.\n *\n * - `instrumentOpenAIAgents(runnerOrOptions, options?)` — two-mode\n * installer. With a runner, equivalent to `wrapRunner`. With\n * `{ openaiAgentsModule }`, best-effort patches\n * `Runner.prototype.run`. Always returns the wrapped runner or a\n * boolean; never throws.\n *\n * All telemetry paths are wrapped in `absorbErrors*` — a tracing failure\n * MUST NEVER break the customer's `run()`.\n */\n\nimport { absorbErrorsAsync, absorbErrorsSync } from \"../_internal/errors\";\nimport { getActiveTraceState, runAsync as _runAsync } from \"../_internal/tracing\";\nimport { emitAgentSpan } from \"../_agent-sdk-common/span-emitter\";\n\nimport type { AgentLike, OpenAIAgentsModuleLike, RunResultLike, RunnerLike } from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Module-level install sentinels */\n/* ------------------------------------------------------------------------ */\n\nconst WRAPPED_RUNNER = Symbol.for(\"morse.openai-agents.wrapped\");\nconst INSTALL_SENTINEL = Symbol.for(\"morse.openai-agents.installed\");\nconst ORIGINALS_SENTINEL = Symbol.for(\"morse.openai-agents.originals\");\n\ninterface OriginalsBag {\n protoRun?: unknown;\n protoCarrier?: { prototype: { run: unknown } };\n}\n\ninterface InstalledModule {\n [INSTALL_SENTINEL]?: boolean;\n [ORIGINALS_SENTINEL]?: OriginalsBag;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------------ */\n\nexport interface WrapRunnerOptions {\n /** Override the agent name on the outer span when `agent.name` is absent. */\n defaultAgentName?: string;\n /**\n * MHQ-787: called with the resolved `RunResult` and the agent's\n * configured model after each `run()` succeeds, so callers can enrich\n * already-closed LLM spans with usage/model data that only becomes\n * available on the result (not on the SDK's own tracing spans). Never\n * called on a failed run. Errors from this callback are swallowed —\n * telemetry must never break the customer's `run()`.\n */\n onRunResult?: (result: RunResultLike, model: string | undefined) => void;\n}\n\n/**\n * Wrap a `Runner` so each `run()` call opens an outer `agent` span (via\n * `emitAgentSpan` from `_agent-sdk-common`). The Proxy forwards the rest\n * of the runner surface (event subscription via `on`/`off`, etc.) so\n * customers see no behavior change. Idempotent.\n *\n * THIS WRAPPER ONLY HANDLES THE OUTER AGENT SPAN. llm / tool / handoff /\n * guardrail spans are layered by sibling files (W2-O.2/.3/.4) and composed\n * via `src/openai-agents/index.ts` in Wave 3-O.\n */\nexport function wrapRunner<R extends RunnerLike>(runner: R, options: WrapRunnerOptions = {}): R {\n if (!runner || typeof runner !== \"object\") return runner;\n if ((runner as Record<string | symbol, unknown>)[WRAPPED_RUNNER]) return runner;\n\n const originalRun = runner.run?.bind(runner);\n if (typeof originalRun !== \"function\") return runner;\n\n const patchedRun = buildPatchedRun(\n originalRun as (\n agent: AgentLike,\n input: unknown,\n callOptions?: Record<string, unknown>,\n ) => Promise<RunResultLike>,\n options,\n );\n\n const wrapper = new Proxy(runner, {\n get(target, prop, receiver) {\n if (prop === WRAPPED_RUNNER) return true;\n if (prop === \"run\") return patchedRun;\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === \"function\") {\n return (value as (...a: unknown[]) => unknown).bind(target);\n }\n return value;\n },\n });\n\n return wrapper as R;\n}\n\nexport interface InstrumentOpenAIAgentsOptions extends WrapRunnerOptions {\n openaiAgentsModule?: unknown;\n}\n\ntype InstrumentRunnerArg = RunnerLike | InstrumentOpenAIAgentsOptions | undefined;\n\n/**\n * Top-level installer. Two modes:\n *\n * - `instrumentOpenAIAgents(runner)` — equivalent to `wrapRunner(runner)`.\n * - `instrumentOpenAIAgents({ openaiAgentsModule: mod })` — best-effort\n * prototype patch on `Runner.prototype.run`. Prefer the wrap form when\n * possible.\n *\n * Always returns the wrapped runner, `true`/`false` for the module path, or\n * `undefined` on absorbed error. Never throws.\n */\nexport const instrumentOpenAIAgents: (\n runnerOrOptions?: InstrumentRunnerArg,\n maybeOptions?: WrapRunnerOptions,\n) => Promise<unknown> = absorbErrorsAsync(\n async (\n runnerOrOptions: InstrumentRunnerArg = undefined,\n maybeOptions: WrapRunnerOptions = {},\n ): Promise<unknown> => {\n if (runnerOrOptions && isRunner(runnerOrOptions)) {\n const opts = maybeOptions ?? {};\n return wrapRunner(runnerOrOptions, opts);\n }\n const opts = (runnerOrOptions as InstrumentOpenAIAgentsOptions | undefined) ?? {};\n const mod = await loadOpenAIAgentsModule(opts.openaiAgentsModule);\n if (!mod) return false;\n const installed = (mod as InstalledModule)[INSTALL_SENTINEL] === true;\n if (installed) return true;\n\n const carrier = findRunnerPrototypeCarrier(mod);\n if (!carrier) return false;\n const originalRun = carrier.prototype.run;\n if (typeof originalRun !== \"function\") return false;\n\n const patchedRun = buildPatchedRun(function (\n this: unknown,\n agent: AgentLike,\n input: unknown,\n callOptions?: Record<string, unknown>,\n ) {\n return (originalRun as (...args: unknown[]) => Promise<RunResultLike>).call(\n this,\n agent,\n input,\n callOptions,\n );\n }, opts);\n carrier.prototype.run = patchedRun as unknown as typeof carrier.prototype.run;\n (mod as InstalledModule)[ORIGINALS_SENTINEL] = {\n protoRun: originalRun,\n protoCarrier: carrier,\n };\n (mod as InstalledModule)[INSTALL_SENTINEL] = true;\n return true;\n },\n { fingerprint: \"morse.adapters.openai-agents.install\" },\n);\n\n/**\n * Restore the prototype patch and clear the install sentinel. Pass the same\n * module reference given to `instrumentOpenAIAgents`. No-op when called with\n * no module or on a wrapped-runner (vs. module) install — just discard the\n * wrapper.\n */\nexport const uninstallOpenAIAgents: (openaiAgentsModule?: unknown) => void = absorbErrorsSync(\n (openaiAgentsModule?: unknown): void => {\n if (!openaiAgentsModule || typeof openaiAgentsModule !== \"object\") return;\n const mod = openaiAgentsModule as InstalledModule;\n if (!mod[INSTALL_SENTINEL]) return;\n const originals = mod[ORIGINALS_SENTINEL];\n if (originals?.protoCarrier && originals.protoRun !== undefined) {\n originals.protoCarrier.prototype.run =\n originals.protoRun as typeof originals.protoCarrier.prototype.run;\n }\n mod[ORIGINALS_SENTINEL] = undefined;\n mod[INSTALL_SENTINEL] = false;\n },\n { fingerprint: \"morse.adapters.openai-agents.uninstall\" },\n) as (openaiAgentsModule?: unknown) => void;\n\n/** True when a wrapped OpenAI Agents `Runner` is passed in. */\nexport function isOpenAIAgentsWrapped(runner: unknown): boolean {\n if (!runner || typeof runner !== \"object\") return false;\n return (runner as Record<string | symbol, unknown>)[WRAPPED_RUNNER] === true;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Internals — module discovery */\n/* ------------------------------------------------------------------------ */\n\nfunction isRunner(x: unknown): x is RunnerLike {\n if (!x || typeof x !== \"object\") return false;\n const r = (x as { run?: unknown }).run;\n return typeof r === \"function\";\n}\n\nasync function loadOpenAIAgentsModule(explicit?: unknown): Promise<unknown | null> {\n if (explicit && typeof explicit === \"object\") return explicit;\n try {\n // Function-eval'd dynamic import keeps bundlers from trying to resolve\n // `@openai/agents` at build time when the dep isn't installed.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return await (Function(\"m\", \"return import(m)\") as any)(\"@openai/agents\");\n } catch {\n return null;\n }\n}\n\n/**\n * Locate `Runner.prototype` on the OpenAI Agents module. The SDK exposes\n * the class at slightly different paths across versions; try the most\n * common shapes.\n */\nfunction findRunnerPrototypeCarrier(mod: unknown): { prototype: { run: unknown } } | null {\n if (!mod || typeof mod !== \"object\") return null;\n const m = mod as OpenAIAgentsModuleLike & Record<string, unknown>;\n const candidates: unknown[] = [m.Runner, (m.default as { Runner?: unknown } | undefined)?.Runner];\n for (const c of candidates) {\n if (\n c &&\n typeof c === \"function\" &&\n (c as { prototype?: { run?: unknown } }).prototype &&\n typeof (c as { prototype: { run?: unknown } }).prototype.run === \"function\"\n ) {\n return c as { prototype: { run: unknown } };\n }\n }\n return null;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Internals — wrapper that opens the outer `agent` span */\n/* ------------------------------------------------------------------------ */\n\nfunction stringifyModel(m: AgentLike[\"model\"]): string | undefined {\n if (typeof m === \"string\" && m.length > 0) return m;\n if (m && typeof m === \"object\" && typeof m.id === \"string\" && m.id.length > 0) return m.id;\n return undefined;\n}\n\nfunction buildPatchedRun(\n original: (\n agent: AgentLike,\n input: unknown,\n callOptions?: Record<string, unknown>,\n ) => Promise<RunResultLike>,\n options: WrapRunnerOptions,\n): (\n agent: AgentLike,\n input: unknown,\n callOptions?: Record<string, unknown>,\n) => Promise<RunResultLike> {\n return function patchedRun(\n this: unknown,\n agent: AgentLike,\n input: unknown,\n callOptions?: Record<string, unknown>,\n ): Promise<RunResultLike> {\n const boundOriginal = (\n a: AgentLike,\n i: unknown,\n o?: Record<string, unknown>,\n ): Promise<RunResultLike> => original.call(this, a, i, o);\n\n const agentName =\n (agent && typeof agent === \"object\" && typeof agent.name === \"string\" && agent.name.length > 0\n ? agent.name\n : undefined) ??\n options.defaultAgentName ??\n \"openai-agent\";\n const model = stringifyModel(agent?.model);\n\n const runWithSpan = async (): Promise<RunResultLike> => {\n const handle = emitAgentSpan({\n adapter: \"openai-agents\",\n agentName,\n model,\n });\n try {\n const result = await boundOriginal(agent, input, callOptions);\n try {\n options.onRunResult?.(result, model);\n } catch {\n /* telemetry must never throw at the caller */\n }\n handle?.end();\n return result;\n } catch (err) {\n handle?.end(err);\n throw err;\n }\n };\n\n // If we're already inside an active trace, the agent span attaches as a\n // child of the existing root. Otherwise, open a fresh trace so the span\n // has a parent — without this, `emitAgentSpan` would no-op (return null)\n // and the customer would see no telemetry.\n if (getActiveTraceState() !== null) {\n return runWithSpan();\n }\n\n return (async (): Promise<RunResultLike> => {\n let captured: RunResultLike | undefined;\n let caughtErr: unknown;\n const runResult = await _runAsync({ agentName }, async (runHandle) => {\n try {\n captured = await runWithSpan();\n runHandle.setOutcome(true);\n return captured;\n } catch (err) {\n caughtErr = err;\n throw err;\n }\n }).catch((err) => {\n // _runAsync rethrows; capture so we can rethrow after the trace\n // flush completes. The trace is already finalized as failed by\n // _runAsync's catch path.\n if (caughtErr === undefined) caughtErr = err;\n return undefined;\n });\n\n if (caughtErr !== undefined) throw caughtErr;\n // `runResult` is the value returned by the inner fn (i.e. `captured`),\n // but prefer the captured local for type-safety.\n return (captured ?? runResult) as RunResultLike;\n })();\n };\n}\n","/**\n * `openai-agents/llm-and-tool.ts` — Phase 13 W2-O.2.\n *\n * Subscribes to the OpenAI Agents `Runner`'s event channel and emits `llm`\n * and `tool` spans for each `*_call_start` / `*_call_end` pair.\n *\n * The real `@openai/agents` Runner fires events on both typed channels\n * (e.g. `runner.on(\"llm_call_start\", ...)`) and a catch-all `\"event\"`\n * channel. We register on the typed channels only — the FakeRunner used\n * in tests mirrors that behaviour, and using typed-only avoids the\n * double-emit risk if a host has wired both.\n *\n * Call matching is FIFO via two per-installation stacks (one for llm,\n * one for tool). Within a single `Runner.run` the SDK does not interleave\n * calls, so FIFO is sufficient — and it tolerates orphan `_end` events\n * (no matching `_start`) by simply ignoring them.\n *\n * All span emission goes through the shared `_agent-sdk-common/span-emitter`\n * helpers which are themselves wrapped in `absorbErrorsSync` — telemetry\n * MUST NOT throw at the caller.\n *\n * MHQ-750: when the `llm_call_start` event carries `event.llm.messages`\n * (OpenAI-chat-completions-shaped, since `@openai/agents` is built on the\n * same request format), they're decomposed into `context_segments` via the\n * shared `_agent-sdk-common/context-decomposer` — the same decomposer used\n * by `../langgraph/` and `../langchain/`. `event.llm.messages` is optional\n * on the structural `RunnerEventLike` type; hosts that don't surface it\n * simply produce no `context_segments`, same as before this change.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport { calculateCost } from \"../_internal/pricing\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { emitLlmSpan, emitToolSpan } from \"../_agent-sdk-common/span-emitter\";\nimport { summarizeToolInput, summarizeToolOutput } from \"../_agent-sdk-common/redaction\";\nimport { decomposeOpenAiMessages } from \"../_agent-sdk-common/context-decomposer\";\nimport type { RunnerEventLike, RunnerLike } from \"./types\";\n\nconst ADAPTER = \"openai-agents\" as const;\n\nexport interface InstallLlmAndToolInstrumentationOptions {\n /** Max bytes for serialized tool input summary. Defaults to redaction helper's cap. */\n toolInputMaxBytes?: number;\n /** Max bytes for serialized tool output summary. Defaults to redaction helper's cap. */\n toolOutputMaxBytes?: number;\n}\n\n/**\n * Subscribe to the runner's event channel and emit `llm` and `tool` spans\n * for each `_call_start`/`_call_end` pair.\n *\n * Returns an unsubscribe function. If `runner.on` is not a function (e.g.\n * the host injected a mock), returns a no-op unsubscriber.\n */\nexport function installLlmAndToolInstrumentation(\n runner: RunnerLike,\n options?: InstallLlmAndToolInstrumentationOptions,\n): () => void {\n if (typeof runner?.on !== \"function\") {\n return () => {\n /* no-op */\n };\n }\n\n const opts = options ?? {};\n const llmStack: SpanHandle[] = [];\n const toolStack: SpanHandle[] = [];\n\n const onLlmStart = absorbErrorsSync(\n (event: RunnerEventLike): void => {\n const contextSegments = decomposeOpenAiMessages(event.llm?.messages, event.llm?.tools);\n const handle = emitLlmSpan({\n adapter: ADAPTER,\n model:\n typeof event.llm?.model === \"string\" && event.llm.model.length > 0\n ? event.llm.model\n : \"unknown\",\n provider: typeof event.llm?.provider === \"string\" ? event.llm.provider : undefined,\n contextSegments: contextSegments.length > 0 ? contextSegments : undefined,\n });\n if (handle !== null) llmStack.push(handle);\n },\n { fingerprint: \"morse.openai-agents.llm_call_start\" },\n );\n\n const onLlmEnd = absorbErrorsSync(\n (event: RunnerEventLike): void => {\n const handle = llmStack.shift();\n if (handle === undefined) return; // orphan _end, tolerate\n const usage = event.llm?.usage;\n if (usage !== undefined && usage !== null) {\n if (typeof usage.input_tokens === \"number\" && Number.isFinite(usage.input_tokens)) {\n handle.span.input_tokens = usage.input_tokens;\n }\n if (typeof usage.output_tokens === \"number\" && Number.isFinite(usage.output_tokens)) {\n handle.span.output_tokens = usage.output_tokens;\n }\n if (typeof usage.total_tokens === \"number\" && Number.isFinite(usage.total_tokens)) {\n handle.span.total_tokens = usage.total_tokens;\n } else if (\n handle.span.input_tokens !== undefined &&\n handle.span.output_tokens !== undefined\n ) {\n handle.span.total_tokens = handle.span.input_tokens + handle.span.output_tokens;\n }\n const cachedTokens =\n typeof usage.cached_tokens === \"number\" && Number.isFinite(usage.cached_tokens)\n ? usage.cached_tokens\n : 0;\n if (\n handle.span.cost_usd === undefined &&\n handle.span.model &&\n (handle.span.input_tokens !== undefined || handle.span.output_tokens !== undefined)\n ) {\n const cost = calculateCost({\n inputTokens: handle.span.input_tokens ?? 0,\n outputTokens: handle.span.output_tokens ?? 0,\n model: handle.span.model,\n cachedInputTokens: cachedTokens,\n });\n if (cost !== undefined) handle.span.cost_usd = cost;\n }\n }\n handle.end();\n },\n { fingerprint: \"morse.openai-agents.llm_call_end\" },\n );\n\n const onToolStart = absorbErrorsSync(\n (event: RunnerEventLike): void => {\n const toolName =\n typeof event.tool?.name === \"string\" && event.tool.name.length > 0\n ? event.tool.name\n : \"unknown\";\n const inputSummary = summarizeToolInput(\n event.tool?.input,\n opts.toolInputMaxBytes !== undefined ? { maxBytes: opts.toolInputMaxBytes } : undefined,\n );\n const handle = emitToolSpan({\n adapter: ADAPTER,\n toolName,\n inputSummary,\n });\n if (handle !== null) toolStack.push(handle);\n },\n { fingerprint: \"morse.openai-agents.tool_call_start\" },\n );\n\n const onToolEnd = absorbErrorsSync(\n (event: RunnerEventLike): void => {\n const handle = toolStack.shift();\n if (handle === undefined) return; // orphan _end, tolerate\n const outputSummary = summarizeToolOutput(\n event.tool?.output,\n opts.toolOutputMaxBytes !== undefined ? { maxBytes: opts.toolOutputMaxBytes } : undefined,\n );\n const success = typeof event.tool?.success === \"boolean\" ? event.tool.success : true;\n const metadata = (handle.span.metadata ?? {}) as Record<string, unknown>;\n const tool =\n metadata.tool !== undefined && metadata.tool !== null\n ? (metadata.tool as Record<string, unknown>)\n : {};\n tool.output_summary = outputSummary;\n tool.success = success;\n if (typeof event.tool?.duration_ms === \"number\" && Number.isFinite(event.tool.duration_ms)) {\n tool.duration_ms = event.tool.duration_ms;\n }\n metadata.tool = tool;\n metadata.tool_output_summary = outputSummary;\n handle.span.metadata = metadata;\n if (success === false) {\n handle.end(new Error(\"tool call reported failure\"));\n } else {\n handle.end();\n }\n },\n { fingerprint: \"morse.openai-agents.tool_call_end\" },\n );\n\n // Register on typed channels.\n runner.on(\"llm_call_start\", onLlmStart);\n runner.on(\"llm_call_end\", onLlmEnd);\n runner.on(\"tool_call_start\", onToolStart);\n runner.on(\"tool_call_end\", onToolEnd);\n\n let unsubscribed = false;\n return () => {\n if (unsubscribed) return;\n unsubscribed = true;\n if (typeof runner.off === \"function\") {\n runner.off(\"llm_call_start\", onLlmStart);\n runner.off(\"llm_call_end\", onLlmEnd);\n runner.off(\"tool_call_start\", onToolStart);\n runner.off(\"tool_call_end\", onToolEnd);\n }\n };\n}\n","/**\n * `openai-agents/handoff.ts` — OpenAI Agents SDK handoff-span instrumentation.\n *\n * Subscribes to the Runner's \"handoff\" event channel and emits a\n * `subagent.spawn`-shape span per handoff:\n *\n * - wire `type = \"agent\"`\n * - `metadata.spawn_kind = \"subagent\"`\n * - `metadata.parent_agent_name = handoff.from_agent`\n * - `metadata.subagent_name = handoff.to_agent`\n * - `metadata.handoff_from = handoff.from_agent` (alias for UI clarity)\n * - `metadata.task_description = handoff.reason` (via emitSubagentSpan)\n * - `metadata.handoff_reason = handoff.reason` (when present)\n *\n * The handoff event in the OpenAI Agents SDK is instantaneous — the to_agent's\n * subsequent work is captured by separate llm/tool spans (W2-O.2). The span\n * opened here is therefore closed immediately (duration_ms = 0).\n *\n * Errors emitted from inside the listener never propagate back to the runner —\n * `absorbErrorsSync` swallows them and `emitSubagentSpan` itself is wrapped.\n */\n\nimport { emitSubagentSpan } from \"../_agent-sdk-common/span-emitter\";\nimport { absorbErrorsSync } from \"../_internal/errors\";\n\nimport type { RunnerEventLike, RunnerLike } from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Listener */\n/* ------------------------------------------------------------------------ */\n\nconst _handleHandoffEvent = (event: RunnerEventLike): void => {\n if (event === null || typeof event !== \"object\") return;\n const handoff = event.handoff;\n if (!handoff || typeof handoff !== \"object\") return;\n const from = handoff.from_agent;\n const to = handoff.to_agent;\n if (typeof from !== \"string\" || from.length === 0) return;\n if (typeof to !== \"string\" || to.length === 0) return;\n const reason =\n typeof handoff.reason === \"string\" && handoff.reason.length > 0 ? handoff.reason : undefined;\n const attributes: Record<string, unknown> = {\n handoff_from: from,\n };\n if (reason !== undefined) attributes.handoff_reason = reason;\n const handle = emitSubagentSpan({\n adapter: \"openai-agents\",\n parentAgentName: from,\n subagentName: to,\n taskDescription: reason,\n attributes,\n });\n // The handoff event is instantaneous; close the span immediately so the\n // to_agent's subsequent work is captured as separate sibling spans (not\n // children of an open handoff span).\n handle?.end();\n};\n\nconst handleHandoffEvent: (event: RunnerEventLike) => void = absorbErrorsSync(_handleHandoffEvent, {\n fingerprint: \"morse.adapters.openai-agents.handoff.listener\",\n}) as (event: RunnerEventLike) => void;\n\n/* ------------------------------------------------------------------------ */\n/* Installer */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Subscribe to a Runner's \"handoff\" events and emit a `subagent.spawn`-shape\n * span for each. Returns an unsubscribe function. Safely no-ops when\n * `runner.on` is missing (e.g., a wrapped Runner without an event channel).\n */\nexport function installHandoffInstrumentation(runner: RunnerLike): () => void {\n if (runner === null || typeof runner !== \"object\") return () => {};\n if (typeof runner.on !== \"function\") return () => {};\n try {\n runner.on(\"handoff\", handleHandoffEvent);\n } catch {\n // Defensive: a misbehaving on() implementation must not break the caller.\n return () => {};\n }\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n try {\n runner.off?.(\"handoff\", handleHandoffEvent);\n } catch {\n // never propagate\n }\n };\n}\n","/**\n * `openai-agents/guardrail.ts` — W2-O.4\n *\n * Subscribes to the `Runner`'s `\"guardrail_check\"` event channel and emits\n * one guardrail-shaped span per check. Guardrails are wire-`tool` spans\n * tagged with `metadata.tool_kind=\"guardrail\"` so the dashboard can render\n * them distinctly from regular tool calls and hook spans.\n *\n * Spans close immediately on emission. When the guardrail reports\n * `passed === false`, the span closes with `failed` status and the\n * reason (when present) lands in both the synthetic error message and\n * `metadata.guardrail.reason`.\n *\n * Every emission is wrapped in `absorbErrorsSync` per the foundational\n * \"telemetry must never break the host\" guarantee.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport { emitToolSpan } from \"../_agent-sdk-common/span-emitter\";\nimport type { RunnerEventLike, RunnerLike } from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Internal helpers */\n/* ------------------------------------------------------------------------ */\n\nconst _handleGuardrailEvent = (payload: RunnerEventLike): void => {\n const guardrail = payload?.guardrail;\n if (guardrail === undefined || guardrail === null || typeof guardrail !== \"object\") {\n return;\n }\n\n const name =\n typeof guardrail.name === \"string\" && guardrail.name.length > 0 ? guardrail.name : undefined;\n const passed = guardrail.passed === true;\n const reason =\n typeof guardrail.reason === \"string\" && guardrail.reason.length > 0\n ? guardrail.reason\n : undefined;\n\n const guardrailMeta: Record<string, unknown> = { passed };\n if (name !== undefined) guardrailMeta.name = name;\n if (reason !== undefined) guardrailMeta.reason = reason;\n\n const handle = emitToolSpan({\n adapter: \"openai-agents\",\n toolName: `guardrail.${name ?? \"anon\"}`,\n success: passed,\n });\n if (handle === null || handle === undefined) return;\n\n // Apply guardrail-specific metadata on top of what emitToolSpan set.\n handle.span.metadata = {\n ...(handle.span.metadata ?? {}),\n tool_kind: \"guardrail\",\n guardrail: guardrailMeta,\n };\n\n if (passed) {\n handle.end();\n } else {\n handle.end(new Error(`guardrail failed: ${reason ?? \"no reason\"}`));\n }\n};\n\nconst handleGuardrailEvent: (payload: RunnerEventLike) => void = absorbErrorsSync(\n _handleGuardrailEvent,\n { fingerprint: \"morse.openai-agents.guardrail.handle\" },\n) as (payload: RunnerEventLike) => void;\n\n/* ------------------------------------------------------------------------ */\n/* Public installer */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Subscribe to the runner's `\"guardrail_check\"` events. Emit one\n * tool-shape span per check:\n *\n * - wire `type = \"tool\"`\n * - `metadata.tool_kind = \"guardrail\"`\n * - `metadata.guardrail.passed: boolean`\n * - `metadata.guardrail.name: string` (when present)\n * - `metadata.guardrail.reason: string` (when present, typically on fail)\n *\n * On failure, the span closes with `failed` status. Returns an\n * unsubscribe function. No-op when `runner.on` is missing.\n */\nexport function installGuardrailInstrumentation(runner: RunnerLike): () => void {\n if (runner === null || typeof runner !== \"object\" || typeof runner.on !== \"function\") {\n return () => {\n /* no-op */\n };\n }\n\n const listener = (payload: RunnerEventLike): void => {\n handleGuardrailEvent(payload);\n };\n\n try {\n runner.on(\"guardrail_check\", listener);\n } catch {\n return () => {\n /* no-op */\n };\n }\n\n return (): void => {\n try {\n if (typeof runner.off === \"function\") {\n runner.off(\"guardrail_check\", listener);\n }\n } catch {\n /* swallow — telemetry must never throw at the caller */\n }\n };\n}\n","/**\n * `openai-agents/trace-processor.ts` — translate `@openai/agents` SDK spans\n * into Morse spans via the SDK's first-class TraceProcessor pipeline.\n *\n * The SDK exposes `addTraceProcessor(p)` / `setTraceProcessors([p])` where\n * `p` implements:\n *\n * - `onTraceStart(trace)`\n * - `onTraceEnd(trace)`\n * - `onSpanStart(span)`\n * - `onSpanEnd(span)`\n * - `shutdown()`\n * - `forceFlush()`\n *\n * Each `span` carries `span.spanId` + `span.spanData.{type,name,model,usage,...}`.\n * Span types observed in the SDK: `agent`, `response`, `generation`,\n * `function`, `handoff`, `guardrail`, `mcp_list_tools`, `custom`.\n *\n * **Why this exists.** The original W2-O surfaces in this directory\n * (llm-and-tool.ts, handoff.ts, guardrail.ts) listened to a hypothetical\n * `runner.on('llm_call_start', ...)` event channel that the real SDK\n * doesn't expose. Phase 13 Option A dogfood (commit 9e53731) confirmed\n * the old installers never fired. This TraceProcessor is the canonical\n * replacement — see `openspec/changes/2026-05-26-phase-13-ts-agent-sdk-adapters/`.\n *\n * **Telemetry containment.** Every processor method is wrapped — a\n * translation failure must never bubble back into the customer's\n * Runner.run().\n */\n\nimport { summarizeToolInput, summarizeToolOutput } from \"../_agent-sdk-common/redaction\";\nimport {\n emitAgentSpan,\n emitLlmSpan,\n emitSubagentSpan,\n emitToolSpan,\n} from \"../_agent-sdk-common/span-emitter\";\nimport { calculateCost } from \"../_internal/pricing\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { report } from \"../_internal/diagnostics\";\n\nconst ADAPTER = \"openai-agents\" as const;\n\n/**\n * Structural shape of a span passed to the processor. We avoid importing\n * the real SDK types so this file builds without `@openai/agents` installed.\n */\nexport interface OpenAISpanLike {\n spanId?: string;\n parentId?: string;\n traceId?: string;\n spanData?: {\n type?: string;\n name?: string;\n model?: string;\n input?: unknown;\n output?: unknown;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n prompt_tokens?: number;\n completion_tokens?: number;\n [k: string]: unknown;\n };\n // handoff\n from_agent?: string;\n to_agent?: string;\n // guardrail\n passed?: boolean;\n reason?: string;\n [k: string]: unknown;\n };\n error?: unknown;\n [k: string]: unknown;\n}\n\nexport interface OpenAITraceLike {\n traceId?: string;\n name?: string;\n [k: string]: unknown;\n}\n\nexport interface MorseTraceProcessorOptions {\n toolInputMaxBytes?: number;\n toolOutputMaxBytes?: number;\n}\n\nfunction safe<T>(fn: () => T): T | undefined {\n try {\n return fn();\n } catch {\n return undefined;\n }\n}\n\n/**\n * Translate OpenAI Agents SDK spans into Morse spans.\n *\n * Pass to the SDK via `addTraceProcessor(new MorseTraceProcessor())`\n * (or via `wrapRunnerWithFullInstrumentation` which installs it for you).\n *\n * The processor is idempotent: registering the same instance twice is\n * harmless. Multiple instances can coexist (each will translate spans\n * independently — useful if you need to fan out to several backends).\n */\nexport class MorseTraceProcessor {\n private readonly options: MorseTraceProcessorOptions;\n private readonly openSpans = new Map<string, SpanHandle>();\n /**\n * MHQ-787: `'response'`-type spans (the SDK's default Responses-API path)\n * carry a `response_id` but no `model`/`usage` of their own — that data\n * only becomes available on `Runner.run()`'s resolved result\n * (`result.rawResponses`), which arrives AFTER `onSpanEnd` already fired.\n * Keep already-closed response spans around, keyed by `response_id`, so\n * `enrichFromRunResult()` can patch them in place once the real usage\n * data is available. Spans stay mutable (their span-tree object isn't\n * exported until the outer trace closes), so a late patch still lands.\n */\n private readonly closedResponseSpans = new Map<string, SpanHandle>();\n\n constructor(options: MorseTraceProcessorOptions = {}) {\n this.options = options;\n }\n\n /**\n * MHQ-787: called by `wrapRunnerWithFullInstrumentation` after each\n * `Runner.run()` resolves. Matches `rawResponses[].responseId` back to\n * the `'response'`-type span it belongs to and fills in the model/usage/\n * cost fields `onSpanEnd` couldn't populate at the time. `fallbackModel`\n * is the model configured on the `Agent` (known at call time in\n * `runner-wrapper.ts`) — used only when the span still has no model.\n * Never throws; a translation failure must not surface to the caller.\n */\n enrichFromRunResult(\n rawResponses: Array<{\n responseId?: string;\n usage?: { inputTokens?: number; outputTokens?: number; totalTokens?: number };\n // MHQ-926: the model actually served. `@openai/agents` does not surface\n // it as `raw.model` — it sits under `providerData`, straight off the\n // Responses API payload.\n providerData?: { model?: string; [k: string]: unknown };\n }>,\n fallbackModel?: string,\n ): void {\n safe(() => {\n for (const raw of rawResponses) {\n if (typeof raw.responseId !== \"string\") continue;\n const handle = this.closedResponseSpans.get(raw.responseId);\n if (!handle) continue;\n this.closedResponseSpans.delete(raw.responseId);\n\n // MHQ-926: prefer the model the provider actually served over the one\n // configured on the Agent. `new Agent({ name, instructions })` leaves\n // `agent.model` as the EMPTY STRING when the caller relies on the SDK\n // default — falsy, so `fallbackModel` contributed nothing and the span\n // stayed `model: \"unknown\"`, which made `calculateCost` return\n // undefined and every openai-agents llm span land with a null\n // `cost_usd`. Relying on the SDK's default model is the common case,\n // so this was not an edge case.\n //\n // `providerData.model` is also strictly better than the configured\n // value even when one is set: it is the dated id that was billed\n // (`gpt-5.4-mini-2026-03-17`), and the pricing table normalises dated\n // ids back to their base entry.\n const servedModel =\n typeof raw.providerData?.model === \"string\" && raw.providerData.model.length > 0\n ? raw.providerData.model\n : undefined;\n if (!handle.span.model || handle.span.model === \"unknown\") {\n const resolved = servedModel ?? fallbackModel;\n if (resolved) handle.span.model = resolved;\n }\n\n const u = raw.usage;\n if (u) {\n if (typeof u.inputTokens === \"number\") handle.span.input_tokens = u.inputTokens;\n if (typeof u.outputTokens === \"number\") handle.span.output_tokens = u.outputTokens;\n if (typeof u.totalTokens === \"number\") {\n handle.span.total_tokens = u.totalTokens;\n } else if (\n handle.span.input_tokens !== undefined &&\n handle.span.output_tokens !== undefined\n ) {\n handle.span.total_tokens = handle.span.input_tokens + handle.span.output_tokens;\n }\n }\n\n if (\n handle.span.cost_usd === undefined &&\n handle.span.model &&\n handle.span.model !== \"unknown\" &&\n (handle.span.input_tokens !== undefined || handle.span.output_tokens !== undefined)\n ) {\n const cost = calculateCost({\n inputTokens: handle.span.input_tokens ?? 0,\n outputTokens: handle.span.output_tokens ?? 0,\n model: handle.span.model,\n });\n if (cost !== undefined) handle.span.cost_usd = cost;\n }\n }\n });\n }\n\n /* -- TraceProcessor surface ---------------------------------------- */\n\n onTraceStart(_trace: OpenAITraceLike): void {\n // No-op: `wrapRunnerWithFullInstrumentation`'s outer `wrapRunner`\n // call already opens an agent span for the run. The SDK's trace\n // boundary is informational.\n void _trace;\n }\n\n onTraceEnd(_trace: OpenAITraceLike): void {\n void _trace;\n }\n\n onSpanStart(span: OpenAISpanLike): void {\n safe(() => {\n const handle = this.openSpanFor(span);\n if (handle && span.spanId) {\n this.openSpans.set(span.spanId, handle);\n }\n });\n }\n\n onSpanEnd(span: OpenAISpanLike): void {\n safe(() => {\n if (!span.spanId) return;\n const handle = this.openSpans.get(span.spanId);\n if (!handle) return;\n this.openSpans.delete(span.spanId);\n this.populateSpanFromData(handle, span);\n\n const d = span.spanData;\n if (d?.type === \"response\" && typeof d.response_id === \"string\" && d.response_id.length > 0) {\n this.closedResponseSpans.set(d.response_id, handle);\n }\n if (d?.type === \"guardrail\" && d.passed === false) {\n safeEnd(handle, new Error(`guardrail failed: ${d.reason ?? \"no reason\"}`));\n return;\n }\n if (span.error) {\n safeEnd(handle, new Error(String(span.error)));\n return;\n }\n safeEnd(handle);\n });\n }\n\n async shutdown(): Promise<void> {\n // Close any still-open spans (the customer's process is exiting).\n for (const [, handle] of this.openSpans) {\n safeEnd(handle, new Error(\"morse: processor shutdown before span ended\"));\n }\n this.openSpans.clear();\n this.closedResponseSpans.clear();\n }\n\n async forceFlush(): Promise<void> {\n // No internal buffer — flushing is the underlying SDK's responsibility.\n }\n\n /* -- Internals ------------------------------------------------------ */\n\n private openSpanFor(span: OpenAISpanLike): SpanHandle | null {\n const d = span.spanData ?? {};\n const type = typeof d.type === \"string\" ? d.type : \"\";\n const name = typeof d.name === \"string\" && d.name.length > 0 ? d.name : undefined;\n\n switch (type) {\n case \"agent\":\n return emitAgentSpan({\n adapter: ADAPTER,\n agentName: name ?? \"openai-agent\",\n });\n\n case \"generation\":\n case \"response\": {\n // Model + usage are typically only known at end; populate from\n // openSpanFor for what we have now, fill the rest in populateSpanFromData.\n const model = typeof d.model === \"string\" && d.model.length > 0 ? d.model : \"unknown\";\n return emitLlmSpan({ adapter: ADAPTER, model });\n }\n\n case \"function\": {\n const inputOpts = this.options.toolInputMaxBytes\n ? { maxBytes: this.options.toolInputMaxBytes }\n : undefined;\n return emitToolSpan({\n adapter: ADAPTER,\n toolName: name ?? \"function\",\n inputSummary: d.input !== undefined ? summarizeToolInput(d.input, inputOpts) : undefined,\n });\n }\n\n case \"handoff\":\n return emitSubagentSpan({\n adapter: ADAPTER,\n parentAgentName: typeof d.from_agent === \"string\" ? d.from_agent : \"unknown\",\n subagentName: typeof d.to_agent === \"string\" ? d.to_agent : (name ?? \"unknown\"),\n taskDescription: typeof d.reason === \"string\" ? d.reason : undefined,\n });\n\n case \"guardrail\": {\n const handle = emitToolSpan({\n adapter: ADAPTER,\n toolName: `guardrail.${name ?? \"anon\"}`,\n });\n if (handle) {\n handle.span.metadata = {\n ...(handle.span.metadata ?? {}),\n tool_kind: \"guardrail\",\n guardrail: {\n name: name ?? \"anon\",\n passed: d.passed,\n ...(typeof d.reason === \"string\" ? { reason: d.reason } : {}),\n },\n };\n }\n return handle;\n }\n\n case \"mcp_list_tools\":\n return emitToolSpan({\n adapter: ADAPTER,\n toolName: `mcp.list_tools.${name ?? \"anon\"}`,\n });\n\n case \"custom\":\n // Custom spans are user-defined; pass through as a generic tool span\n // so they appear in the trace without us guessing semantics.\n return emitToolSpan({\n adapter: ADAPTER,\n toolName: `custom.${name ?? \"anon\"}`,\n });\n\n default:\n // Unknown type — emit a tool span tagged with the raw type so we\n // can spot SDK additions in the dashboard rather than silently dropping.\n return emitToolSpan({\n adapter: ADAPTER,\n toolName: `${type || \"unknown\"}.${name ?? \"anon\"}`,\n });\n }\n }\n\n private populateSpanFromData(handle: SpanHandle, span: OpenAISpanLike): void {\n const d = span.spanData;\n if (!d) return;\n\n if (typeof d.model === \"string\" && d.model.length > 0) {\n handle.span.model = d.model;\n }\n\n const u = d.usage;\n if (u) {\n const input = u.input_tokens ?? u.prompt_tokens;\n const output = u.output_tokens ?? u.completion_tokens;\n const total = u.total_tokens;\n if (typeof input === \"number\") handle.span.input_tokens = input;\n if (typeof output === \"number\") handle.span.output_tokens = output;\n if (typeof total === \"number\") {\n handle.span.total_tokens = total;\n } else if (typeof input === \"number\" && typeof output === \"number\") {\n handle.span.total_tokens = input + output;\n }\n }\n\n if (d.output !== undefined) {\n const outputOpts = this.options.toolOutputMaxBytes\n ? { maxBytes: this.options.toolOutputMaxBytes }\n : undefined;\n handle.span.metadata = {\n ...(handle.span.metadata ?? {}),\n tool_output_summary: summarizeToolOutput(d.output, outputOpts),\n };\n }\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Module loader — best-effort registration with the real SDK */\n/* ------------------------------------------------------------------------ */\n\nexport interface AgentsModuleLike {\n addTraceProcessor?(processor: unknown): void;\n setTraceProcessors?(processors: unknown[]): void;\n}\n\n/**\n * Best-effort installation of an MorseTraceProcessor with the real\n * `@openai/agents` SDK. Returns true if installation succeeded.\n *\n * Loads the module via runtime-eval'd dynamic import so the SDK is a\n * pure optional peer dep — bundlers won't try to resolve it at build\n * time when the customer hasn't installed it.\n *\n * Idempotent at the registration level: the SDK's `addTraceProcessor`\n * appends to a list, so calling this twice will install two processors.\n * Production callers should call once at app bootstrap.\n */\nexport async function installMorseTraceProcessor(\n options?: MorseTraceProcessorOptions,\n): Promise<{ installed: boolean; processor: MorseTraceProcessor | null }> {\n const processor = new MorseTraceProcessor(options);\n let mod: AgentsModuleLike | null = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dynamicImport = Function(\"m\", \"return import(m)\") as any as (\n m: string,\n ) => Promise<AgentsModuleLike>;\n mod = await dynamicImport(\"@openai/agents\");\n } catch {\n return { installed: false, processor: null };\n }\n try {\n if (typeof mod?.addTraceProcessor === \"function\") {\n mod.addTraceProcessor(processor);\n return { installed: true, processor };\n }\n } catch {\n // fall through\n }\n return { installed: false, processor: null };\n}\n\nfunction safeEnd(handle: SpanHandle, err?: unknown): void {\n try {\n if (err !== undefined) {\n handle.end(err);\n } else {\n handle.end();\n }\n } catch (err) {\n /* never propagate */\n reportSwallowed(err, \"morse.openai_agents.trace_processor\");\n }\n}\n\n/**\n * Route a swallowed internal error to the diagnostics channel (SDKDIAG-07).\n *\n * Control flow is unchanged — the site still swallows, still returns the same\n * value. It is simply no longer invisible to us.\n */\nfunction reportSwallowed(err: unknown, fingerprint: string): void {\n try {\n report(err, { fingerprint });\n } catch {\n // Reporting must never break the swallow it is reporting on.\n }\n}\n","/**\n * `@morsehq-dev/sdk/openai-agents` — adapter for `@openai/agents`.\n *\n * Wave 3-O composes the W2-O surfaces (`runner-wrapper`, `llm-and-tool`,\n * `handoff`, `guardrail`) into a single public entry point.\n *\n * Two usage modes:\n *\n * 1. **Granular** — import any of the four installers individually and\n * compose them yourself (`wrapRunner`, `installLlmAndToolInstrumentation`,\n * `installHandoffInstrumentation`, `installGuardrailInstrumentation`).\n *\n * 2. **Full convenience** — call `wrapRunnerWithFullInstrumentation(runner)`\n * to get an outer-span-wrapped Runner with llm + tool + handoff +\n * guardrail event listeners pre-installed, plus a single `dispose()`\n * that unsubscribes all three event installers.\n *\n * See `openspec/changes/2026-05-26-phase-13-ts-agent-sdk-adapters/`.\n */\n\nimport { wrapRunner } from \"./runner-wrapper\";\nimport { installLlmAndToolInstrumentation } from \"./llm-and-tool\";\nimport { installHandoffInstrumentation } from \"./handoff\";\nimport { installGuardrailInstrumentation } from \"./guardrail\";\nimport { MorseTraceProcessor, installMorseTraceProcessor } from \"./trace-processor\";\n\nimport type { RunnerLike } from \"./types\";\n\nexport type {\n AgentLike,\n OpenAIAgentsModuleLike,\n RunResultLike,\n RunnerEventLike,\n RunnerLike,\n} from \"./types\";\n\nexport {\n instrumentOpenAIAgents,\n isOpenAIAgentsWrapped,\n uninstallOpenAIAgents,\n wrapRunner,\n} from \"./runner-wrapper\";\nexport { installLlmAndToolInstrumentation } from \"./llm-and-tool\";\nexport { installHandoffInstrumentation } from \"./handoff\";\nexport { installGuardrailInstrumentation } from \"./guardrail\";\nexport { MorseTraceProcessor, installMorseTraceProcessor } from \"./trace-processor\";\nexport type {\n MorseTraceProcessorOptions,\n AgentsModuleLike,\n OpenAISpanLike,\n OpenAITraceLike,\n} from \"./trace-processor\";\n\n/* ------------------------------------------------------------------------ */\n/* Composed convenience installer */\n/* ------------------------------------------------------------------------ */\n\nexport interface FullOpenAIInstrumentationOptions {\n /** Override the agent name on the outer span when `agent.name` is absent. */\n defaultAgentName?: string;\n /** Max bytes for serialized tool input summary. */\n toolInputMaxBytes?: number;\n /** Max bytes for serialized tool output summary. */\n toolOutputMaxBytes?: number;\n}\n\n/**\n * Wrap an OpenAI Agents `Runner` with the full instrumentation stack:\n *\n * 1. Outer `agent` span via `wrapRunner` (provides the trace context).\n * 2. SDK-native span translation via `MorseTraceProcessor`\n * registered through the SDK's `addTraceProcessor()` pipeline —\n * catches `agent` / `response` / `generation` / `function` /\n * `handoff` / `guardrail` / `mcp_list_tools` / `custom` spans.\n * 3. Legacy event-listener installers (`installLlmAndToolInstrumentation`,\n * `installHandoffInstrumentation`, `installGuardrailInstrumentation`)\n * remain wired as no-ops when the real SDK doesn't expose a\n * `runner.on()` channel — they only fire against the mock fixture\n * in unit tests. Real-SDK usage flows through the TraceProcessor.\n *\n * Returns the wrapped runner and a single `dispose()` that unsubscribes\n * the legacy event installers. The TraceProcessor stays registered for\n * the lifetime of the process — the SDK's `addTraceProcessor` API has no\n * symmetric `removeTraceProcessor` (you'd have to `setTraceProcessors([])`\n * which would nuke any other processors too).\n *\n * Telemetry failures NEVER propagate to the host — every emission path\n * is wrapped in `absorbErrorsSync` upstream.\n */\nexport function wrapRunnerWithFullInstrumentation<R extends RunnerLike>(\n runner: R,\n options: FullOpenAIInstrumentationOptions = {},\n): { runner: R; dispose: () => void } {\n // Fire-and-forget: install the TraceProcessor with the real SDK if it's\n // resolvable. Failure is silent (e.g., the customer is running tests\n // with a mocked SDK, or hasn't installed `@openai/agents` at all).\n // Declared before `wrapRunner` below so `onRunResult` can close over it —\n // by the time a real run() resolves (a live model round trip), this\n // fire-and-forget install has virtually always finished; if it somehow\n // hasn't, enrichment is just skipped for that run (never throws).\n let installedProcessor: MorseTraceProcessor | null = null;\n\n const wrapped = wrapRunner(runner, {\n defaultAgentName: options.defaultAgentName,\n // MHQ-787: the SDK's own tracing spans for the Responses-API path\n // carry no model/usage — only the resolved RunResult does. Patch\n // already-closed LLM spans once we have it.\n onRunResult: (result, model) => {\n const rawResponses = (result as { rawResponses?: unknown }).rawResponses;\n if (installedProcessor && Array.isArray(rawResponses)) {\n installedProcessor.enrichFromRunResult(\n rawResponses as Parameters<MorseTraceProcessor[\"enrichFromRunResult\"]>[0],\n model,\n );\n }\n },\n });\n\n const llmAndToolOpts: {\n toolInputMaxBytes?: number;\n toolOutputMaxBytes?: number;\n } = {};\n if (options.toolInputMaxBytes !== undefined) {\n llmAndToolOpts.toolInputMaxBytes = options.toolInputMaxBytes;\n }\n if (options.toolOutputMaxBytes !== undefined) {\n llmAndToolOpts.toolOutputMaxBytes = options.toolOutputMaxBytes;\n }\n\n const offLlmTool = installLlmAndToolInstrumentation(wrapped, llmAndToolOpts);\n const offHandoff = installHandoffInstrumentation(wrapped);\n const offGuardrail = installGuardrailInstrumentation(wrapped);\n\n void installMorseTraceProcessor(llmAndToolOpts).then((result) => {\n if (result.installed) {\n installedProcessor = result.processor;\n }\n });\n\n let disposed = false;\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n try {\n offLlmTool();\n } catch {\n /* telemetry must never throw at the caller */\n }\n try {\n offHandoff();\n } catch {\n /* telemetry must never throw at the caller */\n }\n try {\n offGuardrail();\n } catch {\n /* telemetry must never throw at the caller */\n }\n // Best-effort: drain any in-flight spans the processor still holds.\n if (installedProcessor) {\n try {\n void installedProcessor.shutdown();\n } catch {\n /* never propagate */\n }\n }\n };\n\n return { runner: wrapped, dispose };\n}\n"]}
1
+ {"version":3,"sources":["../../src/openai-agents/runner-wrapper.ts","../../src/openai-agents/llm-and-tool.ts","../../src/openai-agents/handoff.ts","../../src/openai-agents/guardrail.ts","../../src/openai-agents/trace-processor.ts","../../src/openai-agents/index.ts"],"names":["opts","ADAPTER","err"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * `@morsehq-dev/sdk/openai-agents` — OpenAI Agents SDK runner wrapper.\n *\n * This module implements ONLY the outer-span (agent) instrumentation around\n * `Runner.run()`. Sibling files (`llm-and-tool.ts`, `handoff.ts`,\n * `guardrail.ts`) layer the inner llm / tool / handoff / guardrail spans;\n * Wave 3-O composes them via `src/openai-agents/index.ts`.\n *\n * Two entry points (mirroring `src/anthropic-agent-sdk/client-wrapper.ts`):\n *\n * - `wrapRunner(runner)` — returns a Proxy that intercepts `run()` and\n * opens an outer `agent` span around the returned Promise. The rest of\n * the runner surface (`on`, `off`, anything else) is forwarded.\n *\n * - `instrumentOpenAIAgents(runnerOrOptions, options?)` — two-mode\n * installer. With a runner, equivalent to `wrapRunner`. With\n * `{ openaiAgentsModule }`, best-effort patches\n * `Runner.prototype.run`. Always returns the wrapped runner or a\n * boolean; never throws.\n *\n * All telemetry paths are wrapped in `absorbErrors*` — a tracing failure\n * MUST NEVER break the customer's `run()`.\n */\n\nimport { absorbErrorsAsync, absorbErrorsSync } from \"../_internal/errors\";\nimport { adoptThreadId, getActiveTraceState, runAsync as _runAsync } from \"../_internal/tracing\";\nimport { emitAgentSpan } from \"../_agent-sdk-common/span-emitter\";\n\nimport type { AgentLike, OpenAIAgentsModuleLike, RunResultLike, RunnerLike } from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Module-level install sentinels */\n/* ------------------------------------------------------------------------ */\n\nconst WRAPPED_RUNNER = Symbol.for(\"morse.openai-agents.wrapped\");\nconst INSTALL_SENTINEL = Symbol.for(\"morse.openai-agents.installed\");\nconst ORIGINALS_SENTINEL = Symbol.for(\"morse.openai-agents.originals\");\n\ninterface OriginalsBag {\n protoRun?: unknown;\n protoCarrier?: { prototype: { run: unknown } };\n}\n\ninterface InstalledModule {\n [INSTALL_SENTINEL]?: boolean;\n [ORIGINALS_SENTINEL]?: OriginalsBag;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------------ */\n\nexport interface WrapRunnerOptions {\n /** Override the agent name on the outer span when `agent.name` is absent. */\n defaultAgentName?: string;\n /**\n * MHQ-787: called with the resolved `RunResult` and the agent's\n * configured model after each `run()` succeeds, so callers can enrich\n * already-closed LLM spans with usage/model data that only becomes\n * available on the result (not on the SDK's own tracing spans). Never\n * called on a failed run. Errors from this callback are swallowed —\n * telemetry must never break the customer's `run()`.\n */\n onRunResult?: (result: RunResultLike, model: string | undefined) => void;\n}\n\n/**\n * Wrap a `Runner` so each `run()` call opens an outer `agent` span (via\n * `emitAgentSpan` from `_agent-sdk-common`). The Proxy forwards the rest\n * of the runner surface (event subscription via `on`/`off`, etc.) so\n * customers see no behavior change. Idempotent.\n *\n * THIS WRAPPER ONLY HANDLES THE OUTER AGENT SPAN. llm / tool / handoff /\n * guardrail spans are layered by sibling files (W2-O.2/.3/.4) and composed\n * via `src/openai-agents/index.ts` in Wave 3-O.\n */\nexport function wrapRunner<R extends RunnerLike>(runner: R, options: WrapRunnerOptions = {}): R {\n if (!runner || typeof runner !== \"object\") return runner;\n if ((runner as Record<string | symbol, unknown>)[WRAPPED_RUNNER]) return runner;\n\n const originalRun = runner.run?.bind(runner);\n if (typeof originalRun !== \"function\") return runner;\n\n const patchedRun = buildPatchedRun(\n originalRun as (\n agent: AgentLike,\n input: unknown,\n callOptions?: Record<string, unknown>,\n ) => Promise<RunResultLike>,\n options,\n );\n\n const wrapper = new Proxy(runner, {\n get(target, prop, receiver) {\n if (prop === WRAPPED_RUNNER) return true;\n if (prop === \"run\") return patchedRun;\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === \"function\") {\n return (value as (...a: unknown[]) => unknown).bind(target);\n }\n return value;\n },\n });\n\n return wrapper as R;\n}\n\nexport interface InstrumentOpenAIAgentsOptions extends WrapRunnerOptions {\n openaiAgentsModule?: unknown;\n}\n\ntype InstrumentRunnerArg = RunnerLike | InstrumentOpenAIAgentsOptions | undefined;\n\n/**\n * Top-level installer. Two modes:\n *\n * - `instrumentOpenAIAgents(runner)` — equivalent to `wrapRunner(runner)`.\n * - `instrumentOpenAIAgents({ openaiAgentsModule: mod })` — best-effort\n * prototype patch on `Runner.prototype.run`. Prefer the wrap form when\n * possible.\n *\n * Always returns the wrapped runner, `true`/`false` for the module path, or\n * `undefined` on absorbed error. Never throws.\n */\nexport const instrumentOpenAIAgents: (\n runnerOrOptions?: InstrumentRunnerArg,\n maybeOptions?: WrapRunnerOptions,\n) => Promise<unknown> = absorbErrorsAsync(\n async (\n runnerOrOptions: InstrumentRunnerArg = undefined,\n maybeOptions: WrapRunnerOptions = {},\n ): Promise<unknown> => {\n if (runnerOrOptions && isRunner(runnerOrOptions)) {\n const opts = maybeOptions ?? {};\n return wrapRunner(runnerOrOptions, opts);\n }\n const opts = (runnerOrOptions as InstrumentOpenAIAgentsOptions | undefined) ?? {};\n const mod = await loadOpenAIAgentsModule(opts.openaiAgentsModule);\n if (!mod) return false;\n const installed = (mod as InstalledModule)[INSTALL_SENTINEL] === true;\n if (installed) return true;\n\n const carrier = findRunnerPrototypeCarrier(mod);\n if (!carrier) return false;\n const originalRun = carrier.prototype.run;\n if (typeof originalRun !== \"function\") return false;\n\n const patchedRun = buildPatchedRun(function (\n this: unknown,\n agent: AgentLike,\n input: unknown,\n callOptions?: Record<string, unknown>,\n ) {\n return (originalRun as (...args: unknown[]) => Promise<RunResultLike>).call(\n this,\n agent,\n input,\n callOptions,\n );\n }, opts);\n carrier.prototype.run = patchedRun as unknown as typeof carrier.prototype.run;\n (mod as InstalledModule)[ORIGINALS_SENTINEL] = {\n protoRun: originalRun,\n protoCarrier: carrier,\n };\n (mod as InstalledModule)[INSTALL_SENTINEL] = true;\n return true;\n },\n { fingerprint: \"morse.adapters.openai-agents.install\" },\n);\n\n/**\n * Restore the prototype patch and clear the install sentinel. Pass the same\n * module reference given to `instrumentOpenAIAgents`. No-op when called with\n * no module or on a wrapped-runner (vs. module) install — just discard the\n * wrapper.\n */\nexport const uninstallOpenAIAgents: (openaiAgentsModule?: unknown) => void = absorbErrorsSync(\n (openaiAgentsModule?: unknown): void => {\n if (!openaiAgentsModule || typeof openaiAgentsModule !== \"object\") return;\n const mod = openaiAgentsModule as InstalledModule;\n if (!mod[INSTALL_SENTINEL]) return;\n const originals = mod[ORIGINALS_SENTINEL];\n if (originals?.protoCarrier && originals.protoRun !== undefined) {\n originals.protoCarrier.prototype.run =\n originals.protoRun as typeof originals.protoCarrier.prototype.run;\n }\n mod[ORIGINALS_SENTINEL] = undefined;\n mod[INSTALL_SENTINEL] = false;\n },\n { fingerprint: \"morse.adapters.openai-agents.uninstall\" },\n) as (openaiAgentsModule?: unknown) => void;\n\n/** True when a wrapped OpenAI Agents `Runner` is passed in. */\nexport function isOpenAIAgentsWrapped(runner: unknown): boolean {\n if (!runner || typeof runner !== \"object\") return false;\n return (runner as Record<string | symbol, unknown>)[WRAPPED_RUNNER] === true;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Internals — module discovery */\n/* ------------------------------------------------------------------------ */\n\nfunction isRunner(x: unknown): x is RunnerLike {\n if (!x || typeof x !== \"object\") return false;\n const r = (x as { run?: unknown }).run;\n return typeof r === \"function\";\n}\n\nasync function loadOpenAIAgentsModule(explicit?: unknown): Promise<unknown | null> {\n if (explicit && typeof explicit === \"object\") return explicit;\n try {\n // Function-eval'd dynamic import keeps bundlers from trying to resolve\n // `@openai/agents` at build time when the dep isn't installed.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return await (Function(\"m\", \"return import(m)\") as any)(\"@openai/agents\");\n } catch {\n return null;\n }\n}\n\n/**\n * Locate `Runner.prototype` on the OpenAI Agents module. The SDK exposes\n * the class at slightly different paths across versions; try the most\n * common shapes.\n */\nfunction findRunnerPrototypeCarrier(mod: unknown): { prototype: { run: unknown } } | null {\n if (!mod || typeof mod !== \"object\") return null;\n const m = mod as OpenAIAgentsModuleLike & Record<string, unknown>;\n const candidates: unknown[] = [m.Runner, (m.default as { Runner?: unknown } | undefined)?.Runner];\n for (const c of candidates) {\n if (\n c &&\n typeof c === \"function\" &&\n (c as { prototype?: { run?: unknown } }).prototype &&\n typeof (c as { prototype: { run?: unknown } }).prototype.run === \"function\"\n ) {\n return c as { prototype: { run: unknown } };\n }\n }\n return null;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Internals — wrapper that opens the outer `agent` span */\n/* ------------------------------------------------------------------------ */\n\nfunction stringifyModel(m: AgentLike[\"model\"]): string | undefined {\n if (typeof m === \"string\" && m.length > 0) return m;\n if (m && typeof m === \"object\" && typeof m.id === \"string\" && m.id.length > 0) return m.id;\n return undefined;\n}\n\n/**\n * Find the conversation identity for one `run()` call, or undefined. (MHQ-1029)\n *\n * Checked in order of how explicit the signal is:\n *\n * 1. `session` — the Agents SDK's own multi-turn primitive.\n * 2. `conversationId` — the OpenAI Conversations API thread.\n * 3. `context` — the app's run context. ChatKit hangs the thread off\n * `context.thread.id` (`thr_…`); apps that roll their own context usually\n * name the field `threadId`/`sessionId`/`conversationId`. This is the case\n * the Python ticket was filed for: the app's only integration is the SDK's\n * auto-install, so the id comes off the context or not at all.\n *\n * Every read can run customer getter code, hence the blanket guard.\n */\nfunction resolveThreadId(callOptions: Record<string, unknown> | undefined): unknown {\n if (!callOptions) return undefined;\n try {\n const session = callOptions.session as\n | { sessionId?: unknown; session_id?: unknown }\n | undefined;\n if (session) {\n const sid = session.sessionId ?? session.session_id;\n if (sid) return sid;\n }\n if (callOptions.conversationId) return callOptions.conversationId;\n const ctx = callOptions.context as Record<string, unknown> | undefined;\n if (!ctx || typeof ctx !== \"object\") return undefined;\n const threadPk = (ctx.thread as { id?: unknown } | undefined)?.id;\n if (threadPk) return threadPk;\n for (const key of [\"threadId\", \"thread_id\", \"sessionId\", \"session_id\", \"conversationId\"]) {\n if (ctx[key]) return ctx[key];\n }\n } catch {\n /* telemetry must never throw at the caller */\n }\n return undefined;\n}\n\nfunction buildPatchedRun(\n original: (\n agent: AgentLike,\n input: unknown,\n callOptions?: Record<string, unknown>,\n ) => Promise<RunResultLike>,\n options: WrapRunnerOptions,\n): (\n agent: AgentLike,\n input: unknown,\n callOptions?: Record<string, unknown>,\n) => Promise<RunResultLike> {\n return function patchedRun(\n this: unknown,\n agent: AgentLike,\n input: unknown,\n callOptions?: Record<string, unknown>,\n ): Promise<RunResultLike> {\n const boundOriginal = (\n a: AgentLike,\n i: unknown,\n o?: Record<string, unknown>,\n ): Promise<RunResultLike> => original.call(this, a, i, o);\n\n const agentName =\n (agent && typeof agent === \"object\" && typeof agent.name === \"string\" && agent.name.length > 0\n ? agent.name\n : undefined) ??\n options.defaultAgentName ??\n \"openai-agent\";\n const model = stringifyModel(agent?.model);\n\n const runWithSpan = async (): Promise<RunResultLike> => {\n adoptThreadId(resolveThreadId(callOptions));\n const handle = emitAgentSpan({\n adapter: \"openai-agents\",\n agentName,\n model,\n });\n try {\n const result = await boundOriginal(agent, input, callOptions);\n try {\n options.onRunResult?.(result, model);\n } catch {\n /* telemetry must never throw at the caller */\n }\n handle?.end();\n return result;\n } catch (err) {\n handle?.end(err);\n throw err;\n }\n };\n\n // If we're already inside an active trace, the agent span attaches as a\n // child of the existing root. Otherwise, open a fresh trace so the span\n // has a parent — without this, `emitAgentSpan` would no-op (return null)\n // and the customer would see no telemetry.\n if (getActiveTraceState() !== null) {\n return runWithSpan();\n }\n\n return (async (): Promise<RunResultLike> => {\n let captured: RunResultLike | undefined;\n let caughtErr: unknown;\n const runResult = await _runAsync({ agentName }, async (runHandle) => {\n try {\n captured = await runWithSpan();\n runHandle.setOutcome(true);\n return captured;\n } catch (err) {\n caughtErr = err;\n throw err;\n }\n }).catch((err) => {\n // _runAsync rethrows; capture so we can rethrow after the trace\n // flush completes. The trace is already finalized as failed by\n // _runAsync's catch path.\n if (caughtErr === undefined) caughtErr = err;\n return undefined;\n });\n\n if (caughtErr !== undefined) throw caughtErr;\n // `runResult` is the value returned by the inner fn (i.e. `captured`),\n // but prefer the captured local for type-safety.\n return (captured ?? runResult) as RunResultLike;\n })();\n };\n}\n","/**\n * `openai-agents/llm-and-tool.ts` — Phase 13 W2-O.2.\n *\n * Subscribes to the OpenAI Agents `Runner`'s event channel and emits `llm`\n * and `tool` spans for each `*_call_start` / `*_call_end` pair.\n *\n * The real `@openai/agents` Runner fires events on both typed channels\n * (e.g. `runner.on(\"llm_call_start\", ...)`) and a catch-all `\"event\"`\n * channel. We register on the typed channels only — the FakeRunner used\n * in tests mirrors that behaviour, and using typed-only avoids the\n * double-emit risk if a host has wired both.\n *\n * Call matching is FIFO via two per-installation stacks (one for llm,\n * one for tool). Within a single `Runner.run` the SDK does not interleave\n * calls, so FIFO is sufficient — and it tolerates orphan `_end` events\n * (no matching `_start`) by simply ignoring them.\n *\n * All span emission goes through the shared `_agent-sdk-common/span-emitter`\n * helpers which are themselves wrapped in `absorbErrorsSync` — telemetry\n * MUST NOT throw at the caller.\n *\n * MHQ-750: when the `llm_call_start` event carries `event.llm.messages`\n * (OpenAI-chat-completions-shaped, since `@openai/agents` is built on the\n * same request format), they're decomposed into `context_segments` via the\n * shared `_agent-sdk-common/context-decomposer` — the same decomposer used\n * by `../langgraph/` and `../langchain/`. `event.llm.messages` is optional\n * on the structural `RunnerEventLike` type; hosts that don't surface it\n * simply produce no `context_segments`, same as before this change.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport { calculateCost } from \"../_internal/pricing\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { emitLlmSpan, emitToolSpan } from \"../_agent-sdk-common/span-emitter\";\nimport { summarizeToolInput, summarizeToolOutput } from \"../_agent-sdk-common/redaction\";\nimport { decomposeOpenAiMessages } from \"../_agent-sdk-common/context-decomposer\";\nimport type { RunnerEventLike, RunnerLike } from \"./types\";\n\nconst ADAPTER = \"openai-agents\" as const;\n\nexport interface InstallLlmAndToolInstrumentationOptions {\n /** Max bytes for serialized tool input summary. Defaults to redaction helper's cap. */\n toolInputMaxBytes?: number;\n /** Max bytes for serialized tool output summary. Defaults to redaction helper's cap. */\n toolOutputMaxBytes?: number;\n}\n\n/**\n * Subscribe to the runner's event channel and emit `llm` and `tool` spans\n * for each `_call_start`/`_call_end` pair.\n *\n * Returns an unsubscribe function. If `runner.on` is not a function (e.g.\n * the host injected a mock), returns a no-op unsubscriber.\n */\nexport function installLlmAndToolInstrumentation(\n runner: RunnerLike,\n options?: InstallLlmAndToolInstrumentationOptions,\n): () => void {\n if (typeof runner?.on !== \"function\") {\n return () => {\n /* no-op */\n };\n }\n\n const opts = options ?? {};\n const llmStack: SpanHandle[] = [];\n const toolStack: SpanHandle[] = [];\n\n const onLlmStart = absorbErrorsSync(\n (event: RunnerEventLike): void => {\n const contextSegments = decomposeOpenAiMessages(event.llm?.messages, event.llm?.tools);\n const handle = emitLlmSpan({\n adapter: ADAPTER,\n model:\n typeof event.llm?.model === \"string\" && event.llm.model.length > 0\n ? event.llm.model\n : \"unknown\",\n provider: typeof event.llm?.provider === \"string\" ? event.llm.provider : undefined,\n contextSegments: contextSegments.length > 0 ? contextSegments : undefined,\n });\n if (handle !== null) llmStack.push(handle);\n },\n { fingerprint: \"morse.openai-agents.llm_call_start\" },\n );\n\n const onLlmEnd = absorbErrorsSync(\n (event: RunnerEventLike): void => {\n const handle = llmStack.shift();\n if (handle === undefined) return; // orphan _end, tolerate\n const usage = event.llm?.usage;\n if (usage !== undefined && usage !== null) {\n if (typeof usage.input_tokens === \"number\" && Number.isFinite(usage.input_tokens)) {\n handle.span.input_tokens = usage.input_tokens;\n }\n if (typeof usage.output_tokens === \"number\" && Number.isFinite(usage.output_tokens)) {\n handle.span.output_tokens = usage.output_tokens;\n }\n if (typeof usage.total_tokens === \"number\" && Number.isFinite(usage.total_tokens)) {\n handle.span.total_tokens = usage.total_tokens;\n } else if (\n handle.span.input_tokens !== undefined &&\n handle.span.output_tokens !== undefined\n ) {\n handle.span.total_tokens = handle.span.input_tokens + handle.span.output_tokens;\n }\n const cachedTokens =\n typeof usage.cached_tokens === \"number\" && Number.isFinite(usage.cached_tokens)\n ? usage.cached_tokens\n : 0;\n if (\n handle.span.cost_usd === undefined &&\n handle.span.model &&\n (handle.span.input_tokens !== undefined || handle.span.output_tokens !== undefined)\n ) {\n const cost = calculateCost({\n inputTokens: handle.span.input_tokens ?? 0,\n outputTokens: handle.span.output_tokens ?? 0,\n model: handle.span.model,\n cachedInputTokens: cachedTokens,\n });\n if (cost !== undefined) handle.span.cost_usd = cost;\n }\n }\n handle.end();\n },\n { fingerprint: \"morse.openai-agents.llm_call_end\" },\n );\n\n const onToolStart = absorbErrorsSync(\n (event: RunnerEventLike): void => {\n const toolName =\n typeof event.tool?.name === \"string\" && event.tool.name.length > 0\n ? event.tool.name\n : \"unknown\";\n const inputSummary = summarizeToolInput(\n event.tool?.input,\n opts.toolInputMaxBytes !== undefined ? { maxBytes: opts.toolInputMaxBytes } : undefined,\n );\n const handle = emitToolSpan({\n adapter: ADAPTER,\n toolName,\n inputSummary,\n });\n if (handle !== null) toolStack.push(handle);\n },\n { fingerprint: \"morse.openai-agents.tool_call_start\" },\n );\n\n const onToolEnd = absorbErrorsSync(\n (event: RunnerEventLike): void => {\n const handle = toolStack.shift();\n if (handle === undefined) return; // orphan _end, tolerate\n const outputSummary = summarizeToolOutput(\n event.tool?.output,\n opts.toolOutputMaxBytes !== undefined ? { maxBytes: opts.toolOutputMaxBytes } : undefined,\n );\n const success = typeof event.tool?.success === \"boolean\" ? event.tool.success : true;\n const metadata = (handle.span.metadata ?? {}) as Record<string, unknown>;\n const tool =\n metadata.tool !== undefined && metadata.tool !== null\n ? (metadata.tool as Record<string, unknown>)\n : {};\n tool.output_summary = outputSummary;\n tool.success = success;\n if (typeof event.tool?.duration_ms === \"number\" && Number.isFinite(event.tool.duration_ms)) {\n tool.duration_ms = event.tool.duration_ms;\n }\n metadata.tool = tool;\n metadata.tool_output_summary = outputSummary;\n handle.span.metadata = metadata;\n if (success === false) {\n handle.end(new Error(\"tool call reported failure\"));\n } else {\n handle.end();\n }\n },\n { fingerprint: \"morse.openai-agents.tool_call_end\" },\n );\n\n // Register on typed channels.\n runner.on(\"llm_call_start\", onLlmStart);\n runner.on(\"llm_call_end\", onLlmEnd);\n runner.on(\"tool_call_start\", onToolStart);\n runner.on(\"tool_call_end\", onToolEnd);\n\n let unsubscribed = false;\n return () => {\n if (unsubscribed) return;\n unsubscribed = true;\n if (typeof runner.off === \"function\") {\n runner.off(\"llm_call_start\", onLlmStart);\n runner.off(\"llm_call_end\", onLlmEnd);\n runner.off(\"tool_call_start\", onToolStart);\n runner.off(\"tool_call_end\", onToolEnd);\n }\n };\n}\n","/**\n * `openai-agents/handoff.ts` — OpenAI Agents SDK handoff-span instrumentation.\n *\n * Subscribes to the Runner's \"handoff\" event channel and emits TWO spans per\n * handoff, matching the Python adapter:\n *\n * 1. The routing decision — wire `type = \"handoff\"` (MHQ-1025), named\n * `from → to`, with `metadata.from_agent` / `metadata.to_agent` and\n * `metadata.handoff_reason` when present. This is the navigable, timestamped\n * node; before MHQ-1025 the decision itself had no span of its own.\n * 2. The handoff target — a `subagent.spawn`-shape span:\n *\n * - wire `type = \"agent\"`\n * - `metadata.spawn_kind = \"subagent\"`\n * - `metadata.parent_agent_name = handoff.from_agent`\n * - `metadata.subagent_name = handoff.to_agent`\n * - `metadata.handoff_from = handoff.from_agent` (alias for UI clarity)\n * - `metadata.askl_handoff_from = handoff.from_agent` — the key the server\n * reads to derive a HANDS_OFF_TO edge rather than a SPAWNS one\n * (`apps/api/apps/agents/selectors.py`); Python's adapter stamps the same.\n * - `metadata.task_description = handoff.reason` (via emitSubagentSpan)\n * - `metadata.handoff_reason = handoff.reason` (when present)\n *\n * The handoff event in the OpenAI Agents SDK is instantaneous — the to_agent's\n * subsequent work is captured by separate llm/tool spans (W2-O.2). Both spans\n * opened here are therefore closed immediately (duration_ms = 0).\n *\n * Errors emitted from inside the listener never propagate back to the runner —\n * `absorbErrorsSync` swallows them and `emitSubagentSpan` itself is wrapped.\n */\n\nimport { emitHandoffSpan, emitSubagentSpan } from \"../_agent-sdk-common/span-emitter\";\nimport { absorbErrorsSync } from \"../_internal/errors\";\n\nimport type { RunnerEventLike, RunnerLike } from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Listener */\n/* ------------------------------------------------------------------------ */\n\nconst _handleHandoffEvent = (event: RunnerEventLike): void => {\n if (event === null || typeof event !== \"object\") return;\n const handoff = event.handoff;\n if (!handoff || typeof handoff !== \"object\") return;\n const from = handoff.from_agent;\n const to = handoff.to_agent;\n if (typeof from !== \"string\" || from.length === 0) return;\n if (typeof to !== \"string\" || to.length === 0) return;\n const reason =\n typeof handoff.reason === \"string\" && handoff.reason.length > 0 ? handoff.reason : undefined;\n // 1. The routing decision itself, closed immediately — a handoff is an\n // instant, not an interval.\n emitHandoffSpan({\n adapter: \"openai-agents\",\n fromAgent: from,\n toAgent: to,\n reason,\n })?.end();\n // 2. The target agent, so it stays a node in the orchestration tree.\n const attributes: Record<string, unknown> = {\n handoff_from: from,\n askl_handoff_from: from,\n };\n if (reason !== undefined) attributes.handoff_reason = reason;\n const handle = emitSubagentSpan({\n adapter: \"openai-agents\",\n parentAgentName: from,\n subagentName: to,\n taskDescription: reason,\n attributes,\n });\n // The handoff event is instantaneous; close the span immediately so the\n // to_agent's subsequent work is captured as separate sibling spans (not\n // children of an open handoff span).\n handle?.end();\n};\n\nconst handleHandoffEvent: (event: RunnerEventLike) => void = absorbErrorsSync(_handleHandoffEvent, {\n fingerprint: \"morse.adapters.openai-agents.handoff.listener\",\n}) as (event: RunnerEventLike) => void;\n\n/* ------------------------------------------------------------------------ */\n/* Installer */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Subscribe to a Runner's \"handoff\" events and emit a `subagent.spawn`-shape\n * span for each. Returns an unsubscribe function. Safely no-ops when\n * `runner.on` is missing (e.g., a wrapped Runner without an event channel).\n */\nexport function installHandoffInstrumentation(runner: RunnerLike): () => void {\n if (runner === null || typeof runner !== \"object\") return () => {};\n if (typeof runner.on !== \"function\") return () => {};\n try {\n runner.on(\"handoff\", handleHandoffEvent);\n } catch {\n // Defensive: a misbehaving on() implementation must not break the caller.\n return () => {};\n }\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n try {\n runner.off?.(\"handoff\", handleHandoffEvent);\n } catch {\n // never propagate\n }\n };\n}\n","/**\n * `openai-agents/guardrail.ts` — W2-O.4\n *\n * Subscribes to the `Runner`'s `\"guardrail_check\"` event channel and emits\n * one guardrail-shaped span per check. Guardrails are wire-`tool` spans\n * tagged with `metadata.tool_kind=\"guardrail\"` so the dashboard can render\n * them distinctly from regular tool calls and hook spans.\n *\n * Spans close immediately on emission. When the guardrail reports\n * `passed === false`, the span closes with `failed` status and the\n * reason (when present) lands in both the synthetic error message and\n * `metadata.guardrail.reason`.\n *\n * Every emission is wrapped in `absorbErrorsSync` per the foundational\n * \"telemetry must never break the host\" guarantee.\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport { emitToolSpan } from \"../_agent-sdk-common/span-emitter\";\nimport type { RunnerEventLike, RunnerLike } from \"./types\";\n\n/* ------------------------------------------------------------------------ */\n/* Internal helpers */\n/* ------------------------------------------------------------------------ */\n\nconst _handleGuardrailEvent = (payload: RunnerEventLike): void => {\n const guardrail = payload?.guardrail;\n if (guardrail === undefined || guardrail === null || typeof guardrail !== \"object\") {\n return;\n }\n\n const name =\n typeof guardrail.name === \"string\" && guardrail.name.length > 0 ? guardrail.name : undefined;\n const passed = guardrail.passed === true;\n const reason =\n typeof guardrail.reason === \"string\" && guardrail.reason.length > 0\n ? guardrail.reason\n : undefined;\n\n const guardrailMeta: Record<string, unknown> = { passed };\n if (name !== undefined) guardrailMeta.name = name;\n if (reason !== undefined) guardrailMeta.reason = reason;\n\n const handle = emitToolSpan({\n adapter: \"openai-agents\",\n toolName: `guardrail.${name ?? \"anon\"}`,\n success: passed,\n });\n if (handle === null || handle === undefined) return;\n\n // Apply guardrail-specific metadata on top of what emitToolSpan set.\n handle.span.metadata = {\n ...(handle.span.metadata ?? {}),\n tool_kind: \"guardrail\",\n guardrail: guardrailMeta,\n };\n\n if (passed) {\n handle.end();\n } else {\n handle.end(new Error(`guardrail failed: ${reason ?? \"no reason\"}`));\n }\n};\n\nconst handleGuardrailEvent: (payload: RunnerEventLike) => void = absorbErrorsSync(\n _handleGuardrailEvent,\n { fingerprint: \"morse.openai-agents.guardrail.handle\" },\n) as (payload: RunnerEventLike) => void;\n\n/* ------------------------------------------------------------------------ */\n/* Public installer */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Subscribe to the runner's `\"guardrail_check\"` events. Emit one\n * tool-shape span per check:\n *\n * - wire `type = \"tool\"`\n * - `metadata.tool_kind = \"guardrail\"`\n * - `metadata.guardrail.passed: boolean`\n * - `metadata.guardrail.name: string` (when present)\n * - `metadata.guardrail.reason: string` (when present, typically on fail)\n *\n * On failure, the span closes with `failed` status. Returns an\n * unsubscribe function. No-op when `runner.on` is missing.\n */\nexport function installGuardrailInstrumentation(runner: RunnerLike): () => void {\n if (runner === null || typeof runner !== \"object\" || typeof runner.on !== \"function\") {\n return () => {\n /* no-op */\n };\n }\n\n const listener = (payload: RunnerEventLike): void => {\n handleGuardrailEvent(payload);\n };\n\n try {\n runner.on(\"guardrail_check\", listener);\n } catch {\n return () => {\n /* no-op */\n };\n }\n\n return (): void => {\n try {\n if (typeof runner.off === \"function\") {\n runner.off(\"guardrail_check\", listener);\n }\n } catch {\n /* swallow — telemetry must never throw at the caller */\n }\n };\n}\n","/**\n * `openai-agents/trace-processor.ts` — translate `@openai/agents` SDK spans\n * into Morse spans via the SDK's first-class TraceProcessor pipeline.\n *\n * The SDK exposes `addTraceProcessor(p)` / `setTraceProcessors([p])` where\n * `p` implements:\n *\n * - `onTraceStart(trace)`\n * - `onTraceEnd(trace)`\n * - `onSpanStart(span)`\n * - `onSpanEnd(span)`\n * - `shutdown()`\n * - `forceFlush()`\n *\n * Each `span` carries `span.spanId` + `span.spanData.{type,name,model,usage,...}`.\n * Span types observed in the SDK: `agent`, `response`, `generation`,\n * `function`, `handoff`, `guardrail`, `mcp_list_tools`, `custom`.\n *\n * **Why this exists.** The original W2-O surfaces in this directory\n * (llm-and-tool.ts, handoff.ts, guardrail.ts) listened to a hypothetical\n * `runner.on('llm_call_start', ...)` event channel that the real SDK\n * doesn't expose. Phase 13 Option A dogfood (commit 9e53731) confirmed\n * the old installers never fired. This TraceProcessor is the canonical\n * replacement — see `openspec/changes/2026-05-26-phase-13-ts-agent-sdk-adapters/`.\n *\n * **Telemetry containment.** Every processor method is wrapped — a\n * translation failure must never bubble back into the customer's\n * Runner.run().\n */\n\nimport { summarizeToolInput, summarizeToolOutput } from \"../_agent-sdk-common/redaction\";\nimport {\n emitAgentSpan,\n emitLlmSpan,\n emitSubagentSpan,\n emitToolSpan,\n} from \"../_agent-sdk-common/span-emitter\";\nimport { calculateCost } from \"../_internal/pricing\";\nimport type { SpanHandle } from \"../_internal/tracing\";\nimport { report } from \"../_internal/diagnostics\";\n\nconst ADAPTER = \"openai-agents\" as const;\n\n/**\n * Structural shape of a span passed to the processor. We avoid importing\n * the real SDK types so this file builds without `@openai/agents` installed.\n */\nexport interface OpenAISpanLike {\n spanId?: string;\n parentId?: string;\n traceId?: string;\n spanData?: {\n type?: string;\n name?: string;\n model?: string;\n input?: unknown;\n output?: unknown;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n prompt_tokens?: number;\n completion_tokens?: number;\n [k: string]: unknown;\n };\n // handoff\n from_agent?: string;\n to_agent?: string;\n // guardrail\n passed?: boolean;\n reason?: string;\n [k: string]: unknown;\n };\n error?: unknown;\n [k: string]: unknown;\n}\n\nexport interface OpenAITraceLike {\n traceId?: string;\n name?: string;\n [k: string]: unknown;\n}\n\nexport interface MorseTraceProcessorOptions {\n toolInputMaxBytes?: number;\n toolOutputMaxBytes?: number;\n}\n\nfunction safe<T>(fn: () => T): T | undefined {\n try {\n return fn();\n } catch {\n return undefined;\n }\n}\n\n/**\n * Translate OpenAI Agents SDK spans into Morse spans.\n *\n * Pass to the SDK via `addTraceProcessor(new MorseTraceProcessor())`\n * (or via `wrapRunnerWithFullInstrumentation` which installs it for you).\n *\n * The processor is idempotent: registering the same instance twice is\n * harmless. Multiple instances can coexist (each will translate spans\n * independently — useful if you need to fan out to several backends).\n */\nexport class MorseTraceProcessor {\n private readonly options: MorseTraceProcessorOptions;\n private readonly openSpans = new Map<string, SpanHandle>();\n /**\n * MHQ-787: `'response'`-type spans (the SDK's default Responses-API path)\n * carry a `response_id` but no `model`/`usage` of their own — that data\n * only becomes available on `Runner.run()`'s resolved result\n * (`result.rawResponses`), which arrives AFTER `onSpanEnd` already fired.\n * Keep already-closed response spans around, keyed by `response_id`, so\n * `enrichFromRunResult()` can patch them in place once the real usage\n * data is available. Spans stay mutable (their span-tree object isn't\n * exported until the outer trace closes), so a late patch still lands.\n */\n private readonly closedResponseSpans = new Map<string, SpanHandle>();\n\n constructor(options: MorseTraceProcessorOptions = {}) {\n this.options = options;\n }\n\n /**\n * MHQ-787: called by `wrapRunnerWithFullInstrumentation` after each\n * `Runner.run()` resolves. Matches `rawResponses[].responseId` back to\n * the `'response'`-type span it belongs to and fills in the model/usage/\n * cost fields `onSpanEnd` couldn't populate at the time. `fallbackModel`\n * is the model configured on the `Agent` (known at call time in\n * `runner-wrapper.ts`) — used only when the span still has no model.\n * Never throws; a translation failure must not surface to the caller.\n */\n enrichFromRunResult(\n rawResponses: Array<{\n responseId?: string;\n usage?: { inputTokens?: number; outputTokens?: number; totalTokens?: number };\n // MHQ-926: the model actually served. `@openai/agents` does not surface\n // it as `raw.model` — it sits under `providerData`, straight off the\n // Responses API payload.\n providerData?: { model?: string; [k: string]: unknown };\n }>,\n fallbackModel?: string,\n ): void {\n safe(() => {\n for (const raw of rawResponses) {\n if (typeof raw.responseId !== \"string\") continue;\n const handle = this.closedResponseSpans.get(raw.responseId);\n if (!handle) continue;\n this.closedResponseSpans.delete(raw.responseId);\n\n // MHQ-926: prefer the model the provider actually served over the one\n // configured on the Agent. `new Agent({ name, instructions })` leaves\n // `agent.model` as the EMPTY STRING when the caller relies on the SDK\n // default — falsy, so `fallbackModel` contributed nothing and the span\n // stayed `model: \"unknown\"`, which made `calculateCost` return\n // undefined and every openai-agents llm span land with a null\n // `cost_usd`. Relying on the SDK's default model is the common case,\n // so this was not an edge case.\n //\n // `providerData.model` is also strictly better than the configured\n // value even when one is set: it is the dated id that was billed\n // (`gpt-5.4-mini-2026-03-17`), and the pricing table normalises dated\n // ids back to their base entry.\n const servedModel =\n typeof raw.providerData?.model === \"string\" && raw.providerData.model.length > 0\n ? raw.providerData.model\n : undefined;\n if (!handle.span.model || handle.span.model === \"unknown\") {\n const resolved = servedModel ?? fallbackModel;\n if (resolved) handle.span.model = resolved;\n }\n\n const u = raw.usage;\n if (u) {\n if (typeof u.inputTokens === \"number\") handle.span.input_tokens = u.inputTokens;\n if (typeof u.outputTokens === \"number\") handle.span.output_tokens = u.outputTokens;\n if (typeof u.totalTokens === \"number\") {\n handle.span.total_tokens = u.totalTokens;\n } else if (\n handle.span.input_tokens !== undefined &&\n handle.span.output_tokens !== undefined\n ) {\n handle.span.total_tokens = handle.span.input_tokens + handle.span.output_tokens;\n }\n }\n\n if (\n handle.span.cost_usd === undefined &&\n handle.span.model &&\n handle.span.model !== \"unknown\" &&\n (handle.span.input_tokens !== undefined || handle.span.output_tokens !== undefined)\n ) {\n const cost = calculateCost({\n inputTokens: handle.span.input_tokens ?? 0,\n outputTokens: handle.span.output_tokens ?? 0,\n model: handle.span.model,\n });\n if (cost !== undefined) handle.span.cost_usd = cost;\n }\n }\n });\n }\n\n /* -- TraceProcessor surface ---------------------------------------- */\n\n onTraceStart(_trace: OpenAITraceLike): void {\n // No-op: `wrapRunnerWithFullInstrumentation`'s outer `wrapRunner`\n // call already opens an agent span for the run. The SDK's trace\n // boundary is informational.\n void _trace;\n }\n\n onTraceEnd(_trace: OpenAITraceLike): void {\n void _trace;\n }\n\n onSpanStart(span: OpenAISpanLike): void {\n safe(() => {\n const handle = this.openSpanFor(span);\n if (handle && span.spanId) {\n this.openSpans.set(span.spanId, handle);\n }\n });\n }\n\n onSpanEnd(span: OpenAISpanLike): void {\n safe(() => {\n if (!span.spanId) return;\n const handle = this.openSpans.get(span.spanId);\n if (!handle) return;\n this.openSpans.delete(span.spanId);\n this.populateSpanFromData(handle, span);\n\n const d = span.spanData;\n if (d?.type === \"response\" && typeof d.response_id === \"string\" && d.response_id.length > 0) {\n this.closedResponseSpans.set(d.response_id, handle);\n }\n if (d?.type === \"guardrail\" && d.passed === false) {\n safeEnd(handle, new Error(`guardrail failed: ${d.reason ?? \"no reason\"}`));\n return;\n }\n if (span.error) {\n safeEnd(handle, new Error(String(span.error)));\n return;\n }\n safeEnd(handle);\n });\n }\n\n async shutdown(): Promise<void> {\n // Close any still-open spans (the customer's process is exiting).\n for (const [, handle] of this.openSpans) {\n safeEnd(handle, new Error(\"morse: processor shutdown before span ended\"));\n }\n this.openSpans.clear();\n this.closedResponseSpans.clear();\n }\n\n async forceFlush(): Promise<void> {\n // No internal buffer — flushing is the underlying SDK's responsibility.\n }\n\n /* -- Internals ------------------------------------------------------ */\n\n private openSpanFor(span: OpenAISpanLike): SpanHandle | null {\n const d = span.spanData ?? {};\n const type = typeof d.type === \"string\" ? d.type : \"\";\n const name = typeof d.name === \"string\" && d.name.length > 0 ? d.name : undefined;\n\n switch (type) {\n case \"agent\":\n return emitAgentSpan({\n adapter: ADAPTER,\n agentName: name ?? \"openai-agent\",\n });\n\n case \"generation\":\n case \"response\": {\n // Model + usage are typically only known at end; populate from\n // openSpanFor for what we have now, fill the rest in populateSpanFromData.\n const model = typeof d.model === \"string\" && d.model.length > 0 ? d.model : \"unknown\";\n return emitLlmSpan({ adapter: ADAPTER, model });\n }\n\n case \"function\": {\n const inputOpts = this.options.toolInputMaxBytes\n ? { maxBytes: this.options.toolInputMaxBytes }\n : undefined;\n return emitToolSpan({\n adapter: ADAPTER,\n toolName: name ?? \"function\",\n inputSummary: d.input !== undefined ? summarizeToolInput(d.input, inputOpts) : undefined,\n });\n }\n\n case \"handoff\":\n return emitSubagentSpan({\n adapter: ADAPTER,\n parentAgentName: typeof d.from_agent === \"string\" ? d.from_agent : \"unknown\",\n subagentName: typeof d.to_agent === \"string\" ? d.to_agent : (name ?? \"unknown\"),\n taskDescription: typeof d.reason === \"string\" ? d.reason : undefined,\n });\n\n case \"guardrail\": {\n const handle = emitToolSpan({\n adapter: ADAPTER,\n toolName: `guardrail.${name ?? \"anon\"}`,\n });\n if (handle) {\n handle.span.metadata = {\n ...(handle.span.metadata ?? {}),\n tool_kind: \"guardrail\",\n guardrail: {\n name: name ?? \"anon\",\n passed: d.passed,\n ...(typeof d.reason === \"string\" ? { reason: d.reason } : {}),\n },\n };\n }\n return handle;\n }\n\n case \"mcp_list_tools\":\n return emitToolSpan({\n adapter: ADAPTER,\n toolName: `mcp.list_tools.${name ?? \"anon\"}`,\n });\n\n case \"custom\":\n // Custom spans are user-defined; pass through as a generic tool span\n // so they appear in the trace without us guessing semantics.\n return emitToolSpan({\n adapter: ADAPTER,\n toolName: `custom.${name ?? \"anon\"}`,\n });\n\n default:\n // Unknown type — emit a tool span tagged with the raw type so we\n // can spot SDK additions in the dashboard rather than silently dropping.\n return emitToolSpan({\n adapter: ADAPTER,\n toolName: `${type || \"unknown\"}.${name ?? \"anon\"}`,\n });\n }\n }\n\n private populateSpanFromData(handle: SpanHandle, span: OpenAISpanLike): void {\n const d = span.spanData;\n if (!d) return;\n\n if (typeof d.model === \"string\" && d.model.length > 0) {\n handle.span.model = d.model;\n }\n\n const u = d.usage;\n if (u) {\n const input = u.input_tokens ?? u.prompt_tokens;\n const output = u.output_tokens ?? u.completion_tokens;\n const total = u.total_tokens;\n if (typeof input === \"number\") handle.span.input_tokens = input;\n if (typeof output === \"number\") handle.span.output_tokens = output;\n if (typeof total === \"number\") {\n handle.span.total_tokens = total;\n } else if (typeof input === \"number\" && typeof output === \"number\") {\n handle.span.total_tokens = input + output;\n }\n }\n\n if (d.output !== undefined) {\n const outputOpts = this.options.toolOutputMaxBytes\n ? { maxBytes: this.options.toolOutputMaxBytes }\n : undefined;\n handle.span.metadata = {\n ...(handle.span.metadata ?? {}),\n tool_output_summary: summarizeToolOutput(d.output, outputOpts),\n };\n }\n }\n}\n\n/* ------------------------------------------------------------------------ */\n/* Module loader — best-effort registration with the real SDK */\n/* ------------------------------------------------------------------------ */\n\nexport interface AgentsModuleLike {\n addTraceProcessor?(processor: unknown): void;\n setTraceProcessors?(processors: unknown[]): void;\n}\n\n/**\n * Best-effort installation of an MorseTraceProcessor with the real\n * `@openai/agents` SDK. Returns true if installation succeeded.\n *\n * Loads the module via runtime-eval'd dynamic import so the SDK is a\n * pure optional peer dep — bundlers won't try to resolve it at build\n * time when the customer hasn't installed it.\n *\n * Idempotent at the registration level: the SDK's `addTraceProcessor`\n * appends to a list, so calling this twice will install two processors.\n * Production callers should call once at app bootstrap.\n */\nexport async function installMorseTraceProcessor(\n options?: MorseTraceProcessorOptions,\n): Promise<{ installed: boolean; processor: MorseTraceProcessor | null }> {\n const processor = new MorseTraceProcessor(options);\n let mod: AgentsModuleLike | null = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const dynamicImport = Function(\"m\", \"return import(m)\") as any as (\n m: string,\n ) => Promise<AgentsModuleLike>;\n mod = await dynamicImport(\"@openai/agents\");\n } catch {\n return { installed: false, processor: null };\n }\n try {\n if (typeof mod?.addTraceProcessor === \"function\") {\n mod.addTraceProcessor(processor);\n return { installed: true, processor };\n }\n } catch {\n // fall through\n }\n return { installed: false, processor: null };\n}\n\nfunction safeEnd(handle: SpanHandle, err?: unknown): void {\n try {\n if (err !== undefined) {\n handle.end(err);\n } else {\n handle.end();\n }\n } catch (err) {\n /* never propagate */\n reportSwallowed(err, \"morse.openai_agents.trace_processor\");\n }\n}\n\n/**\n * Route a swallowed internal error to the diagnostics channel (SDKDIAG-07).\n *\n * Control flow is unchanged — the site still swallows, still returns the same\n * value. It is simply no longer invisible to us.\n */\nfunction reportSwallowed(err: unknown, fingerprint: string): void {\n try {\n report(err, { fingerprint });\n } catch {\n // Reporting must never break the swallow it is reporting on.\n }\n}\n","/**\n * `@morsehq-dev/sdk/openai-agents` — adapter for `@openai/agents`.\n *\n * Wave 3-O composes the W2-O surfaces (`runner-wrapper`, `llm-and-tool`,\n * `handoff`, `guardrail`) into a single public entry point.\n *\n * Two usage modes:\n *\n * 1. **Granular** — import any of the four installers individually and\n * compose them yourself (`wrapRunner`, `installLlmAndToolInstrumentation`,\n * `installHandoffInstrumentation`, `installGuardrailInstrumentation`).\n *\n * 2. **Full convenience** — call `wrapRunnerWithFullInstrumentation(runner)`\n * to get an outer-span-wrapped Runner with llm + tool + handoff +\n * guardrail event listeners pre-installed, plus a single `dispose()`\n * that unsubscribes all three event installers.\n *\n * See `openspec/changes/2026-05-26-phase-13-ts-agent-sdk-adapters/`.\n */\n\nimport { wrapRunner } from \"./runner-wrapper\";\nimport { installLlmAndToolInstrumentation } from \"./llm-and-tool\";\nimport { installHandoffInstrumentation } from \"./handoff\";\nimport { installGuardrailInstrumentation } from \"./guardrail\";\nimport { MorseTraceProcessor, installMorseTraceProcessor } from \"./trace-processor\";\n\nimport type { RunnerLike } from \"./types\";\n\nexport type {\n AgentLike,\n OpenAIAgentsModuleLike,\n RunResultLike,\n RunnerEventLike,\n RunnerLike,\n} from \"./types\";\n\nexport {\n instrumentOpenAIAgents,\n isOpenAIAgentsWrapped,\n uninstallOpenAIAgents,\n wrapRunner,\n} from \"./runner-wrapper\";\nexport { installLlmAndToolInstrumentation } from \"./llm-and-tool\";\nexport { installHandoffInstrumentation } from \"./handoff\";\nexport { installGuardrailInstrumentation } from \"./guardrail\";\nexport { MorseTraceProcessor, installMorseTraceProcessor } from \"./trace-processor\";\nexport type {\n MorseTraceProcessorOptions,\n AgentsModuleLike,\n OpenAISpanLike,\n OpenAITraceLike,\n} from \"./trace-processor\";\n\n/* ------------------------------------------------------------------------ */\n/* Composed convenience installer */\n/* ------------------------------------------------------------------------ */\n\nexport interface FullOpenAIInstrumentationOptions {\n /** Override the agent name on the outer span when `agent.name` is absent. */\n defaultAgentName?: string;\n /** Max bytes for serialized tool input summary. */\n toolInputMaxBytes?: number;\n /** Max bytes for serialized tool output summary. */\n toolOutputMaxBytes?: number;\n}\n\n/**\n * Wrap an OpenAI Agents `Runner` with the full instrumentation stack:\n *\n * 1. Outer `agent` span via `wrapRunner` (provides the trace context).\n * 2. SDK-native span translation via `MorseTraceProcessor`\n * registered through the SDK's `addTraceProcessor()` pipeline —\n * catches `agent` / `response` / `generation` / `function` /\n * `handoff` / `guardrail` / `mcp_list_tools` / `custom` spans.\n * 3. Legacy event-listener installers (`installLlmAndToolInstrumentation`,\n * `installHandoffInstrumentation`, `installGuardrailInstrumentation`)\n * remain wired as no-ops when the real SDK doesn't expose a\n * `runner.on()` channel — they only fire against the mock fixture\n * in unit tests. Real-SDK usage flows through the TraceProcessor.\n *\n * Returns the wrapped runner and a single `dispose()` that unsubscribes\n * the legacy event installers. The TraceProcessor stays registered for\n * the lifetime of the process — the SDK's `addTraceProcessor` API has no\n * symmetric `removeTraceProcessor` (you'd have to `setTraceProcessors([])`\n * which would nuke any other processors too).\n *\n * Telemetry failures NEVER propagate to the host — every emission path\n * is wrapped in `absorbErrorsSync` upstream.\n */\nexport function wrapRunnerWithFullInstrumentation<R extends RunnerLike>(\n runner: R,\n options: FullOpenAIInstrumentationOptions = {},\n): { runner: R; dispose: () => void } {\n // Fire-and-forget: install the TraceProcessor with the real SDK if it's\n // resolvable. Failure is silent (e.g., the customer is running tests\n // with a mocked SDK, or hasn't installed `@openai/agents` at all).\n // Declared before `wrapRunner` below so `onRunResult` can close over it —\n // by the time a real run() resolves (a live model round trip), this\n // fire-and-forget install has virtually always finished; if it somehow\n // hasn't, enrichment is just skipped for that run (never throws).\n let installedProcessor: MorseTraceProcessor | null = null;\n\n const wrapped = wrapRunner(runner, {\n defaultAgentName: options.defaultAgentName,\n // MHQ-787: the SDK's own tracing spans for the Responses-API path\n // carry no model/usage — only the resolved RunResult does. Patch\n // already-closed LLM spans once we have it.\n onRunResult: (result, model) => {\n const rawResponses = (result as { rawResponses?: unknown }).rawResponses;\n if (installedProcessor && Array.isArray(rawResponses)) {\n installedProcessor.enrichFromRunResult(\n rawResponses as Parameters<MorseTraceProcessor[\"enrichFromRunResult\"]>[0],\n model,\n );\n }\n },\n });\n\n const llmAndToolOpts: {\n toolInputMaxBytes?: number;\n toolOutputMaxBytes?: number;\n } = {};\n if (options.toolInputMaxBytes !== undefined) {\n llmAndToolOpts.toolInputMaxBytes = options.toolInputMaxBytes;\n }\n if (options.toolOutputMaxBytes !== undefined) {\n llmAndToolOpts.toolOutputMaxBytes = options.toolOutputMaxBytes;\n }\n\n const offLlmTool = installLlmAndToolInstrumentation(wrapped, llmAndToolOpts);\n const offHandoff = installHandoffInstrumentation(wrapped);\n const offGuardrail = installGuardrailInstrumentation(wrapped);\n\n void installMorseTraceProcessor(llmAndToolOpts).then((result) => {\n if (result.installed) {\n installedProcessor = result.processor;\n }\n });\n\n let disposed = false;\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n try {\n offLlmTool();\n } catch {\n /* telemetry must never throw at the caller */\n }\n try {\n offHandoff();\n } catch {\n /* telemetry must never throw at the caller */\n }\n try {\n offGuardrail();\n } catch {\n /* telemetry must never throw at the caller */\n }\n // Best-effort: drain any in-flight spans the processor still holds.\n if (installedProcessor) {\n try {\n void installedProcessor.shutdown();\n } catch {\n /* never propagate */\n }\n }\n };\n\n return { runner: wrapped, dispose };\n}\n"]}
@@ -13,6 +13,7 @@ declare const SpanType: {
13
13
  readonly CUSTOM: "custom";
14
14
  readonly MEMORY: "memory";
15
15
  readonly RETRIEVER: "retriever";
16
+ readonly HANDOFF: "handoff";
16
17
  };
17
18
  type SpanType = (typeof SpanType)[keyof typeof SpanType];
18
19
  type SpanStatus = "completed" | "failed" | "timed_out";
@@ -13,6 +13,7 @@ declare const SpanType: {
13
13
  readonly CUSTOM: "custom";
14
14
  readonly MEMORY: "memory";
15
15
  readonly RETRIEVER: "retriever";
16
+ readonly HANDOFF: "handoff";
16
17
  };
17
18
  type SpanType = (typeof SpanType)[keyof typeof SpanType];
18
19
  type SpanStatus = "completed" | "failed" | "timed_out";
@@ -1,4 +1,4 @@
1
- import { S as SpanData, b as SpanType } from './spans-DZtMuBvc.js';
1
+ import { S as SpanData, b as SpanType } from './spans-CBMWNg2C.js';
2
2
 
3
3
  /**
4
4
  * SDK V2 tracing core — TraceState, run(), span() context-manager-likes.
@@ -1,4 +1,4 @@
1
- import { S as SpanData, b as SpanType } from './spans-DZtMuBvc.cjs';
1
+ import { S as SpanData, b as SpanType } from './spans-CBMWNg2C.cjs';
2
2
 
3
3
  /**
4
4
  * SDK V2 tracing core — TraceState, run(), span() context-manager-likes.
@@ -1,14 +1,14 @@
1
1
  'use strict';
2
2
 
3
- var chunkGTPKPUAV_cjs = require('../chunk-GTPKPUAV.cjs');
4
- require('../chunk-7HYFOHM3.cjs');
3
+ var chunkDXTNU2KT_cjs = require('../chunk-DXTNU2KT.cjs');
4
+ require('../chunk-ESJJXXB6.cjs');
5
5
  var chunkKBWPNIH4_cjs = require('../chunk-KBWPNIH4.cjs');
6
6
  var chunkHICEJ4LV_cjs = require('../chunk-HICEJ4LV.cjs');
7
- var chunkKMBKZLXH_cjs = require('../chunk-KMBKZLXH.cjs');
7
+ var chunk7DALGJL2_cjs = require('../chunk-7DALGJL2.cjs');
8
8
 
9
9
  // src/vercel-ai/index.ts
10
- chunkKMBKZLXH_cjs.init_tracing();
11
- chunkKMBKZLXH_cjs.init_propagation();
10
+ chunk7DALGJL2_cjs.init_tracing();
11
+ chunk7DALGJL2_cjs.init_propagation();
12
12
  var ADAPTER = "vercel-ai";
13
13
  async function createTracedVercelAI(options = {}) {
14
14
  const aiModule = await loadAiModule(options.aiModule);
@@ -71,11 +71,11 @@ function contextSegmentsFor(args) {
71
71
  function wrapStreamText(original, options) {
72
72
  const agentName = options.defaultAgentName ?? "vercel-ai.streamText";
73
73
  return function patchedStreamText(...args) {
74
- const inTrace = chunkKMBKZLXH_cjs.getActiveTraceState() !== null;
74
+ const inTrace = chunk7DALGJL2_cjs.getActiveTraceState() !== null;
75
75
  const callArgs = args[0] ?? {};
76
76
  const model = modelLabel(callArgs);
77
77
  if (inTrace) {
78
- const handle = chunkGTPKPUAV_cjs.emitLlmSpan({
78
+ const handle = chunkDXTNU2KT_cjs.emitLlmSpan({
79
79
  adapter: ADAPTER,
80
80
  model: model ?? "unknown",
81
81
  attributes: { max_steps: callArgs.maxSteps ?? 1 }
@@ -94,9 +94,9 @@ function wrapStreamText(original, options) {
94
94
  }
95
95
  }
96
96
  let result;
97
- void chunkKMBKZLXH_cjs.runAsync({ agentName }, async (runHandle) => {
97
+ void chunk7DALGJL2_cjs.runAsync({ agentName }, async (runHandle) => {
98
98
  runHandle.setOutcome(true);
99
- const handle = chunkGTPKPUAV_cjs.emitLlmSpan({
99
+ const handle = chunkDXTNU2KT_cjs.emitLlmSpan({
100
100
  adapter: ADAPTER,
101
101
  model: model ?? "unknown",
102
102
  attributes: { max_steps: callArgs.maxSteps ?? 1 }
@@ -177,9 +177,9 @@ function wrapGenerate(original, spanName, options) {
177
177
  return function patched(...args) {
178
178
  const callArgs = args[0] ?? {};
179
179
  const model = modelLabel(callArgs);
180
- const inTrace = chunkKMBKZLXH_cjs.getActiveTraceState() !== null;
180
+ const inTrace = chunk7DALGJL2_cjs.getActiveTraceState() !== null;
181
181
  const work = async () => {
182
- const handle = chunkGTPKPUAV_cjs.emitLlmSpan({
182
+ const handle = chunkDXTNU2KT_cjs.emitLlmSpan({
183
183
  adapter: ADAPTER,
184
184
  model: model ?? "unknown",
185
185
  attributes: { max_steps: callArgs.maxSteps ?? 1 }
@@ -204,7 +204,7 @@ function wrapGenerate(original, spanName, options) {
204
204
  if (inTrace) {
205
205
  return work();
206
206
  }
207
- return chunkKMBKZLXH_cjs.runAsync({ agentName }, async (runHandle) => {
207
+ return chunk7DALGJL2_cjs.runAsync({ agentName }, async (runHandle) => {
208
208
  runHandle.setOutcome(true);
209
209
  return work();
210
210
  });
@@ -212,13 +212,13 @@ function wrapGenerate(original, spanName, options) {
212
212
  }
213
213
  function wrapFetch(original) {
214
214
  const patched = function patched2(input, init) {
215
- const state = chunkKMBKZLXH_cjs.getActiveTraceState();
215
+ const state = chunk7DALGJL2_cjs.getActiveTraceState();
216
216
  if (state === null) {
217
217
  return original(input, init);
218
218
  }
219
219
  try {
220
220
  const merged = new Headers(init?.headers ?? {});
221
- chunkKMBKZLXH_cjs.injectTraceparent(merged);
221
+ chunk7DALGJL2_cjs.injectTraceparent(merged);
222
222
  const next = { ...init ?? {}, headers: merged };
223
223
  return original(input, next);
224
224
  } catch {
@@ -1,8 +1,8 @@
1
- import { emitLlmSpan } from '../chunk-KWOSUW7B.js';
2
- import '../chunk-6FLGLD72.js';
1
+ import { emitLlmSpan } from '../chunk-GULJAURY.js';
2
+ import '../chunk-ERH3TNXZ.js';
3
3
  import { calculateCost } from '../chunk-XTKMUJWI.js';
4
4
  import { decomposeOpenAiMessages } from '../chunk-4JPZV2VZ.js';
5
- import { init_tracing, init_propagation, getActiveTraceState, runAsync, injectTraceparent } from '../chunk-ZIMGB7IT.js';
5
+ import { init_tracing, init_propagation, getActiveTraceState, runAsync, injectTraceparent } from '../chunk-HJV35HWL.js';
6
6
 
7
7
  // src/vercel-ai/index.ts
8
8
  init_tracing();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@morsehq-dev/sdk",
3
- "version": "0.5.0",
3
+ "version": "0.6.0-rc.1",
4
4
  "description": "Unified observability for AI agents and infrastructure. One SDK.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://morsehq.dev",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/_agent-sdk-common/span-emitter.ts"],"names":["init_tracing","startSpan","absorbErrorsSync"],"mappings":"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","file":"chunk-52JTU4LH.cjs","sourcesContent":["/**\n * `_agent-sdk-common/span-emitter.ts` — shared span-emission helpers used by\n * all three agent-SDK adapters (`anthropic-agent-sdk`, `openai-agents`,\n * `langgraph-js`).\n *\n * Each helper:\n *\n * 1. Validates the required metadata for its logical span type.\n * 2. Calls `startSpan(...)` from `_internal/tracing.ts` to allocate the\n * wire-format span and push it onto the active trace's span stack.\n * 3. Tags `metadata.adapter` on every span so the UI can attribute spans\n * back to their adapter origin.\n * 4. Hydrates type-specific top-level fields (`model`, `input_tokens`,\n * `output_tokens`, `total_tokens`, `context_segments`) onto `SpanData`.\n * 5. Returns the `SpanHandle` so callers can later call `.end(err?)`.\n *\n * All helpers are wrapped in `absorbErrorsSync` — telemetry MUST NOT throw\n * at the caller. If `startSpan` returns `null` (no active trace), the\n * helper also returns `null`; callers must tolerate this case.\n *\n * Logical → wire `type` mapping (per `design.md` §Span schema):\n *\n * agent → \"agent\"\n * llm → \"llm\"\n * tool → \"tool\"\n * subagent → \"agent\" + metadata.spawn_kind = \"subagent\"\n * hook → \"tool\" + metadata.tool_kind = \"hook\"\n *\n * Adapter-flavoured redaction (tool-arg truncation, base64/image\n * stripping) lives in a sibling `redaction.ts` (W1.2). This file is\n * intentionally agnostic: the only redaction it applies is a minimal\n * string-length guard on free-form fields that would otherwise blow up\n * the wire payload (task descriptions, hook names, tool names).\n */\n\nimport { absorbErrorsSync } from \"../_internal/errors\";\nimport type { ContextSegment, SpanData } from \"../_internal/spans\";\nimport { startSpan, type SpanHandle } from \"../_internal/tracing\";\n\n/* ------------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------------ */\n\nexport type AdapterName = \"anthropic-agent-sdk\" | \"openai-agents\" | \"langgraph-js\" | \"vercel-ai\";\n\n/** Soft cap for free-form identifier-ish strings (tool names, hook names, etc.). */\nconst MAX_NAME_BYTES = 256;\n\n/** Soft cap for free-form description strings (task descriptions). */\nconst MAX_DESCRIPTION_BYTES = 2048;\n\n/** Trim a string to `maxBytes` bytes (UTF-8 codepoint-safe at the JS-string level). */\nfunction truncate(value: string, maxBytes: number): string {\n if (value.length <= maxBytes) return value;\n return `${value.slice(0, maxBytes)}…[truncated]`;\n}\n\nfunction requireNonEmpty(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`morse span-emitter: ${field} must be a non-empty string`);\n }\n return value;\n}\n\n/* ------------------------------------------------------------------------ */\n/* emitAgentSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitAgentSpanOptions {\n adapter: AdapterName;\n agentName: string;\n model?: string;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitAgentSpan = (opts: EmitAgentSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const agentName = requireNonEmpty(opts.agentName, \"agentName\");\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n agent_name: agentName,\n };\n const handle = startSpan({\n name: `${adapter}.agent`,\n type: \"agent\",\n metadata,\n });\n if (handle === null) return null;\n if (typeof opts.model === \"string\" && opts.model.length > 0) {\n handle.span.model = opts.model;\n metadata.model = opts.model;\n }\n return handle;\n};\n\n/**\n * Emit a wire `type=agent` span. Returns `null` when no active trace exists\n * (callers MUST tolerate this); never throws.\n */\nexport const emitAgentSpan: (opts: EmitAgentSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitAgentSpan,\n {\n fingerprint: \"morse.adapters.shared.emitAgentSpan\",\n },\n) as (opts: EmitAgentSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitLlmSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitLlmSpanOptions {\n adapter: AdapterName;\n model: string;\n provider?: string;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n contextSegments?: ContextSegment[];\n attributes?: Record<string, unknown>;\n // MHQ-858: prompt/response capture. Adapters pass already-truncated\n // values (see `_internal/llm-io.ts`); this emitter does not truncate.\n inputData?: unknown;\n outputData?: unknown;\n}\n\nconst _emitLlmSpan = (opts: EmitLlmSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const model = requireNonEmpty(opts.model, \"model\");\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n model,\n };\n if (typeof opts.provider === \"string\" && opts.provider.length > 0) {\n metadata.provider = opts.provider;\n }\n const handle = startSpan({\n name: `${adapter}.llm`,\n type: \"llm\",\n metadata,\n });\n if (handle === null) return null;\n const span: SpanData = handle.span;\n span.model = model;\n if (typeof opts.inputTokens === \"number\" && Number.isFinite(opts.inputTokens)) {\n span.input_tokens = opts.inputTokens;\n }\n if (typeof opts.outputTokens === \"number\" && Number.isFinite(opts.outputTokens)) {\n span.output_tokens = opts.outputTokens;\n }\n if (typeof opts.totalTokens === \"number\" && Number.isFinite(opts.totalTokens)) {\n span.total_tokens = opts.totalTokens;\n } else if (span.input_tokens !== undefined && span.output_tokens !== undefined) {\n span.total_tokens = span.input_tokens + span.output_tokens;\n }\n if (Array.isArray(opts.contextSegments)) {\n span.context_segments = opts.contextSegments;\n }\n if (opts.inputData !== undefined) span.input_data = opts.inputData;\n if (opts.outputData !== undefined) span.output_data = opts.outputData;\n return handle;\n};\n\n/**\n * Emit a wire `type=llm` span. Returns `null` when no active trace exists;\n * never throws. Hydrates `model`, `input_tokens`, `output_tokens`,\n * `total_tokens` (derived if absent), and `context_segments` onto the\n * underlying `SpanData` so downstream consumers see them at the top level\n * — not buried in `metadata`.\n */\nexport const emitLlmSpan: (opts: EmitLlmSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitLlmSpan,\n {\n fingerprint: \"morse.adapters.shared.emitLlmSpan\",\n },\n) as (opts: EmitLlmSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitToolSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitToolSpanOptions {\n adapter: AdapterName;\n toolName: string;\n inputSummary?: unknown;\n outputSummary?: unknown;\n durationMs?: number;\n success?: boolean;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitToolSpan = (opts: EmitToolSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const toolName = truncate(requireNonEmpty(opts.toolName, \"toolName\"), MAX_NAME_BYTES);\n const tool: Record<string, unknown> = { name: toolName };\n if (opts.inputSummary !== undefined) tool.input_summary = opts.inputSummary;\n if (opts.outputSummary !== undefined) tool.output_summary = opts.outputSummary;\n if (typeof opts.durationMs === \"number\" && Number.isFinite(opts.durationMs)) {\n tool.duration_ms = opts.durationMs;\n }\n if (typeof opts.success === \"boolean\") tool.success = opts.success;\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n tool,\n };\n return startSpan({\n name: `${adapter}.tool.${toolName}`,\n type: \"tool\",\n metadata,\n });\n};\n\n/**\n * Emit a wire `type=tool` span. Returns `null` when no active trace exists;\n * never throws.\n */\nexport const emitToolSpan: (opts: EmitToolSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitToolSpan,\n {\n fingerprint: \"morse.adapters.shared.emitToolSpan\",\n },\n) as (opts: EmitToolSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitSubagentSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitSubagentSpanOptions {\n adapter: AdapterName;\n parentAgentName: string;\n subagentName: string;\n taskDescription?: string;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitSubagentSpan = (opts: EmitSubagentSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const parentAgentName = requireNonEmpty(opts.parentAgentName, \"parentAgentName\");\n const subagentName = requireNonEmpty(opts.subagentName, \"subagentName\");\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n spawn_kind: \"subagent\",\n parent_agent_name: parentAgentName,\n subagent_name: subagentName,\n };\n if (typeof opts.taskDescription === \"string\" && opts.taskDescription.length > 0) {\n metadata.task_description = truncate(opts.taskDescription, MAX_DESCRIPTION_BYTES);\n }\n return startSpan({\n name: `${adapter}.subagent.${subagentName}`,\n type: \"agent\",\n metadata,\n });\n};\n\n/**\n * Emit a wire `type=agent` span with `metadata.spawn_kind=\"subagent\"` — the\n * UI inspects this metadata key to render subagent-spawn relationships\n * until the backend gains a native `subagent` enum value. Returns `null`\n * when no active trace exists; never throws.\n */\nexport const emitSubagentSpan: (opts: EmitSubagentSpanOptions) => SpanHandle | null =\n absorbErrorsSync(_emitSubagentSpan, {\n fingerprint: \"morse.adapters.shared.emitSubagentSpan\",\n }) as (opts: EmitSubagentSpanOptions) => SpanHandle | null;\n\n/* ------------------------------------------------------------------------ */\n/* emitHookSpan */\n/* ------------------------------------------------------------------------ */\n\nexport interface EmitHookSpanOptions {\n adapter: AdapterName;\n hookName: string;\n hookKind: \"pre_tool\" | \"post_tool\" | \"on_error\";\n durationMs?: number;\n attributes?: Record<string, unknown>;\n}\n\nconst _emitHookSpan = (opts: EmitHookSpanOptions): SpanHandle | null => {\n const adapter = requireNonEmpty(opts.adapter, \"adapter\");\n const hookName = truncate(requireNonEmpty(opts.hookName, \"hookName\"), MAX_NAME_BYTES);\n const hookKind = opts.hookKind;\n if (hookKind !== \"pre_tool\" && hookKind !== \"post_tool\" && hookKind !== \"on_error\") {\n throw new Error(\n `morse span-emitter: hookKind must be one of pre_tool|post_tool|on_error (got ${String(\n hookKind,\n )})`,\n );\n }\n const hook: Record<string, unknown> = { name: hookName, kind: hookKind };\n if (typeof opts.durationMs === \"number\" && Number.isFinite(opts.durationMs)) {\n hook.duration_ms = opts.durationMs;\n }\n const metadata: Record<string, unknown> = {\n ...(opts.attributes ?? {}),\n adapter,\n tool_kind: \"hook\",\n hook,\n };\n return startSpan({\n name: `${adapter}.hook.${hookKind}.${hookName}`,\n type: \"tool\",\n metadata,\n });\n};\n\n/**\n * Emit a wire `type=tool` span with `metadata.tool_kind=\"hook\"` — the UI\n * inspects this metadata key to render hook spans separately from regular\n * tool spans. Returns `null` when no active trace exists; never throws.\n */\nexport const emitHookSpan: (opts: EmitHookSpanOptions) => SpanHandle | null = absorbErrorsSync(\n _emitHookSpan,\n {\n fingerprint: \"morse.adapters.shared.emitHookSpan\",\n },\n) as (opts: EmitHookSpanOptions) => SpanHandle | null;\n"]}