@morphllm/morphsdk 0.2.172 → 0.2.174

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 (241) hide show
  1. package/dist/{chunk-GJZXDRH5.js → chunk-2OHOIGNC.js} +17 -3
  2. package/dist/chunk-2OHOIGNC.js.map +1 -0
  3. package/dist/{chunk-QQXNZIVK.js → chunk-2VMJYD6W.js} +2 -2
  4. package/dist/{chunk-XJDXV5VX.js → chunk-34NQGT2I.js} +2 -2
  5. package/dist/{chunk-5DA6SZQJ.js → chunk-4IO2Z7US.js} +2 -2
  6. package/dist/{chunk-IJ33I7P5.js → chunk-4SQU273Z.js} +2 -2
  7. package/dist/{chunk-U4J3BVAQ.js → chunk-7D7FJY7Y.js} +2 -2
  8. package/dist/{chunk-AE7M2I52.js → chunk-ABMYD6QV.js} +2 -2
  9. package/dist/{chunk-UADW6FYD.js → chunk-APVS7EAO.js} +2 -2
  10. package/dist/{chunk-QAXXE4AD.js → chunk-B2GSQO2U.js} +2 -2
  11. package/dist/{chunk-QZR7SJ5N.js → chunk-CBPPR3OM.js} +2 -2
  12. package/dist/{chunk-53ZJMCWU.js → chunk-DHFFOBSV.js} +3 -3
  13. package/dist/{chunk-7PVVPLRL.js → chunk-DK442LPX.js} +6 -6
  14. package/dist/{chunk-FOIDGIY4.js → chunk-GWRJD5WE.js} +4 -4
  15. package/dist/chunk-IDS4XQ4T.js +143 -0
  16. package/dist/chunk-IDS4XQ4T.js.map +1 -0
  17. package/dist/{chunk-SJVLAGUL.js → chunk-J5XHHP5X.js} +2 -2
  18. package/dist/{chunk-VBARKJWL.js → chunk-L6LYTTZR.js} +2 -2
  19. package/dist/{chunk-VLZ6PNAD.js → chunk-LN7GNFET.js} +7 -7
  20. package/dist/{chunk-XYTYIAMQ.js → chunk-M35HA2EQ.js} +2 -2
  21. package/dist/{chunk-Z4GJVN52.js → chunk-MB6ZYZ3V.js} +2 -2
  22. package/dist/chunk-MQMRIQNU.js +130 -0
  23. package/dist/chunk-MQMRIQNU.js.map +1 -0
  24. package/dist/{chunk-NI7PWQ3B.js → chunk-OERNLFLW.js} +2 -2
  25. package/dist/{chunk-JWZ5DLAS.js → chunk-OKBNOGD5.js} +2 -2
  26. package/dist/{chunk-QFE5523Q.js → chunk-OYQT243T.js} +2 -2
  27. package/dist/chunk-PICGNBUE.js +35 -0
  28. package/dist/chunk-PICGNBUE.js.map +1 -0
  29. package/dist/{chunk-CQF76HJC.js → chunk-QW3ARPU3.js} +10 -10
  30. package/dist/{chunk-66OHYI24.js → chunk-RH2E2PTB.js} +3 -3
  31. package/dist/{chunk-IN2U7AAI.js → chunk-RM2U5DE4.js} +31 -31
  32. package/dist/{chunk-U4MRSZQQ.js → chunk-S3GAUEV6.js} +2 -2
  33. package/dist/{chunk-2SNAXTUJ.js → chunk-SSGEZ4GK.js} +2 -2
  34. package/dist/{chunk-MO6S2LRD.js → chunk-WKNYYI2G.js} +2 -2
  35. package/dist/{chunk-453ZV2AX.js → chunk-XBUHHKHX.js} +4 -4
  36. package/dist/chunk-XQ4T5QDT.js +39 -0
  37. package/dist/chunk-XQ4T5QDT.js.map +1 -0
  38. package/dist/{chunk-6X6QMRQG.js → chunk-XVNI3Y3O.js} +4 -4
  39. package/dist/{chunk-6X6QMRQG.js.map → chunk-XVNI3Y3O.js.map} +1 -1
  40. package/dist/{chunk-ZLSNL6M2.js → chunk-ZG6JEYEG.js} +3 -3
  41. package/dist/{chunk-QZ3V2BP7.js → chunk-ZHWVJ7SF.js} +2 -2
  42. package/dist/{chunk-ESXCQBMU.js → chunk-ZRPPKRKS.js} +2 -2
  43. package/dist/client.cjs +17 -3
  44. package/dist/client.cjs.map +1 -1
  45. package/dist/client.js +32 -32
  46. package/dist/core/client.cjs +16 -2
  47. package/dist/core/client.cjs.map +1 -1
  48. package/dist/core/client.js +4 -4
  49. package/dist/core/error.cjs +16 -2
  50. package/dist/core/error.cjs.map +1 -1
  51. package/dist/core/error.js +3 -3
  52. package/dist/core/index.cjs +16 -2
  53. package/dist/core/index.cjs.map +1 -1
  54. package/dist/core/index.js +4 -4
  55. package/dist/edge.cjs +16 -2
  56. package/dist/edge.cjs.map +1 -1
  57. package/dist/edge.js +7 -7
  58. package/dist/git/client.cjs +16 -2
  59. package/dist/git/client.cjs.map +1 -1
  60. package/dist/git/client.js +5 -5
  61. package/dist/git/index.cjs +16 -2
  62. package/dist/git/index.cjs.map +1 -1
  63. package/dist/git/index.js +5 -5
  64. package/dist/index.cjs +17 -3
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.js +37 -37
  67. package/dist/modelrouter/core.cjs +16 -2
  68. package/dist/modelrouter/core.cjs.map +1 -1
  69. package/dist/modelrouter/core.js +5 -5
  70. package/dist/modelrouter/index.cjs +16 -2
  71. package/dist/modelrouter/index.cjs.map +1 -1
  72. package/dist/modelrouter/index.js +5 -5
  73. package/dist/otel-Dt36jfxw.d.ts +45 -0
  74. package/dist/subagents/anthropic.cjs +16 -2
  75. package/dist/subagents/anthropic.cjs.map +1 -1
  76. package/dist/subagents/anthropic.js +11 -11
  77. package/dist/subagents/vercel.cjs +16 -2
  78. package/dist/subagents/vercel.cjs.map +1 -1
  79. package/dist/subagents/vercel.js +11 -11
  80. package/dist/tools/browser/anthropic.cjs +16 -2
  81. package/dist/tools/browser/anthropic.cjs.map +1 -1
  82. package/dist/tools/browser/anthropic.js +8 -8
  83. package/dist/tools/browser/core.cjs +16 -2
  84. package/dist/tools/browser/core.cjs.map +1 -1
  85. package/dist/tools/browser/core.js +7 -7
  86. package/dist/tools/browser/index.cjs +16 -2
  87. package/dist/tools/browser/index.cjs.map +1 -1
  88. package/dist/tools/browser/index.js +15 -15
  89. package/dist/tools/browser/openai.cjs +16 -2
  90. package/dist/tools/browser/openai.cjs.map +1 -1
  91. package/dist/tools/browser/openai.js +8 -8
  92. package/dist/tools/browser/profiles/core.cjs +16 -2
  93. package/dist/tools/browser/profiles/core.cjs.map +1 -1
  94. package/dist/tools/browser/profiles/core.js +3 -3
  95. package/dist/tools/browser/profiles/index.cjs +16 -2
  96. package/dist/tools/browser/profiles/index.cjs.map +1 -1
  97. package/dist/tools/browser/profiles/index.js +3 -3
  98. package/dist/tools/browser/vercel.cjs +16 -2
  99. package/dist/tools/browser/vercel.cjs.map +1 -1
  100. package/dist/tools/browser/vercel.js +8 -8
  101. package/dist/tools/codebase_search/anthropic.cjs +16 -2
  102. package/dist/tools/codebase_search/anthropic.cjs.map +1 -1
  103. package/dist/tools/codebase_search/anthropic.js +6 -6
  104. package/dist/tools/codebase_search/core.cjs +16 -2
  105. package/dist/tools/codebase_search/core.cjs.map +1 -1
  106. package/dist/tools/codebase_search/core.js +5 -5
  107. package/dist/tools/codebase_search/index.cjs +16 -2
  108. package/dist/tools/codebase_search/index.cjs.map +1 -1
  109. package/dist/tools/codebase_search/index.js +10 -10
  110. package/dist/tools/codebase_search/openai.cjs +16 -2
  111. package/dist/tools/codebase_search/openai.cjs.map +1 -1
  112. package/dist/tools/codebase_search/openai.js +6 -6
  113. package/dist/tools/codebase_search/vercel.cjs +16 -2
  114. package/dist/tools/codebase_search/vercel.cjs.map +1 -1
  115. package/dist/tools/codebase_search/vercel.js +6 -6
  116. package/dist/tools/compact/core.cjs +16 -2
  117. package/dist/tools/compact/core.cjs.map +1 -1
  118. package/dist/tools/compact/core.js +5 -5
  119. package/dist/tools/compact/index.cjs +16 -2
  120. package/dist/tools/compact/index.cjs.map +1 -1
  121. package/dist/tools/compact/index.js +6 -6
  122. package/dist/tools/fastapply/anthropic.cjs +16 -2
  123. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  124. package/dist/tools/fastapply/anthropic.js +7 -7
  125. package/dist/tools/fastapply/apply.cjs +16 -2
  126. package/dist/tools/fastapply/apply.cjs.map +1 -1
  127. package/dist/tools/fastapply/apply.js +2 -2
  128. package/dist/tools/fastapply/core.cjs +16 -2
  129. package/dist/tools/fastapply/core.cjs.map +1 -1
  130. package/dist/tools/fastapply/core.js +6 -6
  131. package/dist/tools/fastapply/index.cjs +16 -2
  132. package/dist/tools/fastapply/index.cjs.map +1 -1
  133. package/dist/tools/fastapply/index.js +11 -11
  134. package/dist/tools/fastapply/openai.cjs +16 -2
  135. package/dist/tools/fastapply/openai.cjs.map +1 -1
  136. package/dist/tools/fastapply/openai.js +7 -7
  137. package/dist/tools/fastapply/vercel.cjs +16 -2
  138. package/dist/tools/fastapply/vercel.cjs.map +1 -1
  139. package/dist/tools/fastapply/vercel.js +7 -7
  140. package/dist/tools/index.cjs +16 -2
  141. package/dist/tools/index.cjs.map +1 -1
  142. package/dist/tools/index.js +11 -11
  143. package/dist/tools/reflex/core.cjs +17 -3
  144. package/dist/tools/reflex/core.cjs.map +1 -1
  145. package/dist/tools/reflex/core.js +5 -5
  146. package/dist/tools/reflex/index.cjs +17 -3
  147. package/dist/tools/reflex/index.cjs.map +1 -1
  148. package/dist/tools/reflex/index.js +5 -5
  149. package/dist/tools/reflex/types.cjs.map +1 -1
  150. package/dist/tools/reflex/types.d.ts +2 -1
  151. package/dist/tools/utils/resilience.cjs +16 -2
  152. package/dist/tools/utils/resilience.cjs.map +1 -1
  153. package/dist/tools/utils/resilience.js +2 -2
  154. package/dist/tools/warp_grep/agent/runner.cjs +16 -2
  155. package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
  156. package/dist/tools/warp_grep/agent/runner.js +3 -3
  157. package/dist/tools/warp_grep/anthropic.cjs +16 -2
  158. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  159. package/dist/tools/warp_grep/anthropic.js +11 -11
  160. package/dist/tools/warp_grep/client.cjs +16 -2
  161. package/dist/tools/warp_grep/client.cjs.map +1 -1
  162. package/dist/tools/warp_grep/client.js +10 -10
  163. package/dist/tools/warp_grep/gemini.cjs +16 -2
  164. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  165. package/dist/tools/warp_grep/gemini.js +10 -10
  166. package/dist/tools/warp_grep/harness.js +6 -6
  167. package/dist/tools/warp_grep/index.cjs +16 -2
  168. package/dist/tools/warp_grep/index.cjs.map +1 -1
  169. package/dist/tools/warp_grep/index.js +16 -16
  170. package/dist/tools/warp_grep/openai.cjs +16 -2
  171. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  172. package/dist/tools/warp_grep/openai.js +11 -11
  173. package/dist/tools/warp_grep/providers/local.js +2 -2
  174. package/dist/tools/warp_grep/vercel.cjs +16 -2
  175. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  176. package/dist/tools/warp_grep/vercel.js +11 -11
  177. package/dist/tracing/core.cjs +346 -0
  178. package/dist/tracing/core.cjs.map +1 -0
  179. package/dist/tracing/core.d.ts +50 -0
  180. package/dist/tracing/core.js +13 -0
  181. package/dist/tracing/core.js.map +1 -0
  182. package/dist/tracing/index.cjs +359 -0
  183. package/dist/tracing/index.cjs.map +1 -0
  184. package/dist/tracing/index.d.ts +5 -0
  185. package/dist/tracing/index.js +18 -0
  186. package/dist/tracing/index.js.map +1 -0
  187. package/dist/tracing/interaction.cjs +183 -0
  188. package/dist/tracing/interaction.cjs.map +1 -0
  189. package/dist/tracing/interaction.d.ts +26 -0
  190. package/dist/tracing/interaction.js +9 -0
  191. package/dist/tracing/interaction.js.map +1 -0
  192. package/dist/tracing/otel.cjs +53 -0
  193. package/dist/tracing/otel.cjs.map +1 -0
  194. package/dist/tracing/otel.d.ts +2 -0
  195. package/dist/tracing/otel.js +12 -0
  196. package/dist/tracing/otel.js.map +1 -0
  197. package/dist/tracing/signals.cjs +59 -0
  198. package/dist/tracing/signals.cjs.map +1 -0
  199. package/dist/tracing/signals.d.ts +13 -0
  200. package/dist/tracing/signals.js +8 -0
  201. package/dist/tracing/signals.js.map +1 -0
  202. package/dist/tracing/types.cjs +19 -0
  203. package/dist/tracing/types.cjs.map +1 -0
  204. package/dist/tracing/types.d.ts +134 -0
  205. package/dist/tracing/types.js +1 -0
  206. package/dist/tracing/types.js.map +1 -0
  207. package/dist/version.cjs +16 -2
  208. package/dist/version.cjs.map +1 -1
  209. package/dist/version.js +1 -1
  210. package/package.json +16 -2
  211. package/dist/chunk-GJZXDRH5.js.map +0 -1
  212. /package/dist/{chunk-QQXNZIVK.js.map → chunk-2VMJYD6W.js.map} +0 -0
  213. /package/dist/{chunk-XJDXV5VX.js.map → chunk-34NQGT2I.js.map} +0 -0
  214. /package/dist/{chunk-5DA6SZQJ.js.map → chunk-4IO2Z7US.js.map} +0 -0
  215. /package/dist/{chunk-IJ33I7P5.js.map → chunk-4SQU273Z.js.map} +0 -0
  216. /package/dist/{chunk-U4J3BVAQ.js.map → chunk-7D7FJY7Y.js.map} +0 -0
  217. /package/dist/{chunk-AE7M2I52.js.map → chunk-ABMYD6QV.js.map} +0 -0
  218. /package/dist/{chunk-UADW6FYD.js.map → chunk-APVS7EAO.js.map} +0 -0
  219. /package/dist/{chunk-QAXXE4AD.js.map → chunk-B2GSQO2U.js.map} +0 -0
  220. /package/dist/{chunk-QZR7SJ5N.js.map → chunk-CBPPR3OM.js.map} +0 -0
  221. /package/dist/{chunk-53ZJMCWU.js.map → chunk-DHFFOBSV.js.map} +0 -0
  222. /package/dist/{chunk-7PVVPLRL.js.map → chunk-DK442LPX.js.map} +0 -0
  223. /package/dist/{chunk-FOIDGIY4.js.map → chunk-GWRJD5WE.js.map} +0 -0
  224. /package/dist/{chunk-SJVLAGUL.js.map → chunk-J5XHHP5X.js.map} +0 -0
  225. /package/dist/{chunk-VBARKJWL.js.map → chunk-L6LYTTZR.js.map} +0 -0
  226. /package/dist/{chunk-VLZ6PNAD.js.map → chunk-LN7GNFET.js.map} +0 -0
  227. /package/dist/{chunk-XYTYIAMQ.js.map → chunk-M35HA2EQ.js.map} +0 -0
  228. /package/dist/{chunk-Z4GJVN52.js.map → chunk-MB6ZYZ3V.js.map} +0 -0
  229. /package/dist/{chunk-NI7PWQ3B.js.map → chunk-OERNLFLW.js.map} +0 -0
  230. /package/dist/{chunk-JWZ5DLAS.js.map → chunk-OKBNOGD5.js.map} +0 -0
  231. /package/dist/{chunk-QFE5523Q.js.map → chunk-OYQT243T.js.map} +0 -0
  232. /package/dist/{chunk-CQF76HJC.js.map → chunk-QW3ARPU3.js.map} +0 -0
  233. /package/dist/{chunk-66OHYI24.js.map → chunk-RH2E2PTB.js.map} +0 -0
  234. /package/dist/{chunk-IN2U7AAI.js.map → chunk-RM2U5DE4.js.map} +0 -0
  235. /package/dist/{chunk-U4MRSZQQ.js.map → chunk-S3GAUEV6.js.map} +0 -0
  236. /package/dist/{chunk-2SNAXTUJ.js.map → chunk-SSGEZ4GK.js.map} +0 -0
  237. /package/dist/{chunk-MO6S2LRD.js.map → chunk-WKNYYI2G.js.map} +0 -0
  238. /package/dist/{chunk-453ZV2AX.js.map → chunk-XBUHHKHX.js.map} +0 -0
  239. /package/dist/{chunk-ZLSNL6M2.js.map → chunk-ZG6JEYEG.js.map} +0 -0
  240. /package/dist/{chunk-QZ3V2BP7.js.map → chunk-ZHWVJ7SF.js.map} +0 -0
  241. /package/dist/{chunk-ESXCQBMU.js.map → chunk-ZRPPKRKS.js.map} +0 -0
