@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
@@ -0,0 +1,130 @@
1
+ import {
2
+ metadata
3
+ } from "./chunk-XQ4T5QDT.js";
4
+
5
+ // tracing/interaction.ts
6
+ import { SpanStatusCode } from "@opentelemetry/api";
7
+ import * as traceloop from "@traceloop/node-server-sdk";
8
+ var ASSOC = "traceloop.association.properties.";
9
+ var ENTITY_INPUT = "traceloop.entity.input";
10
+ var ENTITY_OUTPUT = "traceloop.entity.output";
11
+ var ENTITY_NAME = "traceloop.entity.name";
12
+ var SPAN_KIND = "traceloop.span.kind";
13
+ function uuid() {
14
+ const c = globalThis.crypto;
15
+ if (c?.randomUUID) return c.randomUUID();
16
+ return "xxxxxxxxxxxx4xxxyxxx".replace(/[xy]/g, (ch) => {
17
+ const r = Math.random() * 16 | 0;
18
+ return (ch === "x" ? r : r & 3 | 8).toString(16);
19
+ });
20
+ }
21
+ function asString(v) {
22
+ if (v == null) return "";
23
+ return typeof v === "string" ? v : JSON.stringify(v);
24
+ }
25
+ function associationProps(ctx, extra) {
26
+ const props = { ...extra };
27
+ if (ctx.userId) props.user_id = ctx.userId;
28
+ if (ctx.convoId) props.convo_id = ctx.convoId;
29
+ if (ctx.eventId) props.event_id = ctx.eventId;
30
+ if (ctx.event) props.event_name = ctx.event;
31
+ return props;
32
+ }
33
+ function createInteractionApi(initial, traceContent) {
34
+ const ctx = {
35
+ ...initial,
36
+ eventId: initial.eventId ?? uuid()
37
+ };
38
+ const properties = { ...initial.properties ?? {} };
39
+ let input = initial.input;
40
+ const withAssoc = (fn) => traceloop.withAssociationProperties(associationProps(ctx, properties), fn);
41
+ const toolName = (p) => typeof p === "string" ? p : p.name;
42
+ function startToolSpan(params) {
43
+ const name = toolName(params);
44
+ const span = traceloop.getTraceloopTracer().startSpan(name);
45
+ span.setAttribute(SPAN_KIND, "tool");
46
+ span.setAttribute(ENTITY_NAME, name);
47
+ for (const [k, v] of Object.entries(associationProps(ctx, properties))) {
48
+ span.setAttribute(ASSOC + k, v);
49
+ }
50
+ if (typeof params !== "string" && params.properties) {
51
+ for (const [k, v] of Object.entries(params.properties)) span.setAttribute(k, v);
52
+ }
53
+ return {
54
+ setInput(value) {
55
+ if (traceContent) span.setAttribute(ENTITY_INPUT, asString(value));
56
+ },
57
+ setOutput(value) {
58
+ if (traceContent) span.setAttribute(ENTITY_OUTPUT, asString(value));
59
+ },
60
+ setError(error) {
61
+ const e = typeof error === "string" ? new Error(error) : error;
62
+ span.recordException(e);
63
+ span.setStatus({ code: SpanStatusCode.ERROR, message: e.message });
64
+ },
65
+ end() {
66
+ span.end();
67
+ }
68
+ };
69
+ }
70
+ return {
71
+ getEventId: () => ctx.eventId,
72
+ setInput(value) {
73
+ input = value;
74
+ },
75
+ setProperty(key, value) {
76
+ properties[key] = value;
77
+ },
78
+ setProperties(props) {
79
+ Object.assign(properties, props);
80
+ },
81
+ vercelAiSdkMetadata() {
82
+ return metadata({
83
+ userId: ctx.userId ?? "unknown",
84
+ convoId: ctx.convoId,
85
+ eventName: ctx.event,
86
+ eventId: ctx.eventId
87
+ });
88
+ },
89
+ withSpan(params, fn) {
90
+ const name = typeof params === "string" ? params : params.name;
91
+ return Promise.resolve(withAssoc(() => traceloop.withTask({ name }, fn)));
92
+ },
93
+ withTool(params, fn) {
94
+ const name = toolName(params);
95
+ const version = typeof params === "string" ? void 0 : params.version;
96
+ return Promise.resolve(withAssoc(() => traceloop.withTool({ name, version }, fn)));
97
+ },
98
+ startToolSpan,
99
+ trackTool(params) {
100
+ const span = startToolSpan({ name: params.name, properties: params.properties });
101
+ if (params.input !== void 0) span.setInput(params.input);
102
+ if (params.output !== void 0) span.setOutput(params.output);
103
+ if (params.error) span.setError(params.error);
104
+ span.end();
105
+ },
106
+ async finish(opts) {
107
+ const output = typeof opts === "string" ? opts : opts.output;
108
+ if (typeof opts !== "string" && opts.properties) Object.assign(properties, opts.properties);
109
+ await Promise.resolve(
110
+ withAssoc(
111
+ () => traceloop.withTask({ name: ctx.event ?? "interaction" }, () => {
112
+ const span = traceloop.getTraceloopTracer().startSpan(ctx.event ?? "interaction");
113
+ span.setAttribute(SPAN_KIND, "workflow");
114
+ for (const [k, v] of Object.entries(associationProps(ctx, properties))) {
115
+ span.setAttribute(ASSOC + k, v);
116
+ }
117
+ if (traceContent && input) span.setAttribute(ENTITY_INPUT, input);
118
+ if (traceContent) span.setAttribute(ENTITY_OUTPUT, output);
119
+ span.end();
120
+ })
121
+ )
122
+ );
123
+ }
124
+ };
125
+ }
126
+
127
+ export {
128
+ createInteractionApi
129
+ };
130
+ //# sourceMappingURL=chunk-MQMRIQNU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../tracing/interaction.ts"],"sourcesContent":["/**\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"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  executeEditFile
3
- } from "./chunk-Z4GJVN52.js";
3
+ } from "./chunk-MB6ZYZ3V.js";
4
4
  import {
5
5
  EDIT_FILE_SYSTEM_PROMPT,
6
6
  EDIT_FILE_TOOL_DESCRIPTION
@@ -86,4 +86,4 @@ export {
86
86
  vercel_default,
87
87
  vercel_exports
88
88
  };
89
- //# sourceMappingURL=chunk-NI7PWQ3B.js.map
89
+ //# sourceMappingURL=chunk-OERNLFLW.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MorphAPIClient
3
- } from "./chunk-453ZV2AX.js";
3
+ } from "./chunk-XBUHHKHX.js";
4
4
  import {
5
5
  APIResource
6
6
  } from "./chunk-LKFZBBTD.js";
