@morphllm/morphsdk 0.2.179 → 0.2.181

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 (235) hide show
  1. package/dist/{chunk-ZMXPIXOS.js → chunk-2VETLL6C.js} +2 -2
  2. package/dist/{chunk-PSJXKCCP.js → chunk-4DLGPMUS.js} +2 -2
  3. package/dist/{chunk-V2BD6NXI.js → chunk-4NDS3GQB.js} +4 -4
  4. package/dist/{chunk-U3XOCF4O.js → chunk-4ZTI7JDJ.js} +3 -3
  5. package/dist/{chunk-BGRGUSNI.js → chunk-AFMB2XGS.js} +2 -2
  6. package/dist/{chunk-ABQMAHEA.js → chunk-AWUIP46W.js} +2 -2
  7. package/dist/{chunk-53RYMV2B.js → chunk-CIBOCK5C.js} +39 -4
  8. package/dist/chunk-CIBOCK5C.js.map +1 -0
  9. package/dist/{chunk-CXE7CVNL.js → chunk-CTCRNGRP.js} +2 -2
  10. package/dist/{chunk-WKKPZO4I.js → chunk-DYGQ3BB5.js} +2 -2
  11. package/dist/{chunk-PP2GHVRI.js → chunk-GG4ATN6M.js} +2 -2
  12. package/dist/{chunk-PP2GHVRI.js.map → chunk-GG4ATN6M.js.map} +1 -1
  13. package/dist/{chunk-2MSNIGVA.js → chunk-IDMKQWQG.js} +52 -4
  14. package/dist/chunk-IDMKQWQG.js.map +1 -0
  15. package/dist/{chunk-RANVC4NO.js → chunk-IHVQKX6U.js} +25 -23
  16. package/dist/{chunk-RANVC4NO.js.map → chunk-IHVQKX6U.js.map} +1 -1
  17. package/dist/{chunk-GEPVEMCF.js → chunk-II3AF6LD.js} +2 -2
  18. package/dist/{chunk-I3UFROCM.js → chunk-INXEXFQV.js} +2 -2
  19. package/dist/{chunk-Q5FAU76K.js → chunk-J7BZPA63.js} +78 -9
  20. package/dist/chunk-J7BZPA63.js.map +1 -0
  21. package/dist/{chunk-6VFTPA27.js → chunk-KOTSWCSD.js} +2 -2
  22. package/dist/{chunk-V2QYP4Z7.js → chunk-KP3YMV7Y.js} +2 -2
  23. package/dist/{chunk-47MAQT6H.js → chunk-KP5VIWLO.js} +2 -2
  24. package/dist/{chunk-PK2OTDD5.js → chunk-LJ27CQI3.js} +2 -2
  25. package/dist/{chunk-YO7D5VEC.js → chunk-LZUBCNTC.js} +2 -2
  26. package/dist/{chunk-OK5Y6FH6.js → chunk-MNDFDO2W.js} +2 -2
  27. package/dist/{chunk-4YKNHDJI.js → chunk-MYBIXWNM.js} +2 -2
  28. package/dist/{chunk-6FQLA42K.js → chunk-NOX6MIA2.js} +2 -2
  29. package/dist/{chunk-S3V5JP26.js → chunk-OWY3P43T.js} +2 -2
  30. package/dist/{chunk-OR27NPLB.js → chunk-P63CYB3F.js} +2 -2
  31. package/dist/{chunk-EQJEOG3S.js → chunk-PJWEGYOK.js} +2 -2
  32. package/dist/{chunk-MA2LJGLZ.js → chunk-QAJW6FOO.js} +2 -2
  33. package/dist/{chunk-WGIMYL4A.js → chunk-STJTJDAV.js} +28 -13
  34. package/dist/chunk-STJTJDAV.js.map +1 -0
  35. package/dist/{chunk-CVH6TA6O.js → chunk-TD2SQ6TQ.js} +3 -3
  36. package/dist/{chunk-CABQ652L.js → chunk-TLXVGE4R.js} +1 -1
  37. package/dist/chunk-TLXVGE4R.js.map +1 -0
  38. package/dist/{chunk-Y6QK7CDW.js → chunk-WJ2LQ3NR.js} +2 -2
  39. package/dist/{chunk-5G3D45TP.js → chunk-X4JLZWGW.js} +4 -4
  40. package/dist/{chunk-TROXSFNC.js → chunk-X4XBY7VI.js} +4 -4
  41. package/dist/{chunk-4PT4J6FV.js → chunk-X5YEUR65.js} +2 -2
  42. package/dist/{client-Dh6yzCm4.d.ts → client-DUvmVWQJ.d.ts} +2 -1
  43. package/dist/client.cjs +112 -8
  44. package/dist/client.cjs.map +1 -1
  45. package/dist/client.d.ts +1 -1
  46. package/dist/client.js +28 -28
  47. package/dist/core/client.cjs +1 -1
  48. package/dist/core/client.cjs.map +1 -1
  49. package/dist/core/client.js +4 -4
  50. package/dist/core/error.cjs +1 -1
  51. package/dist/core/error.cjs.map +1 -1
  52. package/dist/core/error.js +3 -3
  53. package/dist/core/index.cjs +1 -1
  54. package/dist/core/index.cjs.map +1 -1
  55. package/dist/core/index.js +4 -4
  56. package/dist/edge.cjs +37 -1
  57. package/dist/edge.cjs.map +1 -1
  58. package/dist/edge.d.ts +2 -2
  59. package/dist/edge.js +10 -8
  60. package/dist/git/client.cjs +1 -1
  61. package/dist/git/client.cjs.map +1 -1
  62. package/dist/git/client.js +5 -5
  63. package/dist/git/index.cjs +1 -1
  64. package/dist/git/index.cjs.map +1 -1
  65. package/dist/git/index.js +5 -5
  66. package/dist/index.cjs +112 -8
  67. package/dist/index.cjs.map +1 -1
  68. package/dist/index.d.ts +2 -2
  69. package/dist/index.js +28 -28
  70. package/dist/modelrouter/core.cjs +39 -3
  71. package/dist/modelrouter/core.cjs.map +1 -1
  72. package/dist/modelrouter/core.d.ts +15 -2
  73. package/dist/modelrouter/core.js +9 -7
  74. package/dist/modelrouter/index.cjs +39 -3
  75. package/dist/modelrouter/index.cjs.map +1 -1
  76. package/dist/modelrouter/index.d.ts +2 -2
  77. package/dist/modelrouter/index.js +9 -7
  78. package/dist/modelrouter/types.cjs.map +1 -1
  79. package/dist/modelrouter/types.d.ts +24 -1
  80. package/dist/{otel-Dk8kdhmZ.d.ts → otel-CG0uqXjp.d.ts} +1 -1
  81. package/dist/subagents/anthropic.cjs +1 -1
  82. package/dist/subagents/anthropic.cjs.map +1 -1
  83. package/dist/subagents/anthropic.js +9 -9
  84. package/dist/subagents/vercel.cjs +1 -1
  85. package/dist/subagents/vercel.cjs.map +1 -1
  86. package/dist/subagents/vercel.js +9 -9
  87. package/dist/tools/browser/anthropic.cjs +1 -1
  88. package/dist/tools/browser/anthropic.cjs.map +1 -1
  89. package/dist/tools/browser/anthropic.js +7 -7
  90. package/dist/tools/browser/core.cjs +1 -1
  91. package/dist/tools/browser/core.cjs.map +1 -1
  92. package/dist/tools/browser/core.js +6 -6
  93. package/dist/tools/browser/index.cjs +1 -1
  94. package/dist/tools/browser/index.cjs.map +1 -1
  95. package/dist/tools/browser/index.js +9 -9
  96. package/dist/tools/browser/openai.cjs +1 -1
  97. package/dist/tools/browser/openai.cjs.map +1 -1
  98. package/dist/tools/browser/openai.js +7 -7
  99. package/dist/tools/browser/profiles/core.cjs +1 -1
  100. package/dist/tools/browser/profiles/core.cjs.map +1 -1
  101. package/dist/tools/browser/profiles/core.js +3 -3
  102. package/dist/tools/browser/profiles/index.cjs +1 -1
  103. package/dist/tools/browser/profiles/index.cjs.map +1 -1
  104. package/dist/tools/browser/profiles/index.js +3 -3
  105. package/dist/tools/browser/vercel.cjs +1 -1
  106. package/dist/tools/browser/vercel.cjs.map +1 -1
  107. package/dist/tools/browser/vercel.js +7 -7
  108. package/dist/tools/codebase_search/anthropic.cjs +1 -1
  109. package/dist/tools/codebase_search/anthropic.cjs.map +1 -1
  110. package/dist/tools/codebase_search/anthropic.js +6 -6
  111. package/dist/tools/codebase_search/core.cjs +1 -1
  112. package/dist/tools/codebase_search/core.cjs.map +1 -1
  113. package/dist/tools/codebase_search/core.js +5 -5
  114. package/dist/tools/codebase_search/index.cjs +1 -1
  115. package/dist/tools/codebase_search/index.cjs.map +1 -1
  116. package/dist/tools/codebase_search/index.js +8 -8
  117. package/dist/tools/codebase_search/openai.cjs +1 -1
  118. package/dist/tools/codebase_search/openai.cjs.map +1 -1
  119. package/dist/tools/codebase_search/openai.js +6 -6
  120. package/dist/tools/codebase_search/vercel.cjs +1 -1
  121. package/dist/tools/codebase_search/vercel.cjs.map +1 -1
  122. package/dist/tools/codebase_search/vercel.js +6 -6
  123. package/dist/tools/compact/core.cjs +1 -1
  124. package/dist/tools/compact/core.cjs.map +1 -1
  125. package/dist/tools/compact/core.js +5 -5
  126. package/dist/tools/compact/index.cjs +1 -1
  127. package/dist/tools/compact/index.cjs.map +1 -1
  128. package/dist/tools/compact/index.js +6 -6
  129. package/dist/tools/fastapply/anthropic.cjs +1 -1
  130. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  131. package/dist/tools/fastapply/anthropic.js +7 -7
  132. package/dist/tools/fastapply/apply.cjs +1 -1
  133. package/dist/tools/fastapply/apply.cjs.map +1 -1
  134. package/dist/tools/fastapply/apply.js +2 -2
  135. package/dist/tools/fastapply/core.cjs +1 -1
  136. package/dist/tools/fastapply/core.cjs.map +1 -1
  137. package/dist/tools/fastapply/core.js +6 -6
  138. package/dist/tools/fastapply/index.cjs +1 -1
  139. package/dist/tools/fastapply/index.cjs.map +1 -1
  140. package/dist/tools/fastapply/index.js +9 -9
  141. package/dist/tools/fastapply/openai.cjs +1 -1
  142. package/dist/tools/fastapply/openai.cjs.map +1 -1
  143. package/dist/tools/fastapply/openai.js +7 -7
  144. package/dist/tools/fastapply/vercel.cjs +1 -1
  145. package/dist/tools/fastapply/vercel.cjs.map +1 -1
  146. package/dist/tools/fastapply/vercel.js +7 -7
  147. package/dist/tools/index.cjs +1 -1
  148. package/dist/tools/index.cjs.map +1 -1
  149. package/dist/tools/index.js +9 -9
  150. package/dist/tools/reflex/core.cjs +76 -7
  151. package/dist/tools/reflex/core.cjs.map +1 -1
  152. package/dist/tools/reflex/core.d.ts +8 -1
  153. package/dist/tools/reflex/core.js +5 -5
  154. package/dist/tools/reflex/index.cjs +76 -7
  155. package/dist/tools/reflex/index.cjs.map +1 -1
  156. package/dist/tools/reflex/index.js +5 -5
  157. package/dist/tools/reflex/types.cjs.map +1 -1
  158. package/dist/tools/reflex/types.d.ts +83 -4
  159. package/dist/tools/utils/resilience.cjs +1 -1
  160. package/dist/tools/utils/resilience.cjs.map +1 -1
  161. package/dist/tools/utils/resilience.js +2 -2
  162. package/dist/tools/warp_grep/agent/runner.cjs +1 -1
  163. package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
  164. package/dist/tools/warp_grep/agent/runner.js +2 -2
  165. package/dist/tools/warp_grep/anthropic.cjs +1 -1
  166. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  167. package/dist/tools/warp_grep/anthropic.js +9 -9
  168. package/dist/tools/warp_grep/client.cjs +1 -1
  169. package/dist/tools/warp_grep/client.cjs.map +1 -1
  170. package/dist/tools/warp_grep/client.js +8 -8
  171. package/dist/tools/warp_grep/gemini.cjs +1 -1
  172. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  173. package/dist/tools/warp_grep/gemini.js +8 -8
  174. package/dist/tools/warp_grep/index.cjs +1 -1
  175. package/dist/tools/warp_grep/index.cjs.map +1 -1
  176. package/dist/tools/warp_grep/index.js +8 -8
  177. package/dist/tools/warp_grep/openai.cjs +1 -1
  178. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  179. package/dist/tools/warp_grep/openai.js +9 -9
  180. package/dist/tools/warp_grep/vercel.cjs +1 -1
  181. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  182. package/dist/tools/warp_grep/vercel.js +9 -9
  183. package/dist/tracing/core.cjs +71 -10
  184. package/dist/tracing/core.cjs.map +1 -1
  185. package/dist/tracing/core.d.ts +7 -2
  186. package/dist/tracing/core.js +3 -3
  187. package/dist/tracing/index.cjs +71 -10
  188. package/dist/tracing/index.cjs.map +1 -1
  189. package/dist/tracing/index.d.ts +1 -1
  190. package/dist/tracing/index.js +3 -3
  191. package/dist/tracing/interaction.cjs +52 -3
  192. package/dist/tracing/interaction.cjs.map +1 -1
  193. package/dist/tracing/interaction.d.ts +12 -2
  194. package/dist/tracing/interaction.js +6 -4
  195. package/dist/tracing/otel.cjs.map +1 -1
  196. package/dist/tracing/otel.d.ts +1 -1
  197. package/dist/tracing/otel.js +1 -1
  198. package/dist/tracing/types.cjs.map +1 -1
  199. package/dist/tracing/types.d.ts +9 -8
  200. package/dist/version.cjs +1 -1
  201. package/dist/version.cjs.map +1 -1
  202. package/dist/version.js +1 -1
  203. package/package.json +1 -1
  204. package/dist/chunk-2MSNIGVA.js.map +0 -1
  205. package/dist/chunk-53RYMV2B.js.map +0 -1
  206. package/dist/chunk-CABQ652L.js.map +0 -1
  207. package/dist/chunk-Q5FAU76K.js.map +0 -1
  208. package/dist/chunk-WGIMYL4A.js.map +0 -1
  209. /package/dist/{chunk-ZMXPIXOS.js.map → chunk-2VETLL6C.js.map} +0 -0
  210. /package/dist/{chunk-PSJXKCCP.js.map → chunk-4DLGPMUS.js.map} +0 -0
  211. /package/dist/{chunk-V2BD6NXI.js.map → chunk-4NDS3GQB.js.map} +0 -0
  212. /package/dist/{chunk-U3XOCF4O.js.map → chunk-4ZTI7JDJ.js.map} +0 -0
  213. /package/dist/{chunk-BGRGUSNI.js.map → chunk-AFMB2XGS.js.map} +0 -0
  214. /package/dist/{chunk-ABQMAHEA.js.map → chunk-AWUIP46W.js.map} +0 -0
  215. /package/dist/{chunk-CXE7CVNL.js.map → chunk-CTCRNGRP.js.map} +0 -0
  216. /package/dist/{chunk-WKKPZO4I.js.map → chunk-DYGQ3BB5.js.map} +0 -0
  217. /package/dist/{chunk-GEPVEMCF.js.map → chunk-II3AF6LD.js.map} +0 -0
  218. /package/dist/{chunk-I3UFROCM.js.map → chunk-INXEXFQV.js.map} +0 -0
  219. /package/dist/{chunk-6VFTPA27.js.map → chunk-KOTSWCSD.js.map} +0 -0
  220. /package/dist/{chunk-V2QYP4Z7.js.map → chunk-KP3YMV7Y.js.map} +0 -0
  221. /package/dist/{chunk-47MAQT6H.js.map → chunk-KP5VIWLO.js.map} +0 -0
  222. /package/dist/{chunk-PK2OTDD5.js.map → chunk-LJ27CQI3.js.map} +0 -0
  223. /package/dist/{chunk-YO7D5VEC.js.map → chunk-LZUBCNTC.js.map} +0 -0
  224. /package/dist/{chunk-OK5Y6FH6.js.map → chunk-MNDFDO2W.js.map} +0 -0
  225. /package/dist/{chunk-4YKNHDJI.js.map → chunk-MYBIXWNM.js.map} +0 -0
  226. /package/dist/{chunk-6FQLA42K.js.map → chunk-NOX6MIA2.js.map} +0 -0
  227. /package/dist/{chunk-S3V5JP26.js.map → chunk-OWY3P43T.js.map} +0 -0
  228. /package/dist/{chunk-OR27NPLB.js.map → chunk-P63CYB3F.js.map} +0 -0
  229. /package/dist/{chunk-EQJEOG3S.js.map → chunk-PJWEGYOK.js.map} +0 -0
  230. /package/dist/{chunk-MA2LJGLZ.js.map → chunk-QAJW6FOO.js.map} +0 -0
  231. /package/dist/{chunk-CVH6TA6O.js.map → chunk-TD2SQ6TQ.js.map} +0 -0
  232. /package/dist/{chunk-Y6QK7CDW.js.map → chunk-WJ2LQ3NR.js.map} +0 -0
  233. /package/dist/{chunk-5G3D45TP.js.map → chunk-X4JLZWGW.js.map} +0 -0
  234. /package/dist/{chunk-TROXSFNC.js.map → chunk-X4XBY7VI.js.map} +0 -0
  235. /package/dist/{chunk-4PT4J6FV.js.map → chunk-X5YEUR65.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  executeEditFile
3
- } from "./chunk-PSJXKCCP.js";
3
+ } from "./chunk-4DLGPMUS.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-S3V5JP26.js.map
89
+ //# sourceMappingURL=chunk-OWY3P43T.js.map
@@ -8,7 +8,7 @@ import {
8
8
  executeGitHubReadFile,
9
9
  executeToolCall,
10
10
  executeToolCallStreaming
11
- } from "./chunk-5G3D45TP.js";
11
+ } from "./chunk-X4JLZWGW.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-OR27NPLB.js.map
118
+ //# sourceMappingURL=chunk-P63CYB3F.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MorphAPIClient
3
- } from "./chunk-TROXSFNC.js";
3
+ } from "./chunk-X4XBY7VI.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-EQJEOG3S.js.map
561
+ //# sourceMappingURL=chunk-PJWEGYOK.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  executeEditFile
3
- } from "./chunk-PSJXKCCP.js";
3
+ } from "./chunk-4DLGPMUS.js";
4
4
  import {
5
5
  EDIT_FILE_SYSTEM_PROMPT,
6
6
  EDIT_FILE_TOOL_DESCRIPTION
@@ -91,4 +91,4 @@ export {
91
91
  openai_default,
92
92
  openai_exports
93
93
  };
94
- //# sourceMappingURL=chunk-MA2LJGLZ.js.map
94
+ //# sourceMappingURL=chunk-QAJW6FOO.js.map
@@ -2,11 +2,12 @@ import {
2
2
  shipSignal
3
3
  } from "./chunk-PICGNBUE.js";
4
4
  import {
5
- createInteractionApi
6
- } from "./chunk-2MSNIGVA.js";
5
+ createInteractionApi,
6
+ createNoopInteraction
7
+ } from "./chunk-IDMKQWQG.js";
7
8
  import {
8
9
  metadata
9
- } from "./chunk-CABQ652L.js";
10
+ } from "./chunk-TLXVGE4R.js";
10
11
 
