@morsehq-dev/sdk 0.4.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 (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +294 -0
  3. package/dist/anthropic/index.cjs +39 -0
  4. package/dist/anthropic/index.cjs.map +1 -0
  5. package/dist/anthropic/index.d.cts +213 -0
  6. package/dist/anthropic/index.d.ts +213 -0
  7. package/dist/anthropic/index.js +6 -0
  8. package/dist/anthropic/index.js.map +1 -0
  9. package/dist/anthropic-agent-sdk/index.cjs +744 -0
  10. package/dist/anthropic-agent-sdk/index.cjs.map +1 -0
  11. package/dist/anthropic-agent-sdk/index.d.cts +371 -0
  12. package/dist/anthropic-agent-sdk/index.d.ts +371 -0
  13. package/dist/anthropic-agent-sdk/index.js +735 -0
  14. package/dist/anthropic-agent-sdk/index.js.map +1 -0
  15. package/dist/browser/anthropic/index.cjs +39 -0
  16. package/dist/browser/anthropic/index.cjs.map +1 -0
  17. package/dist/browser/anthropic/index.js +6 -0
  18. package/dist/browser/anthropic/index.js.map +1 -0
  19. package/dist/browser/anthropic-agent-sdk/index.cjs +744 -0
  20. package/dist/browser/anthropic-agent-sdk/index.cjs.map +1 -0
  21. package/dist/browser/anthropic-agent-sdk/index.js +735 -0
  22. package/dist/browser/anthropic-agent-sdk/index.js.map +1 -0
  23. package/dist/browser/chunk-3643DC7K.cjs +365 -0
  24. package/dist/browser/chunk-3643DC7K.cjs.map +1 -0
  25. package/dist/browser/chunk-4FALQMOZ.js +232 -0
  26. package/dist/browser/chunk-4FALQMOZ.js.map +1 -0
  27. package/dist/browser/chunk-5J2QBK75.js +884 -0
  28. package/dist/browser/chunk-5J2QBK75.js.map +1 -0
  29. package/dist/browser/chunk-7MSXWGAH.js +53 -0
  30. package/dist/browser/chunk-7MSXWGAH.js.map +1 -0
  31. package/dist/browser/chunk-A24L5N5N.js +596 -0
  32. package/dist/browser/chunk-A24L5N5N.js.map +1 -0
  33. package/dist/browser/chunk-B7DEUDP6.cjs +177 -0
  34. package/dist/browser/chunk-B7DEUDP6.cjs.map +1 -0
  35. package/dist/browser/chunk-F6CJACNH.cjs +604 -0
  36. package/dist/browser/chunk-F6CJACNH.cjs.map +1 -0
  37. package/dist/browser/chunk-JBOYFQSB.js +412 -0
  38. package/dist/browser/chunk-JBOYFQSB.js.map +1 -0
  39. package/dist/browser/chunk-KRBADE6R.cjs +183 -0
  40. package/dist/browser/chunk-KRBADE6R.cjs.map +1 -0
  41. package/dist/browser/chunk-MCJYZH6W.cjs +415 -0
  42. package/dist/browser/chunk-MCJYZH6W.cjs.map +1 -0
  43. package/dist/browser/chunk-NQG2IAQS.js +178 -0
  44. package/dist/browser/chunk-NQG2IAQS.js.map +1 -0
  45. package/dist/browser/chunk-O4HG3OSK.cjs +929 -0
  46. package/dist/browser/chunk-O4HG3OSK.cjs.map +1 -0
  47. package/dist/browser/chunk-QWRQJO57.js +363 -0
  48. package/dist/browser/chunk-QWRQJO57.js.map +1 -0
  49. package/dist/browser/chunk-SWQOPFE4.cjs +234 -0
  50. package/dist/browser/chunk-SWQOPFE4.cjs.map +1 -0
  51. package/dist/browser/chunk-TYDG747E.js +171 -0
  52. package/dist/browser/chunk-TYDG747E.js.map +1 -0
  53. package/dist/browser/chunk-TZRSDDFP.cjs +56 -0
  54. package/dist/browser/chunk-TZRSDDFP.cjs.map +1 -0
  55. package/dist/browser/index.cjs +587 -0
  56. package/dist/browser/index.cjs.map +1 -0
  57. package/dist/browser/index.js +522 -0
  58. package/dist/browser/index.js.map +1 -0
  59. package/dist/browser/integrations/pino.cjs +89 -0
  60. package/dist/browser/integrations/pino.cjs.map +1 -0
  61. package/dist/browser/integrations/pino.js +86 -0
  62. package/dist/browser/integrations/pino.js.map +1 -0
  63. package/dist/browser/langchain/index.cjs +535 -0
  64. package/dist/browser/langchain/index.cjs.map +1 -0
  65. package/dist/browser/langchain/index.js +528 -0
  66. package/dist/browser/langchain/index.js.map +1 -0
  67. package/dist/browser/langgraph/index.cjs +377 -0
  68. package/dist/browser/langgraph/index.cjs.map +1 -0
  69. package/dist/browser/langgraph/index.js +371 -0
  70. package/dist/browser/langgraph/index.js.map +1 -0
  71. package/dist/browser/openai/index.cjs +125 -0
  72. package/dist/browser/openai/index.cjs.map +1 -0
  73. package/dist/browser/openai/index.js +122 -0
  74. package/dist/browser/openai/index.js.map +1 -0
  75. package/dist/browser/openai-agents/index.cjs +689 -0
  76. package/dist/browser/openai-agents/index.cjs.map +1 -0
  77. package/dist/browser/openai-agents/index.js +678 -0
  78. package/dist/browser/openai-agents/index.js.map +1 -0
  79. package/dist/browser/vercel-ai/index.cjs +233 -0
  80. package/dist/browser/vercel-ai/index.cjs.map +1 -0
  81. package/dist/browser/vercel-ai/index.js +231 -0
  82. package/dist/browser/vercel-ai/index.js.map +1 -0
  83. package/dist/chunk-4R4SHGOK.js +363 -0
  84. package/dist/chunk-4R4SHGOK.js.map +1 -0
  85. package/dist/chunk-7EO7MQBA.cjs +183 -0
  86. package/dist/chunk-7EO7MQBA.cjs.map +1 -0
  87. package/dist/chunk-7YCENA54.cjs +604 -0
  88. package/dist/chunk-7YCENA54.cjs.map +1 -0
  89. package/dist/chunk-CKFOGDUF.js +596 -0
  90. package/dist/chunk-CKFOGDUF.js.map +1 -0
  91. package/dist/chunk-FJUNILZT.cjs +1324 -0
  92. package/dist/chunk-FJUNILZT.cjs.map +1 -0
  93. package/dist/chunk-HDAFUKQ3.js +171 -0
  94. package/dist/chunk-HDAFUKQ3.js.map +1 -0
  95. package/dist/chunk-KBWPNIH4.cjs +234 -0
  96. package/dist/chunk-KBWPNIH4.cjs.map +1 -0
  97. package/dist/chunk-KJEO52QS.cjs +365 -0
  98. package/dist/chunk-KJEO52QS.cjs.map +1 -0
  99. package/dist/chunk-KZBCOZIQ.cjs +177 -0
  100. package/dist/chunk-KZBCOZIQ.cjs.map +1 -0
  101. package/dist/chunk-ME5JALGT.js +53 -0
  102. package/dist/chunk-ME5JALGT.js.map +1 -0
  103. package/dist/chunk-PVHDEPRE.cjs +56 -0
  104. package/dist/chunk-PVHDEPRE.cjs.map +1 -0
  105. package/dist/chunk-RTL23YOQ.js +178 -0
  106. package/dist/chunk-RTL23YOQ.js.map +1 -0
  107. package/dist/chunk-TQWI4UYO.js +1277 -0
  108. package/dist/chunk-TQWI4UYO.js.map +1 -0
  109. package/dist/chunk-VXDBDPDR.cjs +415 -0
  110. package/dist/chunk-VXDBDPDR.cjs.map +1 -0
  111. package/dist/chunk-XTKMUJWI.js +232 -0
  112. package/dist/chunk-XTKMUJWI.js.map +1 -0
  113. package/dist/chunk-ZKUGOWER.js +412 -0
  114. package/dist/chunk-ZKUGOWER.js.map +1 -0
  115. package/dist/index.cjs +843 -0
  116. package/dist/index.cjs.map +1 -0
  117. package/dist/index.d.cts +464 -0
  118. package/dist/index.d.ts +464 -0
  119. package/dist/index.js +778 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/integrations/pino.cjs +89 -0
  122. package/dist/integrations/pino.cjs.map +1 -0
  123. package/dist/integrations/pino.d.cts +65 -0
  124. package/dist/integrations/pino.d.ts +65 -0
  125. package/dist/integrations/pino.js +86 -0
  126. package/dist/integrations/pino.js.map +1 -0
  127. package/dist/langchain/index.cjs +535 -0
  128. package/dist/langchain/index.cjs.map +1 -0
  129. package/dist/langchain/index.d.cts +265 -0
  130. package/dist/langchain/index.d.ts +265 -0
  131. package/dist/langchain/index.js +528 -0
  132. package/dist/langchain/index.js.map +1 -0
  133. package/dist/langgraph/index.cjs +377 -0
  134. package/dist/langgraph/index.cjs.map +1 -0
  135. package/dist/langgraph/index.d.cts +324 -0
  136. package/dist/langgraph/index.d.ts +324 -0
  137. package/dist/langgraph/index.js +371 -0
  138. package/dist/langgraph/index.js.map +1 -0
  139. package/dist/openai/index.cjs +125 -0
  140. package/dist/openai/index.cjs.map +1 -0
  141. package/dist/openai/index.d.cts +136 -0
  142. package/dist/openai/index.d.ts +136 -0
  143. package/dist/openai/index.js +122 -0
  144. package/dist/openai/index.js.map +1 -0
  145. package/dist/openai-agents/index.cjs +689 -0
  146. package/dist/openai-agents/index.cjs.map +1 -0
  147. package/dist/openai-agents/index.d.cts +502 -0
  148. package/dist/openai-agents/index.d.ts +502 -0
  149. package/dist/openai-agents/index.js +678 -0
  150. package/dist/openai-agents/index.js.map +1 -0
  151. package/dist/spans-DZtMuBvc.d.cts +73 -0
  152. package/dist/spans-DZtMuBvc.d.ts +73 -0
  153. package/dist/tracing-BYAqjT5Q.d.cts +114 -0
  154. package/dist/tracing-rz9cWQ8d.d.ts +114 -0
  155. package/dist/vercel-ai/index.cjs +233 -0
  156. package/dist/vercel-ai/index.cjs.map +1 -0
  157. package/dist/vercel-ai/index.d.cts +93 -0
  158. package/dist/vercel-ai/index.d.ts +93 -0
  159. package/dist/vercel-ai/index.js +231 -0
  160. package/dist/vercel-ai/index.js.map +1 -0
  161. package/package.json +182 -0
@@ -0,0 +1,231 @@
1
+ import { emitLlmSpan } from '../chunk-TYDG747E.js';
2
+ import { calculateCost } from '../chunk-4FALQMOZ.js';
3
+ import '../chunk-NQG2IAQS.js';
4
+ import { decomposeOpenAiMessages } from '../chunk-QWRQJO57.js';
5
+ import { init_tracing, init_propagation, getActiveTraceState, runAsync, injectTraceparent } from '../chunk-5J2QBK75.js';
6
+
7
+ // src/vercel-ai/index.ts
8
+ init_tracing();
9
+ init_propagation();
10
+ var ADAPTER = "vercel-ai";
11
+ async function createTracedVercelAI(options = {}) {
12
+ const aiModule = await loadAiModule(options.aiModule);
13
+ if (!aiModule || typeof aiModule !== "object") {
14
+ throw new Error(
15
+ 'morse: createTracedVercelAI() could not resolve the "ai" package \u2014 is it installed? Pass { aiModule } explicitly if your bundler blocks dynamic import().'
16
+ );
17
+ }
18
+ const mod = aiModule;
19
+ const shouldPatchFetch = options.patchGlobalFetch ?? isBrowser();
20
+ if (shouldPatchFetch && typeof globalThis.fetch === "function") {
21
+ globalThis.fetch = wrapFetch(globalThis.fetch.bind(globalThis));
22
+ }
23
+ const original = {
24
+ streamText: mod.streamText,
25
+ generateText: mod.generateText,
26
+ generateObject: mod.generateObject
27
+ };
28
+ if (typeof original.streamText !== "function" || typeof original.generateText !== "function") {
29
+ throw new Error(
30
+ 'morse: the resolved "ai" module is missing streamText/generateText \u2014 unexpected shape, is this really the Vercel AI SDK\'s `ai` package?'
31
+ );
32
+ }
33
+ return {
34
+ streamText: wrapStreamText(original.streamText, options),
35
+ generateText: wrapGenerate(original.generateText, "vercel-ai.generateText", options),
36
+ generateObject: typeof original.generateObject === "function" ? wrapGenerate(original.generateObject, "vercel-ai.generateObject", options) : original.generateObject
37
+ };
38
+ }
39
+ async function loadAiModule(explicit) {
40
+ if (explicit && typeof explicit === "object") return explicit;
41
+ try {
42
+ return await Function("m", "return import(m)")("ai");
43
+ } catch {
44
+ return null;
45
+ }
46
+ }
47
+ function isBrowser() {
48
+ return typeof window !== "undefined" && typeof document !== "undefined";
49
+ }
50
+ function modelLabel(args) {
51
+ if (!args || typeof args !== "object") return void 0;
52
+ const a = args;
53
+ const m = a.model;
54
+ if (!m || typeof m !== "object") return void 0;
55
+ return m.modelId ?? m.id ?? m.provider;
56
+ }
57
+ function toolsRecordToArray(tools) {
58
+ if (!tools || typeof tools !== "object") return void 0;
59
+ const entries = Object.entries(tools);
60
+ if (entries.length === 0) return void 0;
61
+ return entries.map(([name, def]) => ({
62
+ type: "function",
63
+ function: { name, ...def && typeof def === "object" ? def : {} }
64
+ }));
65
+ }
66
+ function contextSegmentsFor(args) {
67
+ return decomposeOpenAiMessages(args.messages, toolsRecordToArray(args.tools));
68
+ }
69
+ function wrapStreamText(original, options) {
70
+ const agentName = options.defaultAgentName ?? "vercel-ai.streamText";
71
+ return function patchedStreamText(...args) {
72
+ const inTrace = getActiveTraceState() !== null;
73
+ const callArgs = args[0] ?? {};
74
+ const model = modelLabel(callArgs);
75
+ if (inTrace) {
76
+ const handle = emitLlmSpan({
77
+ adapter: ADAPTER,
78
+ model: model ?? "unknown",
79
+ attributes: { max_steps: callArgs.maxSteps ?? 1 }
80
+ });
81
+ if (handle !== null) {
82
+ const contextSegments = contextSegmentsFor(callArgs);
83
+ if (contextSegments.length > 0) handle.span.context_segments = contextSegments;
84
+ }
85
+ try {
86
+ const result2 = original(...args);
87
+ attachStreamingFinalize(result2, handle);
88
+ return result2;
89
+ } catch (err) {
90
+ handle?.end(err);
91
+ throw err;
92
+ }
93
+ }
94
+ let result;
95
+ void runAsync({ agentName }, async (runHandle) => {
96
+ runHandle.setOutcome(true);
97
+ const handle = emitLlmSpan({
98
+ adapter: ADAPTER,
99
+ model: model ?? "unknown",
100
+ attributes: { max_steps: callArgs.maxSteps ?? 1 }
101
+ });
102
+ if (handle !== null) {
103
+ const contextSegments = contextSegmentsFor(callArgs);
104
+ if (contextSegments.length > 0) handle.span.context_segments = contextSegments;
105
+ }
106
+ try {
107
+ result = original(...args);
108
+ attachStreamingFinalize(result, handle);
109
+ await waitForStreamCompletion(result);
110
+ } catch (err) {
111
+ handle?.end(err);
112
+ throw err;
113
+ }
114
+ return null;
115
+ });
116
+ return result;
117
+ };
118
+ }
119
+ function applyUsage(handle, usage) {
120
+ if (!usage || typeof usage !== "object") return;
121
+ const u = usage;
122
+ const input = u.promptTokens ?? u.inputTokens;
123
+ const output = u.completionTokens ?? u.outputTokens;
124
+ const total = u.totalTokens;
125
+ if (typeof input === "number" && Number.isFinite(input)) handle.span.input_tokens = input;
126
+ if (typeof output === "number" && Number.isFinite(output)) handle.span.output_tokens = output;
127
+ if (typeof total === "number" && Number.isFinite(total)) {
128
+ handle.span.total_tokens = total;
129
+ } else if (handle.span.input_tokens !== void 0 && handle.span.output_tokens !== void 0) {
130
+ handle.span.total_tokens = handle.span.input_tokens + handle.span.output_tokens;
131
+ }
132
+ if (handle.span.cost_usd === void 0 && handle.span.model && handle.span.model !== "unknown" && (handle.span.input_tokens !== void 0 || handle.span.output_tokens !== void 0)) {
133
+ const cost = calculateCost({
134
+ inputTokens: handle.span.input_tokens ?? 0,
135
+ outputTokens: handle.span.output_tokens ?? 0,
136
+ model: handle.span.model
137
+ });
138
+ if (cost !== void 0) handle.span.cost_usd = cost;
139
+ }
140
+ }
141
+ function attachStreamingFinalize(result, handle) {
142
+ if (!handle) return;
143
+ if (!result || typeof result !== "object") {
144
+ handle.end();
145
+ return;
146
+ }
147
+ const r = result;
148
+ const usagePromise = r.usage;
149
+ if (usagePromise && typeof usagePromise.then === "function") {
150
+ void usagePromise.then((usage) => {
151
+ applyUsage(handle, usage);
152
+ handle.end();
153
+ }).catch((err) => handle.end(err));
154
+ return;
155
+ }
156
+ handle.end();
157
+ }
158
+ async function waitForStreamCompletion(result) {
159
+ if (!result || typeof result !== "object") return;
160
+ const r = result;
161
+ const candidates = ["usage", "finishReason", "text"];
162
+ for (const key of candidates) {
163
+ const v = r[key];
164
+ if (v && typeof v.then === "function") {
165
+ try {
166
+ await v;
167
+ } catch {
168
+ }
169
+ return;
170
+ }
171
+ }
172
+ }
173
+ function wrapGenerate(original, spanName, options) {
174
+ const agentName = options.defaultAgentName ?? spanName;
175
+ return function patched(...args) {
176
+ const callArgs = args[0] ?? {};
177
+ const model = modelLabel(callArgs);
178
+ const inTrace = getActiveTraceState() !== null;
179
+ const work = async () => {
180
+ const handle = emitLlmSpan({
181
+ adapter: ADAPTER,
182
+ model: model ?? "unknown",
183
+ attributes: { max_steps: callArgs.maxSteps ?? 1 }
184
+ });
185
+ if (handle !== null) {
186
+ const contextSegments = contextSegmentsFor(callArgs);
187
+ if (contextSegments.length > 0) handle.span.context_segments = contextSegments;
188
+ }
189
+ try {
190
+ const result = await original(...args);
191
+ if (result && typeof result === "object" && handle) {
192
+ const r = result;
193
+ applyUsage(handle, r.usage);
194
+ }
195
+ handle?.end();
196
+ return result;
197
+ } catch (err) {
198
+ handle?.end(err);
199
+ throw err;
200
+ }
201
+ };
202
+ if (inTrace) {
203
+ return work();
204
+ }
205
+ return runAsync({ agentName }, async (runHandle) => {
206
+ runHandle.setOutcome(true);
207
+ return work();
208
+ });
209
+ };
210
+ }
211
+ function wrapFetch(original) {
212
+ const patched = function patched2(input, init) {
213
+ const state = getActiveTraceState();
214
+ if (state === null) {
215
+ return original(input, init);
216
+ }
217
+ try {
218
+ const merged = new Headers(init?.headers ?? {});
219
+ injectTraceparent(merged);
220
+ const next = { ...init ?? {}, headers: merged };
221
+ return original(input, next);
222
+ } catch {
223
+ return original(input, init);
224
+ }
225
+ };
226
+ return patched;
227
+ }
228
+
229
+ export { createTracedVercelAI };
230
+ //# sourceMappingURL=index.js.map
231
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/vercel-ai/index.ts"],"names":["result","patched"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * `@morsehq-dev/sdk/vercel-ai` — Vercel AI SDK instrumentation.\n *\n * Mirrors the Python adapters' contract from\n * `openspec/changes/phase-6c-multi-sdk-dogfood/specs/sdk/spec.md`:\n *\n * - One `agent` span per top-level `streamText` / `generateText` /\n * `generateObject` invocation.\n * - One `llm` child span per LLM round trip.\n * - One `tool` child span per tool invocation.\n * - Multi-step `maxSteps` runs render as ONE `agent` span with\n * N `llm` + tool children.\n * - W3C `traceparent` header injected on outbound `fetch` so the\n * Copilot frontend → backend flow renders as one unified trace.\n * - Client-side `useChat` calls emit a parent client-side span, then\n * inject the W3C context onto the resulting fetch.\n *\n * MHQ-758: earlier versions of this adapter instrumented `ai` by\n * reassigning its named exports in place (`aiModule.streamText = wrapped`).\n * That only works against a plain mutable object — real installs of `ai`\n * are pure ESM, and Node exposes ESM named exports as non-configurable\n * getter-only properties on the CJS interop namespace too, so the\n * assignment throws `TypeError: ... which has only a getter`, silently\n * swallowed by `absorbErrorsAsync`. Confirmed via a bare Node repro\n * (no bundler involved) during MHQ-482 OSS dogfooding — see\n * `bizops/dogfood/ai-sdk-preview-rag.md`. `ai`'s functions have no\n * prototype to patch either (unlike `@anthropic-ai/sdk`'s\n * `Messages.prototype.create`), so there is no way to instrument the\n * real module in place.\n *\n * Fix: `createTracedVercelAI()` resolves the real `ai` module once and\n * returns traced *replacement* functions the customer imports and calls\n * instead of `ai`'s own — no mutation, works under any module system.\n * This means `ai` cannot be zero-config auto-detected (there is nothing\n * to silently patch); it's a `DETECT_ONLY_TARGETS` entry in\n * `_internal/auto-detect.ts` that points here.\n *\n * MHQ-750: Python has no Vercel AI equivalent to mirror (it doesn't exist\n * as a Python package), so `context_segments` support here is a TS-only\n * extension. It's wired in because the Vercel AI SDK's `CoreMessage[]`\n * `messages` param is already OpenAI-chat-format-compatible\n * (`{role, content}`), so the shared `_agent-sdk-common/context-decomposer`\n * applies directly — no translation layer beyond converting the SDK's\n * `tools: Record<name, Tool>` shape into the OpenAI `tools` array shape\n * the decomposer expects (see `toolsRecordToArray` below).\n */\n\nimport { getActiveTraceState, runAsync as _runAsync } from \"../_internal/tracing\";\nimport { calculateCost } from \"../_internal/pricing\";\nimport { injectTraceparent } from \"../propagation\";\nimport { decomposeOpenAiMessages } from \"../_agent-sdk-common/context-decomposer\";\nimport { emitLlmSpan } from \"../_agent-sdk-common/span-emitter\";\n\nconst ADAPTER = \"vercel-ai\" as const;\n\n/* ------------------------------------------------------------------------ */\n/* Configuration */\n/* ------------------------------------------------------------------------ */\n\nexport interface InstrumentVercelAIOptions {\n /**\n * The Vercel AI module to instrument. If omitted, the adapter\n * imports `ai` lazily — recommended for server-side usage.\n *\n * Pass an explicit module when you have a constraint that prevents\n * dynamic import (older bundlers, strict tree-shaking, etc.).\n */\n aiModule?: unknown;\n /**\n * If true, also patch `globalThis.fetch` so outbound HTTP requests\n * inside an active trace context automatically carry a `traceparent`\n * header. Default: true on the browser (where `useChat` lives),\n * false on the server.\n */\n patchGlobalFetch?: boolean;\n /**\n * When provided, used as the parent agent span's name. Default:\n * `\"vercel-ai.<primitive>\"` (e.g., `\"vercel-ai.streamText\"`).\n */\n defaultAgentName?: string;\n}\n\n/** The traced replacement functions returned by {@link createTracedVercelAI}. */\nexport interface TracedVercelAI {\n streamText: (...args: unknown[]) => unknown;\n generateText: (...args: unknown[]) => unknown;\n generateObject: (...args: unknown[]) => unknown;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Public API */\n/* ------------------------------------------------------------------------ */\n\n/**\n * Resolve the real `ai` module once and return traced replacements for\n * `streamText` / `generateText` / `generateObject` — import and call these\n * in place of `ai`'s own exports (`ai`'s named exports can't be patched\n * in place; see the module doc comment above).\n *\n * ```ts\n * import { createTracedVercelAI } from \"@morsehq-dev/sdk/vercel-ai\";\n * const { streamText } = await createTracedVercelAI();\n * // use streamText(...) exactly like ai's own streamText(...)\n * ```\n *\n * Throws if `ai` can't be resolved (not installed, or a module system that\n * blocks dynamic `import()`) — surfaced at setup time rather than silently\n * leaving calls untraced.\n */\nexport async function createTracedVercelAI(\n options: InstrumentVercelAIOptions = {},\n): Promise<TracedVercelAI> {\n const aiModule = await loadAiModule(options.aiModule);\n if (!aiModule || typeof aiModule !== \"object\") {\n throw new Error(\n 'morse: createTracedVercelAI() could not resolve the \"ai\" package — is it installed? ' +\n \"Pass { aiModule } explicitly if your bundler blocks dynamic import().\",\n );\n }\n const mod = aiModule as Record<string, unknown>;\n\n const shouldPatchFetch = options.patchGlobalFetch ?? isBrowser();\n if (shouldPatchFetch && typeof globalThis.fetch === \"function\") {\n globalThis.fetch = wrapFetch(globalThis.fetch.bind(globalThis));\n }\n\n const original = {\n streamText: mod.streamText as (...args: unknown[]) => unknown,\n generateText: mod.generateText as (...args: unknown[]) => unknown,\n generateObject: mod.generateObject as (...args: unknown[]) => unknown,\n };\n if (typeof original.streamText !== \"function\" || typeof original.generateText !== \"function\") {\n throw new Error(\n 'morse: the resolved \"ai\" module is missing streamText/generateText — ' +\n \"unexpected shape, is this really the Vercel AI SDK's `ai` package?\",\n );\n }\n\n return {\n streamText: wrapStreamText(original.streamText, options),\n generateText: wrapGenerate(original.generateText, \"vercel-ai.generateText\", options),\n generateObject:\n typeof original.generateObject === \"function\"\n ? wrapGenerate(original.generateObject, \"vercel-ai.generateObject\", options)\n : original.generateObject,\n };\n}\n\n/* ------------------------------------------------------------------------ */\n/* Internal: lazy import of `ai` */\n/* ------------------------------------------------------------------------ */\n\nasync function loadAiModule(explicit?: unknown): Promise<unknown | null> {\n if (explicit && typeof explicit === \"object\") return explicit;\n try {\n // Dynamic import — gracefully no-ops if the customer doesn't depend on `ai`.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return await (Function(\"m\", \"return import(m)\") as any)(\"ai\");\n } catch {\n return null;\n }\n}\n\nfunction isBrowser(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\n/* ------------------------------------------------------------------------ */\n/* Wrappers */\n/* ------------------------------------------------------------------------ */\n\ninterface CallArgs {\n model?: { provider?: string; modelId?: string; id?: string };\n maxSteps?: number;\n tools?: Record<string, unknown>;\n messages?: unknown;\n prompt?: unknown;\n}\n\nfunction modelLabel(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\") return undefined;\n const a = args as CallArgs;\n const m = a.model;\n if (!m || typeof m !== \"object\") return undefined;\n return m.modelId ?? m.id ?? m.provider;\n}\n\n/**\n * Convert the Vercel AI SDK's `tools: Record<toolName, Tool>` shape into\n * the OpenAI `tools: [{type:\"function\", function:{name, ...}}]` array\n * shape the shared decomposer expects. Best-effort — never throws.\n */\nfunction toolsRecordToArray(tools: Record<string, unknown> | undefined): unknown[] | undefined {\n if (!tools || typeof tools !== \"object\") return undefined;\n const entries = Object.entries(tools);\n if (entries.length === 0) return undefined;\n return entries.map(([name, def]) => ({\n type: \"function\",\n function: { name, ...(def && typeof def === \"object\" ? def : {}) },\n }));\n}\n\n/** Compute `context_segments` from a Vercel AI SDK call's `messages`/`tools`, if present. */\nfunction contextSegmentsFor(args: CallArgs): ReturnType<typeof decomposeOpenAiMessages> {\n return decomposeOpenAiMessages(args.messages, toolsRecordToArray(args.tools));\n}\n\n/**\n * Wrap `streamText`. Vercel's `streamText` returns synchronously with\n * a result object whose properties are streams / promises (`textStream`,\n * `text`, `usage`, `finishReason`, etc.). We start the agent span when\n * the function is called and finalize it when `result.usage` (or one of\n * its terminal promises) resolves.\n */\nfunction wrapStreamText(\n original: (...args: unknown[]) => unknown,\n options: InstrumentVercelAIOptions,\n): (...args: unknown[]) => unknown {\n const agentName = options.defaultAgentName ?? \"vercel-ai.streamText\";\n\n return function patchedStreamText(...args: unknown[]): unknown {\n // If we're already inside a trace, just emit a child llm span and\n // delegate. Otherwise, open a fresh agent span via runAsync.\n const inTrace = getActiveTraceState() !== null;\n\n const callArgs = (args[0] ?? {}) as CallArgs;\n const model = modelLabel(callArgs);\n\n if (inTrace) {\n const handle = emitLlmSpan({\n adapter: ADAPTER,\n model: model ?? \"unknown\",\n attributes: { max_steps: callArgs.maxSteps ?? 1 },\n });\n if (handle !== null) {\n const contextSegments = contextSegmentsFor(callArgs);\n if (contextSegments.length > 0) handle.span.context_segments = contextSegments;\n }\n try {\n const result = original(...args);\n attachStreamingFinalize(result, handle);\n return result;\n } catch (err) {\n handle?.end(err);\n throw err;\n }\n }\n\n // No active trace — wrap in a fresh agent span.\n let result: unknown;\n void _runAsync({ agentName }, async (runHandle) => {\n runHandle.setOutcome(true);\n const handle = emitLlmSpan({\n adapter: ADAPTER,\n model: model ?? \"unknown\",\n attributes: { max_steps: callArgs.maxSteps ?? 1 },\n });\n if (handle !== null) {\n const contextSegments = contextSegmentsFor(callArgs);\n if (contextSegments.length > 0) handle.span.context_segments = contextSegments;\n }\n try {\n result = original(...args);\n attachStreamingFinalize(result, handle);\n // Wait for completion (best-effort) so the agent span ends after\n // the LLM span — without consuming the user's stream.\n await waitForStreamCompletion(result);\n } catch (err) {\n handle?.end(err);\n throw err;\n }\n return null;\n });\n return result;\n };\n}\n\ninterface FinalizeHandle {\n span: {\n model?: string;\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n cost_usd?: number;\n };\n end(error?: unknown): void;\n}\n\n/**\n * MHQ-789: apply resolved usage to the TOP-LEVEL span fields the dashboard\n * reads (`span.input_tokens`/`.output_tokens`/`.total_tokens`), not\n * `span.metadata` — and compute `cost_usd` the same way every sibling\n * adapter does, once real tokens + a real model are both on the span.\n */\nfunction applyUsage(handle: FinalizeHandle, usage: unknown): void {\n if (!usage || typeof usage !== \"object\") return;\n const u = usage as Record<string, unknown>;\n const input = u.promptTokens ?? u.inputTokens;\n const output = u.completionTokens ?? u.outputTokens;\n const total = u.totalTokens;\n if (typeof input === \"number\" && Number.isFinite(input)) handle.span.input_tokens = input;\n if (typeof output === \"number\" && Number.isFinite(output)) handle.span.output_tokens = output;\n if (typeof total === \"number\" && Number.isFinite(total)) {\n handle.span.total_tokens = total;\n } else if (handle.span.input_tokens !== undefined && handle.span.output_tokens !== undefined) {\n handle.span.total_tokens = handle.span.input_tokens + handle.span.output_tokens;\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\nfunction attachStreamingFinalize(result: unknown, handle: FinalizeHandle | null): void {\n if (!handle) return;\n if (!result || typeof result !== \"object\") {\n handle.end();\n return;\n }\n const r = result as Record<string, unknown>;\n // The Vercel AI SDK exposes a `usage` Promise that resolves with the\n // token counts at the end of the stream. If unavailable, fall back to\n // a `finalize` Promise we wait on.\n const usagePromise = r.usage;\n if (usagePromise && typeof (usagePromise as Promise<unknown>).then === \"function\") {\n void (usagePromise as Promise<unknown>)\n .then((usage) => {\n applyUsage(handle, usage);\n handle.end();\n })\n .catch((err) => handle.end(err));\n return;\n }\n // No usage — best effort: end the span immediately. The customer\n // may consume the stream afterward; that's fine.\n handle.end();\n}\n\nasync function waitForStreamCompletion(result: unknown): Promise<void> {\n if (!result || typeof result !== \"object\") return;\n const r = result as Record<string, unknown>;\n const candidates = [\"usage\", \"finishReason\", \"text\"];\n for (const key of candidates) {\n const v = r[key];\n if (v && typeof (v as Promise<unknown>).then === \"function\") {\n try {\n await v;\n } catch {\n // swallow — the customer will surface the error via their own consumption\n }\n return;\n }\n }\n}\n\n/**\n * Wrap `generateText` / `generateObject`. These return a Promise of a\n * full result; tracing is straightforward.\n */\nfunction wrapGenerate(\n original: (...args: unknown[]) => unknown,\n spanName: string,\n options: InstrumentVercelAIOptions,\n): (...args: unknown[]) => unknown {\n const agentName = options.defaultAgentName ?? spanName;\n\n return function patched(...args: unknown[]): unknown {\n const callArgs = (args[0] ?? {}) as CallArgs;\n const model = modelLabel(callArgs);\n const inTrace = getActiveTraceState() !== null;\n\n const work = async (): Promise<unknown> => {\n const handle = emitLlmSpan({\n adapter: ADAPTER,\n model: model ?? \"unknown\",\n attributes: { max_steps: callArgs.maxSteps ?? 1 },\n });\n if (handle !== null) {\n const contextSegments = contextSegmentsFor(callArgs);\n if (contextSegments.length > 0) handle.span.context_segments = contextSegments;\n }\n try {\n const result = await (original(...args) as Promise<unknown>);\n if (result && typeof result === \"object\" && handle) {\n const r = result as Record<string, unknown>;\n applyUsage(handle, r.usage);\n }\n handle?.end();\n return result;\n } catch (err) {\n handle?.end(err);\n throw err;\n }\n };\n\n if (inTrace) {\n return work();\n }\n return _runAsync({ agentName }, async (runHandle) => {\n runHandle.setOutcome(true);\n return work();\n });\n };\n}\n\n/**\n * Wrap `globalThis.fetch` so outbound calls inside an active trace\n * carry a `traceparent` header. The wrapper is idempotent.\n */\nfunction wrapFetch(original: typeof globalThis.fetch): typeof globalThis.fetch {\n const patched: typeof globalThis.fetch = function patched(\n input: Parameters<typeof globalThis.fetch>[0],\n init?: Parameters<typeof globalThis.fetch>[1],\n ) {\n const state = getActiveTraceState();\n if (state === null) {\n return original(input, init);\n }\n try {\n const merged = new Headers(init?.headers ?? {});\n injectTraceparent(merged);\n const next = { ...(init ?? {}), headers: merged };\n return original(input, next);\n } catch {\n return original(input, init);\n }\n };\n return patched;\n}\n"]}
@@ -0,0 +1,363 @@
1
+ // src/_agent-sdk-common/context-decomposer.ts
2
+ var CONTEXT_SEGMENT_CONTENT_BYTE_CAP = 4096;
3
+ function decomposeOpenAiMessages(messages, tools) {
4
+ const messagesArr = Array.isArray(messages) ? messages : void 0;
5
+ const toolsArr = Array.isArray(tools) ? tools : void 0;
6
+ if ((!messagesArr || messagesArr.length === 0) && (!toolsArr || toolsArr.length === 0)) {
7
+ return [];
8
+ }
9
+ try {
10
+ const segments = [];
11
+ let position = 0;
12
+ if (toolsArr && toolsArr.length > 0) {
13
+ const toolNames = [];
14
+ for (const t of toolsArr) {
15
+ if (t && typeof t === "object") {
16
+ const name = t.function?.name ?? t.name;
17
+ if (typeof name === "string" && name.length > 0) toolNames.push(name);
18
+ }
19
+ }
20
+ const toolsJson = canonicalJsonStringify(toolsArr);
21
+ segments.push(
22
+ makeSegment(position, "tool_descriptions", toolsJson, {
23
+ tool_count: toolsArr.length,
24
+ tool_names: toolNames
25
+ })
26
+ );
27
+ position += 1;
28
+ }
29
+ if (!messagesArr) return segments;
30
+ const systemParts = [];
31
+ for (const msg of messagesArr) {
32
+ if (getRole(msg) === "system") {
33
+ const text = contentToText(getContent(msg));
34
+ if (text) systemParts.push(text);
35
+ }
36
+ }
37
+ if (systemParts.length > 0) {
38
+ segments.push(makeSegment(position, "system_prompt", systemParts.join("\n")));
39
+ position += 1;
40
+ }
41
+ const nonSystem = messagesArr.filter((m) => getRole(m) !== "system");
42
+ let lastUserInputIdx = -1;
43
+ for (let i = nonSystem.length - 1; i >= 0; i--) {
44
+ if (getRole(nonSystem[i]) === "user") {
45
+ lastUserInputIdx = i;
46
+ break;
47
+ }
48
+ }
49
+ for (let i = 0; i < nonSystem.length; i++) {
50
+ const msg = nonSystem[i];
51
+ const role = getRole(msg);
52
+ const content = getContent(msg);
53
+ if (role === "tool") {
54
+ const text2 = contentToText(content);
55
+ if (text2) {
56
+ const toolCallId = getAttr(msg, "tool_call_id");
57
+ const prefix = typeof toolCallId === "string" && toolCallId.length > 0 ? `[tool_result id=${toolCallId}]
58
+ ` : "";
59
+ segments.push(makeSegment(position, "tool_observation", prefix + text2, { role }));
60
+ position += 1;
61
+ }
62
+ continue;
63
+ }
64
+ if (role === "system") continue;
65
+ const text = contentToText(content);
66
+ if (!text) continue;
67
+ const source = role === "user" && i === lastUserInputIdx ? "current_input" : "chat_history";
68
+ segments.push(makeSegment(position, source, text, role ? { role } : void 0));
69
+ position += 1;
70
+ }
71
+ return segments;
72
+ } catch {
73
+ return [];
74
+ }
75
+ }
76
+ var LC_TYPE_TO_ROLE = {
77
+ human: "user",
78
+ ai: "assistant",
79
+ system: "system",
80
+ tool: "tool",
81
+ function: "tool",
82
+ chat: "user"
83
+ };
84
+ function lcTypeToRole(lcType) {
85
+ return LC_TYPE_TO_ROLE[lcType.toLowerCase()] ?? lcType;
86
+ }
87
+ function getRole(msg) {
88
+ if (msg === null || typeof msg !== "object") return "";
89
+ const rec = msg;
90
+ if (typeof rec.role === "string") return rec.role;
91
+ if (typeof rec._getType === "function") {
92
+ try {
93
+ const t = rec._getType();
94
+ if (typeof t === "string" && t.length > 0) return lcTypeToRole(t);
95
+ } catch {
96
+ }
97
+ }
98
+ if (typeof rec.type === "string" && rec.type.length > 0) return lcTypeToRole(rec.type);
99
+ return "";
100
+ }
101
+ function getContent(msg) {
102
+ if (msg === null || typeof msg !== "object") return void 0;
103
+ return msg.content;
104
+ }
105
+ function getAttr(msg, attr) {
106
+ if (msg === null || typeof msg !== "object") return void 0;
107
+ return msg[attr];
108
+ }
109
+ function contentToText(content) {
110
+ if (content === null || content === void 0) return "";
111
+ if (typeof content === "string") return content;
112
+ if (Array.isArray(content)) {
113
+ const parts = [];
114
+ for (const part of content) {
115
+ if (part && typeof part === "object") {
116
+ const p = part;
117
+ if (p.type === "text") {
118
+ parts.push(typeof p.text === "string" ? p.text : String(p.text ?? ""));
119
+ } else if (p.type === "image_url") {
120
+ parts.push("[image]");
121
+ }
122
+ } else if (typeof part === "string") {
123
+ parts.push(part);
124
+ }
125
+ }
126
+ return parts.filter((p) => p.length > 0).join("\n");
127
+ }
128
+ return String(content);
129
+ }
130
+ function makeSegment(position, source, content, attrs) {
131
+ const contentHash = sha256Hex(content);
132
+ const truncated = truncateToBytes(content, CONTEXT_SEGMENT_CONTENT_BYTE_CAP);
133
+ const seg = {
134
+ position,
135
+ source,
136
+ content_hash: contentHash,
137
+ content: truncated.text
138
+ };
139
+ if (truncated.truncated) seg.content_truncated = true;
140
+ if (attrs) seg.attrs = attrs;
141
+ return seg;
142
+ }
143
+ function canonicalJsonStringify(value) {
144
+ try {
145
+ return JSON.stringify(value, function replacer(_key, val) {
146
+ if (val && typeof val === "object" && !Array.isArray(val)) {
147
+ const obj = val;
148
+ const sorted = {};
149
+ for (const k of Object.keys(obj).sort()) {
150
+ sorted[k] = obj[k];
151
+ }
152
+ return sorted;
153
+ }
154
+ return val;
155
+ });
156
+ } catch {
157
+ return String(value);
158
+ }
159
+ }
160
+ function sha256Hex(text) {
161
+ try {
162
+ if (typeof process !== "undefined" && process.versions?.node) {
163
+ const dynamicRequire = Function("m", "return require(m)");
164
+ const cryptoMod = dynamicRequire("node:crypto");
165
+ if (cryptoMod?.createHash) {
166
+ return cryptoMod.createHash("sha256").update(text).digest("hex");
167
+ }
168
+ }
169
+ } catch {
170
+ }
171
+ return purejsSha256(text);
172
+ }
173
+ function truncateToBytes(text, maxBytes) {
174
+ if (text.length <= maxBytes / 4) return { text, truncated: false };
175
+ const bytes = utf8Encode(text);
176
+ if (bytes.length <= maxBytes) return { text, truncated: false };
177
+ let cut = maxBytes;
178
+ while (cut > 0 && (bytes[cut] & 192) === 128) {
179
+ cut--;
180
+ }
181
+ return { text: utf8Decode(bytes.subarray(0, cut)), truncated: true };
182
+ }
183
+ function utf8Encode(text) {
184
+ if (typeof TextEncoder !== "undefined") {
185
+ return new TextEncoder().encode(text);
186
+ }
187
+ const out = [];
188
+ for (let i = 0; i < text.length; i++) {
189
+ const code = text.charCodeAt(i);
190
+ if (code < 128) {
191
+ out.push(code);
192
+ } else if (code < 2048) {
193
+ out.push(192 | code >> 6, 128 | code & 63);
194
+ } else {
195
+ out.push(224 | code >> 12, 128 | code >> 6 & 63, 128 | code & 63);
196
+ }
197
+ }
198
+ return new Uint8Array(out);
199
+ }
200
+ function utf8Decode(bytes) {
201
+ if (typeof TextDecoder !== "undefined") {
202
+ return new TextDecoder("utf-8").decode(bytes);
203
+ }
204
+ let out = "";
205
+ for (let i = 0; i < bytes.length; ) {
206
+ const b = bytes[i];
207
+ if (b < 128) {
208
+ out += String.fromCharCode(b);
209
+ i++;
210
+ } else if (b < 224) {
211
+ out += String.fromCharCode((b & 31) << 6 | bytes[i + 1] & 63);
212
+ i += 2;
213
+ } else {
214
+ out += String.fromCharCode(
215
+ (b & 15) << 12 | (bytes[i + 1] & 63) << 6 | bytes[i + 2] & 63
216
+ );
217
+ i += 3;
218
+ }
219
+ }
220
+ return out;
221
+ }
222
+ function purejsSha256(text) {
223
+ const K = [
224
+ 1116352408,
225
+ 1899447441,
226
+ 3049323471,
227
+ 3921009573,
228
+ 961987163,
229
+ 1508970993,
230
+ 2453635748,
231
+ 2870763221,
232
+ 3624381080,
233
+ 310598401,
234
+ 607225278,
235
+ 1426881987,
236
+ 1925078388,
237
+ 2162078206,
238
+ 2614888103,
239
+ 3248222580,
240
+ 3835390401,
241
+ 4022224774,
242
+ 264347078,
243
+ 604807628,
244
+ 770255983,
245
+ 1249150122,
246
+ 1555081692,
247
+ 1996064986,
248
+ 2554220882,
249
+ 2821834349,
250
+ 2952996808,
251
+ 3210313671,
252
+ 3336571891,
253
+ 3584528711,
254
+ 113926993,
255
+ 338241895,
256
+ 666307205,
257
+ 773529912,
258
+ 1294757372,
259
+ 1396182291,
260
+ 1695183700,
261
+ 1986661051,
262
+ 2177026350,
263
+ 2456956037,
264
+ 2730485921,
265
+ 2820302411,
266
+ 3259730800,
267
+ 3345764771,
268
+ 3516065817,
269
+ 3600352804,
270
+ 4094571909,
271
+ 275423344,
272
+ 430227734,
273
+ 506948616,
274
+ 659060556,
275
+ 883997877,
276
+ 958139571,
277
+ 1322822218,
278
+ 1537002063,
279
+ 1747873779,
280
+ 1955562222,
281
+ 2024104815,
282
+ 2227730452,
283
+ 2361852424,
284
+ 2428436474,
285
+ 2756734187,
286
+ 3204031479,
287
+ 3329325298
288
+ ];
289
+ const H = [
290
+ 1779033703,
291
+ 3144134277,
292
+ 1013904242,
293
+ 2773480762,
294
+ 1359893119,
295
+ 2600822924,
296
+ 528734635,
297
+ 1541459225
298
+ ];
299
+ const msg = utf8Encode(text);
300
+ const msgLen = msg.length;
301
+ const bitLen = msgLen * 8;
302
+ const padded = new Uint8Array(msgLen + 9 + 63 >> 6 << 6);
303
+ padded.set(msg);
304
+ padded[msgLen] = 128;
305
+ const lo = (bitLen & 4294967295) >>> 0;
306
+ const hi = Math.floor(bitLen / 4294967296) >>> 0;
307
+ padded[padded.length - 8] = hi >>> 24 & 255;
308
+ padded[padded.length - 7] = hi >>> 16 & 255;
309
+ padded[padded.length - 6] = hi >>> 8 & 255;
310
+ padded[padded.length - 5] = hi & 255;
311
+ padded[padded.length - 4] = lo >>> 24 & 255;
312
+ padded[padded.length - 3] = lo >>> 16 & 255;
313
+ padded[padded.length - 2] = lo >>> 8 & 255;
314
+ padded[padded.length - 1] = lo & 255;
315
+ const W = new Uint32Array(64);
316
+ for (let chunk = 0; chunk < padded.length; chunk += 64) {
317
+ for (let i = 0; i < 16; i++) {
318
+ W[i] = (padded[chunk + i * 4] << 24 | padded[chunk + i * 4 + 1] << 16 | padded[chunk + i * 4 + 2] << 8 | padded[chunk + i * 4 + 3]) >>> 0;
319
+ }
320
+ for (let i = 16; i < 64; i++) {
321
+ const s0 = rotr(W[i - 15], 7) ^ rotr(W[i - 15], 18) ^ W[i - 15] >>> 3;
322
+ const s1 = rotr(W[i - 2], 17) ^ rotr(W[i - 2], 19) ^ W[i - 2] >>> 10;
323
+ W[i] = W[i - 16] + s0 + W[i - 7] + s1 >>> 0;
324
+ }
325
+ let [a, b, c, d, e, f, g, h] = H;
326
+ for (let i = 0; i < 64; i++) {
327
+ const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);
328
+ const ch = e & f ^ ~e & g;
329
+ const temp1 = h + S1 + ch + K[i] + W[i] >>> 0;
330
+ const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);
331
+ const maj = a & b ^ a & c ^ b & c;
332
+ const temp2 = S0 + maj >>> 0;
333
+ h = g;
334
+ g = f;
335
+ f = e;
336
+ e = d + temp1 >>> 0;
337
+ d = c;
338
+ c = b;
339
+ b = a;
340
+ a = temp1 + temp2 >>> 0;
341
+ }
342
+ H[0] = H[0] + a >>> 0;
343
+ H[1] = H[1] + b >>> 0;
344
+ H[2] = H[2] + c >>> 0;
345
+ H[3] = H[3] + d >>> 0;
346
+ H[4] = H[4] + e >>> 0;
347
+ H[5] = H[5] + f >>> 0;
348
+ H[6] = H[6] + g >>> 0;
349
+ H[7] = H[7] + h >>> 0;
350
+ }
351
+ let hex = "";
352
+ for (const v of H) {
353
+ hex += v.toString(16).padStart(8, "0");
354
+ }
355
+ return hex;
356
+ }
357
+ function rotr(x, n) {
358
+ return (x >>> n | x << 32 - n) >>> 0;
359
+ }
360
+
361
+ export { decomposeOpenAiMessages };
362
+ //# sourceMappingURL=chunk-4R4SHGOK.js.map
363
+ //# sourceMappingURL=chunk-4R4SHGOK.js.map