@@ -5,25 +5,25 @@ import {
5
5
  execute,
6
6
  vercel_default,
7
7
  warpGrepJsonSchema
8
- } from "../../chunk-MO6S2LRD.js";
8
+ } from "../../chunk-WKNYYI2G.js";
9
9
  import "../../chunk-Q6QCHAMD.js";
10
10
  import {
11
11
  formatResult
12
- } from "../../chunk-CQF76HJC.js";
13
- import "../../chunk-63VHBANJ.js";
14
- import "../../chunk-7PVVPLRL.js";
12
+ } from "../../chunk-QW3ARPU3.js";
15
13
  import "../../chunk-GVGJIXV2.js";
16
14
  import "../../chunk-A4D2CIIT.js";
15
+ import "../../chunk-63VHBANJ.js";
16
+ import "../../chunk-DK442LPX.js";
17
17
  import "../../chunk-IA5K2HTC.js";
18
- import "../../chunk-FBRNUWEB.js";
19
18
  import "../../chunk-CCJK3HTG.js";
20
- import "../../chunk-QAXXE4AD.js";
21
- import "../../chunk-66OHYI24.js";
22
- import "../../chunk-453ZV2AX.js";
19
+ import "../../chunk-FBRNUWEB.js";
20
+ import "../../chunk-B2GSQO2U.js";
21
+ import "../../chunk-RH2E2PTB.js";
22
+ import "../../chunk-XBUHHKHX.js";
23
23
  import "../../chunk-F3NCFNUX.js";