11
12
  // tracing/core.ts
12
13
  import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
@@ -32,6 +33,7 @@ var MorphTracing = class {
32
33
  appName: config.appName ?? process.env.npm_package_name ?? "morph-app",
33
34
  disableBatching: config.disableBatching ?? !isProd,
34
35
  traceContent: config.traceContent ?? true,
36
+ headers: config.headers,
35
37
  debug
36
38
  };
37
39
  if (config.disabled) {
@@ -61,7 +63,7 @@ var MorphTracing = class {
61
63
  }
62
64
  const exporter = new OTLPTraceExporter({
63
65
  url: `${baseUrl}/v1/traces`,
64
- headers: { Authorization: `Bearer ${apiKey}`, ...config.headers }
66
+ headers: { Authorization: `Bearer ${apiKey}`, ...this.cfg.headers }
65
67
  });
66
68
  traceloop.initialize({
67
69
  baseUrl,
@@ -80,9 +82,18 @@ var MorphTracing = class {
80
82
  `initialized \u2192 ${baseUrl}/v1/traces (batching ${this.cfg.disableBatching ? "off" : "on"})`
81
83
  );
82
84
  }
83
- /** Begin a new traced interaction (a single user turn / agent run). */
85
+ /**
86
+ * Begin a new traced interaction (a single user turn / agent run). On a
87
+ * disabled instance this returns an inert no-op interaction — callbacks still
88
+ * run, but no spans are created or shipped.
89
+ */
84
90
  begin(ctx) {
85
- const interaction = createInteractionApi(ctx, this.cfg.traceContent);
91
+ if (!this.enabled) return createNoopInteraction(ctx);
92
+ const interaction = createInteractionApi(
93
+ ctx,
94
+ this.cfg.traceContent,
95
+ (eventId) => this.active.delete(eventId)
96
+ );
86
97
  this.active.set(interaction.getEventId(), interaction);
87
98
  return interaction;
88
99
  }
@@ -95,12 +106,11 @@ var MorphTracing = class {
95
106
  * spans/token usage, not a user-facing interaction.
96
107
  */
97
108
  tracer(globalProperties = {}) {
98
- return createInteractionApi(
99
- { userId: globalProperties.userId ?? "batch", properties: globalProperties },
100
- this.cfg.traceContent
101
- );
109
+ const ctx = { userId: globalProperties.userId ?? "batch", properties: globalProperties };
110
+ if (!this.enabled) return createNoopInteraction(ctx);
111
+ return createInteractionApi(ctx, this.cfg.traceContent);
102
112
  }
103
- /** Build Vercel AI SDK telemetry metadata (see `morphsdk/tracing/otel`). */
113
+ /** Build Vercel AI SDK telemetry metadata (see `@morphllm/morphsdk/tracing/otel`). */
104
114
  metadata(opts) {
105
115
  return metadata(opts);
106
116
  }
@@ -112,10 +122,15 @@ var MorphTracing = class {
112
122
  }
113
123
  /** Span processor for `useExternalOtel: true` integrations. */
114
124
  createSpanProcessor(options) {
125
+ const exporter = options?.exporter ?? new OTLPTraceExporter({
126
+ url: `${this.cfg.baseUrl}/v1/traces`,
127
+ headers: { Authorization: `Bearer ${this.cfg.apiKey}`, ...this.cfg.headers }
128
+ });
115
129
  return traceloop.createSpanProcessor({
116
130
  apiKey: this.cfg.apiKey,
117
131
  baseUrl: this.cfg.baseUrl,
118
- ...options
132
+ ...options,
133
+ exporter
119
134
  });
120
135
  }
121
136
  /** Flush any batched spans immediately. Safe to call when idle. */
@@ -140,4 +155,4 @@ export {
140
155
  MorphTracing,
141
156
  morphTracing
142
157
  };
143
- //# sourceMappingURL=chunk-WGIMYL4A.js.map
158
+ //# sourceMappingURL=chunk-STJTJDAV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../tracing/core.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 {\n createInteractionApi,\n createNoopInteraction,\n type Interaction,\n type Tracer,\n} 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 headers?: Record<string, string>;\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 headers: config.headers,\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}`, ...this.cfg.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 /**\n * Begin a new traced interaction (a single user turn / agent run). On a\n * disabled instance this returns an inert no-op interaction — callbacks still\n * run, but no spans are created or shipped.\n */\n begin(ctx: TraceContext & { userId: string; event?: string }): Interaction {\n if (!this.enabled) return createNoopInteraction(ctx);\n const interaction = createInteractionApi(ctx, this.cfg.traceContent, (eventId) =>\n this.active.delete(eventId),\n );\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 const ctx = { userId: globalProperties.userId ?? 'batch', properties: globalProperties };\n if (!this.enabled) return createNoopInteraction(ctx);\n return createInteractionApi(ctx, this.cfg.traceContent);\n }\n\n /** Build Vercel AI SDK telemetry metadata (see `@morphllm/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 // Traceloop's default exporter here is OTLP/protobuf, but Morph's ingest\n // parses OTLP/JSON only — supply the JSON exporter unless the caller\n // brings their own.\n const exporter =\n options?.exporter ??\n new OTLPTraceExporter({\n url: `${this.cfg.baseUrl}/v1/traces`,\n headers: { Authorization: `Bearer ${this.cfg.apiKey}`, ...this.cfg.headers },\n });\n return traceloop.createSpanProcessor({\n apiKey: this.cfg.apiKey,\n baseUrl: this.cfg.baseUrl,\n ...options,\n exporter,\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"],"mappings":"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","names":[]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  MorphAPIClient
3
- } from "./chunk-TROXSFNC.js";
3
+ } from "./chunk-X4XBY7VI.js";
4
4
  import {
5
5
  MorphError
6
- } from "./chunk-47MAQT6H.js";
6
+ } from "./chunk-KP5VIWLO.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-CVH6TA6O.js.map
78
+ //# sourceMappingURL=chunk-TD2SQ6TQ.js.map
@@ -39,4 +39,4 @@ export {
39
39
  otel_default,
40
40
  otel_exports
41
41
  };