@@ -558,4 +558,4 @@ var MorphGit = class extends APIResource {
558
558
  export {
559
559
  MorphGit
560
560
  };
561
- //# sourceMappingURL=chunk-JWZ5DLAS.js.map
561
+ //# sourceMappingURL=chunk-OKBNOGD5.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-F3NCFNUX.js";
4
4
  import {
5
5
  SDK_VERSION
6
- } from "./chunk-GJZXDRH5.js";
6
+ } from "./chunk-2OHOIGNC.js";
7
7
 
8
8
  // tools/fastapply/apply.ts
9
9
  import { createTwoFilesPatch } from "diff";
@@ -145,4 +145,4 @@ export {
145
145
  callMorphAPI,
146
146
  applyEdit
147
147
  };
148
- //# sourceMappingURL=chunk-QFE5523Q.js.map
148
+ //# sourceMappingURL=chunk-OYQT243T.js.map
@@ -0,0 +1,35 @@
1
+ // tracing/signals.ts
2
+ async function shipSignal(endpoint, apiKey, signals, debug = false, timeoutMs = 1e4) {
3
+ if (signals.length === 0) return;
4
+ const controller = new AbortController();
5
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
6
+ try {
7
+ const res = await fetch(endpoint, {
8
+ method: "POST",
9
+ headers: {
10
+ "Content-Type": "application/json",
11
+ Authorization: `Bearer ${apiKey}`
12
+ },
13
+ body: JSON.stringify({ signals }),
14
+ signal: controller.signal
15
+ });
16
+ if (!res.ok) {
17
+ const body = await res.text().catch(() => "");
18
+ console.warn(`[morph-tracing] signal POST failed (${res.status}): ${body}`);
19
+ } else if (debug) {
20
+ console.log(`[morph-tracing] shipped ${signals.length} signal(s)`);
21
+ }
22
+ } catch (err) {
23
+ console.warn(
24
+ "[morph-tracing] signal POST error:",
25
+ err instanceof Error ? err.message : err
26
+ );
27
+ } finally {
28
+ clearTimeout(timer);
29
+ }
30
+ }
31
+
32
+ export {
33
+ shipSignal
34
+ };
35
+ //# sourceMappingURL=chunk-PICGNBUE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../tracing/signals.ts"],"sourcesContent":["/**\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":";AASA,eAAsB,WACpB,UACA,QACA,SACA,QAAQ,OACR,YAAY,KACG;AACf,MAAI,QAAQ,WAAW,EAAG;AAE1B,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAC5D,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,UAAU;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,MAAM;AAAA,MACjC;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,QAAQ,CAAC;AAAA,MAChC,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAE5C,cAAQ,KAAK,uCAAuC,IAAI,MAAM,MAAM,IAAI,EAAE;AAAA,IAC5E,WAAW,OAAO;AAChB,cAAQ,IAAI,2BAA2B,QAAQ,MAAM,YAAY;AAAA,IACnE;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ;AAAA,MACN;AAAA,MACA,eAAe,QAAQ,IAAI,UAAU;AAAA,IACvC;AAAA,EACF,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;","names":[]}
@@ -1,22 +1,22 @@
1
- import {
2
- parseGitHubUrl
3
- } from "./chunk-63VHBANJ.js";
4
- import {
5
- runWarpGrep,
6
- runWarpGrepStreaming
7
- } from "./chunk-7PVVPLRL.js";
8
1
  import {
9
2
  createCodeStorageHttpCommands
10
3
  } from "./chunk-GVGJIXV2.js";
11
4
  import {
12
5
  RemoteCommandsProvider
13
6
  } from "./chunk-A4D2CIIT.js";
7
+ import {
8
+ parseGitHubUrl
9
+ } from "./chunk-63VHBANJ.js";
10
+ import {
11
+ runWarpGrep,
12
+ runWarpGrepStreaming
13
+ } from "./chunk-DK442LPX.js";
14
14
  import {
15
15
  compactFileContexts
16
- } from "./chunk-QAXXE4AD.js";
16
+ } from "./chunk-B2GSQO2U.js";
17
17
  import {
18
18
  MorphAPIClient
19
- } from "./chunk-453ZV2AX.js";
19
+ } from "./chunk-XBUHHKHX.js";
20
20
  import {
21
21
  logger
22
22
  } from "./chunk-F3NCFNUX.js";
@@ -321,4 +321,4 @@ export {
321
321
  formatGitHubReadFileResult,
322
322
  formatResult
323
323
  };
324
- //# sourceMappingURL=chunk-CQF76HJC.js.map
324
+ //# sourceMappingURL=chunk-QW3ARPU3.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  MorphAPIClient
3
- } from "./chunk-453ZV2AX.js";
3
+ } from "./chunk-XBUHHKHX.js";
4
4
  import {
5
5
  MorphError
6
- } from "./chunk-XYTYIAMQ.js";
6
+ } from "./chunk-M35HA2EQ.js";
7
7
  import {
8
8
  APIResource
9
9
  } from "./chunk-LKFZBBTD.js";