24
- import "../../chunk-QZR7SJ5N.js";
25
- import "../../chunk-XYTYIAMQ.js";
26
- import "../../chunk-GJZXDRH5.js";
24
+ import "../../chunk-CBPPR3OM.js";
25
+ import "../../chunk-M35HA2EQ.js";
26
+ import "../../chunk-2OHOIGNC.js";
27
27
  import "../../chunk-LKFZBBTD.js";
28
28
  import "../../chunk-PZ5AY32C.js";
29
29
  export {
@@ -0,0 +1,346 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // tracing/core.ts
31
+ var core_exports = {};
32
+ __export(core_exports, {
33
+ MorphTracing: () => MorphTracing,
34
+ morphTracing: () => morphTracing
35
+ });
36
+ module.exports = __toCommonJS(core_exports);
37
+ var import_exporter_trace_otlp_http = require("@opentelemetry/exporter-trace-otlp-http");
38
+ var traceloop2 = __toESM(require("@traceloop/node-server-sdk"), 1);
39
+
40
+ // tracing/interaction.ts
41
+ var import_api = require("@opentelemetry/api");
42
+ var traceloop = __toESM(require("@traceloop/node-server-sdk"), 1);
43
+
44
+ // tracing/otel.ts
45
+ var MORPH_METADATA_PREFIX = "morph";
46
+ function uuid() {
47
+ const c = globalThis.crypto;
48
+ if (c?.randomUUID) return c.randomUUID();
49
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (ch) => {
50
+ const r = Math.random() * 16 | 0;
51
+ const v = ch === "x" ? r : r & 3 | 8;
52
+ return v.toString(16);
53
+ });
54
+ }
55
+ function metadata(opts) {
56
+ const result = {
57
+ [`${MORPH_METADATA_PREFIX}.userId`]: opts.userId,
58
+ [`${MORPH_METADATA_PREFIX}.eventId`]: opts.eventId ?? uuid()
59
+ };
60
+ if (opts.convoId) result[`${MORPH_METADATA_PREFIX}.convoId`] = opts.convoId;
61
+ if (opts.eventName) result[`${MORPH_METADATA_PREFIX}.eventName`] = opts.eventName;
62
+ return result;
63
+ }
64
+
65
+ // tracing/interaction.ts
66
+ var ASSOC = "traceloop.association.properties.";
67
+ var ENTITY_INPUT = "traceloop.entity.input";
68
+ var ENTITY_OUTPUT = "traceloop.entity.output";
69
+ var ENTITY_NAME = "traceloop.entity.name";
70
+ var SPAN_KIND = "traceloop.span.kind";
71
+ function uuid2() {
72
+ const c = globalThis.crypto;
73
+ if (c?.randomUUID) return c.randomUUID();
74
+ return "xxxxxxxxxxxx4xxxyxxx".replace(/[xy]/g, (ch) => {
75
+ const r = Math.random() * 16 | 0;
76
+ return (ch === "x" ? r : r & 3 | 8).toString(16);
77
+ });
78
+ }
79
+ function asString(v) {
80
+ if (v == null) return "";
81
+ return typeof v === "string" ? v : JSON.stringify(v);
82
+ }
83
+ function associationProps(ctx, extra) {
84
+ const props = { ...extra };
85
+ if (ctx.userId) props.user_id = ctx.userId;
86
+ if (ctx.convoId) props.convo_id = ctx.convoId;
87
+ if (ctx.eventId) props.event_id = ctx.eventId;
88
+ if (ctx.event) props.event_name = ctx.event;
89
+ return props;
90
+ }
91
+ function createInteractionApi(initial, traceContent) {
92
+ const ctx = {
93
+ ...initial,
94
+ eventId: initial.eventId ?? uuid2()
95
+ };
96
+ const properties = { ...initial.properties ?? {} };
97
+ let input = initial.input;
98
+ const withAssoc = (fn) => traceloop.withAssociationProperties(associationProps(ctx, properties), fn);
99
+ const toolName = (p) => typeof p === "string" ? p : p.name;
100
+ function startToolSpan(params) {
101
+ const name = toolName(params);
102
+ const span = traceloop.getTraceloopTracer().startSpan(name);
103
+ span.setAttribute(SPAN_KIND, "tool");
104
+ span.setAttribute(ENTITY_NAME, name);
105
+ for (const [k, v] of Object.entries(associationProps(ctx, properties))) {
106
+ span.setAttribute(ASSOC + k, v);
107
+ }
108
+ if (typeof params !== "string" && params.properties) {
109
+ for (const [k, v] of Object.entries(params.properties)) span.setAttribute(k, v);
110
+ }
111
+ return {
112
+ setInput(value) {
113
+ if (traceContent) span.setAttribute(ENTITY_INPUT, asString(value));
114
+ },
115
+ setOutput(value) {
116
+ if (traceContent) span.setAttribute(ENTITY_OUTPUT, asString(value));
117
+ },
118
+ setError(error) {
119
+ const e = typeof error === "string" ? new Error(error) : error;
120
+ span.recordException(e);
121
+ span.setStatus({ code: import_api.SpanStatusCode.ERROR, message: e.message });
122
+ },
123
+ end() {
124
+ span.end();
125
+ }
126
+ };
127
+ }
128
+ return {
129
+ getEventId: () => ctx.eventId,
130
+ setInput(value) {
131
+ input = value;
132
+ },
133
+ setProperty(key, value) {
134
+ properties[key] = value;
135
+ },
136
+ setProperties(props) {
137
+ Object.assign(properties, props);
138
+ },
139
+ vercelAiSdkMetadata() {
140
+ return metadata({
141
+ userId: ctx.userId ?? "unknown",
142
+ convoId: ctx.convoId,
143
+ eventName: ctx.event,
144
+ eventId: ctx.eventId
145
+ });
146
+ },
147
+ withSpan(params, fn) {
148
+ const name = typeof params === "string" ? params : params.name;
149
+ return Promise.resolve(withAssoc(() => traceloop.withTask({ name }, fn)));
150
+ },
151
+ withTool(params, fn) {
152
+ const name = toolName(params);
153
+ const version = typeof params === "string" ? void 0 : params.version;
154
+ return Promise.resolve(withAssoc(() => traceloop.withTool({ name, version }, fn)));
155
+ },
156
+ startToolSpan,
157
+ trackTool(params) {
158
+ const span = startToolSpan({ name: params.name, properties: params.properties });
159
+ if (params.input !== void 0) span.setInput(params.input);
160
+ if (params.output !== void 0) span.setOutput(params.output);
161
+ if (params.error) span.setError(params.error);
162
+ span.end();
163
+ },
164
+ async finish(opts) {
165
+ const output = typeof opts === "string" ? opts : opts.output;
166
+ if (typeof opts !== "string" && opts.properties) Object.assign(properties, opts.properties);
167
+ await Promise.resolve(
168
+ withAssoc(
169
+ () => traceloop.withTask({ name: ctx.event ?? "interaction" }, () => {
170
+ const span = traceloop.getTraceloopTracer().startSpan(ctx.event ?? "interaction");
171
+ span.setAttribute(SPAN_KIND, "workflow");
172
+ for (const [k, v] of Object.entries(associationProps(ctx, properties))) {
173
+ span.setAttribute(ASSOC + k, v);
174
+ }
175
+ if (traceContent && input) span.setAttribute(ENTITY_INPUT, input);
176
+ if (traceContent) span.setAttribute(ENTITY_OUTPUT, output);
177
+ span.end();
178
+ })
179
+ )
180
+ );
181
+ }
182
+ };
183
+ }
184
+
185
+ // tracing/signals.ts
186
+ async function shipSignal(endpoint, apiKey, signals, debug = false, timeoutMs = 1e4) {
187
+ if (signals.length === 0) return;
188
+ const controller = new AbortController();
189
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
190
+ try {
191
+ const res = await fetch(endpoint, {
192
+ method: "POST",
193
+ headers: {
194
+ "Content-Type": "application/json",
195
+ Authorization: `Bearer ${apiKey}`
196
+ },
197
+ body: JSON.stringify({ signals }),
198
+ signal: controller.signal
199
+ });
200
+ if (!res.ok) {
201
+ const body = await res.text().catch(() => "");
202
+ console.warn(`[morph-tracing] signal POST failed (${res.status}): ${body}`);
203
+ } else if (debug) {
204
+ console.log(`[morph-tracing] shipped ${signals.length} signal(s)`);
205
+ }
206
+ } catch (err) {
207
+ console.warn(
208
+ "[morph-tracing] signal POST error:",
209
+ err instanceof Error ? err.message : err
210
+ );
211
+ } finally {
212
+ clearTimeout(timer);
213
+ }
214
+ }
215
+
216
+ // tracing/core.ts
217
+ var DEFAULT_BASE_URL = "https://api.morphllm.com";
218
+ function log(debug, ...args) {
219
+ if (debug) console.log("[morph-tracing]", ...args);
220
+ }
221
+ var MorphTracing = class {
222
+ cfg;
223
+ active = /* @__PURE__ */ new Map();
224
+ enabled;
225
+ constructor(config = {}) {
226
+ const debug = config.debug ?? process.env.MORPH_TRACING_DEBUG === "1";
227
+ const apiKey = config.apiKey ?? process.env.MORPH_API_KEY ?? "";
228
+ const baseUrlRaw = config.baseUrl ?? process.env.MORPH_TRACES_URL ?? DEFAULT_BASE_URL;
229
+ const baseUrl = baseUrlRaw.replace(/\/+$/, "");
230
+ const isProd = process.env.NODE_ENV === "production";
231
+ this.cfg = {
232
+ apiKey,
233
+ baseUrl,
234
+ signalsEndpoint: `${baseUrl}/v1/signals`,
235
+ appName: config.appName ?? process.env.npm_package_name ?? "morph-app",
236
+ disableBatching: config.disableBatching ?? !isProd,
237
+ traceContent: config.traceContent ?? true,
238
+ debug
239
+ };
240
+ if (config.disabled) {
241
+ log(debug, "disabled \u2014 no tracing initialized");
242
+ this.enabled = false;
243
+ return;
244
+ }
245
+ if (!apiKey) {
246
+ console.warn(
247
+ "[morph-tracing] No API key (set MORPH_API_KEY or pass { apiKey }). Tracing disabled."
248
+ );
249
+ this.enabled = false;
250
+ return;
251
+ }
252
+ this.enabled = true;
253
+ if (config.useExternalOtel) {
254
+ traceloop2.initialize({
255
+ baseUrl,
256
+ apiKey,
257
+ appName: this.cfg.appName,
258
+ tracingEnabled: false,
259
+ traceContent: this.cfg.traceContent,
260
+ silenceInitializationMessage: true
261
+ });
262
+ log(debug, "external OTEL mode \u2014 add createSpanProcessor() to your NodeSDK");
263
+ return;
264
+ }
265
+ const exporter = new import_exporter_trace_otlp_http.OTLPTraceExporter({
266
+ url: `${baseUrl}/v1/traces`,
267
+ headers: { Authorization: `Bearer ${apiKey}`, ...config.headers }
268
+ });
269
+ traceloop2.initialize({
270
+ baseUrl,
271
+ apiKey,
272
+ appName: this.cfg.appName,
273
+ exporter,
274
+ disableBatch: this.cfg.disableBatching,
275
+ traceContent: this.cfg.traceContent,
276
+ instrumentModules: config.instrumentModules,
277
+ tracingEnabled: true,
278
+ traceloopSyncEnabled: false,
279
+ silenceInitializationMessage: !debug
280
+ });
281
+ log(
282
+ debug,
283
+ `initialized \u2192 ${baseUrl}/v1/traces (batching ${this.cfg.disableBatching ? "off" : "on"})`
284
+ );
285
+ }
286
+ /** Begin a new traced interaction (a single user turn / agent run). */
287
+ begin(ctx) {
288
+ const interaction = createInteractionApi(ctx, this.cfg.traceContent);
289
+ this.active.set(interaction.getEventId(), interaction);
290
+ return interaction;
291
+ }
292
+ /** Look up an in-flight interaction by its eventId. */
293
+ getActiveInteraction(eventId) {
294
+ return this.active.get(eventId);
295
+ }
296
+ /**
297
+ * Non-interactive tracer for batch jobs where you only care about
298
+ * spans/token usage, not a user-facing interaction.
299
+ */
300
+ tracer(globalProperties = {}) {
301
+ return createInteractionApi(
302
+ { userId: globalProperties.userId ?? "batch", properties: globalProperties },
303
+ this.cfg.traceContent
304
+ );
305
+ }
306
+ /** Build Vercel AI SDK telemetry metadata (see `morphsdk/tracing/otel`). */
307
+ metadata(opts) {
308
+ return metadata(opts);
309
+ }
310
+ /** Attach a feedback/quality signal to an interaction by eventId. */
311
+ async trackSignal(signal) {
312
+ if (!this.enabled) return;
313
+ const signals = Array.isArray(signal) ? signal : [signal];
314
+ await shipSignal(this.cfg.signalsEndpoint, this.cfg.apiKey, signals, this.cfg.debug);
315
+ }
316
+ /** Span processor for `useExternalOtel: true` integrations. */
317
+ createSpanProcessor(options) {
318
+ return traceloop2.createSpanProcessor({
319
+ apiKey: this.cfg.apiKey,
320
+ baseUrl: this.cfg.baseUrl,
321
+ ...options
322
+ });
323
+ }
324
+ /** Flush any batched spans immediately. Safe to call when idle. */
325
+ async forceFlush() {
326
+ if (!this.enabled) return;
327
+ try {
328
+ await traceloop2.forceFlush();
329
+ } catch (err) {
330
+ log(this.cfg.debug, "forceFlush error (ignored):", err);
331
+ }
332
+ }
333
+ /** Flush and stop tracing. */
334
+ async shutdown() {
335
+ await this.forceFlush();
336
+ }
337
+ };
338
+ function morphTracing(config = {}) {
339
+ return new MorphTracing(config);
340
+ }
341
+ // Annotate the CommonJS export names for ESM import in node:
342
+ 0 && (module.exports = {
343
+ MorphTracing,
344
+ morphTracing
345
+ });
346
+ //# sourceMappingURL=core.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../tracing/core.ts","../../tracing/interaction.ts","../../tracing/otel.ts","../../tracing/signals.ts"],"sourcesContent":["/**\n * Morph Tracing — core initialization.\n *\n * Thin Morph layer over OpenLLMetry / Traceloop. `morphTracing()` initializes\n * Traceloop with a JSON OTLP exporter pointed at Morph's ingest endpoint\n * (`${baseUrl}/v1/traces`, `Authorization: Bearer <apiKey>`) and returns a\n * `MorphTracing` handle for interactions, tools, and signals.\n *\n * We deliberately override Traceloop's default protobuf exporter with the\n * JSON-over-HTTP exporter so the ingest service can parse plain OTLP/JSON.\n */\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport * as traceloop from '@traceloop/node-server-sdk';\n\nimport { createInteractionApi, type Interaction, type Tracer } from './interaction.js';\nimport { metadata as buildMetadata } from './otel.js';\nimport { shipSignal } from './signals.js';\nimport type {\n MetadataOptions,\n MorphTracingConfig,\n SignalEvent,\n TraceContext,\n} from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://api.morphllm.com';\n\nexport interface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n signalsEndpoint: string;\n appName: string;\n disableBatching: boolean;\n traceContent: boolean;\n debug: boolean;\n}\n\nfunction log(debug: boolean, ...args: unknown[]): void {\n if (debug) console.log('[morph-tracing]', ...args);\n}\n\n/**\n * Handle returned by {@link morphTracing}. Create interactions with `begin()`,\n * get a non-interactive `tracer()`, attach feedback with `trackSignal()`, and\n * flush/shutdown the exporter.\n */\nexport class MorphTracing {\n private readonly cfg: ResolvedConfig;\n private readonly active = new Map<string, Interaction>();\n readonly enabled: boolean;\n\n constructor(config: MorphTracingConfig = {}) {\n const debug = config.debug ?? process.env.MORPH_TRACING_DEBUG === '1';\n const apiKey = config.apiKey ?? process.env.MORPH_API_KEY ?? '';\n const baseUrlRaw =\n config.baseUrl ?? process.env.MORPH_TRACES_URL ?? DEFAULT_BASE_URL;\n const baseUrl = baseUrlRaw.replace(/\\/+$/, '');\n const isProd = process.env.NODE_ENV === 'production';\n\n this.cfg = {\n apiKey,\n baseUrl,\n signalsEndpoint: `${baseUrl}/v1/signals`,\n appName: config.appName ?? process.env.npm_package_name ?? 'morph-app',\n disableBatching: config.disableBatching ?? !isProd,\n traceContent: config.traceContent ?? true,\n debug,\n };\n\n if (config.disabled) {\n log(debug, 'disabled — no tracing initialized');\n this.enabled = false;\n return;\n }\n if (!apiKey) {\n console.warn(\n '[morph-tracing] No API key (set MORPH_API_KEY or pass { apiKey }). Tracing disabled.',\n );\n this.enabled = false;\n return;\n }\n\n this.enabled = true;\n if (config.useExternalOtel) {\n // Customer drives their own NodeSDK; just register config, no SDK start.\n traceloop.initialize({\n baseUrl,\n apiKey,\n appName: this.cfg.appName,\n tracingEnabled: false,\n traceContent: this.cfg.traceContent,\n silenceInitializationMessage: true,\n });\n log(debug, 'external OTEL mode — add createSpanProcessor() to your NodeSDK');\n return;\n }\n\n const exporter = new OTLPTraceExporter({\n url: `${baseUrl}/v1/traces`,\n headers: { Authorization: `Bearer ${apiKey}`, ...config.headers },\n });\n\n traceloop.initialize({\n baseUrl,\n apiKey,\n appName: this.cfg.appName,\n exporter,\n disableBatch: this.cfg.disableBatching,\n traceContent: this.cfg.traceContent,\n instrumentModules: config.instrumentModules as NonNullable<\n Parameters<typeof traceloop.initialize>[0]\n >['instrumentModules'],\n tracingEnabled: true,\n traceloopSyncEnabled: false,\n silenceInitializationMessage: !debug,\n });\n log(\n debug,\n `initialized → ${baseUrl}/v1/traces (batching ${this.cfg.disableBatching ? 'off' : 'on'})`,\n );\n }\n\n /** Begin a new traced interaction (a single user turn / agent run). */\n begin(ctx: TraceContext & { userId: string; event?: string }): Interaction {\n const interaction = createInteractionApi(ctx, this.cfg.traceContent);\n this.active.set(interaction.getEventId()!, interaction);\n return interaction;\n }\n\n /** Look up an in-flight interaction by its eventId. */\n getActiveInteraction(eventId: string): Interaction | undefined {\n return this.active.get(eventId);\n }\n\n /**\n * Non-interactive tracer for batch jobs where you only care about\n * spans/token usage, not a user-facing interaction.\n */\n tracer(globalProperties: Record<string, string> = {}): Tracer {\n return createInteractionApi(\n { userId: globalProperties.userId ?? 'batch', properties: globalProperties },\n this.cfg.traceContent,\n );\n }\n\n /** Build Vercel AI SDK telemetry metadata (see `morphsdk/tracing/otel`). */\n metadata(opts: MetadataOptions): Record<string, string> {\n return buildMetadata(opts);\n }\n\n /** Attach a feedback/quality signal to an interaction by eventId. */\n async trackSignal(signal: SignalEvent | SignalEvent[]): Promise<void> {\n if (!this.enabled) return;\n const signals = Array.isArray(signal) ? signal : [signal];\n await shipSignal(this.cfg.signalsEndpoint, this.cfg.apiKey, signals, this.cfg.debug);\n }\n\n /** Span processor for `useExternalOtel: true` integrations. */\n createSpanProcessor(\n options?: Parameters<typeof traceloop.createSpanProcessor>[0],\n ): ReturnType<typeof traceloop.createSpanProcessor> {\n return traceloop.createSpanProcessor({\n apiKey: this.cfg.apiKey,\n baseUrl: this.cfg.baseUrl,\n ...options,\n });\n }\n\n /** Flush any batched spans immediately. Safe to call when idle. */\n async forceFlush(): Promise<void> {\n if (!this.enabled) return;\n try {\n await traceloop.forceFlush();\n } catch (err) {\n log(this.cfg.debug, 'forceFlush error (ignored):', err);\n }\n }\n\n /** Flush and stop tracing. */\n async shutdown(): Promise<void> {\n await this.forceFlush();\n }\n}\n\n/** Initialize Morph Tracing and auto-instrument supported AI SDKs. */\nexport function morphTracing(config: MorphTracingConfig = {}): MorphTracing {\n return new MorphTracing(config);\n}\n","/**\n * Morph Tracing — interactions, tools, and manual spans.\n *\n * An `Interaction` is one user turn / agent run. It threads association\n * properties (user_id / convo_id / event_id) onto every span created inside it —\n * including the auto-instrumented LLM spans — so a whole conversation stitches\n * together in the Morph UI. Built on Traceloop's `withTask` / `withTool` and a\n * manual tracer for already-completed tool spans.\n */\nimport { SpanStatusCode, type Span } from '@opentelemetry/api';\nimport * as traceloop from '@traceloop/node-server-sdk';\n\nimport { metadata as buildMetadata } from './otel.js';\nimport type {\n FinishOptions,\n SpanParams,\n ToolParams,\n ToolSpan,\n TrackToolParams,\n TraceContext,\n} from './types.js';\n\n// Traceloop semantic-convention attribute keys.\nconst ASSOC = 'traceloop.association.properties.';\nconst ENTITY_INPUT = 'traceloop.entity.input';\nconst ENTITY_OUTPUT = 'traceloop.entity.output';\nconst ENTITY_NAME = 'traceloop.entity.name';\nconst SPAN_KIND = 'traceloop.span.kind';\n\nfunction uuid(): string {\n const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n if (c?.randomUUID) return c.randomUUID();\n return 'xxxxxxxxxxxx4xxxyxxx'.replace(/[xy]/g, (ch) => {\n const r = (Math.random() * 16) | 0;\n return (ch === 'x' ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n\nfunction asString(v: unknown): string {\n if (v == null) return '';\n return typeof v === 'string' ? v : JSON.stringify(v);\n}\n\nexport interface Interaction {\n getEventId(): string | undefined;\n setInput(input: string): void;\n setProperty(key: string, value: string): void;\n setProperties(props: Record<string, string>): void;\n /** Run `fn` inside a traced task span; LLM calls within inherit attribution. */\n withSpan<T>(params: SpanParams | string, fn: () => Promise<T> | T): Promise<T>;\n /** Run `fn` inside a traced tool span. */\n withTool<T>(params: ToolParams | string, fn: () => Promise<T> | T): Promise<T>;\n /** Start a tool span you end manually. */\n startToolSpan(params: ToolParams | string): ToolSpan;\n /** Record an already-completed tool invocation. */\n trackTool(params: TrackToolParams): void;\n /** Metadata for the Vercel AI SDK `experimental_telemetry.metadata`. */\n vercelAiSdkMetadata(): Record<string, string>;\n /** End the interaction with its final output. */\n finish(opts: FinishOptions | string): Promise<void>;\n}\n\nexport type Tracer = Pick<Interaction, 'withSpan' | 'withTool' | 'startToolSpan' | 'trackTool'>;\n\n/** Build the association-property bag Traceloop propagates onto child spans. */\nfunction associationProps(\n ctx: TraceContext & { userId?: string },\n extra: Record<string, string>,\n): Record<string, string> {\n const props: Record<string, string> = { ...extra };\n if (ctx.userId) props.user_id = ctx.userId;\n if (ctx.convoId) props.convo_id = ctx.convoId;\n if (ctx.eventId) props.event_id = ctx.eventId;\n if (ctx.event) props.event_name = ctx.event;\n return props;\n}\n\nexport function createInteractionApi(\n initial: TraceContext & { userId?: string },\n traceContent: boolean,\n): Interaction {\n const ctx: TraceContext & { userId?: string } = {\n ...initial,\n eventId: initial.eventId ?? uuid(),\n };\n const properties: Record<string, string> = { ...(initial.properties ?? {}) };\n let input = initial.input;\n\n const withAssoc = <T>(fn: () => Promise<T> | T): Promise<T> | T =>\n traceloop.withAssociationProperties(associationProps(ctx, properties), fn);\n\n const toolName = (p: ToolParams | string) => (typeof p === 'string' ? p : p.name);\n\n function startToolSpan(params: ToolParams | string): ToolSpan {\n const name = toolName(params);\n const span: Span = traceloop.getTraceloopTracer().startSpan(name);\n span.setAttribute(SPAN_KIND, 'tool');\n span.setAttribute(ENTITY_NAME, name);\n for (const [k, v] of Object.entries(associationProps(ctx, properties))) {\n span.setAttribute(ASSOC + k, v);\n }\n if (typeof params !== 'string' && params.properties) {\n for (const [k, v] of Object.entries(params.properties)) span.setAttribute(k, v);\n }\n return {\n setInput(value: unknown) {\n if (traceContent) span.setAttribute(ENTITY_INPUT, asString(value));\n },\n setOutput(value: unknown) {\n if (traceContent) span.setAttribute(ENTITY_OUTPUT, asString(value));\n },\n setError(error: Error | string) {\n const e = typeof error === 'string' ? new Error(error) : error;\n span.recordException(e);\n span.setStatus({ code: SpanStatusCode.ERROR, message: e.message });\n },\n end() {\n span.end();\n },\n };\n }\n\n return {\n getEventId: () => ctx.eventId,\n setInput(value: string) {\n input = value;\n },\n setProperty(key: string, value: string) {\n properties[key] = value;\n },\n setProperties(props: Record<string, string>) {\n Object.assign(properties, props);\n },\n vercelAiSdkMetadata() {\n return buildMetadata({\n userId: ctx.userId ?? 'unknown',\n convoId: ctx.convoId,\n eventName: ctx.event,\n eventId: ctx.eventId,\n });\n },\n withSpan(params, fn) {\n const name = typeof params === 'string' ? params : params.name;\n return Promise.resolve(withAssoc(() => traceloop.withTask({ name }, fn)));\n },\n withTool(params, fn) {\n const name = toolName(params);\n const version = typeof params === 'string' ? undefined : params.version;\n return Promise.resolve(withAssoc(() => traceloop.withTool({ name, version }, fn)));\n },\n startToolSpan,\n trackTool(params: TrackToolParams) {\n const span = startToolSpan({ name: params.name, properties: params.properties });\n if (params.input !== undefined) span.setInput(params.input);\n if (params.output !== undefined) span.setOutput(params.output);\n if (params.error) span.setError(params.error);\n span.end();\n },\n async finish(opts) {\n const output = typeof opts === 'string' ? opts : opts.output;\n if (typeof opts !== 'string' && opts.properties) Object.assign(properties, opts.properties);\n // Emit a top-level interaction span carrying input/output + attribution.\n await Promise.resolve(\n withAssoc(() =>\n traceloop.withTask({ name: ctx.event ?? 'interaction' }, () => {\n const span = traceloop.getTraceloopTracer().startSpan(ctx.event ?? 'interaction');\n span.setAttribute(SPAN_KIND, 'workflow');\n for (const [k, v] of Object.entries(associationProps(ctx, properties))) {\n span.setAttribute(ASSOC + k, v);\n }\n if (traceContent && input) span.setAttribute(ENTITY_INPUT, input);\n if (traceContent) span.setAttribute(ENTITY_OUTPUT, output);\n span.end();\n }),\n ),\n );\n },\n };\n}\n","/**\n * Morph Tracing — Vercel AI SDK helper.\n *\n * The Vercel AI SDK emits its own OpenTelemetry spans when you pass\n * `experimental_telemetry`. There is nothing to monkey-patch; instead you tag\n * each call with `metadata()` so Morph can attribute the resulting spans to a\n * user/conversation/event.\n *\n * @example\n * ```ts\n * import { generateText } from \"ai\";\n * import { metadata } from \"morphsdk/tracing/otel\";\n *\n * const res = await generateText({\n * model: openai(\"gpt-4o\"),\n * prompt: \"Hello!\",\n * experimental_telemetry: {\n * isEnabled: true,\n * metadata: metadata({ userId: \"user-123\", convoId: \"convo-456\" }),\n * },\n * });\n * ```\n */\nimport type { MetadataOptions } from './types.js';\n\n/** Prefix under which Morph reads attribution from AI SDK telemetry metadata. */\nexport const MORPH_METADATA_PREFIX = 'morph';\n\nfunction uuid(): string {\n // Node 18+ and modern runtimes expose globalThis.crypto.randomUUID.\n const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n if (c?.randomUUID) return c.randomUUID();\n // Fallback: RFC4122-ish without crypto.\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (ch) => {\n const r = (Math.random() * 16) | 0;\n const v = ch === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * Build the metadata object for the Vercel AI SDK's\n * `experimental_telemetry.metadata`. The values are propagated to every span the\n * AI SDK creates for that call. Generate a fresh `eventId` per call for grouping.\n */\nexport function metadata(opts: MetadataOptions): Record<string, string> {\n const result: Record<string, string> = {\n [`${MORPH_METADATA_PREFIX}.userId`]: opts.userId,\n [`${MORPH_METADATA_PREFIX}.eventId`]: opts.eventId ?? uuid(),\n };\n if (opts.convoId) result[`${MORPH_METADATA_PREFIX}.convoId`] = opts.convoId;\n if (opts.eventName) result[`${MORPH_METADATA_PREFIX}.eventName`] = opts.eventName;\n return result;\n}\n\nexport default { metadata };\n","/**\n * Morph Tracing — feedback signals.\n *\n * Signals (👍/👎, free-text feedback, user edits) attach to an interaction by\n * `eventId` and ship directly over HTTP — they are low-volume and need no OTel\n * pipeline. Mirrors the request shape of `tools/fastapply/core.ts`.\n */\nimport type { SignalEvent } from './types.js';\n\nexport async function shipSignal(\n endpoint: string,\n apiKey: string,\n signals: SignalEvent[],\n debug = false,\n timeoutMs = 10_000,\n): Promise<void> {\n if (signals.length === 0) return;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ signals }),\n signal: controller.signal,\n });\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n // Signals are best-effort; never throw into the caller's hot path.\n console.warn(`[morph-tracing] signal POST failed (${res.status}): ${body}`);\n } else if (debug) {\n console.log(`[morph-tracing] shipped ${signals.length} signal(s)`);\n }\n } catch (err) {\n console.warn(\n '[morph-tracing] signal POST error:',\n err instanceof Error ? err.message : err,\n );\n } finally {\n clearTimeout(timer);\n }\n}\n"],"mappings":"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","names":["traceloop","uuid"]}
@@ -0,0 +1,50 @@
1
+ import * as traceloop from '@traceloop/node-server-sdk';
2
+ import { Interaction, Tracer } from './interaction.js';
3
+ import { MorphTracingConfig, TraceContext, MetadataOptions, SignalEvent } from './types.js';
4
+
5
+ interface ResolvedConfig {
6
+ apiKey: string;
7
+ baseUrl: string;
8
+ signalsEndpoint: string;
9
+ appName: string;
10
+ disableBatching: boolean;
11
+ traceContent: boolean;
12
+ debug: boolean;
13
+ }
14
+ /**
15
+ * Handle returned by {@link morphTracing}. Create interactions with `begin()`,
16
+ * get a non-interactive `tracer()`, attach feedback with `trackSignal()`, and
17
+ * flush/shutdown the exporter.
18
+ */
19
+ declare class MorphTracing {
20
+ private readonly cfg;
21
+ private readonly active;
22
+ readonly enabled: boolean;
23
+ constructor(config?: MorphTracingConfig);
24
+ /** Begin a new traced interaction (a single user turn / agent run). */
25
+ begin(ctx: TraceContext & {
26
+ userId: string;
27
+ event?: string;
28
+ }): Interaction;
29
+ /** Look up an in-flight interaction by its eventId. */
30
+ getActiveInteraction(eventId: string): Interaction | undefined;
31
+ /**
32
+ * Non-interactive tracer for batch jobs where you only care about
33
+ * spans/token usage, not a user-facing interaction.
34
+ */
35
+ tracer(globalProperties?: Record<string, string>): Tracer;
36
+ /** Build Vercel AI SDK telemetry metadata (see `morphsdk/tracing/otel`). */
37
+ metadata(opts: MetadataOptions): Record<string, string>;
38
+ /** Attach a feedback/quality signal to an interaction by eventId. */
39
+ trackSignal(signal: SignalEvent | SignalEvent[]): Promise<void>;
40
+ /** Span processor for `useExternalOtel: true` integrations. */
41
+ createSpanProcessor(options?: Parameters<typeof traceloop.createSpanProcessor>[0]): ReturnType<typeof traceloop.createSpanProcessor>;
42
+ /** Flush any batched spans immediately. Safe to call when idle. */
43
+ forceFlush(): Promise<void>;
44
+ /** Flush and stop tracing. */
45
+ shutdown(): Promise<void>;
46
+ }
47
+ /** Initialize Morph Tracing and auto-instrument supported AI SDKs. */
48
+ declare function morphTracing(config?: MorphTracingConfig): MorphTracing;
49
+
50
+ export { MorphTracing, type ResolvedConfig, morphTracing };
@@ -0,0 +1,13 @@
1
+ import {
2
+ MorphTracing,
3
+ morphTracing
4
+ } from "../chunk-IDS4XQ4T.js";
5
+ import "../chunk-PICGNBUE.js";
6
+ import "../chunk-MQMRIQNU.js";
7
+ import "../chunk-XQ4T5QDT.js";
8
+ import "../chunk-PZ5AY32C.js";
9
+ export {
10
+ MorphTracing,
11
+ morphTracing
12
+ };
13
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}