42
- //# sourceMappingURL=chunk-CABQ652L.js.map
42
+ //# sourceMappingURL=chunk-TLXVGE4R.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 \"@morphllm/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/**\n * Reserved metadata keys Morph owns. Custom `properties` can't overwrite these,\n * so attribution (user_id / convo_id / event_id) stays intact.\n *\n * The AI SDK stores metadata as `ai.telemetry.metadata.<key>`; Traceloop's span\n * processor copies them to `traceloop.association.properties.<key>`, which is\n * what ClickHouse views read. Use snake_case names (user_id, convo_id, …).\n */\nconst RESERVED_KEYS = new Set(['user_id', 'convo_id', 'event_id', 'event_name']);\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 user_id: opts.userId,\n event_id: opts.eventId ?? uuid(),\n };\n if (opts.convoId) result.convo_id = opts.convoId;\n if (opts.eventName) result.event_name = opts.eventName;\n if (opts.properties) {\n for (const [key, value] of Object.entries(opts.properties)) {\n if (!RESERVED_KEYS.has(key)) result[key] = value;\n }\n }\n return result;\n}\n\nexport default { metadata };\n"],"mappings":";;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiCA,IAAM,gBAAgB,oBAAI,IAAI,CAAC,WAAW,YAAY,YAAY,YAAY,CAAC;AAE/E,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,SAAS,KAAK;AAAA,IACd,UAAU,KAAK,WAAW,KAAK;AAAA,EACjC;AACA,MAAI,KAAK,QAAS,QAAO,WAAW,KAAK;AACzC,MAAI,KAAK,UAAW,QAAO,aAAa,KAAK;AAC7C,MAAI,KAAK,YAAY;AACnB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,UAAU,GAAG;AAC1D,UAAI,CAAC,cAAc,IAAI,GAAG,EAAG,QAAO,GAAG,IAAI;AAAA,IAC7C;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAO,eAAQ,EAAE,SAAS;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CompactClient
3
- } from "./chunk-CVH6TA6O.js";
3
+ } from "./chunk-TD2SQ6TQ.js";
4
4
 