@@ -75,4 +75,4 @@ var CompactClient = class extends APIResource {
75
75
  export {
76
76
  CompactClient
77
77
  };
78
- //# sourceMappingURL=chunk-66OHYI24.js.map
78
+ //# sourceMappingURL=chunk-RH2E2PTB.js.map
@@ -1,69 +1,69 @@
1
- import {
2
- createGitHubSearchTool,
3
- createWarpGrepTool
4
- } from "./chunk-U4MRSZQQ.js";
5
1
  import {
6
2
  createGitHubSearchTool as createGitHubSearchTool3,
7
3
  createWarpGrepTool as createWarpGrepTool3
8
- } from "./chunk-MO6S2LRD.js";
9
- import {
10
- ReflexClient
11
- } from "./chunk-6X6QMRQG.js";
4
+ } from "./chunk-WKNYYI2G.js";
12
5
  import {
13
6
  createGitHubSearchTool as createGitHubSearchTool2,
14
7
  createWarpGrepTool as createWarpGrepTool2
15
- } from "./chunk-5DA6SZQJ.js";
8
+ } from "./chunk-4IO2Z7US.js";
16
9
  import {
17
- createCodebaseSearchTool
18
- } from "./chunk-SJVLAGUL.js";
10
+ createGitHubSearchTool,
11
+ createWarpGrepTool
12
+ } from "./chunk-S3GAUEV6.js";
13
+ import {
14
+ ReflexClient
15
+ } from "./chunk-XVNI3Y3O.js";
19
16
  import {
20
17
  createCodebaseSearchTool as createCodebaseSearchTool3
21
- } from "./chunk-2SNAXTUJ.js";
18
+ } from "./chunk-SSGEZ4GK.js";
22
19
  import {
23
20
  createCodebaseSearchTool as createCodebaseSearchTool2
24
- } from "./chunk-IJ33I7P5.js";
21
+ } from "./chunk-4SQU273Z.js";
22
+ import {
23
+ createCodebaseSearchTool
24
+ } from "./chunk-J5XHHP5X.js";
25
25
  import {
26
26
  CodebaseSearchClient
27
- } from "./chunk-ZLSNL6M2.js";
27
+ } from "./chunk-ZG6JEYEG.js";
28
28
  import {
29
- createExploreSubagent as createExploreSubagent2
30
- } from "./chunk-QZ3V2BP7.js";
29
+ BrowserClient
30
+ } from "./chunk-GWRJD5WE.js";
31
31
  import {
32
- createEditFileTool as createEditFileTool2
33
- } from "./chunk-QQXNZIVK.js";
32
+ createExploreSubagent as createExploreSubagent2
33
+ } from "./chunk-ZHWVJ7SF.js";
34
34
  import {
35
35
  createEditFileTool
36
- } from "./chunk-U4J3BVAQ.js";
36
+ } from "./chunk-7D7FJY7Y.js";
37
37
  import {
38
38
  createEditFileTool as createEditFileTool3
39
- } from "./chunk-NI7PWQ3B.js";
39
+ } from "./chunk-OERNLFLW.js";
40
40
  import {
41
- FastApplyClient
42
- } from "./chunk-Z4GJVN52.js";
41
+ createEditFileTool as createEditFileTool2
42
+ } from "./chunk-2VMJYD6W.js";
43
43
  import {
44
- BrowserClient
45
- } from "./chunk-FOIDGIY4.js";
44
+ FastApplyClient
45
+ } from "./chunk-MB6ZYZ3V.js";
46
46
  import {
47
47
  MorphGit
48
- } from "./chunk-JWZ5DLAS.js";
48
+ } from "./chunk-OKBNOGD5.js";
49
49
  import {
50
50
  createExploreSubagent
51
- } from "./chunk-AE7M2I52.js";
51
+ } from "./chunk-ABMYD6QV.js";
52
52
  import {
53
53
  WarpGrepClient
54
- } from "./chunk-CQF76HJC.js";
54
+ } from "./chunk-QW3ARPU3.js";
55
55
  import {
56
56
  AnthropicRouter,
57
57
  GeminiRouter,
58
58
  OpenAIRouter,
59
59
  RawRouter
60
- } from "./chunk-53ZJMCWU.js";
60
+ } from "./chunk-DHFFOBSV.js";
61
61
  import {
62
62
  CompactClient
63
- } from "./chunk-66OHYI24.js";
63
+ } from "./chunk-RH2E2PTB.js";
64
64
  import {
65
65
  MorphAPIClient
66
- } from "./chunk-453ZV2AX.js";
66
+ } from "./chunk-XBUHHKHX.js";
67
67
  import {
68
68
  logger
69
69
  } from "./chunk-F3NCFNUX.js";
@@ -687,4 +687,4 @@ export {
687
687
  VercelToolFactory,
688
688
  MorphClient
689
689
  };
690
- //# sourceMappingURL=chunk-IN2U7AAI.js.map
690
+ //# sourceMappingURL=chunk-RM2U5DE4.js.map
@@ -14,7 +14,7 @@ import {
14
14
  executeToolCall,
15
15
  formatGitHubReadFileResult,
16
16
  formatResult
17
- } from "./chunk-CQF76HJC.js";
17
+ } from "./chunk-QW3ARPU3.js";
18
18
 
19
19
  // tools/warp_grep/openai.ts
20
20
  var TOOL_PARAMETERS = {
@@ -104,4 +104,4 @@ export {
104
104
  createGitHubReadFileTool,
105
105
  openai_default
106
106
  };
107
- //# sourceMappingURL=chunk-U4MRSZQQ.js.map
107
+ //# sourceMappingURL=chunk-S3GAUEV6.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-YQMPVJ2L.js";
4
4
  import {
5
5
  executeCodebaseSearch
6
- } from "./chunk-ZLSNL6M2.js";
6
+ } from "./chunk-ZG6JEYEG.js";
7
7
 
8
8
  // tools/codebase_search/vercel.ts
9
9
  import { tool } from "ai";
@@ -55,4 +55,4 @@ export {
55
55
  getSystemPrompt,
56
56
  vercel_default
57
57
  };
58
- //# sourceMappingURL=chunk-2SNAXTUJ.js.map
58
+ //# sourceMappingURL=chunk-SSGEZ4GK.js.map
@@ -8,7 +8,7 @@ import {
8
8
  executeGitHubReadFile,
9
9
  executeToolCall,
10
10
  executeToolCallStreaming
11
- } from "./chunk-CQF76HJC.js";
11
+ } from "./chunk-QW3ARPU3.js";
12
12
 
13
13
  // tools/warp_grep/vercel.ts
14
14
  import { tool } from "ai";
@@ -115,4 +115,4 @@ export {
115
115
  createGitHubReadFileTool,
116
116
  vercel_default
117
117
  };
118
- //# sourceMappingURL=chunk-MO6S2LRD.js.map
118
+ //# sourceMappingURL=chunk-WKNYYI2G.js.map
@@ -3,15 +3,15 @@ import {
3
3
  } from "./chunk-F3NCFNUX.js";
4
4
  import {
5
5
  toMorphError
6
- } from "./chunk-QZR7SJ5N.js";
6
+ } from "./chunk-CBPPR3OM.js";
7
7
  import {
8
8
  MorphError,
9
9
  fetchWithRetry,
10
10
  withTimeout
11
- } from "./chunk-XYTYIAMQ.js";
11
+ } from "./chunk-M35HA2EQ.js";
12
12
  import {
13
13
  SDK_VERSION
14
- } from "./chunk-GJZXDRH5.js";
14
+ } from "./chunk-2OHOIGNC.js";
15
15
 
16
16
  // core/client.ts
17
17
  var DEFAULT_BASE_URL = "https://api.morphllm.com";
@@ -117,4 +117,4 @@ var MorphAPIClient = class {
117
117
  export {
118
118
  MorphAPIClient
119
119
  };
120
- //# sourceMappingURL=chunk-453ZV2AX.js.map
120
+ //# sourceMappingURL=chunk-XBUHHKHX.js.map
@@ -0,0 +1,39 @@
1
+ import {
2
+ __export
3
+ } from "./chunk-PZ5AY32C.js";
4
+
5
+ // tracing/otel.ts
6
+ var otel_exports = {};
7
+ __export(otel_exports, {
8
+ MORPH_METADATA_PREFIX: () => MORPH_METADATA_PREFIX,
9
+ default: () => otel_default,
10
+ metadata: () => metadata
11
+ });
12
+ var MORPH_METADATA_PREFIX = "morph";
13
+ function uuid() {
14
+ const c = globalThis.crypto;
15
+ if (c?.randomUUID) return c.randomUUID();
16
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (ch) => {
17
+ const r = Math.random() * 16 | 0;
18
+ const v = ch === "x" ? r : r & 3 | 8;
19
+ return v.toString(16);
20
+ });
21
+ }
22
+ function metadata(opts) {
23
+ const result = {
24
+ [`${MORPH_METADATA_PREFIX}.userId`]: opts.userId,
25
+ [`${MORPH_METADATA_PREFIX}.eventId`]: opts.eventId ?? uuid()
26
+ };
27
+ if (opts.convoId) result[`${MORPH_METADATA_PREFIX}.convoId`] = opts.convoId;
28
+ if (opts.eventName) result[`${MORPH_METADATA_PREFIX}.eventName`] = opts.eventName;
29
+ return result;
30
+ }
31
+ var otel_default = { metadata };
32
+
33
+ export {
34
+ MORPH_METADATA_PREFIX,
35
+ metadata,
36
+ otel_default,
37
+ otel_exports
38
+ };
39
+ //# sourceMappingURL=chunk-XQ4T5QDT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../tracing/otel.ts"],"sourcesContent":["/**\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"],"mappings":";;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BO,IAAM,wBAAwB;AAErC,SAAS,OAAe;AAEtB,QAAM,IAAK,WAA0D;AACrE,MAAI,GAAG,WAAY,QAAO,EAAE,WAAW;AAEvC,SAAO,uCAAuC,QAAQ,SAAS,CAAC,OAAO;AACrE,UAAM,IAAK,KAAK,OAAO,IAAI,KAAM;AACjC,UAAM,IAAI,OAAO,MAAM,IAAK,IAAI,IAAO;AACvC,WAAO,EAAE,SAAS,EAAE;AAAA,EACtB,CAAC;AACH;AAOO,SAAS,SAAS,MAA+C;AACtE,QAAM,SAAiC;AAAA,IACrC,CAAC,GAAG,qBAAqB,SAAS,GAAG,KAAK;AAAA,IAC1C,CAAC,GAAG,qBAAqB,UAAU,GAAG,KAAK,WAAW,KAAK;AAAA,EAC7D;AACA,MAAI,KAAK,QAAS,QAAO,GAAG,qBAAqB,UAAU,IAAI,KAAK;AACpE,MAAI,KAAK,UAAW,QAAO,GAAG,qBAAqB,YAAY,IAAI,KAAK;AACxE,SAAO;AACT;AAEA,IAAO,eAAQ,EAAE,SAAS;","names":[]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  MorphAPIClient
3
- } from "./chunk-453ZV2AX.js";
3
+ } from "./chunk-XBUHHKHX.js";
4
4
  import {
5
5
  MorphError
6
- } from "./chunk-XYTYIAMQ.js";
6
+ } from "./chunk-M35HA2EQ.js";
7
7
  import {
8
8
  APIResource
9
9
  } from "./chunk-LKFZBBTD.js";
@@ -36,7 +36,7 @@ var ReflexClient = class extends APIResource {
36
36
  model: raw.model,
37
37
  label: raw.label,
38
38
  confidence: raw.confidence,
39
- allScores: raw.all_scores ?? {},
39
+ allScores: raw.all_scores ?? [],
40
40
  inferenceTimeMs: raw.inference_time_ms
41
41
  };
42
42
  }
@@ -155,4 +155,4 @@ export {
155
155
  ReflexClient,
156
156
  ReflexJobsResource
157
157
  };