5
5
  // tools/compact/utils.ts
6
6
  async function compactFileContexts(files, query, apiKey, apiUrl, maxTokens = 1e4, maxConcurrency = 3) {
@@ -50,4 +50,4 @@ async function compactFileContexts(files, query, apiKey, apiUrl, maxTokens = 1e4
50
50
  export {
51
51
  compactFileContexts
52
52
  };
53
- //# sourceMappingURL=chunk-Y6QK7CDW.js.map
53
+ //# sourceMappingURL=chunk-WJ2LQ3NR.js.map
@@ -10,13 +10,13 @@ import {
10
10
  import {
11
11
  runWarpGrep,
12
12
  runWarpGrepStreaming
13
- } from "./chunk-V2QYP4Z7.js";
13
+ } from "./chunk-KP3YMV7Y.js";
14
14
  import {
15
15
  compactFileContexts
16
- } from "./chunk-Y6QK7CDW.js";
16
+ } from "./chunk-WJ2LQ3NR.js";
17
17
  import {
18
18
  MorphAPIClient
19
- } from "./chunk-TROXSFNC.js";
19
+ } from "./chunk-X4XBY7VI.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-5G3D45TP.js.map
324
+ //# sourceMappingURL=chunk-X4JLZWGW.js.map
@@ -3,15 +3,15 @@ import {
3
3
  } from "./chunk-F3NCFNUX.js";