158
- //# sourceMappingURL=chunk-6X6QMRQG.js.map
158
+ //# sourceMappingURL=chunk-XVNI3Y3O.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../tools/reflex/core.ts"],"sourcesContent":["/**\n * Reflex: train and serve small text classifiers.\n *\n * const morph = new MorphClient({ apiKey });\n * const job = await morph.reflex.jobs.create({ trainingData: rows, suffix: 'support' });\n * const ready = await morph.reflex.jobs.waitForReady(job.id);\n * const out = await morph.reflex.predict({ model: ready.fineTunedModel!, text: 'refund please' });\n *\n * Mirrors the OpenAI fine-tuning shape (`reflex.jobs.create/retrieve/list/cancel/delete`)\n * plus `reflex.predict`. All HTTP goes through the shared `MorphAPIClient` transport.\n */\nimport { MorphAPIClient } from '../../core/client.js';\nimport { APIResource } from '../../core/resource.js';\nimport { MorphError } from '../utils/resilience.js';\nimport type {\n CreateReflexJobInput,\n DeletedReflexJob,\n ListReflexJobsInput,\n ReflexConfig,\n ReflexEvent,\n ReflexJob,\n ReflexJobList,\n ReflexPredictInput,\n ReflexPredictResult,\n} from './types.js';\n\nconst BASE_MODEL = 'morph-reflex-v1';\n\n/** Build a transport from either a shared client or a standalone `ReflexConfig`. */\nfunction resolveClient(clientOrConfig: MorphAPIClient | ReflexConfig): MorphAPIClient {\n if (clientOrConfig instanceof MorphAPIClient) return clientOrConfig;\n return new MorphAPIClient({\n apiKey: clientOrConfig.apiKey,\n baseURL: clientOrConfig.baseUrl,\n timeout: clientOrConfig.timeout,\n retryConfig: clientOrConfig.retryConfig,\n debug: clientOrConfig.debug,\n });\n}\n\n/**\n * @deprecated Prefer the unified `MorphClient` (`new MorphClient({ apiKey }).reflex`).\n * Standalone clients remain only for backwards compatibility and may be removed in a future\n * major version — do not use them in new code.\n */\nexport class ReflexClient extends APIResource {\n /** Train, retrieve, and manage classifier jobs. */\n public readonly jobs: ReflexJobsResource;\n\n constructor(clientOrConfig: MorphAPIClient | ReflexConfig = {}) {\n super(resolveClient(clientOrConfig));\n this.jobs = new ReflexJobsResource(this._client);\n }\n\n /** Classify text against a trained model. The model must be `succeeded`. */\n async predict(input: ReflexPredictInput): Promise<ReflexPredictResult> {\n const raw = await this._client.post<RawPredict>('/v1/reflex/predict', {\n body: { model: input.model, text: input.text },\n });\n return {\n model: raw.model,\n label: raw.label,\n confidence: raw.confidence,\n allScores: raw.all_scores ?? {},\n inferenceTimeMs: raw.inference_time_ms,\n };\n }\n}\n\nexport class ReflexJobsResource extends APIResource {\n /** Start a training job from labeled data, a description, or unlabeled text. */\n async create(input: CreateReflexJobInput): Promise<ReflexJob> {\n return toReflexJob(await this._client.post<RawJob>('/v1/fine_tuning/jobs', { body: createBody(input) }));\n }\n\n /** Fetch a job by id. */\n async retrieve(id: string): Promise<ReflexJob> {\n return toReflexJob(await this._client.get<RawJob>(`/v1/fine_tuning/jobs/${encodeURIComponent(id)}`));\n }\n\n /** List the caller's jobs, newest first. */\n async list(input: ListReflexJobsInput = {}): Promise<ReflexJobList> {\n const raw = await this._client.get<RawJobList>('/v1/fine_tuning/jobs', {\n query: { limit: input.limit, after: input.after },\n });\n return { data: (raw.data ?? []).map(toReflexJob), hasMore: Boolean(raw.has_more) };\n }\n\n /** Stop a queued or running job. */\n async cancel(id: string): Promise<ReflexJob> {\n return toReflexJob(await this._client.post<RawJob>(`/v1/fine_tuning/jobs/${encodeURIComponent(id)}/cancel`));\n }\n\n /** Delete a job and its trained model. */\n async delete(id: string): Promise<DeletedReflexJob> {\n const raw = await this._client.delete<{ id: string; deleted?: boolean }>(\n `/v1/fine_tuning/jobs/${encodeURIComponent(id)}`,\n );\n return { id: raw.id, deleted: Boolean(raw.deleted) };\n }\n\n /** The training loss curve as events, plus a terminal event. */\n async events(id: string): Promise<ReflexEvent[]> {\n const raw = await this._client.get<{ data?: RawEvent[] }>(\n `/v1/fine_tuning/jobs/${encodeURIComponent(id)}/events`,\n );\n return (raw.data ?? []).map(toReflexEvent);\n }\n\n /**\n * Poll until the job reaches a terminal status and return it on success.\n * Throws a `MorphError` if it fails, is cancelled, or exceeds `timeoutMs`.\n */\n async waitForReady(id: string, opts: { pollMs?: number; timeoutMs?: number } = {}): Promise<ReflexJob> {\n const pollMs = opts.pollMs ?? 3_000;\n const deadline = Date.now() + (opts.timeoutMs ?? 15 * 60_000);\n\n for (;;) {\n const job = await this.retrieve(id);\n if (job.status === 'succeeded') return job;\n if (job.status === 'failed' || job.status === 'cancelled') {\n throw new MorphError(job.error?.message ?? `Reflex job ${job.status}`, `reflex_job_${job.status}`);\n }\n if (Date.now() >= deadline) {\n throw new MorphError(`Reflex job ${id} did not finish in time`, 'reflex_timeout');\n }\n await sleep(pollMs);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mapping (camelCase <-> snake_case) and helpers\n// ---------------------------------------------------------------------------\n\ninterface RawJob {\n id: string;\n model: string;\n created_at: number;\n finished_at: number | null;\n fine_tuned_model: string | null;\n status: ReflexJob['status'];\n labels?: string[];\n trained_examples?: number;\n result?: { accuracy: number | null; f1_score: number | null } | null;\n error?: { message: string } | null;\n suffix?: string | null;\n}\ninterface RawJobList {\n data?: RawJob[];\n has_more?: boolean;\n}\ninterface RawPredict {\n model: string;\n label: string;\n confidence: number;\n all_scores?: Record<string, number>;\n inference_time_ms: number;\n}\ninterface RawEvent {\n id: string;\n created_at: number;\n level: ReflexEvent['level'];\n message: string;\n type: ReflexEvent['type'];\n data?: { epoch?: number; step?: number; train_loss?: number };\n}\n\nfunction createBody(input: CreateReflexJobInput): Record<string, unknown> {\n const base: Record<string, unknown> = { model: BASE_MODEL };\n if (input.suffix) base.suffix = input.suffix;\n\n if ('trainingData' in input) {\n if (input.labels) base.labels = input.labels;\n return { ...base, training_data: input.trainingData };\n }\n if ('generate' in input) {\n return {\n ...base,\n labels: input.labels,\n generate: {\n description: input.generate.description,\n ...(input.generate.examplesPerLabel != null ? { examples_per_label: input.generate.examplesPerLabel } : {}),\n },\n };\n }\n return {\n ...base,\n labels: input.labels,\n label_data: {\n texts: input.labelData.texts,\n ...(input.labelData.description ? { description: input.labelData.description } : {}),\n },\n };\n}\n\nfunction toReflexJob(raw: RawJob): ReflexJob {\n return {\n id: raw.id,\n object: 'fine_tuning.job',\n model: raw.model,\n createdAt: raw.created_at,\n finishedAt: raw.finished_at ?? null,\n fineTunedModel: raw.fine_tuned_model ?? null,\n status: raw.status,\n labels: raw.labels ?? [],\n trainedExamples: raw.trained_examples ?? 0,\n result: raw.result ? { accuracy: raw.result.accuracy ?? null, f1Score: raw.result.f1_score ?? null } : null,\n error: raw.error ? { message: raw.error.message } : null,\n suffix: raw.suffix ?? null,\n };\n}\n\nfunction toReflexEvent(raw: RawEvent): ReflexEvent {\n return {\n id: raw.id,\n createdAt: raw.created_at,\n level: raw.level,\n message: raw.message,\n type: raw.type,\n data: { epoch: raw.data?.epoch ?? 0, step: raw.data?.step ?? 0, trainLoss: raw.data?.train_loss ?? 0 },\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n"],"mappings":";;;;;;;;;;;AA0BA,IAAM,aAAa;AAGnB,SAAS,cAAc,gBAA+D;AACpF,MAAI,0BAA0B,eAAgB,QAAO;AACrD,SAAO,IAAI,eAAe;AAAA,IACxB,QAAQ,eAAe;AAAA,IACvB,SAAS,eAAe;AAAA,IACxB,SAAS,eAAe;AAAA,IACxB,aAAa,eAAe;AAAA,IAC5B,OAAO,eAAe;AAAA,EACxB,CAAC;AACH;AAOO,IAAM,eAAN,cAA2B,YAAY;AAAA;AAAA,EAE5B;AAAA,EAEhB,YAAY,iBAAgD,CAAC,GAAG;AAC9D,UAAM,cAAc,cAAc,CAAC;AACnC,SAAK,OAAO,IAAI,mBAAmB,KAAK,OAAO;AAAA,EACjD;AAAA;AAAA,EAGA,MAAM,QAAQ,OAAyD;AACrE,UAAM,MAAM,MAAM,KAAK,QAAQ,KAAiB,sBAAsB;AAAA,MACpE,MAAM,EAAE,OAAO,MAAM,OAAO,MAAM,MAAM,KAAK;AAAA,IAC/C,CAAC;AACD,WAAO;AAAA,MACL,OAAO,IAAI;AAAA,MACX,OAAO,IAAI;AAAA,MACX,YAAY,IAAI;AAAA,MAChB,WAAW,IAAI,cAAc,CAAC;AAAA,MAC9B,iBAAiB,IAAI;AAAA,IACvB;AAAA,EACF;AACF;AAEO,IAAM,qBAAN,cAAiC,YAAY;AAAA;AAAA,EAElD,MAAM,OAAO,OAAiD;AAC5D,WAAO,YAAY,MAAM,KAAK,QAAQ,KAAa,wBAAwB,EAAE,MAAM,WAAW,KAAK,EAAE,CAAC,CAAC;AAAA,EACzG;AAAA;AAAA,EAGA,MAAM,SAAS,IAAgC;AAC7C,WAAO,YAAY,MAAM,KAAK,QAAQ,IAAY,wBAAwB,mBAAmB,EAAE,CAAC,EAAE,CAAC;AAAA,EACrG;AAAA;AAAA,EAGA,MAAM,KAAK,QAA6B,CAAC,GAA2B;AAClE,UAAM,MAAM,MAAM,KAAK,QAAQ,IAAgB,wBAAwB;AAAA,MACrE,OAAO,EAAE,OAAO,MAAM,OAAO,OAAO,MAAM,MAAM;AAAA,IAClD,CAAC;AACD,WAAO,EAAE,OAAO,IAAI,QAAQ,CAAC,GAAG,IAAI,WAAW,GAAG,SAAS,QAAQ,IAAI,QAAQ,EAAE;AAAA,EACnF;AAAA;AAAA,EAGA,MAAM,OAAO,IAAgC;AAC3C,WAAO,YAAY,MAAM,KAAK,QAAQ,KAAa,wBAAwB,mBAAmB,EAAE,CAAC,SAAS,CAAC;AAAA,EAC7G;AAAA;AAAA,EAGA,MAAM,OAAO,IAAuC;AAClD,UAAM,MAAM,MAAM,KAAK,QAAQ;AAAA,MAC7B,wBAAwB,mBAAmB,EAAE,CAAC;AAAA,IAChD;AACA,WAAO,EAAE,IAAI,IAAI,IAAI,SAAS,QAAQ,IAAI,OAAO,EAAE;AAAA,EACrD;AAAA;AAAA,EAGA,MAAM,OAAO,IAAoC;AAC/C,UAAM,MAAM,MAAM,KAAK,QAAQ;AAAA,MAC7B,wBAAwB,mBAAmB,EAAE,CAAC;AAAA,IAChD;AACA,YAAQ,IAAI,QAAQ,CAAC,GAAG,IAAI,aAAa;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,IAAY,OAAgD,CAAC,GAAuB;AACrG,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,WAAW,KAAK,IAAI,KAAK,KAAK,aAAa,KAAK;AAEtD,eAAS;AACP,YAAM,MAAM,MAAM,KAAK,SAAS,EAAE;AAClC,UAAI,IAAI,WAAW,YAAa,QAAO;AACvC,UAAI,IAAI,WAAW,YAAY,IAAI,WAAW,aAAa;AACzD,cAAM,IAAI,WAAW,IAAI,OAAO,WAAW,cAAc,IAAI,MAAM,IAAI,cAAc,IAAI,MAAM,EAAE;AAAA,MACnG;AACA,UAAI,KAAK,IAAI,KAAK,UAAU;AAC1B,cAAM,IAAI,WAAW,cAAc,EAAE,2BAA2B,gBAAgB;AAAA,MAClF;AACA,YAAM,MAAM,MAAM;AAAA,IACpB;AAAA,EACF;AACF;AAuCA,SAAS,WAAW,OAAsD;AACxE,QAAM,OAAgC,EAAE,OAAO,WAAW;AAC1D,MAAI,MAAM,OAAQ,MAAK,SAAS,MAAM;AAEtC,MAAI,kBAAkB,OAAO;AAC3B,QAAI,MAAM,OAAQ,MAAK,SAAS,MAAM;AACtC,WAAO,EAAE,GAAG,MAAM,eAAe,MAAM,aAAa;AAAA,EACtD;AACA,MAAI,cAAc,OAAO;AACvB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ,MAAM;AAAA,MACd,UAAU;AAAA,QACR,aAAa,MAAM,SAAS;AAAA,QAC5B,GAAI,MAAM,SAAS,oBAAoB,OAAO,EAAE,oBAAoB,MAAM,SAAS,iBAAiB,IAAI,CAAC;AAAA,MAC3G;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,MAAM;AAAA,IACd,YAAY;AAAA,MACV,OAAO,MAAM,UAAU;AAAA,MACvB,GAAI,MAAM,UAAU,cAAc,EAAE,aAAa,MAAM,UAAU,YAAY,IAAI,CAAC;AAAA,IACpF;AAAA,EACF;AACF;AAEA,SAAS,YAAY,KAAwB;AAC3C,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,QAAQ;AAAA,IACR,OAAO,IAAI;AAAA,IACX,WAAW,IAAI;AAAA,IACf,YAAY,IAAI,eAAe;AAAA,IAC/B,gBAAgB,IAAI,oBAAoB;AAAA,IACxC,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI,UAAU,CAAC;AAAA,IACvB,iBAAiB,IAAI,oBAAoB;AAAA,IACzC,QAAQ,IAAI,SAAS,EAAE,UAAU,IAAI,OAAO,YAAY,MAAM,SAAS,IAAI,OAAO,YAAY,KAAK,IAAI;AAAA,IACvG,OAAO,IAAI,QAAQ,EAAE,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpD,QAAQ,IAAI,UAAU;AAAA,EACxB;AACF;AAEA,SAAS,cAAc,KAA4B;AACjD,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,WAAW,IAAI;AAAA,IACf,OAAO,IAAI;AAAA,IACX,SAAS,IAAI;AAAA,IACb,MAAM,IAAI;AAAA,IACV,MAAM,EAAE,OAAO,IAAI,MAAM,SAAS,GAAG,MAAM,IAAI,MAAM,QAAQ,GAAG,WAAW,IAAI,MAAM,cAAc,EAAE;AAAA,EACvG;AACF;AAEA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACvD;","names":[]}
1
+ {"version":3,"sources":["../tools/reflex/core.ts"],"sourcesContent":["/**\n * Reflex: train and serve small text classifiers.\n *\n * const morph = new MorphClient({ apiKey });\n * const job = await morph.reflex.jobs.create({ trainingData: rows, suffix: 'support' });\n * const ready = await morph.reflex.jobs.waitForReady(job.id);\n * const out = await morph.reflex.predict({ model: ready.fineTunedModel!, text: 'refund please' });\n *\n * Mirrors the OpenAI fine-tuning shape (`reflex.jobs.create/retrieve/list/cancel/delete`)\n * plus `reflex.predict`. All HTTP goes through the shared `MorphAPIClient` transport.\n */\nimport { MorphAPIClient } from '../../core/client.js';\nimport { APIResource } from '../../core/resource.js';\nimport { MorphError } from '../utils/resilience.js';\nimport type {\n CreateReflexJobInput,\n DeletedReflexJob,\n ListReflexJobsInput,\n ReflexConfig,\n ReflexEvent,\n ReflexJob,\n ReflexJobList,\n ReflexPredictInput,\n ReflexPredictResult,\n} from './types.js';\n\nconst BASE_MODEL = 'morph-reflex-v1';\n\n/** Build a transport from either a shared client or a standalone `ReflexConfig`. */\nfunction resolveClient(clientOrConfig: MorphAPIClient | ReflexConfig): MorphAPIClient {\n if (clientOrConfig instanceof MorphAPIClient) return clientOrConfig;\n return new MorphAPIClient({\n apiKey: clientOrConfig.apiKey,\n baseURL: clientOrConfig.baseUrl,\n timeout: clientOrConfig.timeout,\n retryConfig: clientOrConfig.retryConfig,\n debug: clientOrConfig.debug,\n });\n}\n\n/**\n * @deprecated Prefer the unified `MorphClient` (`new MorphClient({ apiKey }).reflex`).\n * Standalone clients remain only for backwards compatibility and may be removed in a future\n * major version — do not use them in new code.\n */\nexport class ReflexClient extends APIResource {\n /** Train, retrieve, and manage classifier jobs. */\n public readonly jobs: ReflexJobsResource;\n\n constructor(clientOrConfig: MorphAPIClient | ReflexConfig = {}) {\n super(resolveClient(clientOrConfig));\n this.jobs = new ReflexJobsResource(this._client);\n }\n\n /** Classify text against a trained model. The model must be `succeeded`. */\n async predict(input: ReflexPredictInput): Promise<ReflexPredictResult> {\n const raw = await this._client.post<RawPredict>('/v1/reflex/predict', {\n body: { model: input.model, text: input.text },\n });\n return {\n model: raw.model,\n label: raw.label,\n confidence: raw.confidence,\n allScores: raw.all_scores ?? [],\n inferenceTimeMs: raw.inference_time_ms,\n };\n }\n}\n\nexport class ReflexJobsResource extends APIResource {\n /** Start a training job from labeled data, a description, or unlabeled text. */\n async create(input: CreateReflexJobInput): Promise<ReflexJob> {\n return toReflexJob(await this._client.post<RawJob>('/v1/fine_tuning/jobs', { body: createBody(input) }));\n }\n\n /** Fetch a job by id. */\n async retrieve(id: string): Promise<ReflexJob> {\n return toReflexJob(await this._client.get<RawJob>(`/v1/fine_tuning/jobs/${encodeURIComponent(id)}`));\n }\n\n /** List the caller's jobs, newest first. */\n async list(input: ListReflexJobsInput = {}): Promise<ReflexJobList> {\n const raw = await this._client.get<RawJobList>('/v1/fine_tuning/jobs', {\n query: { limit: input.limit, after: input.after },\n });\n return { data: (raw.data ?? []).map(toReflexJob), hasMore: Boolean(raw.has_more) };\n }\n\n /** Stop a queued or running job. */\n async cancel(id: string): Promise<ReflexJob> {\n return toReflexJob(await this._client.post<RawJob>(`/v1/fine_tuning/jobs/${encodeURIComponent(id)}/cancel`));\n }\n\n /** Delete a job and its trained model. */\n async delete(id: string): Promise<DeletedReflexJob> {\n const raw = await this._client.delete<{ id: string; deleted?: boolean }>(\n `/v1/fine_tuning/jobs/${encodeURIComponent(id)}`,\n );\n return { id: raw.id, deleted: Boolean(raw.deleted) };\n }\n\n /** The training loss curve as events, plus a terminal event. */\n async events(id: string): Promise<ReflexEvent[]> {\n const raw = await this._client.get<{ data?: RawEvent[] }>(\n `/v1/fine_tuning/jobs/${encodeURIComponent(id)}/events`,\n );\n return (raw.data ?? []).map(toReflexEvent);\n }\n\n /**\n * Poll until the job reaches a terminal status and return it on success.\n * Throws a `MorphError` if it fails, is cancelled, or exceeds `timeoutMs`.\n */\n async waitForReady(id: string, opts: { pollMs?: number; timeoutMs?: number } = {}): Promise<ReflexJob> {\n const pollMs = opts.pollMs ?? 3_000;\n const deadline = Date.now() + (opts.timeoutMs ?? 15 * 60_000);\n\n for (;;) {\n const job = await this.retrieve(id);\n if (job.status === 'succeeded') return job;\n if (job.status === 'failed' || job.status === 'cancelled') {\n throw new MorphError(job.error?.message ?? `Reflex job ${job.status}`, `reflex_job_${job.status}`);\n }\n if (Date.now() >= deadline) {\n throw new MorphError(`Reflex job ${id} did not finish in time`, 'reflex_timeout');\n }\n await sleep(pollMs);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mapping (camelCase <-> snake_case) and helpers\n// ---------------------------------------------------------------------------\n\ninterface RawJob {\n id: string;\n model: string;\n created_at: number;\n finished_at: number | null;\n fine_tuned_model: string | null;\n status: ReflexJob['status'];\n labels?: string[];\n trained_examples?: number;\n result?: { accuracy: number | null; f1_score: number | null } | null;\n error?: { message: string } | null;\n suffix?: string | null;\n}\ninterface RawJobList {\n data?: RawJob[];\n has_more?: boolean;\n}\ninterface RawPredict {\n model: string;\n label: string;\n confidence: number;\n all_scores?: number[];\n inference_time_ms: number;\n}\ninterface RawEvent {\n id: string;\n created_at: number;\n level: ReflexEvent['level'];\n message: string;\n type: ReflexEvent['type'];\n data?: { epoch?: number; step?: number; train_loss?: number };\n}\n\nfunction createBody(input: CreateReflexJobInput): Record<string, unknown> {\n const base: Record<string, unknown> = { model: BASE_MODEL };\n if (input.suffix) base.suffix = input.suffix;\n\n if ('trainingData' in input) {\n if (input.labels) base.labels = input.labels;\n return { ...base, training_data: input.trainingData };\n }\n if ('generate' in input) {\n return {\n ...base,\n labels: input.labels,\n generate: {\n description: input.generate.description,\n ...(input.generate.examplesPerLabel != null ? { examples_per_label: input.generate.examplesPerLabel } : {}),\n },\n };\n }\n return {\n ...base,\n labels: input.labels,\n label_data: {\n texts: input.labelData.texts,\n ...(input.labelData.description ? { description: input.labelData.description } : {}),\n },\n };\n}\n\nfunction toReflexJob(raw: RawJob): ReflexJob {\n return {\n id: raw.id,\n object: 'fine_tuning.job',\n model: raw.model,\n createdAt: raw.created_at,\n finishedAt: raw.finished_at ?? null,\n fineTunedModel: raw.fine_tuned_model ?? null,\n status: raw.status,\n labels: raw.labels ?? [],\n trainedExamples: raw.trained_examples ?? 0,\n result: raw.result ? { accuracy: raw.result.accuracy ?? null, f1Score: raw.result.f1_score ?? null } : null,\n error: raw.error ? { message: raw.error.message } : null,\n suffix: raw.suffix ?? null,\n };\n}\n\nfunction toReflexEvent(raw: RawEvent): ReflexEvent {\n return {\n id: raw.id,\n createdAt: raw.created_at,\n level: raw.level,\n message: raw.message,\n type: raw.type,\n data: { epoch: raw.data?.epoch ?? 0, step: raw.data?.step ?? 0, trainLoss: raw.data?.train_loss ?? 0 },\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n"],"mappings":"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","names":[]}
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  MorphAPIClient
3
- } from "./chunk-453ZV2AX.js";
3
+ } from "./chunk-XBUHHKHX.js";
4
4
  import {
5
5
  logger
6
6
  } from "./chunk-F3NCFNUX.js";
7
7
  import {
8
8
  MorphError
9
- } from "./chunk-XYTYIAMQ.js";
9
+ } from "./chunk-M35HA2EQ.js";
10
10
  import {
11
11
  APIResource
12
12
  } from "./chunk-LKFZBBTD.js";
@@ -94,4 +94,4 @@ export {
94
94
  CodebaseSearchClient,
95
95
  executeCodebaseSearch
96
96
  };
97
- //# sourceMappingURL=chunk-ZLSNL6M2.js.map
97
+ //# sourceMappingURL=chunk-ZG6JEYEG.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  WarpGrepClient,
3
3
  formatResult
4
- } from "./chunk-CQF76HJC.js";
4
+ } from "./chunk-QW3ARPU3.js";
5
5
  import {
6
6
  CODEBASE_SEARCH_TOOL,
7
7
  SEND_MESSAGE_TOOL,
@@ -262,4 +262,4 @@ function deduplicateContexts(contexts) {
262
262
  export {
263
263
  createExploreSubagent
264
264
  };
265
- //# sourceMappingURL=chunk-QZ3V2BP7.js.map
265
+ //# sourceMappingURL=chunk-ZHWVJ7SF.js.map