4
4
  import {
5
5
  toMorphError
6
- } from "./chunk-ZMXPIXOS.js";
6
+ } from "./chunk-2VETLL6C.js";
7
7
  import {
8
8
  MorphError,
9
9
  fetchWithRetry,
10
10
  withTimeout
11
- } from "./chunk-47MAQT6H.js";
11
+ } from "./chunk-KP5VIWLO.js";
12
12
  import {
13
13
  SDK_VERSION
14
- } from "./chunk-PP2GHVRI.js";
14
+ } from "./chunk-GG4ATN6M.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-TROXSFNC.js.map
120
+ //# sourceMappingURL=chunk-X4XBY7VI.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-2HMEZZKK.js";
5
5
  import {
6
6
  executeBrowserTask
7
- } from "./chunk-V2BD6NXI.js";
7
+ } from "./chunk-4NDS3GQB.js";
8
8
  import {
9
9
  __export
10
10
  } from "./chunk-PZ5AY32C.js";
@@ -93,4 +93,4 @@ export {
93
93
  createBrowserTool,
94
94
  openai_exports
95
95
  };
96
- //# sourceMappingURL=chunk-4PT4J6FV.js.map
96
+ //# sourceMappingURL=chunk-X5YEUR65.js.map
@@ -8,7 +8,7 @@ import { APIResource } from './core/resource.js';
8
8
  import { MorphGit } from './git/client.js';
9
9
  import { CompactClient } from './tools/compact/core.js';
10
10
  import { ReflexClient } from './tools/reflex/core.js';
11
- import { OpenAIRouter, AnthropicRouter, GeminiRouter, RawRouter } from './modelrouter/core.js';
11
+ import { OpenAIRouter, AnthropicRouter, GeminiRouter, RawRouter, RouterClassifier } from './modelrouter/core.js';
12
12
  import { EditFileConfig, EditFileInput, EditFileResult, EditChanges } from './tools/fastapply/types.js';
13
13
  import { CodebaseSearchConfig, CodebaseSearchInput, CodebaseSearchResult } from './tools/codebase_search/types.js';
14
14
  import { d as WarpGrepToolConfig, b as WarpGrepResult, g as GitHubSearchToolConfig, c as WarpGrepContext } from './types-CtkD4o1_.js';
@@ -989,6 +989,7 @@ declare class MorphClient extends MorphAPIClient {
989
989
  anthropic: AnthropicRouter;
990
990
  gemini: GeminiRouter;
991
991
  raw: RawRouter;
992
+ classify: RouterClassifier;
992
993
  };
993
994
  /** OpenAI-compatible tool factories */
994
995
  openai: OpenAIToolFactory;
package/dist/client.cjs CHANGED
@@ -36,7 +36,7 @@ var init_package = __esm({
36
36
  "package.json"() {
37
37
  package_default = {
38
38
  name: "@morphllm/morphsdk",
39
- version: "0.2.179",
39
+ version: "0.2.181",
40
40
  description: "TypeScript SDK and CLI for Morph Fast Apply integration",
41
41
  type: "module",
42
42
  main: "./dist/index.cjs",
@@ -5044,15 +5044,49 @@ var ReflexClient = class extends APIResource {
5044
5044
  }
5045
5045
  /** Classify text against a trained model. The model must be `succeeded`. */
5046
5046
  async predict(input) {
5047
+ const completionId = input.completionId ?? crypto.randomUUID();
5047
5048
  const raw = await this._client.post("/v1/reflex/predict", {
5048
- body: { model: input.model, text: input.text }
5049
+ body: { model: input.model, text: input.text },
5050
+ headers: { "X-Completion-Id": completionId }
5049
5051
  });
5052
+ return toPredictResult(raw, completionId);
5053
+ }
5054
+ /**
5055
+ * Record thumbs-up / thumbs-down feedback on a prediction. Reference the
5056
+ * prediction by the `completionId` from `predict()` or by a stored `resultId`.
5057
+ */
5058
+ async flag(input) {
5059
+ if (!input.completionId && !input.resultId) {
5060
+ throw new MorphError("flag() requires completionId or resultId", "reflex_flag_missing_ref");
5061
+ }
5062
+ const body = { good_or_bad: input.verdict };
5063
+ if (input.completionId) body.completion_id = input.completionId;
5064
+ if (input.resultId) body.result_id = input.resultId;
5065
+ if (input.correctedLabel != null) body.corrected_label = input.correctedLabel;
5066
+ if (input.reason != null) body.reason = input.reason;
5067
+ if (input.score != null) body.score = input.score;
5068
+ const raw = await this._client.post("/v1/reflex/predictions/flag", { body });
5050
5069
  return {
5051
- model: raw.model,
5052
- label: raw.label,
5053
- confidence: raw.confidence,
5054
- allScores: raw.all_scores ?? [],
5055
- inferenceTimeMs: raw.inference_time_ms
5070
+ resultId: raw.result_id ?? null,
5071
+ completionId: raw.completion_id ?? null,
5072
+ verdict: raw.flagged_good_or_bad ?? null,
5073
+ correctedLabel: raw.flagged_corrected_label ?? null,
5074
+ flagged: Boolean(raw.flagged)
5075
+ };
5076
+ }
5077
+ /** List the caller's labeled examples (predictions that have been flagged). */
5078
+ async listLabels(input = {}) {
5079
+ const raw = await this._client.get("/v1/reflex/labels", {
5080
+ query: {
5081
+ model: input.model,
5082
+ verdict: input.verdict,
5083
+ limit: input.limit,
5084
+ after: input.after
5085
+ }
5086
+ });
5087
+ return {
5088
+ data: (raw.data ?? []).map(toReflexLabel),
5089
+ hasMore: Boolean(raw.has_more)
5056
5090
  };
5057
5091
  }
5058
5092
  };
@@ -5152,6 +5186,41 @@ function toReflexJob(raw) {
5152
5186
  suffix: raw.suffix ?? null
5153
5187
  };
5154
5188
  }
5189
+ function toPredictResult(raw, completionId) {
5190
+ const classes = (raw.classes ?? []).map((c) => ({
5191
+ classId: c.class_id,
5192
+ label: c.label,
5193
+ score: c.score,
5194
+ selected: c.selected
5195
+ }));
5196
+ const selectedClasses = classes.filter((c) => c.selected);
5197
+ const top = selectedClasses.reduce(
5198
+ (best, c) => best === null || c.score > best.score ? c : best,
5199
+ null
5200
+ );
5201
+ return {
5202
+ model: raw.model,
5203
+ mode: raw.mode === "multi_label" ? "multi_label" : "single_label",
5204
+ classes,
5205
+ selected: selectedClasses.map((c) => c.label),
5206
+ label: top ? top.label : null,
5207
+ confidence: top ? top.score : null,
5208
+ allScores: classes.map((c) => c.score),
5209
+ inferenceTimeMs: raw.inference_time_ms,
5210
+ completionId
5211
+ };
5212
+ }
5213
+ function toReflexLabel(raw) {
5214
+ return {
5215
+ resultId: raw.result_id,
5216
+ text: raw.text,
5217
+ model: raw.model,
5218
+ predictedLabel: raw.predicted_label ?? null,
5219
+ verdict: raw.verdict ?? null,
5220
+ correctedLabel: raw.corrected_label ?? null,
5221
+ createdAt: raw.created_at
5222
+ };
5223
+ }
5155
5224
  function toReflexEvent(raw) {
5156
5225
  return {
5157
5226
  id: raw.id,
@@ -5288,6 +5357,40 @@ var RawRouter = class extends BaseRouter {
5288
5357
  return { difficulty };
5289
5358
  }
5290
5359
  };
5360
+ var RouterClassifier = class extends APIResource {
5361
+ timeout;
5362
+ constructor(clientOrConfig = {}) {
5363
+ super(resolveClient3(clientOrConfig));
5364
+ const cfg = clientOrConfig instanceof MorphAPIClient ? {} : clientOrConfig;
5365
+ this.timeout = cfg.timeout ?? DEFAULT_TIMEOUT6;
5366
+ }
5367
+ /** Classify an input across the requested axes (all three by default). */
5368
+ async classify(input) {
5369
+ if (!this._client.resolveApiKey()) {
5370
+ throw new Error(
5371
+ "Morph API key is required. Set MORPH_API_KEY environment variable or pass apiKey in config."
5372
+ );
5373
+ }
5374
+ logger.debug("RouterClassifier", "request", { classes: input.classes ?? "all" });
5375
+ try {
5376
+ const res = await this._client.post("/v1/router/classify", {
5377
+ body: { input: input.input, ...input.classes ? { classes: input.classes } : {} },
5378
+ timeout: this.timeout
5379
+ });
5380
+ logger.debug("RouterClassifier", "classified", {
5381
+ difficulty: res.classifications.difficulty?.label,
5382
+ ambiguity: res.classifications.ambiguity?.label,
5383
+ domain: res.classifications.domain?.label
5384
+ });
5385
+ return res.classifications;
5386
+ } catch (error) {
5387
+ if (error instanceof MorphError) {
5388
+ throw new Error(`Router API error (${error.statusCode}): ${error.message}`);
5389
+ }
5390
+ throw error;
5391
+ }
5392
+ }
5393
+ };
5291
5394
 
5292
5395
  // tools/warp_grep/prompts.ts
5293
5396
  var WARP_GREP_TOOL_NAME = "codebase_search";
@@ -6731,7 +6834,8 @@ var MorphClient = class extends MorphAPIClient {
6731
6834
  openai: new OpenAIRouter(this),
6732
6835
  anthropic: new AnthropicRouter(this),
6733
6836
  gemini: new GeminiRouter(this),
6734
- raw: new RawRouter(this)
6837
+ raw: new RawRouter(this),
6838
+ classify: new RouterClassifier(this)
6735
6839
  };
6736
6840
  const compactClient = new CompactClient(this);
6737
6841
  this.compact = compactClient.compact.bind(compactClient);