@morphllm/morphsdk 0.2.170 → 0.2.172

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 (260) hide show
  1. package/dist/{chunk-IY7DESC3.js → chunk-2SNAXTUJ.js} +4 -4
  2. package/dist/chunk-453ZV2AX.js +120 -0
  3. package/dist/chunk-453ZV2AX.js.map +1 -0
  4. package/dist/chunk-53ZJMCWU.js +142 -0
  5. package/dist/chunk-53ZJMCWU.js.map +1 -0
  6. package/dist/{chunk-5KFQBI4J.js → chunk-5DA6SZQJ.js} +2 -2
  7. package/dist/chunk-66OHYI24.js +78 -0
  8. package/dist/chunk-66OHYI24.js.map +1 -0
  9. package/dist/chunk-6X6QMRQG.js +158 -0
  10. package/dist/chunk-6X6QMRQG.js.map +1 -0
  11. package/dist/{chunk-76XER44U.js → chunk-7PVVPLRL.js} +2 -2
  12. package/dist/{chunk-BCPZAPWY.js → chunk-AE7M2I52.js} +2 -2
  13. package/dist/{chunk-LNXIVRPY.js → chunk-CQF76HJC.js} +30 -6
  14. package/dist/chunk-CQF76HJC.js.map +1 -0
  15. package/dist/{chunk-OJQYBWHR.js → chunk-ESXCQBMU.js} +2 -2
  16. package/dist/{chunk-LAGN62H5.js → chunk-FOIDGIY4.js} +29 -10
  17. package/dist/chunk-FOIDGIY4.js.map +1 -0
  18. package/dist/{chunk-KUPSW5QN.js → chunk-GJZXDRH5.js} +8 -3
  19. package/dist/{chunk-KUPSW5QN.js.map → chunk-GJZXDRH5.js.map} +1 -1
  20. package/dist/{chunk-5IR3YE77.js → chunk-IJ33I7P5.js} +4 -4
  21. package/dist/{chunk-E5QWXVTF.js → chunk-IN2U7AAI.js} +99 -143
  22. package/dist/chunk-IN2U7AAI.js.map +1 -0
  23. package/dist/{chunk-LE66XCOI.js → chunk-JWZ5DLAS.js} +27 -10
  24. package/dist/chunk-JWZ5DLAS.js.map +1 -0
  25. package/dist/chunk-LKFZBBTD.js +12 -0
  26. package/dist/chunk-LKFZBBTD.js.map +1 -0
  27. package/dist/{chunk-6LPWEZ6H.js → chunk-MO6S2LRD.js} +2 -2
  28. package/dist/{chunk-S4IEM5EG.js → chunk-NI7PWQ3B.js} +4 -4
  29. package/dist/{chunk-GLQWEINZ.js → chunk-QAXXE4AD.js} +2 -2
  30. package/dist/{chunk-YG2I377B.js → chunk-QFE5523Q.js} +18 -3
  31. package/dist/chunk-QFE5523Q.js.map +1 -0
  32. package/dist/{chunk-G4FPDEUP.js → chunk-QQXNZIVK.js} +4 -4
  33. package/dist/{chunk-A3ZUWLYX.js → chunk-QZ3V2BP7.js} +2 -2
  34. package/dist/chunk-QZR7SJ5N.js +24 -0
  35. package/dist/chunk-QZR7SJ5N.js.map +1 -0
  36. package/dist/{chunk-SYD6BRQX.js → chunk-SJVLAGUL.js} +4 -4
  37. package/dist/{chunk-JMEQ6FLB.js → chunk-U4J3BVAQ.js} +4 -4
  38. package/dist/{chunk-QAWYDWDW.js → chunk-U4MRSZQQ.js} +2 -2
  39. package/dist/{chunk-WU3D46MH.js → chunk-UADW6FYD.js} +2 -2
  40. package/dist/{chunk-K7NY5SVR.js → chunk-VBARKJWL.js} +2 -2
  41. package/dist/{chunk-OPNTDMHH.js → chunk-VLZ6PNAD.js} +4 -4
  42. package/dist/chunk-VZ7BOH2K.js +1 -0
  43. package/dist/chunk-VZ7BOH2K.js.map +1 -0
  44. package/dist/{chunk-GUGHUAJU.js → chunk-XJDXV5VX.js} +2 -2
  45. package/dist/{chunk-GPNUS3H2.js → chunk-XYTYIAMQ.js} +2 -2
  46. package/dist/{chunk-MKBVWPU7.js → chunk-Z4GJVN52.js} +23 -8
  47. package/dist/chunk-Z4GJVN52.js.map +1 -0
  48. package/dist/chunk-ZLSNL6M2.js +97 -0
  49. package/dist/chunk-ZLSNL6M2.js.map +1 -0
  50. package/dist/{client-DsAAqupx.d.ts → client-Dh6yzCm4.d.ts} +14 -5
  51. package/dist/client.cjs +741 -525
  52. package/dist/client.cjs.map +1 -1
  53. package/dist/client.d.ts +5 -1
  54. package/dist/client.js +31 -27
  55. package/dist/core/client.cjs +540 -0
  56. package/dist/core/client.cjs.map +1 -0
  57. package/dist/core/client.d.ts +79 -0
  58. package/dist/core/client.js +12 -0
  59. package/dist/core/client.js.map +1 -0
  60. package/dist/core/error.cjs +309 -0
  61. package/dist/core/error.cjs.map +1 -0
  62. package/dist/core/error.d.ts +18 -0
  63. package/dist/core/error.js +10 -0
  64. package/dist/core/error.js.map +1 -0
  65. package/dist/core/index.cjs +552 -0
  66. package/dist/core/index.cjs.map +1 -0
  67. package/dist/core/index.d.ts +4 -0
  68. package/dist/core/index.js +20 -0
  69. package/dist/core/index.js.map +1 -0
  70. package/dist/core/resource.cjs +36 -0
  71. package/dist/core/resource.cjs.map +1 -0
  72. package/dist/core/resource.d.ts +18 -0
  73. package/dist/core/resource.js +8 -0
  74. package/dist/core/resource.js.map +1 -0
  75. package/dist/edge.cjs +252 -174
  76. package/dist/edge.cjs.map +1 -1
  77. package/dist/edge.d.ts +2 -0
  78. package/dist/edge.js +8 -5
  79. package/dist/git/client.cjs +529 -9
  80. package/dist/git/client.cjs.map +1 -1
  81. package/dist/git/client.d.ts +8 -2
  82. package/dist/git/client.js +7 -1
  83. package/dist/git/index.cjs +529 -9
  84. package/dist/git/index.cjs.map +1 -1
  85. package/dist/git/index.d.ts +2 -0
  86. package/dist/git/index.js +7 -1
  87. package/dist/index.cjs +688 -466
  88. package/dist/index.cjs.map +1 -1
  89. package/dist/index.d.ts +6 -2
  90. package/dist/index.js +49 -33
  91. package/dist/modelrouter/core.cjs +204 -125
  92. package/dist/modelrouter/core.cjs.map +1 -1
  93. package/dist/modelrouter/core.d.ts +36 -9
  94. package/dist/modelrouter/core.js +6 -3
  95. package/dist/modelrouter/index.cjs +204 -125
  96. package/dist/modelrouter/index.cjs.map +1 -1
  97. package/dist/modelrouter/index.d.ts +3 -0
  98. package/dist/modelrouter/index.js +6 -3
  99. package/dist/subagents/anthropic.cjs +268 -52
  100. package/dist/subagents/anthropic.cjs.map +1 -1
  101. package/dist/subagents/anthropic.js +10 -6
  102. package/dist/subagents/vercel.cjs +268 -52
  103. package/dist/subagents/vercel.cjs.map +1 -1
  104. package/dist/subagents/vercel.js +10 -6
  105. package/dist/tools/browser/anthropic.cjs +7 -2
  106. package/dist/tools/browser/anthropic.cjs.map +1 -1
  107. package/dist/tools/browser/anthropic.js +9 -6
  108. package/dist/tools/browser/core.cjs +162 -10
  109. package/dist/tools/browser/core.cjs.map +1 -1
  110. package/dist/tools/browser/core.d.ts +8 -2
  111. package/dist/tools/browser/core.js +8 -5
  112. package/dist/tools/browser/index.cjs +163 -11
  113. package/dist/tools/browser/index.cjs.map +1 -1
  114. package/dist/tools/browser/index.d.ts +2 -0
  115. package/dist/tools/browser/index.js +18 -15
  116. package/dist/tools/browser/index.js.map +1 -1
  117. package/dist/tools/browser/openai.cjs +7 -2
  118. package/dist/tools/browser/openai.cjs.map +1 -1
  119. package/dist/tools/browser/openai.js +9 -6
  120. package/dist/tools/browser/profiles/core.cjs +7 -2
  121. package/dist/tools/browser/profiles/core.cjs.map +1 -1
  122. package/dist/tools/browser/profiles/core.js +3 -3
  123. package/dist/tools/browser/profiles/index.cjs +7 -2
  124. package/dist/tools/browser/profiles/index.cjs.map +1 -1
  125. package/dist/tools/browser/profiles/index.js +3 -3
  126. package/dist/tools/browser/vercel.cjs +7 -2
  127. package/dist/tools/browser/vercel.cjs.map +1 -1
  128. package/dist/tools/browser/vercel.js +9 -6
  129. package/dist/tools/codebase_search/anthropic.cjs +162 -41
  130. package/dist/tools/codebase_search/anthropic.cjs.map +1 -1
  131. package/dist/tools/codebase_search/anthropic.js +7 -4
  132. package/dist/tools/codebase_search/core.cjs +195 -66
  133. package/dist/tools/codebase_search/core.cjs.map +1 -1
  134. package/dist/tools/codebase_search/core.d.ts +18 -7
  135. package/dist/tools/codebase_search/core.js +6 -3
  136. package/dist/tools/codebase_search/index.cjs +162 -41
  137. package/dist/tools/codebase_search/index.cjs.map +1 -1
  138. package/dist/tools/codebase_search/index.d.ts +2 -0
  139. package/dist/tools/codebase_search/index.js +13 -10
  140. package/dist/tools/codebase_search/openai.cjs +162 -41
  141. package/dist/tools/codebase_search/openai.cjs.map +1 -1
  142. package/dist/tools/codebase_search/openai.js +7 -4
  143. package/dist/tools/codebase_search/vercel.cjs +162 -41
  144. package/dist/tools/codebase_search/vercel.cjs.map +1 -1
  145. package/dist/tools/codebase_search/vercel.js +7 -4
  146. package/dist/tools/compact/core.cjs +551 -47
  147. package/dist/tools/compact/core.cjs.map +1 -1
  148. package/dist/tools/compact/core.d.ts +16 -3
  149. package/dist/tools/compact/core.js +7 -1
  150. package/dist/tools/compact/index.cjs +549 -47
  151. package/dist/tools/compact/index.cjs.map +1 -1
  152. package/dist/tools/compact/index.d.ts +2 -0
  153. package/dist/tools/compact/index.js +8 -2
  154. package/dist/tools/fastapply/anthropic.cjs +32 -3
  155. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  156. package/dist/tools/fastapply/anthropic.js +8 -4
  157. package/dist/tools/fastapply/apply.cjs +23 -3
  158. package/dist/tools/fastapply/apply.cjs.map +1 -1
  159. package/dist/tools/fastapply/apply.js +2 -2
  160. package/dist/tools/fastapply/core.cjs +258 -13
  161. package/dist/tools/fastapply/core.cjs.map +1 -1
  162. package/dist/tools/fastapply/core.d.ts +8 -2
  163. package/dist/tools/fastapply/core.js +7 -3
  164. package/dist/tools/fastapply/index.cjs +32 -3
  165. package/dist/tools/fastapply/index.cjs.map +1 -1
  166. package/dist/tools/fastapply/index.d.ts +2 -0
  167. package/dist/tools/fastapply/index.js +13 -9
  168. package/dist/tools/fastapply/openai.cjs +32 -3
  169. package/dist/tools/fastapply/openai.cjs.map +1 -1
  170. package/dist/tools/fastapply/openai.js +8 -4
  171. package/dist/tools/fastapply/vercel.cjs +32 -3
  172. package/dist/tools/fastapply/vercel.cjs.map +1 -1
  173. package/dist/tools/fastapply/vercel.js +8 -4
  174. package/dist/tools/index.cjs +32 -3
  175. package/dist/tools/index.cjs.map +1 -1
  176. package/dist/tools/index.d.ts +2 -0
  177. package/dist/tools/index.js +13 -9
  178. package/dist/tools/reflex/core.cjs +693 -0
  179. package/dist/tools/reflex/core.cjs.map +1 -0
  180. package/dist/tools/reflex/core.d.ts +53 -0
  181. package/dist/tools/reflex/core.js +16 -0
  182. package/dist/tools/reflex/core.js.map +1 -0
  183. package/dist/tools/reflex/index.cjs +693 -0
  184. package/dist/tools/reflex/index.cjs.map +1 -0
  185. package/dist/tools/reflex/index.d.ts +5 -0
  186. package/dist/tools/reflex/index.js +16 -0
  187. package/dist/tools/reflex/index.js.map +1 -0
  188. package/dist/tools/reflex/types.cjs +19 -0
  189. package/dist/tools/reflex/types.cjs.map +1 -0
  190. package/dist/tools/reflex/types.d.ts +113 -0
  191. package/dist/tools/reflex/types.js +1 -0
  192. package/dist/tools/reflex/types.js.map +1 -0
  193. package/dist/tools/utils/resilience.cjs +7 -2
  194. package/dist/tools/utils/resilience.cjs.map +1 -1
  195. package/dist/tools/utils/resilience.js +2 -2
  196. package/dist/tools/warp_grep/agent/runner.cjs +7 -2
  197. package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
  198. package/dist/tools/warp_grep/agent/runner.js +2 -2
  199. package/dist/tools/warp_grep/anthropic.cjs +268 -52
  200. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  201. package/dist/tools/warp_grep/anthropic.d.ts +2 -0
  202. package/dist/tools/warp_grep/anthropic.js +10 -6
  203. package/dist/tools/warp_grep/client.cjs +268 -52
  204. package/dist/tools/warp_grep/client.cjs.map +1 -1
  205. package/dist/tools/warp_grep/client.d.ts +8 -2
  206. package/dist/tools/warp_grep/client.js +9 -5
  207. package/dist/tools/warp_grep/gemini.cjs +268 -52
  208. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  209. package/dist/tools/warp_grep/gemini.d.ts +2 -0
  210. package/dist/tools/warp_grep/gemini.js +9 -5
  211. package/dist/tools/warp_grep/gemini.js.map +1 -1
  212. package/dist/tools/warp_grep/harness.js +5 -5
  213. package/dist/tools/warp_grep/index.cjs +268 -52
  214. package/dist/tools/warp_grep/index.cjs.map +1 -1
  215. package/dist/tools/warp_grep/index.d.ts +2 -0
  216. package/dist/tools/warp_grep/index.js +12 -8
  217. package/dist/tools/warp_grep/openai.cjs +268 -52
  218. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  219. package/dist/tools/warp_grep/openai.d.ts +2 -0
  220. package/dist/tools/warp_grep/openai.js +10 -6
  221. package/dist/tools/warp_grep/providers/local.js +2 -2
  222. package/dist/tools/warp_grep/vercel.cjs +268 -52
  223. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  224. package/dist/tools/warp_grep/vercel.d.ts +2 -0
  225. package/dist/tools/warp_grep/vercel.js +10 -6
  226. package/dist/version.cjs +7 -2
  227. package/dist/version.cjs.map +1 -1
  228. package/dist/version.js +1 -1
  229. package/package.json +7 -2
  230. package/dist/chunk-E5QWXVTF.js.map +0 -1
  231. package/dist/chunk-INBZD4EX.js +0 -197
  232. package/dist/chunk-INBZD4EX.js.map +0 -1
  233. package/dist/chunk-LAGN62H5.js.map +0 -1
  234. package/dist/chunk-LE66XCOI.js.map +0 -1
  235. package/dist/chunk-LNXIVRPY.js.map +0 -1
  236. package/dist/chunk-MKBVWPU7.js.map +0 -1
  237. package/dist/chunk-SCVWDNQP.js +0 -84
  238. package/dist/chunk-SCVWDNQP.js.map +0 -1
  239. package/dist/chunk-VE7J6VYX.js +0 -102
  240. package/dist/chunk-VE7J6VYX.js.map +0 -1
  241. package/dist/chunk-YG2I377B.js.map +0 -1
  242. /package/dist/{chunk-IY7DESC3.js.map → chunk-2SNAXTUJ.js.map} +0 -0
  243. /package/dist/{chunk-5KFQBI4J.js.map → chunk-5DA6SZQJ.js.map} +0 -0
  244. /package/dist/{chunk-76XER44U.js.map → chunk-7PVVPLRL.js.map} +0 -0
  245. /package/dist/{chunk-BCPZAPWY.js.map → chunk-AE7M2I52.js.map} +0 -0
  246. /package/dist/{chunk-OJQYBWHR.js.map → chunk-ESXCQBMU.js.map} +0 -0
  247. /package/dist/{chunk-5IR3YE77.js.map → chunk-IJ33I7P5.js.map} +0 -0
  248. /package/dist/{chunk-6LPWEZ6H.js.map → chunk-MO6S2LRD.js.map} +0 -0
  249. /package/dist/{chunk-S4IEM5EG.js.map → chunk-NI7PWQ3B.js.map} +0 -0
  250. /package/dist/{chunk-GLQWEINZ.js.map → chunk-QAXXE4AD.js.map} +0 -0
  251. /package/dist/{chunk-G4FPDEUP.js.map → chunk-QQXNZIVK.js.map} +0 -0
  252. /package/dist/{chunk-A3ZUWLYX.js.map → chunk-QZ3V2BP7.js.map} +0 -0
  253. /package/dist/{chunk-SYD6BRQX.js.map → chunk-SJVLAGUL.js.map} +0 -0
  254. /package/dist/{chunk-JMEQ6FLB.js.map → chunk-U4J3BVAQ.js.map} +0 -0
  255. /package/dist/{chunk-QAWYDWDW.js.map → chunk-U4MRSZQQ.js.map} +0 -0
  256. /package/dist/{chunk-WU3D46MH.js.map → chunk-UADW6FYD.js.map} +0 -0
  257. /package/dist/{chunk-K7NY5SVR.js.map → chunk-VBARKJWL.js.map} +0 -0
  258. /package/dist/{chunk-OPNTDMHH.js.map → chunk-VLZ6PNAD.js.map} +0 -0
  259. /package/dist/{chunk-GUGHUAJU.js.map → chunk-XJDXV5VX.js.map} +0 -0
  260. /package/dist/{chunk-GPNUS3H2.js.map → chunk-XYTYIAMQ.js.map} +0 -0
@@ -1,66 +1,75 @@
1
1
  import {
2
2
  createGitHubSearchTool,
3
3
  createWarpGrepTool
4
- } from "./chunk-QAWYDWDW.js";
4
+ } from "./chunk-U4MRSZQQ.js";
5
5
  import {
6
6
  createGitHubSearchTool as createGitHubSearchTool3,
7
7
  createWarpGrepTool as createWarpGrepTool3
8
- } from "./chunk-6LPWEZ6H.js";
8
+ } from "./chunk-MO6S2LRD.js";
9
+ import {
10
+ ReflexClient
11
+ } from "./chunk-6X6QMRQG.js";
9
12
  import {
10
13
  createGitHubSearchTool as createGitHubSearchTool2,
11
14
  createWarpGrepTool as createWarpGrepTool2
12
- } from "./chunk-5KFQBI4J.js";
15
+ } from "./chunk-5DA6SZQJ.js";
16
+ import {
17
+ createCodebaseSearchTool
18
+ } from "./chunk-SJVLAGUL.js";
13
19
  import {
14
20
  createCodebaseSearchTool as createCodebaseSearchTool3
15
- } from "./chunk-IY7DESC3.js";
21
+ } from "./chunk-2SNAXTUJ.js";
16
22
  import {
17
23
  createCodebaseSearchTool as createCodebaseSearchTool2
18
- } from "./chunk-5IR3YE77.js";
19
- import {
20
- createCodebaseSearchTool
21
- } from "./chunk-SYD6BRQX.js";
24
+ } from "./chunk-IJ33I7P5.js";
22
25
  import {
23
26
  CodebaseSearchClient
24
- } from "./chunk-VE7J6VYX.js";
27
+ } from "./chunk-ZLSNL6M2.js";
28
+ import {
29
+ createExploreSubagent as createExploreSubagent2
30
+ } from "./chunk-QZ3V2BP7.js";
31
+ import {
32
+ createEditFileTool as createEditFileTool2
33
+ } from "./chunk-QQXNZIVK.js";
25
34
  import {
26
35
  createEditFileTool
27
- } from "./chunk-JMEQ6FLB.js";
36
+ } from "./chunk-U4J3BVAQ.js";
28
37
  import {
29
38
  createEditFileTool as createEditFileTool3
30
- } from "./chunk-S4IEM5EG.js";
31
- import {
32
- createEditFileTool as createEditFileTool2
33
- } from "./chunk-G4FPDEUP.js";
39
+ } from "./chunk-NI7PWQ3B.js";
34
40
  import {
35
41
  FastApplyClient
36
- } from "./chunk-MKBVWPU7.js";
42
+ } from "./chunk-Z4GJVN52.js";
37
43
  import {
38
44
  BrowserClient
39
- } from "./chunk-LAGN62H5.js";
45
+ } from "./chunk-FOIDGIY4.js";
40
46
  import {
41
- createExploreSubagent
42
- } from "./chunk-BCPZAPWY.js";
47
+ MorphGit
48
+ } from "./chunk-JWZ5DLAS.js";
43
49
  import {
44
- createExploreSubagent as createExploreSubagent2
45
- } from "./chunk-A3ZUWLYX.js";
50
+ createExploreSubagent
51
+ } from "./chunk-AE7M2I52.js";
46
52
  import {
47
53
  WarpGrepClient
48
- } from "./chunk-LNXIVRPY.js";
54
+ } from "./chunk-CQF76HJC.js";
49
55
  import {
50
56
  AnthropicRouter,
51
57
  GeminiRouter,
52
58
  OpenAIRouter,
53
59
  RawRouter
54
- } from "./chunk-INBZD4EX.js";
60
+ } from "./chunk-53ZJMCWU.js";
55
61
  import {
56
62
  CompactClient
57
- } from "./chunk-SCVWDNQP.js";
63
+ } from "./chunk-66OHYI24.js";
64
+ import {
65
+ MorphAPIClient
66
+ } from "./chunk-453ZV2AX.js";
58
67
  import {
59
68
  logger
60
69
  } from "./chunk-F3NCFNUX.js";
61
70
  import {
62
- MorphGit
63
- } from "./chunk-LE66XCOI.js";
71
+ APIResource
72
+ } from "./chunk-LKFZBBTD.js";
64
73
 
65
74
  // tools/github/types.ts
66
75
  var GitHubError = class extends Error {
@@ -94,9 +103,7 @@ var PermissionError = class extends GitHubError {
94
103
  // tools/github/core.ts
95
104
  var DEFAULT_BASE_URL = "https://api.morphllm.com";
96
105
  var DEFAULT_TIMEOUT = 3e4;
97
- var GitHubClient = class {
98
- apiKey;
99
- baseUrl;
106
+ var GitHubClient = class extends APIResource {
100
107
  timeout;
101
108
  debug;
102
109
  defaultInstallationId;
@@ -121,13 +128,21 @@ var GitHubClient = class {
121
128
  getInstallUrl() {
122
129
  return "https://github.com/apps/morph-subagents/installations/new";
123
130
  }
124
- constructor(config = {}) {
125
- this.apiKey = config.apiKey || process.env.MORPH_API_KEY || "";
126
- this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;
131
+ constructor(clientOrConfig = {}, options = {}) {
132
+ const isClient = clientOrConfig instanceof MorphAPIClient;
133
+ const config = isClient ? {} : clientOrConfig;
134
+ super(
135
+ isClient ? clientOrConfig : new MorphAPIClient({
136
+ apiKey: config.apiKey,
137
+ baseURL: config.baseUrl ?? DEFAULT_BASE_URL,
138
+ timeout: config.timeout ?? DEFAULT_TIMEOUT,
139
+ debug: config.debug
140
+ })
141
+ );
127
142
  this.timeout = config.timeout || DEFAULT_TIMEOUT;
128
143
  this.debug = config.debug || false;
129
- this.defaultInstallationId = config.installationId;
130
- if (!this.apiKey) {
144
+ this.defaultInstallationId = isClient ? options.installationId : config.installationId;
145
+ if (!this._client.resolveApiKey()) {
131
146
  throw new Error("API key required. Set MORPH_API_KEY or pass apiKey in config.");
132
147
  }
133
148
  this.installations = {
@@ -171,59 +186,44 @@ var GitHubClient = class {
171
186
  * Make an authenticated API request
172
187
  */
173
188
  async request(method, path, body) {
174
- const url = `${this.baseUrl}${path}`;
175
189
  if (this.debug) {
176
190
  console.log(`[GitHub SDK] ${method} ${path}`, body || "");
177
191
  }
178
- const controller = new AbortController();
179
- const timeoutId = setTimeout(() => controller.abort(), this.timeout);
192
+ let response;
180
193
  try {
181
- const response = await fetch(url, {
182
- method,
183
- headers: {
184
- "Content-Type": "application/json",
185
- Authorization: `Bearer ${this.apiKey}`
186
- },
187
- body: body ? JSON.stringify(body) : void 0,
188
- signal: controller.signal
194
+ response = await this._client.request(method, path, {
195
+ body,
196
+ timeout: this.timeout,
197
+ raw: true
189
198
  });
190
- clearTimeout(timeoutId);
191
- if (!response.ok) {
192
- const errorData = await response.json().catch(() => ({}));
193
- const message = errorData.error || errorData.detail || errorData.message || response.statusText;
194
- if (this.debug) {
195
- console.error(`[GitHub SDK] Error ${response.status}:`, message);
196
- }
197
- if (response.status === 404) {
198
- if (message.includes("installation")) {
199
- throw new NoInstallationError(message);
200
- }
201
- throw new NotFoundError(message);
202
- }
203
- if (response.status === 403) {
204
- throw new PermissionError(message);
205
- }
206
- throw new GitHubError(message, response.status, errorData.code);
199
+ } catch (error) {
200
+ if (error instanceof Error && /timed out/i.test(error.message)) {
201
+ throw new GitHubError("Request timeout", 408, "TIMEOUT");
207
202
  }
208
- const data = await response.json();
203
+ throw new GitHubError(error instanceof Error ? error.message : "Unknown error", 500, "UNKNOWN");
204
+ }
205
+ if (!response.ok) {
206
+ const errorData = await response.json().catch(() => ({}));
207
+ const message = errorData.error || errorData.detail || errorData.message || response.statusText;
209
208
  if (this.debug) {
210
- console.log(`[GitHub SDK] Response:`, JSON.stringify(data).slice(0, 200));
209
+ console.error(`[GitHub SDK] Error ${response.status}:`, message);
211
210
  }
212
- return data;
213
- } catch (error) {
214
- clearTimeout(timeoutId);
215
- if (error instanceof GitHubError) {
216
- throw error;
211
+ if (response.status === 404) {
212
+ if (message.includes("installation")) {
213
+ throw new NoInstallationError(message);
214
+ }
215
+ throw new NotFoundError(message);
217
216
  }
218
- if (error instanceof Error && error.name === "AbortError") {
219
- throw new GitHubError("Request timeout", 408, "TIMEOUT");
217
+ if (response.status === 403) {
218
+ throw new PermissionError(message);
220
219
  }
221
- throw new GitHubError(
222
- error instanceof Error ? error.message : "Unknown error",
223
- 500,
224
- "UNKNOWN"
225
- );
220
+ throw new GitHubError(message, response.status, errorData.code);
221
+ }
222
+ const data = await response.json();
223
+ if (this.debug) {
224
+ console.log(`[GitHub SDK] Response:`, JSON.stringify(data).slice(0, 200));
226
225
  }
226
+ return data;
227
227
  }
228
228
  /**
229
229
  * Get the installation ID to use for a request
@@ -602,7 +602,7 @@ var VercelToolFactory = class {
602
602
  };
603
603
 
604
604
  // client.ts
605
- var MorphClient = class {
605
+ var MorphClient = class extends MorphAPIClient {
606
606
  /** Client configuration */
607
607
  config;
608
608
  /** FastApply tool for editing files with AI-powered merge */
@@ -627,6 +627,8 @@ var MorphClient = class {
627
627
  vercel;
628
628
  /** Compact context with line ranges */
629
629
  compact;
630
+ /** Reflex: train and serve small text classifiers */
631
+ reflex;
630
632
  /**
631
633
  * Create a new Morph SDK client
632
634
  *
@@ -642,78 +644,32 @@ var MorphClient = class {
642
644
  * ```
643
645
  */
644
646
  constructor(config = {}) {
645
- this.config = config;
646
- if (config.debug) {
647
- logger.enable();
648
- }
649
- logger.debug("MorphClient", "initialized", { debug: !!config.debug, timeout: config.timeout });
650
- this.fastApply = new FastApplyClient({
651
- apiKey: config.apiKey,
652
- debug: config.debug,
653
- timeout: config.timeout,
654
- retryConfig: config.retryConfig
655
- });
656
- this.codebaseSearch = new CodebaseSearchClient({
657
- apiKey: config.apiKey,
658
- debug: config.debug,
659
- timeout: config.timeout,
660
- retryConfig: config.retryConfig
661
- });
662
- this.warpGrep = new WarpGrepClient({
663
- morphApiKey: config.apiKey,
664
- debug: config.debug,
665
- timeout: config.timeout,
666
- retryConfig: config.retryConfig
667
- });
668
- this.browser = new BrowserClient({
647
+ super({
669
648
  apiKey: config.apiKey,
670
- debug: config.debug,
671
- timeout: config.timeout,
672
- retryConfig: config.retryConfig
673
- });
674
- this.github = new GitHubClient({
675
- apiKey: config.apiKey,
676
- debug: config.debug,
677
- timeout: config.timeout,
678
- installationId: config.github?.installationId
679
- });
680
- this.git = new MorphGit({
681
- apiKey: config.apiKey,
682
- retryConfig: config.retryConfig
683
- });
684
- this.routers = {
685
- openai: new OpenAIRouter({
686
- apiKey: config.apiKey,
687
- debug: config.debug,
688
- timeout: config.timeout,
689
- retryConfig: config.retryConfig
690
- }),
691
- anthropic: new AnthropicRouter({
692
- apiKey: config.apiKey,
693
- debug: config.debug,
694
- timeout: config.timeout,
695
- retryConfig: config.retryConfig
696
- }),
697
- gemini: new GeminiRouter({
698
- apiKey: config.apiKey,
699
- debug: config.debug,
700
- timeout: config.timeout,
701
- retryConfig: config.retryConfig
702
- }),
703
- raw: new RawRouter({
704
- apiKey: config.apiKey,
705
- debug: config.debug,
706
- timeout: config.timeout,
707
- retryConfig: config.retryConfig
708
- })
709
- };
710
- const compactClient = new CompactClient({
711
- morphApiKey: config.apiKey,
712
649
  timeout: config.timeout,
713
650
  retryConfig: config.retryConfig,
714
651
  debug: config.debug
715
652
  });
653
+ if (!config.apiKey) {
654
+ throw new Error("Morph API key is required. Pass it as { apiKey } when constructing MorphClient.");
655
+ }
656
+ this.config = config;
657
+ logger.debug("MorphClient", "initialized", { debug: !!config.debug, timeout: config.timeout });
658
+ this.fastApply = new FastApplyClient(this);
659
+ this.codebaseSearch = new CodebaseSearchClient(this);
660
+ this.warpGrep = new WarpGrepClient(this);
661
+ this.browser = new BrowserClient(this);
662
+ this.github = new GitHubClient(this, { installationId: config.github?.installationId });
663
+ this.git = new MorphGit(this);
664
+ this.routers = {
665
+ openai: new OpenAIRouter(this),
666
+ anthropic: new AnthropicRouter(this),
667
+ gemini: new GeminiRouter(this),
668
+ raw: new RawRouter(this)
669
+ };
670
+ const compactClient = new CompactClient(this);
716
671
  this.compact = compactClient.compact.bind(compactClient);
672
+ this.reflex = new ReflexClient(this);
717
673
  this.openai = new OpenAIToolFactory(config);
718
674
  this.anthropic = new AnthropicToolFactory(config);
719
675
  this.vercel = new VercelToolFactory(config);
@@ -731,4 +687,4 @@ export {
731
687
  VercelToolFactory,
732
688
  MorphClient
733
689
  };
734
- //# sourceMappingURL=chunk-E5QWXVTF.js.map
690
+ //# sourceMappingURL=chunk-IN2U7AAI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../tools/github/types.ts","../tools/github/core.ts","../factories/openai.ts","../factories/anthropic.ts","../factories/vercel.ts","../client.ts"],"sourcesContent":["/**\n * GitHub SDK Types\n *\n * Type definitions for the Morph GitHub integration.\n * Users connect GitHub in the Morph dashboard, then use these\n * types to interact with their GitHub repos through the SDK.\n */\n\n// =============================================================================\n// Configuration\n// =============================================================================\n\n/**\n * Configuration for the GitHub client\n */\nexport interface GitHubClientConfig {\n /** Morph API key (defaults to MORPH_API_KEY env var) */\n apiKey?: string;\n /** Default installation ID to use (optional, can be specified per-request) */\n installationId?: string;\n /** Base URL for the Morph API (defaults to https://api.morphllm.com) */\n baseUrl?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Enable debug logging */\n debug?: boolean;\n}\n\n// =============================================================================\n// Core Types\n// =============================================================================\n\n/**\n * A GitHub App installation (connected GitHub account)\n */\nexport interface Installation {\n /** Installation ID (use this for subsequent requests) */\n id: string;\n /** GitHub account login (username or org name) */\n accountLogin: string;\n /** Account type */\n accountType: \"User\" | \"Organization\";\n /** Custom display name (set in Morph dashboard) */\n displayName?: string;\n /** Whether check runs are disabled (only PR comments posted) */\n disableCheckRun: boolean;\n /** Whether to keep all previous PR comments (vs. replacing with latest) */\n keepCommentHistory: boolean;\n /** Browser automation model used for preview tests */\n model: string;\n}\n\n/**\n * Input for updating installation settings\n */\nexport interface UpdateInstallationInput {\n /** Installation ID to update */\n installationId: string;\n /** Custom display name */\n displayName?: string;\n /** Whether to disable check runs */\n disableCheckRun?: boolean;\n /** Whether to keep comment history */\n keepCommentHistory?: boolean;\n /** Browser automation model */\n model?: string;\n}\n\n/**\n * Site authentication credentials for a repo or project\n */\nexport interface SiteAuth {\n /** Login username or email */\n username: string | null;\n /** Login password */\n password: string | null;\n}\n\n/**\n * A repository with its Morph configuration\n */\nexport interface RepoConfig {\n /** Database UUID — use this for update/remove operations */\n id: string;\n /** GitHub's numeric repo ID */\n githubId: number;\n /** Full name including owner (e.g., \"acme/app\") */\n fullName: string;\n /** Repository name (e.g., \"app\") */\n name: string;\n /** Whether Morph tests are enabled */\n enabled: boolean;\n /** Whether to also test on mobile viewport */\n testMobile: boolean;\n /** Path filter — only trigger tests when files match this prefix */\n pathFilter: string | null;\n /** Custom instructions for the AI agent */\n customInstructions: string | null;\n /** Site authentication credentials */\n auth: SiteAuth | null;\n}\n\n/**\n * Input for updating a repo's configuration\n */\nexport interface UpdateRepoInput {\n /** Repo DB ID (from RepoConfig.id) */\n repoId: string;\n /** Whether Morph tests are enabled */\n enabled?: boolean;\n /** Whether to also test on mobile viewport */\n testMobile?: boolean;\n /** Path filter for conditional triggers */\n pathFilter?: string | null;\n /** Custom instructions for the AI agent */\n customInstructions?: string | null;\n /** Site auth credentials (null to clear) */\n auth?: { username?: string; password?: string; cookies?: unknown } | null;\n}\n\n/**\n * Input for syncing repos from GitHub\n */\nexport interface SyncReposInput {\n /** Installation ID to sync repos for */\n installationId: string;\n}\n\n/**\n * A monorepo sub-project scoped under a repo\n */\nexport interface Project {\n /** Project DB UUID */\n id: string;\n /** Parent repo DB UUID */\n repoId: string;\n /** Project name */\n name: string;\n /** Path filter within the repo */\n pathFilter: string | null;\n /** Whether tests are enabled */\n enabled: boolean;\n /** Whether to test on mobile viewport */\n testMobile: boolean;\n /** Custom instructions for the AI agent */\n customInstructions: string | null;\n /** Site authentication credentials */\n auth: SiteAuth | null;\n /** Creation timestamp (ISO 8601) */\n createdAt: string;\n}\n\n/**\n * Input for creating a project\n */\nexport interface CreateProjectInput {\n /** Parent repo DB ID */\n repoId: string;\n /** Project name (must be unique within the repo) */\n name: string;\n /** Path filter within the repo (e.g., \"packages/web/\") */\n pathFilter: string;\n /** Custom instructions for the AI agent */\n customInstructions?: string;\n}\n\n/**\n * Input for updating a project\n */\nexport interface UpdateProjectInput {\n /** Project DB ID */\n projectId: string;\n /** Whether tests are enabled */\n enabled?: boolean;\n /** Whether to test on mobile viewport */\n testMobile?: boolean;\n /** Path filter within the repo */\n pathFilter?: string | null;\n /** Custom instructions for the AI agent */\n customInstructions?: string | null;\n /** Site auth credentials (null to clear) */\n auth?: { username?: string; password?: string; cookies?: unknown } | null;\n}\n\n/**\n * Input for listing projects\n */\nexport interface ListProjectsInput {\n /** Parent repo DB ID */\n repoId: string;\n}\n\n/**\n * A GitHub repository\n */\nexport interface Repo {\n /** GitHub's numeric repo ID */\n id: number;\n /** Repository name (e.g., \"app\") */\n name: string;\n /** Full name including owner (e.g., \"acme/app\") */\n fullName: string;\n /** Whether the repo is private */\n private: boolean;\n /** Default branch name */\n defaultBranch?: string;\n}\n\n/**\n * A pull request (basic info)\n */\nexport interface PullRequest {\n /** PR number */\n number: number;\n /** PR title */\n title: string;\n /** PR description/body */\n body: string | null;\n /** PR state */\n state: \"open\" | \"closed\";\n /** Author's GitHub username */\n author: string;\n /** HEAD commit SHA */\n headSha: string;\n /** Base branch name */\n baseBranch: string;\n /** HEAD branch name */\n headBranch: string;\n /** Creation timestamp (ISO 8601) */\n createdAt: string;\n /** Last update timestamp (ISO 8601) */\n updatedAt: string;\n}\n\n/**\n * A pull request with full context (diff and files)\n */\nexport interface PullRequestWithContext extends PullRequest {\n /** Full unified diff */\n diff: string;\n /** List of changed files with patches */\n files: FileChange[];\n}\n\n/**\n * A file changed in a pull request\n */\nexport interface FileChange {\n /** File path */\n filename: string;\n /** Change status */\n status: \"added\" | \"removed\" | \"modified\" | \"renamed\";\n /** Number of lines added */\n additions: number;\n /** Number of lines deleted */\n deletions: number;\n /** Unified diff patch for this file */\n patch?: string;\n}\n\n/**\n * A deployment (e.g., Vercel preview)\n */\nexport interface Deployment {\n /** Deployment ID */\n id: number;\n /** Commit SHA this deployment is for */\n sha: string;\n /** Environment name (e.g., \"preview\", \"production\") */\n environment: string;\n /** Deployment state */\n state: \"pending\" | \"success\" | \"failure\" | \"error\" | \"inactive\" | \"in_progress\" | \"queued\";\n /** Preview/deployment URL (if available) */\n url: string | null;\n /** Creation timestamp (ISO 8601) */\n createdAt: string;\n}\n\n/**\n * A comment on a PR/issue\n */\nexport interface Comment {\n /** Comment ID */\n id: number;\n /** Comment body/content */\n body: string;\n /** Author's GitHub username */\n author: string;\n /** Creation timestamp (ISO 8601) */\n createdAt: string;\n /** Last update timestamp (ISO 8601) */\n updatedAt: string;\n}\n\n/**\n * A GitHub check run (CI status)\n */\nexport interface CheckRun {\n /** Check run ID */\n id: number;\n /** Check run name */\n name: string;\n /** Current status */\n status: \"queued\" | \"in_progress\" | \"completed\";\n /** Conclusion (only set when status is \"completed\") */\n conclusion?:\n | \"success\"\n | \"failure\"\n | \"neutral\"\n | \"cancelled\"\n | \"skipped\"\n | \"timed_out\"\n | \"action_required\";\n /** Start timestamp (ISO 8601) */\n startedAt?: string;\n /** Completion timestamp (ISO 8601) */\n completedAt?: string;\n}\n\n// =============================================================================\n// Input Types\n// =============================================================================\n\n/**\n * Input for listing repositories\n */\nexport interface ListReposInput {\n /** Installation ID to list repos for */\n installationId: string;\n}\n\n/**\n * Input for listing pull requests\n */\nexport interface ListPullRequestsInput {\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Filter by PR state (default: \"open\") */\n state?: \"open\" | \"closed\" | \"all\";\n /** Installation ID (uses default if not specified) */\n installationId?: string;\n}\n\n/**\n * Input for getting a single pull request\n */\nexport interface GetPullRequestInput {\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** PR number */\n number: number;\n /** Installation ID (uses default if not specified) */\n installationId?: string;\n}\n\n/**\n * Input for listing deployments\n */\nexport interface ListDeploymentsInput {\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Filter by commit SHA */\n sha?: string;\n /** Filter by environment name */\n environment?: string;\n /** Installation ID (uses default if not specified) */\n installationId?: string;\n}\n\n/**\n * Input for listing comments on a PR\n */\nexport interface ListCommentsInput {\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** PR number */\n pr: number;\n /** Installation ID (uses default if not specified) */\n installationId?: string;\n}\n\n/**\n * Input for creating a comment\n */\nexport interface CreateCommentInput {\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** PR number */\n pr: number;\n /** Comment body (Markdown supported) */\n body: string;\n /** Installation ID (uses default if not specified) */\n installationId?: string;\n}\n\n/**\n * Input for updating a comment\n */\nexport interface UpdateCommentInput {\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Comment ID to update */\n commentId: number;\n /** New comment body */\n body: string;\n /** Installation ID (uses default if not specified) */\n installationId?: string;\n}\n\n/**\n * Input for deleting a comment\n */\nexport interface DeleteCommentInput {\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Comment ID to delete */\n commentId: number;\n /** Installation ID (uses default if not specified) */\n installationId?: string;\n}\n\n/**\n * Input for creating a check run\n */\nexport interface CreateCheckRunInput {\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Commit SHA to create check run for */\n sha: string;\n /** Check run name (e.g., \"Preview Test\") */\n name: string;\n /** Initial status */\n status: \"queued\" | \"in_progress\";\n /** Output title */\n title?: string;\n /** Output summary (Markdown supported) */\n summary?: string;\n /** Installation ID (uses default if not specified) */\n installationId?: string;\n}\n\n/**\n * Input for updating a check run\n */\nexport interface UpdateCheckRunInput {\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Check run ID to update */\n checkRunId: number;\n /** New status */\n status?: \"queued\" | \"in_progress\" | \"completed\";\n /** Conclusion (required if status is \"completed\") */\n conclusion?: CheckRun[\"conclusion\"];\n /** Output title */\n title?: string;\n /** Output summary (Markdown supported) */\n summary?: string;\n /** Output text (detailed info, Markdown supported) */\n text?: string;\n /** Installation ID (uses default if not specified) */\n installationId?: string;\n}\n\n// =============================================================================\n// Error Types\n// =============================================================================\n\n/**\n * Error thrown by GitHub operations\n */\nexport class GitHubError extends Error {\n /** HTTP status code */\n status: number;\n /** Error code from API */\n code?: string;\n\n constructor(message: string, status: number, code?: string) {\n super(message);\n this.name = \"GitHubError\";\n this.status = status;\n this.code = code;\n }\n}\n\n/**\n * Error thrown when no installation is found or specified\n */\nexport class NoInstallationError extends GitHubError {\n constructor(message = \"No GitHub installation found. Connect GitHub at morphllm.com/dashboard/integrations/github\") {\n super(message, 404, \"NO_INSTALLATION\");\n }\n}\n\n/**\n * Error thrown when resource is not found\n */\nexport class NotFoundError extends GitHubError {\n constructor(resource: string) {\n super(`${resource} not found`, 404, \"NOT_FOUND\");\n }\n}\n\n/**\n * Error thrown when user lacks permission\n */\nexport class PermissionError extends GitHubError {\n constructor(message = \"Insufficient permissions for this operation\") {\n super(message, 403, \"PERMISSION_DENIED\");\n }\n}\n","/**\n * GitHub SDK Client\n *\n * Provides access to GitHub repositories, pull requests, deployments,\n * comments, and check runs through the user's connected GitHub account.\n *\n * All operations are proxied through the Morph API - installation tokens\n * are never exposed to the client.\n */\n\nimport type {\n GitHubClientConfig,\n Installation,\n Repo,\n RepoConfig,\n PullRequest,\n PullRequestWithContext,\n Deployment,\n Comment,\n CheckRun,\n Project,\n ListReposInput,\n ListPullRequestsInput,\n GetPullRequestInput,\n ListDeploymentsInput,\n ListCommentsInput,\n CreateCommentInput,\n UpdateCommentInput,\n DeleteCommentInput,\n CreateCheckRunInput,\n UpdateCheckRunInput,\n UpdateInstallationInput,\n UpdateRepoInput,\n SyncReposInput,\n CreateProjectInput,\n UpdateProjectInput,\n ListProjectsInput,\n} from \"./types.js\";\n\nimport { GitHubError, NoInstallationError, NotFoundError, PermissionError } from \"./types.js\";\nimport { MorphAPIClient } from \"../../core/client.js\";\nimport { APIResource } from \"../../core/resource.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.morphllm.com\";\nconst DEFAULT_TIMEOUT = 30000;\n\n/**\n * GitHub SDK Client\n *\n * @example\n * ```typescript\n * import { MorphClient } from '@morphllm/morphsdk';\n *\n * const morph = new MorphClient({ apiKey: process.env.MORPH_API_KEY });\n *\n * // List installations\n * const installations = await morph.github.installations.list();\n *\n * // Get PR with context\n * const pr = await morph.github.pullRequests.get({\n * owner: \"acme\",\n * repo: \"app\",\n * number: 42\n * });\n * ```\n *\n * @deprecated Prefer the unified `MorphClient` (`new MorphClient({ apiKey }).github`).\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 GitHubClient extends APIResource {\n private timeout: number;\n private debug: boolean;\n private defaultInstallationId?: string;\n\n /** Installation operations */\n public installations: {\n list: () => Promise<Installation[]>;\n get: (installationId: string) => Promise<Installation>;\n update: (input: UpdateInstallationInput) => Promise<Installation>;\n disconnect: (installationId: string) => Promise<{ success: boolean; alreadyDeleted: boolean }>;\n };\n\n /** Repository operations */\n public repos: {\n list: (input: ListReposInput) => Promise<RepoConfig[]>;\n get: (repoId: string) => Promise<RepoConfig>;\n update: (input: UpdateRepoInput) => Promise<RepoConfig>;\n remove: (repoId: string) => Promise<{ success: boolean; alreadyRemoved: boolean }>;\n sync: (input: SyncReposInput) => Promise<{ count: number }>;\n };\n\n /** Project operations (monorepo sub-projects) */\n public projects: {\n list: (input: ListProjectsInput) => Promise<Project[]>;\n create: (input: CreateProjectInput) => Promise<Project>;\n update: (input: UpdateProjectInput) => Promise<Project>;\n delete: (projectId: string) => Promise<{ success: boolean }>;\n };\n\n /** Pull request operations */\n public pullRequests: {\n list: (input: ListPullRequestsInput) => Promise<PullRequest[]>;\n get: (input: GetPullRequestInput) => Promise<PullRequestWithContext>;\n };\n\n /** Deployment operations */\n public deployments: {\n list: (input: ListDeploymentsInput) => Promise<Deployment[]>;\n };\n\n /** Comment operations */\n public comments: {\n list: (input: ListCommentsInput) => Promise<Comment[]>;\n create: (input: CreateCommentInput) => Promise<Comment>;\n update: (input: UpdateCommentInput) => Promise<Comment>;\n delete: (input: DeleteCommentInput) => Promise<void>;\n };\n\n /** Check run operations */\n public checkRuns: {\n create: (input: CreateCheckRunInput) => Promise<CheckRun>;\n update: (input: UpdateCheckRunInput) => Promise<CheckRun>;\n };\n\n /**\n * Get the GitHub App installation URL.\n * Users visit this URL once to install the Morph GitHub App on their account/org.\n */\n public getInstallUrl(): string {\n return \"https://github.com/apps/morph-subagents/installations/new\";\n }\n\n constructor(\n clientOrConfig: MorphAPIClient | GitHubClientConfig = {},\n options: { installationId?: string } = {},\n ) {\n const isClient = clientOrConfig instanceof MorphAPIClient;\n const config: GitHubClientConfig = isClient ? {} : clientOrConfig;\n super(\n isClient\n ? clientOrConfig\n : new MorphAPIClient({\n apiKey: config.apiKey,\n baseURL: config.baseUrl ?? DEFAULT_BASE_URL,\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n debug: config.debug,\n }),\n );\n this.timeout = config.timeout || DEFAULT_TIMEOUT;\n this.debug = config.debug || false;\n // When sharing a transport, installationId is passed via `options`.\n this.defaultInstallationId = isClient ? options.installationId : config.installationId;\n\n if (!this._client.resolveApiKey()) {\n throw new Error(\"API key required. Set MORPH_API_KEY or pass apiKey in config.\");\n }\n\n // Bind all methods\n this.installations = {\n list: this.listInstallations.bind(this),\n get: this.getInstallation.bind(this),\n update: this.updateInstallation.bind(this),\n disconnect: this.disconnectInstallation.bind(this),\n };\n\n this.repos = {\n list: this.listRepos.bind(this),\n get: this.getRepo.bind(this),\n update: this.updateRepo.bind(this),\n remove: this.removeRepo.bind(this),\n sync: this.syncRepos.bind(this),\n };\n\n this.projects = {\n list: this.listProjects.bind(this),\n create: this.createProject.bind(this),\n update: this.updateProject.bind(this),\n delete: this.deleteProject.bind(this),\n };\n\n this.pullRequests = {\n list: this.listPullRequests.bind(this),\n get: this.getPullRequest.bind(this),\n };\n\n this.deployments = {\n list: this.listDeployments.bind(this),\n };\n\n this.comments = {\n list: this.listComments.bind(this),\n create: this.createComment.bind(this),\n update: this.updateComment.bind(this),\n delete: this.deleteComment.bind(this),\n };\n\n this.checkRuns = {\n create: this.createCheckRun.bind(this),\n update: this.updateCheckRun.bind(this),\n };\n }\n\n /**\n * Make an authenticated API request\n */\n private async request<T>(\n method: string,\n path: string,\n body?: Record<string, unknown>\n ): Promise<T> {\n if (this.debug) {\n console.log(`[GitHub SDK] ${method} ${path}`, body || \"\");\n }\n\n // Centralize transport (auth, retries, timeout, URL) but keep GitHub's own\n // error taxonomy by inspecting the raw response ourselves.\n let response: Response;\n try {\n response = await this._client.request<Response>(method, path, {\n body,\n timeout: this.timeout,\n raw: true,\n });\n } catch (error) {\n if (error instanceof Error && /timed out/i.test(error.message)) {\n throw new GitHubError(\"Request timeout\", 408, \"TIMEOUT\");\n }\n throw new GitHubError(error instanceof Error ? error.message : \"Unknown error\", 500, \"UNKNOWN\");\n }\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({} as Record<string, any>));\n const message = errorData.error || errorData.detail || errorData.message || response.statusText;\n\n if (this.debug) {\n console.error(`[GitHub SDK] Error ${response.status}:`, message);\n }\n\n // Map to specific error types\n if (response.status === 404) {\n if (message.includes(\"installation\")) {\n throw new NoInstallationError(message);\n }\n throw new NotFoundError(message);\n }\n if (response.status === 403) {\n throw new PermissionError(message);\n }\n throw new GitHubError(message, response.status, errorData.code);\n }\n\n const data = await response.json();\n\n if (this.debug) {\n console.log(`[GitHub SDK] Response:`, JSON.stringify(data).slice(0, 200));\n }\n\n return data as T;\n }\n\n /**\n * Get the installation ID to use for a request\n */\n private getInstallationId(input?: { installationId?: string }): string | undefined {\n return input?.installationId || this.defaultInstallationId;\n }\n\n // ==========================================================================\n // Installations\n // ==========================================================================\n\n private async listInstallations(): Promise<Installation[]> {\n return this.request<Installation[]>(\"GET\", \"/api/v1/github/installations\");\n }\n\n private async getInstallation(installationId: string): Promise<Installation> {\n return this.request<Installation>(\"GET\", `/api/v1/github/installations/${installationId}`);\n }\n\n private async updateInstallation(input: UpdateInstallationInput): Promise<Installation> {\n if (this.debug) console.log(\"[GitHub SDK] updateInstallation\", input.installationId);\n const { installationId, ...body } = input;\n return this.request<Installation>(\"PATCH\", `/api/v1/github/installations/${installationId}`, body);\n }\n\n private async disconnectInstallation(installationId: string): Promise<{ success: boolean; alreadyDeleted: boolean }> {\n if (this.debug) console.log(\"[GitHub SDK] disconnectInstallation\", installationId);\n return this.request<{ success: boolean; alreadyDeleted: boolean }>(\"DELETE\", `/api/v1/github/installations/${installationId}`);\n }\n\n // ==========================================================================\n // Repositories\n // ==========================================================================\n\n private async listRepos(input: ListReposInput): Promise<RepoConfig[]> {\n const installationId = input.installationId || this.defaultInstallationId;\n if (!installationId) {\n throw new NoInstallationError(\"installationId required. Call installations.list() first.\");\n }\n return this.request<RepoConfig[]>(\"GET\", `/api/v1/github/installations/${installationId}/repos`);\n }\n\n private async getRepo(repoId: string): Promise<RepoConfig> {\n if (this.debug) console.log(\"[GitHub SDK] getRepo\", repoId);\n return this.request<RepoConfig>(\"GET\", `/api/v1/github/repos/${repoId}`);\n }\n\n private async updateRepo(input: UpdateRepoInput): Promise<RepoConfig> {\n if (this.debug) console.log(\"[GitHub SDK] updateRepo\", input.repoId);\n const { repoId, ...body } = input;\n return this.request<RepoConfig>(\"PATCH\", `/api/v1/github/repos/${repoId}`, body);\n }\n\n private async removeRepo(repoId: string): Promise<{ success: boolean; alreadyRemoved: boolean }> {\n if (this.debug) console.log(\"[GitHub SDK] removeRepo\", repoId);\n return this.request<{ success: boolean; alreadyRemoved: boolean }>(\"DELETE\", `/api/v1/github/repos/${repoId}`);\n }\n\n private async syncRepos(input: SyncReposInput): Promise<{ count: number }> {\n const installationId = input.installationId || this.defaultInstallationId;\n if (!installationId) {\n throw new NoInstallationError(\"installationId required. Call installations.list() first.\");\n }\n if (this.debug) console.log(\"[GitHub SDK] syncRepos\", installationId);\n return this.request<{ count: number }>(\"POST\", `/api/v1/github/installations/${installationId}/repos/sync`);\n }\n\n // ==========================================================================\n // Projects (monorepo sub-projects)\n // ==========================================================================\n\n private async listProjects(input: ListProjectsInput): Promise<Project[]> {\n if (this.debug) console.log(\"[GitHub SDK] listProjects\", input.repoId);\n return this.request<Project[]>(\"GET\", `/api/v1/github/repos/${input.repoId}/projects`);\n }\n\n private async createProject(input: CreateProjectInput): Promise<Project> {\n if (this.debug) console.log(\"[GitHub SDK] createProject\", input.repoId, input.name);\n const { repoId, ...body } = input;\n return this.request<Project>(\"POST\", `/api/v1/github/repos/${repoId}/projects`, body);\n }\n\n private async updateProject(input: UpdateProjectInput): Promise<Project> {\n if (this.debug) console.log(\"[GitHub SDK] updateProject\", input.projectId);\n const { projectId, ...body } = input;\n return this.request<Project>(\"PATCH\", `/api/v1/github/projects/${projectId}`, body);\n }\n\n private async deleteProject(projectId: string): Promise<{ success: boolean }> {\n if (this.debug) console.log(\"[GitHub SDK] deleteProject\", projectId);\n return this.request<{ success: boolean }>(\"DELETE\", `/api/v1/github/projects/${projectId}`);\n }\n\n // ==========================================================================\n // Pull Requests\n // ==========================================================================\n\n private async listPullRequests(input: ListPullRequestsInput): Promise<PullRequest[]> {\n const installationId = this.getInstallationId(input);\n const params = new URLSearchParams({\n owner: input.owner,\n repo: input.repo,\n ...(input.state && { state: input.state }),\n ...(installationId && { installationId }),\n });\n return this.request<PullRequest[]>(\"GET\", `/api/v1/github/pulls?${params}`);\n }\n\n private async getPullRequest(input: GetPullRequestInput): Promise<PullRequestWithContext> {\n const installationId = this.getInstallationId(input);\n const params = new URLSearchParams({\n owner: input.owner,\n repo: input.repo,\n ...(installationId && { installationId }),\n });\n return this.request<PullRequestWithContext>(\n \"GET\",\n `/api/v1/github/pulls/${input.number}?${params}`\n );\n }\n\n // ==========================================================================\n // Deployments\n // ==========================================================================\n\n private async listDeployments(input: ListDeploymentsInput): Promise<Deployment[]> {\n const installationId = this.getInstallationId(input);\n const params = new URLSearchParams({\n owner: input.owner,\n repo: input.repo,\n ...(input.sha && { sha: input.sha }),\n ...(input.environment && { environment: input.environment }),\n ...(installationId && { installationId }),\n });\n return this.request<Deployment[]>(\"GET\", `/api/v1/github/deployments?${params}`);\n }\n\n // ==========================================================================\n // Comments\n // ==========================================================================\n\n private async listComments(input: ListCommentsInput): Promise<Comment[]> {\n const installationId = this.getInstallationId(input);\n const params = new URLSearchParams({\n owner: input.owner,\n repo: input.repo,\n pr: String(input.pr),\n ...(installationId && { installationId }),\n });\n return this.request<Comment[]>(\"GET\", `/api/v1/github/comments?${params}`);\n }\n\n private async createComment(input: CreateCommentInput): Promise<Comment> {\n const installationId = this.getInstallationId(input);\n return this.request<Comment>(\"POST\", \"/api/v1/github/comments\", {\n owner: input.owner,\n repo: input.repo,\n pr: input.pr,\n body: input.body,\n ...(installationId && { installationId }),\n });\n }\n\n private async updateComment(input: UpdateCommentInput): Promise<Comment> {\n const installationId = this.getInstallationId(input);\n return this.request<Comment>(\"PATCH\", `/api/v1/github/comments/${input.commentId}`, {\n owner: input.owner,\n repo: input.repo,\n body: input.body,\n ...(installationId && { installationId }),\n });\n }\n\n private async deleteComment(input: DeleteCommentInput): Promise<void> {\n const installationId = this.getInstallationId(input);\n const params = new URLSearchParams({\n owner: input.owner,\n repo: input.repo,\n ...(installationId && { installationId }),\n });\n await this.request<void>(\"DELETE\", `/api/v1/github/comments/${input.commentId}?${params}`);\n }\n\n // ==========================================================================\n // Check Runs\n // ==========================================================================\n\n private async createCheckRun(input: CreateCheckRunInput): Promise<CheckRun> {\n const installationId = this.getInstallationId(input);\n return this.request<CheckRun>(\"POST\", \"/api/v1/github/check-runs\", {\n owner: input.owner,\n repo: input.repo,\n sha: input.sha,\n name: input.name,\n status: input.status,\n ...(input.title && { title: input.title }),\n ...(input.summary && { summary: input.summary }),\n ...(installationId && { installationId }),\n });\n }\n\n private async updateCheckRun(input: UpdateCheckRunInput): Promise<CheckRun> {\n const installationId = this.getInstallationId(input);\n return this.request<CheckRun>(\"PATCH\", `/api/v1/github/check-runs/${input.checkRunId}`, {\n owner: input.owner,\n repo: input.repo,\n ...(input.status && { status: input.status }),\n ...(input.conclusion && { conclusion: input.conclusion }),\n ...(input.title && { title: input.title }),\n ...(input.summary && { summary: input.summary }),\n ...(input.text && { text: input.text }),\n ...(installationId && { installationId }),\n });\n }\n}\n","/**\n * OpenAI Tool Factory for MorphClient\n * \n * Creates OpenAI-compatible tools that inherit the API key from MorphClient.\n */\n\nimport type { MorphClientConfig } from '../client.js';\nimport { createWarpGrepTool, createGitHubSearchTool } from '../tools/warp_grep/openai.js';\nimport { createCodebaseSearchTool } from '../tools/codebase_search/openai.js';\nimport { createEditFileTool } from '../tools/fastapply/openai.js';\nimport type { WarpGrepToolConfig, GitHubSearchToolConfig } from '../tools/warp_grep/types.js';\nimport type { CodebaseSearchConfig } from '../tools/codebase_search/types.js';\nimport type { EditFileConfig } from '../tools/fastapply/types.js';\n\n/**\n * Factory for creating OpenAI-compatible tools with inherited API key\n * \n * @example\n * ```typescript\n * const morph = new MorphClient({ apiKey: process.env.MORPH_API_KEY });\n * \n * const grepTool = morph.openai.createWarpGrepTool({ repoRoot: '.' });\n * const searchTool = morph.openai.createCodebaseSearchTool({ repoId: 'my-project' });\n * const editTool = morph.openai.createEditFileTool({ baseDir: './src' });\n * \n * // Use with OpenAI client\n * const response = await openai.chat.completions.create({\n * model: 'gpt-4o',\n * tools: [grepTool, searchTool, editTool],\n * messages: [{ role: 'user', content: 'Find and fix the bug' }]\n * });\n * ```\n */\nexport class OpenAIToolFactory {\n constructor(private config: MorphClientConfig) {}\n\n /**\n * Create an OpenAI-compatible warp grep tool\n * \n * @param toolConfig - Tool configuration (morphApiKey inherited from MorphClient)\n * @returns OpenAI ChatCompletionTool with execute and formatResult methods\n */\n createWarpGrepTool(toolConfig: Omit<WarpGrepToolConfig, 'morphApiKey'>) {\n return createWarpGrepTool({ \n ...toolConfig, \n morphApiKey: this.config.apiKey,\n });\n }\n\n /**\n * Create an OpenAI-compatible codebase search tool\n * \n * @param toolConfig - Tool configuration with repoId (apiKey inherited from MorphClient)\n * @returns OpenAI ChatCompletionTool with execute and formatResult methods\n */\n createCodebaseSearchTool(toolConfig: Omit<CodebaseSearchConfig, 'apiKey'>) {\n return createCodebaseSearchTool({ \n ...toolConfig, \n apiKey: this.config.apiKey,\n });\n }\n\n /**\n * Create an OpenAI-compatible edit file tool\n * \n * @param toolConfig - Tool configuration (morphApiKey inherited from MorphClient)\n * @returns OpenAI ChatCompletionTool with execute and formatResult methods\n */\n createEditFileTool(toolConfig: Omit<EditFileConfig, 'morphApiKey'> = {}) {\n return createEditFileTool({ \n ...toolConfig, \n morphApiKey: this.config.apiKey,\n });\n }\n\n /**\n * Create an OpenAI-compatible GitHub search tool\n *\n * @param toolConfig - Tool configuration (morphApiKey inherited from MorphClient)\n * @returns OpenAI ChatCompletionTool with execute and formatResult methods\n */\n createGitHubSearchTool(toolConfig?: Omit<GitHubSearchToolConfig, 'morphApiKey'>) {\n return createGitHubSearchTool({\n ...toolConfig,\n morphApiKey: this.config.apiKey,\n });\n }\n}\n\n","/**\n * Anthropic Tool Factory for MorphClient\n * \n * Creates Anthropic-compatible tools that inherit the API key from MorphClient.\n */\n\nimport type { MorphClientConfig } from '../client.js';\nimport { createWarpGrepTool, createGitHubSearchTool } from '../tools/warp_grep/anthropic.js';\nimport { createCodebaseSearchTool } from '../tools/codebase_search/anthropic.js';\nimport { createEditFileTool } from '../tools/fastapply/anthropic.js';\nimport { createExploreSubagent } from '../subagents/anthropic.js';\nimport type { WarpGrepToolConfig, GitHubSearchToolConfig } from '../tools/warp_grep/types.js';\nimport type { CodebaseSearchConfig } from '../tools/codebase_search/types.js';\nimport type { EditFileConfig } from '../tools/fastapply/types.js';\nimport type { ExploreSubagentConfig } from '../subagents/types.js';\n\n/**\n * Factory for creating Anthropic-compatible tools with inherited API key\n * \n * @example\n * ```typescript\n * const morph = new MorphClient({ apiKey: process.env.MORPH_API_KEY });\n * \n * const grepTool = morph.anthropic.createWarpGrepTool({ repoRoot: '.' });\n * const searchTool = morph.anthropic.createCodebaseSearchTool({ repoId: 'my-project' });\n * const editTool = morph.anthropic.createEditFileTool({ baseDir: './src' });\n * \n * // Use with Anthropic client\n * const response = await anthropic.messages.create({\n * model: 'claude-sonnet-4-5-20250929',\n * tools: [grepTool, searchTool, editTool],\n * messages: [{ role: 'user', content: 'Find and fix the bug' }]\n * });\n * ```\n */\nexport class AnthropicToolFactory {\n constructor(private config: MorphClientConfig) {}\n\n /**\n * Create an Anthropic-compatible warp grep tool\n * \n * @param toolConfig - Tool configuration (morphApiKey inherited from MorphClient)\n * @returns Anthropic Tool with execute and formatResult methods\n */\n createWarpGrepTool(toolConfig: Omit<WarpGrepToolConfig, 'morphApiKey'>) {\n return createWarpGrepTool({ \n ...toolConfig, \n morphApiKey: this.config.apiKey,\n });\n\n }\n\n /**\n * Create an Anthropic-compatible codebase search tool\n * \n * @param toolConfig - Tool configuration with repoId (apiKey inherited from MorphClient)\n * @returns Anthropic Tool with execute and formatResult methods\n */\n createCodebaseSearchTool(toolConfig: Omit<CodebaseSearchConfig, 'apiKey'>) {\n return createCodebaseSearchTool({ \n ...toolConfig, \n apiKey: this.config.apiKey,\n });\n }\n\n /**\n * Create an Anthropic-compatible edit file tool\n * \n * @param toolConfig - Tool configuration (morphApiKey inherited from MorphClient)\n * @returns Anthropic Tool with execute and formatResult methods\n */\n createEditFileTool(toolConfig: Omit<EditFileConfig, 'morphApiKey'> = {}) {\n return createEditFileTool({ \n ...toolConfig, \n morphApiKey: this.config.apiKey,\n });\n }\n\n /**\n * Create an Anthropic-compatible GitHub search tool\n *\n * @param toolConfig - Tool configuration (morphApiKey inherited from MorphClient)\n * @returns Anthropic Tool with execute and formatResult methods\n */\n createGitHubSearchTool(toolConfig?: Omit<GitHubSearchToolConfig, 'morphApiKey'>) {\n return createGitHubSearchTool({\n ...toolConfig,\n morphApiKey: this.config.apiKey,\n });\n }\n\n /**\n * Create an Explore subagent that searches the codebase and returns summaries\n *\n * @param config - Subagent configuration including client and model (morphApiKey inherited from MorphClient)\n * @returns Explore subagent with .tool, .run(), and .stream() methods\n */\n createExploreSubagent(config: Omit<ExploreSubagentConfig, 'morphApiKey'> & { client: any; model: string }) {\n return createExploreSubagent({\n ...config,\n morphApiKey: this.config.apiKey,\n });\n }\n}\n\n","/**\n * Vercel AI SDK Tool Factory for MorphClient\n * \n * Creates Vercel AI SDK-compatible tools that inherit the API key from MorphClient.\n */\n\nimport type { LanguageModel } from 'ai';\nimport type { MorphClientConfig } from '../client.js';\nimport { createWarpGrepTool, createGitHubSearchTool } from '../tools/warp_grep/vercel.js';\nimport { createCodebaseSearchTool } from '../tools/codebase_search/vercel.js';\nimport { createEditFileTool } from '../tools/fastapply/vercel.js';\nimport { createExploreSubagent } from '../subagents/vercel.js';\nimport type { WarpGrepToolConfig, GitHubSearchToolConfig } from '../tools/warp_grep/types.js';\nimport type { CodebaseSearchConfig } from '../tools/codebase_search/types.js';\nimport type { EditFileConfig } from '../tools/fastapply/types.js';\nimport type { ExploreSubagentConfig } from '../subagents/types.js';\n\n/**\n * Factory for creating Vercel AI SDK-compatible tools with inherited API key\n * \n * @example\n * ```typescript\n * const morph = new MorphClient({ apiKey: process.env.MORPH_API_KEY });\n * \n * const grepTool = morph.vercel.createWarpGrepTool({ repoRoot: '.' });\n * const searchTool = morph.vercel.createCodebaseSearchTool({ repoId: 'my-project' });\n * const editTool = morph.vercel.createEditFileTool({ baseDir: './src' });\n * \n * // Use with Vercel AI SDK\n * const result = await generateText({\n * model: anthropic('claude-sonnet-4-5-20250929'),\n * tools: { grep: grepTool, search: searchTool, edit: editTool },\n * prompt: 'Find and fix the bug'\n * });\n * ```\n */\nexport class VercelToolFactory {\n constructor(private config: MorphClientConfig) {}\n\n /**\n * Create a Vercel AI SDK-compatible warp grep tool\n * \n * @param toolConfig - Tool configuration (morphApiKey inherited from MorphClient)\n * @returns Vercel AI SDK tool\n */\n createWarpGrepTool(toolConfig: Omit<WarpGrepToolConfig, 'morphApiKey'>) {\n return createWarpGrepTool({ \n ...toolConfig, \n morphApiKey: this.config.apiKey,\n });\n }\n\n /**\n * Create a Vercel AI SDK-compatible codebase search tool\n * \n * @param toolConfig - Tool configuration with repoId (apiKey inherited from MorphClient)\n * @returns Vercel AI SDK tool\n */\n createCodebaseSearchTool(toolConfig: Omit<CodebaseSearchConfig, 'apiKey'>) {\n return createCodebaseSearchTool({ \n ...toolConfig, \n apiKey: this.config.apiKey,\n });\n }\n\n /**\n * Create a Vercel AI SDK-compatible edit file tool\n * \n * @param toolConfig - Tool configuration (morphApiKey inherited from MorphClient)\n * @returns Vercel AI SDK tool\n */\n createEditFileTool(toolConfig: Omit<EditFileConfig, 'morphApiKey'> = {}) {\n return createEditFileTool({ \n ...toolConfig, \n morphApiKey: this.config.apiKey,\n });\n }\n\n /**\n * Create a Vercel AI SDK-compatible GitHub search tool\n *\n * @param toolConfig - Tool configuration (morphApiKey inherited from MorphClient)\n * @returns Vercel AI SDK tool\n */\n createGitHubSearchTool(toolConfig?: Omit<GitHubSearchToolConfig, 'morphApiKey'>) {\n return createGitHubSearchTool({\n ...toolConfig,\n morphApiKey: this.config.apiKey,\n });\n }\n\n /**\n * Create an Explore subagent that searches the codebase and returns summaries\n *\n * @param config - Subagent configuration including model (morphApiKey inherited from MorphClient)\n * @returns Explore subagent with .tool, .run(), and .stream() methods\n */\n createExploreSubagent(config: Omit<ExploreSubagentConfig, 'morphApiKey'> & { model: LanguageModel }) {\n return createExploreSubagent({\n ...config,\n morphApiKey: this.config.apiKey,\n });\n }\n}\n\n","/**\n * Unified Morph SDK Client\n * \n * Provides access to all Morph tools through a single interface\n * \n * @example\n * ```typescript\n * import { MorphClient } from '@morphllm/morphsdk';\n * \n * const morph = new MorphClient({ \n * apiKey: process.env.MORPH_API_KEY,\n * debug: true,\n * timeout: 60000\n * });\n * \n * // Direct execution\n * await morph.fastApply.execute({ target_filepath: 'src/index.ts', ... });\n * await morph.warpGrep.execute({ query: 'Find auth', repoRoot: '.' });\n * await morph.codebaseSearch.search({ query: 'auth logic', repoId: 'x' });\n * \n * // Tool creation for AI agents (API key inherited)\n * const grepTool = morph.openai.createWarpGrepTool({ repoRoot: '.' });\n * const searchTool = morph.anthropic.createCodebaseSearchTool({ repoId: 'x' });\n * const editTool = morph.vercel.createEditFileTool({ baseDir: './src' });\n * \n * // Use tools with OpenAI\n * const response = await openai.chat.completions.create({\n * model: 'gpt-4o',\n * tools: [grepTool],\n * messages: [{ role: 'user', content: 'Find the bug' }]\n * });\n * ```\n */\n\nimport type { RetryConfig } from './tools/utils/resilience.js';\nimport { MorphAPIClient } from './core/client.js';\nimport { logger } from './logger.js';\nimport { FastApplyClient } from './tools/fastapply/core.js';\nimport { CodebaseSearchClient } from './tools/codebase_search/core.js';\nimport { BrowserClient } from './tools/browser/core.js';\nimport { WarpGrepClient } from './tools/warp_grep/client.js';\nimport { GitHubClient } from './tools/github/core.js';\nimport { MorphGit } from './git/index.js';\nimport { CompactClient } from './tools/compact/core.js';\nimport { ReflexClient } from './tools/reflex/core.js';\nimport { OpenAIRouter, AnthropicRouter, GeminiRouter, RawRouter } from './modelrouter/core.js';\nimport { OpenAIToolFactory, AnthropicToolFactory, VercelToolFactory } from './factories/index.js';\n\n/**\n * Configuration for the MorphClient\n */\nexport interface MorphClientConfig {\n /** Morph API key for authentication (defaults to MORPH_API_KEY env var) */\n apiKey?: string;\n /** Enable debug logging across all tools */\n debug?: boolean;\n /** Default timeout in milliseconds for API requests */\n timeout?: number;\n /** Retry configuration for failed requests */\n retryConfig?: RetryConfig;\n /** GitHub-specific configuration */\n github?: {\n /** Default installation ID for GitHub operations */\n installationId?: string;\n };\n}\n\n/**\n * Unified Morph SDK Client\n * \n * Provides access to all Morph tools through a single interface:\n * - fastApply: AI-powered file editing with intelligent merging\n * - codebaseSearch: Semantic code search\n * - warpGrep: Fast code search with ripgrep\n * - browser: AI-powered browser automation\n * - git: Version control operations\n * - routers: Intelligent model selection (OpenAI, Anthropic, Gemini)\n * - openai/anthropic/vercel: Tool factories for agent frameworks\n */\nexport class MorphClient extends MorphAPIClient {\n /** Client configuration */\n public config: MorphClientConfig;\n\n /** FastApply tool for editing files with AI-powered merge */\n public fastApply: FastApplyClient;\n\n /** CodebaseSearch tool for semantic code search */\n public codebaseSearch: CodebaseSearchClient;\n\n /** WarpGrep tool for fast code search using ripgrep */\n public warpGrep: WarpGrepClient;\n\n /** Browser tool for AI-powered browser automation */\n public browser: BrowserClient;\n\n /** GitHub tool for PR context, comments, and check runs */\n public github: GitHubClient;\n\n /** Git tool for version control operations */\n public git: MorphGit;\n\n /** Model routers for intelligent model selection */\n public routers: {\n openai: OpenAIRouter;\n anthropic: AnthropicRouter;\n gemini: GeminiRouter;\n raw: RawRouter;\n };\n\n /** OpenAI-compatible tool factories */\n public openai: OpenAIToolFactory;\n\n /** Anthropic-compatible tool factories */\n public anthropic: AnthropicToolFactory;\n\n /** Vercel AI SDK tool factories */\n public vercel: VercelToolFactory;\n\n /** Compact context with line ranges */\n public compact: CompactClient['compact'];\n\n /** Reflex: train and serve small text classifiers */\n public reflex: ReflexClient;\n\n /**\n * Create a new Morph SDK client\n * \n * @param config - Client configuration (apiKey, debug, timeout, retryConfig)\n * \n * @example\n * ```typescript\n * const morph = new MorphClient({ \n * apiKey: process.env.MORPH_API_KEY,\n * debug: true,\n * timeout: 60000\n * });\n * ```\n */\n constructor(config: MorphClientConfig = {}) {\n // MorphClient *is* the transport: it owns auth/host/retries/timeout and every\n // resource below shares it by reference (the OpenAI SDK pattern).\n super({\n apiKey: config.apiKey,\n timeout: config.timeout,\n retryConfig: config.retryConfig,\n debug: config.debug,\n });\n\n // An explicit key is required (sub-resources like Git depend on it); this\n // preserves the long-standing eager-throw on construction.\n if (!config.apiKey) {\n throw new Error('Morph API key is required. Pass it as { apiKey } when constructing MorphClient.');\n }\n\n this.config = config;\n logger.debug('MorphClient', 'initialized', { debug: !!config.debug, timeout: config.timeout });\n\n // Attach every resource, sharing this single transport.\n this.fastApply = new FastApplyClient(this);\n this.codebaseSearch = new CodebaseSearchClient(this);\n this.warpGrep = new WarpGrepClient(this);\n this.browser = new BrowserClient(this);\n this.github = new GitHubClient(this, { installationId: config.github?.installationId });\n this.git = new MorphGit(this);\n\n this.routers = {\n openai: new OpenAIRouter(this),\n anthropic: new AnthropicRouter(this),\n gemini: new GeminiRouter(this),\n raw: new RawRouter(this),\n };\n\n const compactClient = new CompactClient(this);\n this.compact = compactClient.compact.bind(compactClient);\n\n this.reflex = new ReflexClient(this);\n\n // Tool factories build framework-specific tool definitions from the same config.\n this.openai = new OpenAIToolFactory(config);\n this.anthropic = new AnthropicToolFactory(config);\n this.vercel = new VercelToolFactory(config);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAweO,IAAM,cAAN,cAA0B,MAAM;AAAA;AAAA,EAErC;AAAA;AAAA,EAEA;AAAA,EAEA,YAAY,SAAiB,QAAgB,MAAe;AAC1D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,sBAAN,cAAkC,YAAY;AAAA,EACnD,YAAY,UAAU,8FAA8F;AAClH,UAAM,SAAS,KAAK,iBAAiB;AAAA,EACvC;AACF;AAKO,IAAM,gBAAN,cAA4B,YAAY;AAAA,EAC7C,YAAY,UAAkB;AAC5B,UAAM,GAAG,QAAQ,cAAc,KAAK,WAAW;AAAA,EACjD;AACF;AAKO,IAAM,kBAAN,cAA8B,YAAY;AAAA,EAC/C,YAAY,UAAU,+CAA+C;AACnE,UAAM,SAAS,KAAK,mBAAmB;AAAA,EACzC;AACF;;;ACpeA,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AA0BjB,IAAM,eAAN,cAA2B,YAAY;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAGD;AAAA;AAAA,EAQA;AAAA;AAAA,EASA;AAAA;AAAA,EAQA;AAAA;AAAA,EAMA;AAAA;AAAA,EAKA;AAAA;AAAA,EAQA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAwB;AAC7B,WAAO;AAAA,EACT;AAAA,EAEA,YACE,iBAAsD,CAAC,GACvD,UAAuC,CAAC,GACxC;AACA,UAAM,WAAW,0BAA0B;AAC3C,UAAM,SAA6B,WAAW,CAAC,IAAI;AACnD;AAAA,MACE,WACI,iBACA,IAAI,eAAe;AAAA,QACjB,QAAQ,OAAO;AAAA,QACf,SAAS,OAAO,WAAW;AAAA,QAC3B,SAAS,OAAO,WAAW;AAAA,QAC3B,OAAO,OAAO;AAAA,MAChB,CAAC;AAAA,IACP;AACA,SAAK,UAAU,OAAO,WAAW;AACjC,SAAK,QAAQ,OAAO,SAAS;AAE7B,SAAK,wBAAwB,WAAW,QAAQ,iBAAiB,OAAO;AAExE,QAAI,CAAC,KAAK,QAAQ,cAAc,GAAG;AACjC,YAAM,IAAI,MAAM,+DAA+D;AAAA,IACjF;AAGA,SAAK,gBAAgB;AAAA,MACnB,MAAM,KAAK,kBAAkB,KAAK,IAAI;AAAA,MACtC,KAAK,KAAK,gBAAgB,KAAK,IAAI;AAAA,MACnC,QAAQ,KAAK,mBAAmB,KAAK,IAAI;AAAA,MACzC,YAAY,KAAK,uBAAuB,KAAK,IAAI;AAAA,IACnD;AAEA,SAAK,QAAQ;AAAA,MACX,MAAM,KAAK,UAAU,KAAK,IAAI;AAAA,MAC9B,KAAK,KAAK,QAAQ,KAAK,IAAI;AAAA,MAC3B,QAAQ,KAAK,WAAW,KAAK,IAAI;AAAA,MACjC,QAAQ,KAAK,WAAW,KAAK,IAAI;AAAA,MACjC,MAAM,KAAK,UAAU,KAAK,IAAI;AAAA,IAChC;AAEA,SAAK,WAAW;AAAA,MACd,MAAM,KAAK,aAAa,KAAK,IAAI;AAAA,MACjC,QAAQ,KAAK,cAAc,KAAK,IAAI;AAAA,MACpC,QAAQ,KAAK,cAAc,KAAK,IAAI;AAAA,MACpC,QAAQ,KAAK,cAAc,KAAK,IAAI;AAAA,IACtC;AAEA,SAAK,eAAe;AAAA,MAClB,MAAM,KAAK,iBAAiB,KAAK,IAAI;AAAA,MACrC,KAAK,KAAK,eAAe,KAAK,IAAI;AAAA,IACpC;AAEA,SAAK,cAAc;AAAA,MACjB,MAAM,KAAK,gBAAgB,KAAK,IAAI;AAAA,IACtC;AAEA,SAAK,WAAW;AAAA,MACd,MAAM,KAAK,aAAa,KAAK,IAAI;AAAA,MACjC,QAAQ,KAAK,cAAc,KAAK,IAAI;AAAA,MACpC,QAAQ,KAAK,cAAc,KAAK,IAAI;AAAA,MACpC,QAAQ,KAAK,cAAc,KAAK,IAAI;AAAA,IACtC;AAEA,SAAK,YAAY;AAAA,MACf,QAAQ,KAAK,eAAe,KAAK,IAAI;AAAA,MACrC,QAAQ,KAAK,eAAe,KAAK,IAAI;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,QACZ,QACA,MACA,MACY;AACZ,QAAI,KAAK,OAAO;AACd,cAAQ,IAAI,gBAAgB,MAAM,IAAI,IAAI,IAAI,QAAQ,EAAE;AAAA,IAC1D;AAIA,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,KAAK,QAAQ,QAAkB,QAAQ,MAAM;AAAA,QAC5D;AAAA,QACA,SAAS,KAAK;AAAA,QACd,KAAK;AAAA,MACP,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,iBAAiB,SAAS,aAAa,KAAK,MAAM,OAAO,GAAG;AAC9D,cAAM,IAAI,YAAY,mBAAmB,KAAK,SAAS;AAAA,MACzD;AACA,YAAM,IAAI,YAAY,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB,KAAK,SAAS;AAAA,IAChG;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,YAAY,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAyB;AAC/E,YAAM,UAAU,UAAU,SAAS,UAAU,UAAU,UAAU,WAAW,SAAS;AAErF,UAAI,KAAK,OAAO;AACd,gBAAQ,MAAM,sBAAsB,SAAS,MAAM,KAAK,OAAO;AAAA,MACjE;AAGA,UAAI,SAAS,WAAW,KAAK;AAC3B,YAAI,QAAQ,SAAS,cAAc,GAAG;AACpC,gBAAM,IAAI,oBAAoB,OAAO;AAAA,QACvC;AACA,cAAM,IAAI,cAAc,OAAO;AAAA,MACjC;AACA,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,gBAAgB,OAAO;AAAA,MACnC;AACA,YAAM,IAAI,YAAY,SAAS,SAAS,QAAQ,UAAU,IAAI;AAAA,IAChE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,QAAI,KAAK,OAAO;AACd,cAAQ,IAAI,0BAA0B,KAAK,UAAU,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;AAAA,IAC1E;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,OAAyD;AACjF,WAAO,OAAO,kBAAkB,KAAK;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,oBAA6C;AACzD,WAAO,KAAK,QAAwB,OAAO,8BAA8B;AAAA,EAC3E;AAAA,EAEA,MAAc,gBAAgB,gBAA+C;AAC3E,WAAO,KAAK,QAAsB,OAAO,gCAAgC,cAAc,EAAE;AAAA,EAC3F;AAAA,EAEA,MAAc,mBAAmB,OAAuD;AACtF,QAAI,KAAK,MAAO,SAAQ,IAAI,mCAAmC,MAAM,cAAc;AACnF,UAAM,EAAE,gBAAgB,GAAG,KAAK,IAAI;AACpC,WAAO,KAAK,QAAsB,SAAS,gCAAgC,cAAc,IAAI,IAAI;AAAA,EACnG;AAAA,EAEA,MAAc,uBAAuB,gBAAgF;AACnH,QAAI,KAAK,MAAO,SAAQ,IAAI,uCAAuC,cAAc;AACjF,WAAO,KAAK,QAAuD,UAAU,gCAAgC,cAAc,EAAE;AAAA,EAC/H;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,UAAU,OAA8C;AACpE,UAAM,iBAAiB,MAAM,kBAAkB,KAAK;AACpD,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,oBAAoB,2DAA2D;AAAA,IAC3F;AACA,WAAO,KAAK,QAAsB,OAAO,gCAAgC,cAAc,QAAQ;AAAA,EACjG;AAAA,EAEA,MAAc,QAAQ,QAAqC;AACzD,QAAI,KAAK,MAAO,SAAQ,IAAI,wBAAwB,MAAM;AAC1D,WAAO,KAAK,QAAoB,OAAO,wBAAwB,MAAM,EAAE;AAAA,EACzE;AAAA,EAEA,MAAc,WAAW,OAA6C;AACpE,QAAI,KAAK,MAAO,SAAQ,IAAI,2BAA2B,MAAM,MAAM;AACnE,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI;AAC5B,WAAO,KAAK,QAAoB,SAAS,wBAAwB,MAAM,IAAI,IAAI;AAAA,EACjF;AAAA,EAEA,MAAc,WAAW,QAAwE;AAC/F,QAAI,KAAK,MAAO,SAAQ,IAAI,2BAA2B,MAAM;AAC7D,WAAO,KAAK,QAAuD,UAAU,wBAAwB,MAAM,EAAE;AAAA,EAC/G;AAAA,EAEA,MAAc,UAAU,OAAmD;AACzE,UAAM,iBAAiB,MAAM,kBAAkB,KAAK;AACpD,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,oBAAoB,2DAA2D;AAAA,IAC3F;AACA,QAAI,KAAK,MAAO,SAAQ,IAAI,0BAA0B,cAAc;AACpE,WAAO,KAAK,QAA2B,QAAQ,gCAAgC,cAAc,aAAa;AAAA,EAC5G;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,aAAa,OAA8C;AACvE,QAAI,KAAK,MAAO,SAAQ,IAAI,6BAA6B,MAAM,MAAM;AACrE,WAAO,KAAK,QAAmB,OAAO,wBAAwB,MAAM,MAAM,WAAW;AAAA,EACvF;AAAA,EAEA,MAAc,cAAc,OAA6C;AACvE,QAAI,KAAK,MAAO,SAAQ,IAAI,8BAA8B,MAAM,QAAQ,MAAM,IAAI;AAClF,UAAM,EAAE,QAAQ,GAAG,KAAK,IAAI;AAC5B,WAAO,KAAK,QAAiB,QAAQ,wBAAwB,MAAM,aAAa,IAAI;AAAA,EACtF;AAAA,EAEA,MAAc,cAAc,OAA6C;AACvE,QAAI,KAAK,MAAO,SAAQ,IAAI,8BAA8B,MAAM,SAAS;AACzE,UAAM,EAAE,WAAW,GAAG,KAAK,IAAI;AAC/B,WAAO,KAAK,QAAiB,SAAS,2BAA2B,SAAS,IAAI,IAAI;AAAA,EACpF;AAAA,EAEA,MAAc,cAAc,WAAkD;AAC5E,QAAI,KAAK,MAAO,SAAQ,IAAI,8BAA8B,SAAS;AACnE,WAAO,KAAK,QAA8B,UAAU,2BAA2B,SAAS,EAAE;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,iBAAiB,OAAsD;AACnF,UAAM,iBAAiB,KAAK,kBAAkB,KAAK;AACnD,UAAM,SAAS,IAAI,gBAAgB;AAAA,MACjC,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,GAAI,MAAM,SAAS,EAAE,OAAO,MAAM,MAAM;AAAA,MACxC,GAAI,kBAAkB,EAAE,eAAe;AAAA,IACzC,CAAC;AACD,WAAO,KAAK,QAAuB,OAAO,wBAAwB,MAAM,EAAE;AAAA,EAC5E;AAAA,EAEA,MAAc,eAAe,OAA6D;AACxF,UAAM,iBAAiB,KAAK,kBAAkB,KAAK;AACnD,UAAM,SAAS,IAAI,gBAAgB;AAAA,MACjC,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,GAAI,kBAAkB,EAAE,eAAe;AAAA,IACzC,CAAC;AACD,WAAO,KAAK;AAAA,MACV;AAAA,MACA,wBAAwB,MAAM,MAAM,IAAI,MAAM;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAgB,OAAoD;AAChF,UAAM,iBAAiB,KAAK,kBAAkB,KAAK;AACnD,UAAM,SAAS,IAAI,gBAAgB;AAAA,MACjC,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,GAAI,MAAM,OAAO,EAAE,KAAK,MAAM,IAAI;AAAA,MAClC,GAAI,MAAM,eAAe,EAAE,aAAa,MAAM,YAAY;AAAA,MAC1D,GAAI,kBAAkB,EAAE,eAAe;AAAA,IACzC,CAAC;AACD,WAAO,KAAK,QAAsB,OAAO,8BAA8B,MAAM,EAAE;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,aAAa,OAA8C;AACvE,UAAM,iBAAiB,KAAK,kBAAkB,KAAK;AACnD,UAAM,SAAS,IAAI,gBAAgB;AAAA,MACjC,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,IAAI,OAAO,MAAM,EAAE;AAAA,MACnB,GAAI,kBAAkB,EAAE,eAAe;AAAA,IACzC,CAAC;AACD,WAAO,KAAK,QAAmB,OAAO,2BAA2B,MAAM,EAAE;AAAA,EAC3E;AAAA,EAEA,MAAc,cAAc,OAA6C;AACvE,UAAM,iBAAiB,KAAK,kBAAkB,KAAK;AACnD,WAAO,KAAK,QAAiB,QAAQ,2BAA2B;AAAA,MAC9D,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,GAAI,kBAAkB,EAAE,eAAe;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,cAAc,OAA6C;AACvE,UAAM,iBAAiB,KAAK,kBAAkB,KAAK;AACnD,WAAO,KAAK,QAAiB,SAAS,2BAA2B,MAAM,SAAS,IAAI;AAAA,MAClF,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,GAAI,kBAAkB,EAAE,eAAe;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,cAAc,OAA0C;AACpE,UAAM,iBAAiB,KAAK,kBAAkB,KAAK;AACnD,UAAM,SAAS,IAAI,gBAAgB;AAAA,MACjC,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,GAAI,kBAAkB,EAAE,eAAe;AAAA,IACzC,CAAC;AACD,UAAM,KAAK,QAAc,UAAU,2BAA2B,MAAM,SAAS,IAAI,MAAM,EAAE;AAAA,EAC3F;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,eAAe,OAA+C;AAC1E,UAAM,iBAAiB,KAAK,kBAAkB,KAAK;AACnD,WAAO,KAAK,QAAkB,QAAQ,6BAA6B;AAAA,MACjE,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,KAAK,MAAM;AAAA,MACX,MAAM,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,GAAI,MAAM,SAAS,EAAE,OAAO,MAAM,MAAM;AAAA,MACxC,GAAI,MAAM,WAAW,EAAE,SAAS,MAAM,QAAQ;AAAA,MAC9C,GAAI,kBAAkB,EAAE,eAAe;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,eAAe,OAA+C;AAC1E,UAAM,iBAAiB,KAAK,kBAAkB,KAAK;AACnD,WAAO,KAAK,QAAkB,SAAS,6BAA6B,MAAM,UAAU,IAAI;AAAA,MACtF,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,GAAI,MAAM,UAAU,EAAE,QAAQ,MAAM,OAAO;AAAA,MAC3C,GAAI,MAAM,cAAc,EAAE,YAAY,MAAM,WAAW;AAAA,MACvD,GAAI,MAAM,SAAS,EAAE,OAAO,MAAM,MAAM;AAAA,MACxC,GAAI,MAAM,WAAW,EAAE,SAAS,MAAM,QAAQ;AAAA,MAC9C,GAAI,MAAM,QAAQ,EAAE,MAAM,MAAM,KAAK;AAAA,MACrC,GAAI,kBAAkB,EAAE,eAAe;AAAA,IACzC,CAAC;AAAA,EACH;AACF;;;AC1bO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAAoB,QAA2B;AAA3B;AAAA,EAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhD,mBAAmB,YAAqD;AACtE,WAAO,mBAAmB;AAAA,MACxB,GAAG;AAAA,MACH,aAAa,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,yBAAyB,YAAkD;AACzE,WAAO,yBAAyB;AAAA,MAC9B,GAAG;AAAA,MACH,QAAQ,KAAK,OAAO;AAAA,IACtB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,aAAkD,CAAC,GAAG;AACvE,WAAO,mBAAmB;AAAA,MACxB,GAAG;AAAA,MACH,aAAa,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,uBAAuB,YAA0D;AAC/E,WAAO,uBAAuB;AAAA,MAC5B,GAAG;AAAA,MACH,aAAa,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AACF;;;ACpDO,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAAoB,QAA2B;AAA3B;AAAA,EAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhD,mBAAmB,YAAqD;AACtE,WAAOA,oBAAmB;AAAA,MACxB,GAAG;AAAA,MACH,aAAa,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EAEH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,yBAAyB,YAAkD;AACzE,WAAOC,0BAAyB;AAAA,MAC9B,GAAG;AAAA,MACH,QAAQ,KAAK,OAAO;AAAA,IACtB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,aAAkD,CAAC,GAAG;AACvE,WAAOC,oBAAmB;AAAA,MACxB,GAAG;AAAA,MACH,aAAa,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,uBAAuB,YAA0D;AAC/E,WAAOC,wBAAuB;AAAA,MAC5B,GAAG;AAAA,MACH,aAAa,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,sBAAsB,QAAqF;AACzG,WAAO,sBAAsB;AAAA,MAC3B,GAAG;AAAA,MACH,aAAa,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AACF;;;ACnEO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAAoB,QAA2B;AAA3B;AAAA,EAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhD,mBAAmB,YAAqD;AACtE,WAAOC,oBAAmB;AAAA,MACxB,GAAG;AAAA,MACH,aAAa,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,yBAAyB,YAAkD;AACzE,WAAOC,0BAAyB;AAAA,MAC9B,GAAG;AAAA,MACH,QAAQ,KAAK,OAAO;AAAA,IACtB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmB,aAAkD,CAAC,GAAG;AACvE,WAAOC,oBAAmB;AAAA,MACxB,GAAG;AAAA,MACH,aAAa,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,uBAAuB,YAA0D;AAC/E,WAAOC,wBAAuB;AAAA,MAC5B,GAAG;AAAA,MACH,aAAa,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,sBAAsB,QAA+E;AACnG,WAAOC,uBAAsB;AAAA,MAC3B,GAAG;AAAA,MACH,aAAa,KAAK,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AACF;;;ACxBO,IAAM,cAAN,cAA0B,eAAe;AAAA;AAAA,EAEvC;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAQA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBP,YAAY,SAA4B,CAAC,GAAG;AAG1C,UAAM;AAAA,MACJ,QAAQ,OAAO;AAAA,MACf,SAAS,OAAO;AAAA,MAChB,aAAa,OAAO;AAAA,MACpB,OAAO,OAAO;AAAA,IAChB,CAAC;AAID,QAAI,CAAC,OAAO,QAAQ;AAClB,YAAM,IAAI,MAAM,iFAAiF;AAAA,IACnG;AAEA,SAAK,SAAS;AACd,WAAO,MAAM,eAAe,eAAe,EAAE,OAAO,CAAC,CAAC,OAAO,OAAO,SAAS,OAAO,QAAQ,CAAC;AAG7F,SAAK,YAAY,IAAI,gBAAgB,IAAI;AACzC,SAAK,iBAAiB,IAAI,qBAAqB,IAAI;AACnD,SAAK,WAAW,IAAI,eAAe,IAAI;AACvC,SAAK,UAAU,IAAI,cAAc,IAAI;AACrC,SAAK,SAAS,IAAI,aAAa,MAAM,EAAE,gBAAgB,OAAO,QAAQ,eAAe,CAAC;AACtF,SAAK,MAAM,IAAI,SAAS,IAAI;AAE5B,SAAK,UAAU;AAAA,MACb,QAAQ,IAAI,aAAa,IAAI;AAAA,MAC7B,WAAW,IAAI,gBAAgB,IAAI;AAAA,MACnC,QAAQ,IAAI,aAAa,IAAI;AAAA,MAC7B,KAAK,IAAI,UAAU,IAAI;AAAA,IACzB;AAEA,UAAM,gBAAgB,IAAI,cAAc,IAAI;AAC5C,SAAK,UAAU,cAAc,QAAQ,KAAK,aAAa;AAEvD,SAAK,SAAS,IAAI,aAAa,IAAI;AAGnC,SAAK,SAAS,IAAI,kBAAkB,MAAM;AAC1C,SAAK,YAAY,IAAI,qBAAqB,MAAM;AAChD,SAAK,SAAS,IAAI,kBAAkB,MAAM;AAAA,EAC5C;AACF;","names":["createWarpGrepTool","createCodebaseSearchTool","createEditFileTool","createGitHubSearchTool","createWarpGrepTool","createCodebaseSearchTool","createEditFileTool","createGitHubSearchTool","createExploreSubagent"]}
@@ -1,20 +1,37 @@
1
+ import {
2
+ MorphAPIClient
3
+ } from "./chunk-453ZV2AX.js";
4
+ import {
5
+ APIResource
6
+ } from "./chunk-LKFZBBTD.js";
7
+
1
8
  // git/client.ts
2
9
  import git from "isomorphic-git";
3
10
  import http from "isomorphic-git/http/node";
4
11
  import fs from "fs";
5
12
  var DEFAULT_PROXY_URL = "https://repos.morphllm.com";
6
- var MorphGit = class {
13
+ var MorphGit = class extends APIResource {
7
14
  apiKey;
8
15
  proxyUrl;
9
- constructor(config) {
10
- if (!config.apiKey) {
11
- throw new Error("API key is required. Get one at https://morphllm.com/dashboard");
12
- }
13
- if (!config.apiKey.startsWith("sk-") && !config.apiKey.startsWith("morph-")) {
14
- throw new Error("Invalid API key format. Expected: sk-... or morph-...");
16
+ constructor(clientOrConfig) {
17
+ const isClient = clientOrConfig instanceof MorphAPIClient;
18
+ if (!isClient) {
19
+ if (!clientOrConfig.apiKey) {
20
+ throw new Error("API key is required. Get one at https://morphllm.com/dashboard");
21
+ }
22
+ if (!clientOrConfig.apiKey.startsWith("sk-") && !clientOrConfig.apiKey.startsWith("morph-")) {
23
+ throw new Error("Invalid API key format. Expected: sk-... or morph-...");
24
+ }
15
25
  }
16
- this.apiKey = config.apiKey;
17
- this.proxyUrl = config.proxyUrl || DEFAULT_PROXY_URL;
26
+ super(
27
+ isClient ? clientOrConfig : new MorphAPIClient({
28
+ apiKey: clientOrConfig.apiKey,
29
+ reposURL: clientOrConfig.proxyUrl,
30
+ retryConfig: clientOrConfig.retryConfig
31
+ })
32
+ );
33
+ this.apiKey = this._client.resolveApiKey() ?? "";
34
+ this.proxyUrl = isClient ? this._client.reposURL : clientOrConfig.proxyUrl || DEFAULT_PROXY_URL;
18
35
  }
19
36
  /**
20
37
  * Get auth callback for isomorphic-git operations
@@ -541,4 +558,4 @@ var MorphGit = class {
541
558
  export {
542
559
  MorphGit
543
560
  };
544
- //# sourceMappingURL=chunk-LE66XCOI.js.map
561
+ //# sourceMappingURL=chunk-JWZ5DLAS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../git/client.ts"],"sourcesContent":["/**\n * Morph Git Client - Simple, high-level Git operations\n * Built on isomorphic-git with explicit configuration\n */\n\n\nimport git from 'isomorphic-git';\nimport http from 'isomorphic-git/http/node';\nimport fs from 'fs';\nimport type {\n CloneOptions,\n PushOptions,\n PullOptions,\n AddOptions,\n CommitOptions,\n StatusOptions,\n LogOptions,\n CheckoutOptions,\n BranchOptions,\n DiffOptions,\n CommitObject,\n StatusResult,\n MorphGitConfig,\n MorphNotesSchema,\n WaitForEmbeddingsOptions,\n EmbeddingProgress,\n} from './types.js';\nimport { MorphAPIClient } from '../core/client.js';\nimport { APIResource } from '../core/resource.js';\n\nconst DEFAULT_PROXY_URL = 'https://repos.morphllm.com';\n\n/**\n * MorphGit - Git operations for AI agents with Morph backend\n * \n * @example\n * ```typescript\n * import { MorphGit } from 'morphsdk/git';\n * \n * const morphGit = new MorphGit({\n * apiKey: process.env.MORPH_API_KEY!,\n * proxyUrl: 'https://repos.morphllm.com' // Optional\n * });\n * \n * await morphGit.init({ repoId: 'my-project', dir: './my-project' });\n * await morphGit.push({ dir: './my-project' });\n * ```\n *\n * @deprecated Prefer the unified `MorphClient` (`new MorphClient({ apiKey }).git`).\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 MorphGit extends APIResource {\n private readonly apiKey: string;\n private readonly proxyUrl: string;\n\n constructor(clientOrConfig: MorphAPIClient | MorphGitConfig) {\n const isClient = clientOrConfig instanceof MorphAPIClient;\n\n // Standalone construction validates the key eagerly (mirrors the historical\n // contract). When sharing a transport, MorphClient has already validated it.\n if (!isClient) {\n if (!clientOrConfig.apiKey) {\n throw new Error('API key is required. Get one at https://morphllm.com/dashboard');\n }\n if (!clientOrConfig.apiKey.startsWith('sk-') && !clientOrConfig.apiKey.startsWith('morph-')) {\n throw new Error('Invalid API key format. Expected: sk-... or morph-...');\n }\n }\n\n super(\n isClient\n ? clientOrConfig\n : new MorphAPIClient({\n apiKey: clientOrConfig.apiKey,\n reposURL: clientOrConfig.proxyUrl,\n retryConfig: clientOrConfig.retryConfig,\n }),\n );\n\n // Git is a distinct service (isomorphic-git + raw fetch to the repos host);\n // it keeps its own wire but sources the key/host from the shared transport.\n this.apiKey = this._client.resolveApiKey() ?? '';\n this.proxyUrl = isClient ? this._client.reposURL : (clientOrConfig.proxyUrl || DEFAULT_PROXY_URL);\n }\n \n /**\n * Get auth callback for isomorphic-git operations\n * @private\n */\n private getAuthCallback() {\n return () => ({\n username: 'morph',\n password: this.apiKey,\n });\n }\n\n /**\n * Initialize a new repository\n * Creates the repo in the database and in the git provider\n * \n * @example\n * ```ts\n * await morphGit.init({\n * repoId: 'my-project',\n * dir: './my-project',\n * defaultBranch: 'main'\n * });\n * ```\n */\n async init(options: {\n repoId: string;\n dir: string;\n defaultBranch?: string;\n }): Promise<void> {\n const { repoId, dir, defaultBranch = 'main' } = options;\n\n // Call backend API to create repository\n const response = await fetch(`${this.proxyUrl}/v1/repos`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n repoId,\n name: repoId,\n defaultBranch,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Failed to create repository: ${error}`);\n }\n\n // Initialize local git repository (industry standard: no clone needed)\n await git.init({\n fs,\n dir,\n defaultBranch,\n });\n\n // Add remote pointing to Morph git-proxy\n await git.addRemote({\n fs,\n dir,\n remote: 'origin',\n url: `${this.proxyUrl}/v1/repos/${repoId}`,\n });\n\n console.log(`✓ Repository '${repoId}' initialized`);\n }\n\n /**\n * Clone a repository from Morph repos\n * \n * @example\n * ```ts\n * await morphGit.clone({\n * repoId: 'my-project',\n * dir: './my-project'\n * });\n * ```\n */\n async clone(options: CloneOptions): Promise<void> {\n const { repoId, dir, branch = 'main', depth, singleBranch = true } = options;\n\n await git.clone({\n fs,\n http,\n dir,\n url: `${this.proxyUrl}/v1/repos/${repoId}`,\n ref: branch,\n singleBranch,\n depth,\n onAuth: this.getAuthCallback(),\n });\n }\n\n /**\n * Push changes to remote repository\n * \n * @example\n * ```ts\n * await morphGit.push({ \n * dir: './my-project',\n * branch: 'main', // Required: explicit branch name\n * index: true // Optional: generate embeddings for semantic search\n * });\n * ```\n */\n async push(options: PushOptions): Promise<void> {\n const { dir, remote = 'origin', branch, waitForEmbeddings, index = false } = options;\n\n if (!branch) {\n throw new Error(\n 'branch is required for push operations. ' +\n 'Specify the branch explicitly: { dir: \"./my-project\", branch: \"main\" }'\n );\n }\n\n // Get commit hash and repoId before pushing\n const commitHash = await git.resolveRef({ fs, dir, ref: 'HEAD' });\n \n // Get repoId from git remote URL\n let repoId: string | undefined;\n const remotes = await git.listRemotes({ fs, dir });\n const originRemote = remotes.find(r => r.remote === remote);\n if (originRemote) {\n // Extract repoId from URL: https://repos.morphllm.com/v1/repos/{repoId}\n const match = originRemote.url.match(/\\/repos\\/([^\\/]+)$/);\n if (match) {\n repoId = match[1];\n }\n }\n\n await git.push({\n fs,\n http,\n dir,\n remote,\n ref: branch,\n onAuth: this.getAuthCallback(),\n });\n \n // Configure commit after successful push (set index flag)\n if (repoId && commitHash) {\n await this.configureCommit({ repoId, commitHash, branch, index });\n }\n \n // Wait for embeddings if requested (and indexing is enabled)\n if (waitForEmbeddings && repoId && commitHash && index) {\n await this.waitForEmbeddings({ repoId, commitHash });\n }\n }\n\n /**\n * Configure commit settings on the backend after push.\n * Sets the index flag to control embedding generation.\n * @private\n */\n private async configureCommit(options: {\n repoId: string;\n commitHash: string;\n branch: string;\n index: boolean;\n }): Promise<void> {\n const { repoId, commitHash, branch, index } = options;\n \n const response = await fetch(\n `${this.proxyUrl}/v1/repos/${repoId}/commits/${commitHash}/config`,\n {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ index, branch }),\n }\n );\n\n if (!response.ok) {\n // Non-fatal: log warning but don't throw\n console.warn(`Failed to configure commit: ${response.status}`);\n }\n }\n\n /**\n * Pull changes from remote repository\n * \n * @example\n * ```ts\n * await morphGit.pull({ \n * dir: './my-project',\n * branch: 'main' // Required: explicit branch name\n * });\n * ```\n */\n async pull(options: PullOptions): Promise<void> {\n const { dir, remote = 'origin', branch } = options;\n\n if (!branch) {\n throw new Error(\n 'branch is required for pull operations. ' +\n 'Specify the branch explicitly: { dir: \"./my-project\", branch: \"main\" }'\n );\n }\n\n await git.pull({\n fs,\n http,\n dir,\n remote,\n ref: branch,\n onAuth: this.getAuthCallback(),\n author: {\n name: 'Morph Agent',\n email: 'agent@morph.com',\n },\n });\n }\n\n /**\n * Wait for embeddings to complete after push.\n * Polls status endpoint until embeddings are done.\n * \n * @example\n * ```ts\n * await morphGit.push({ dir: './my-project', branch: 'main' });\n * await morphGit.waitForEmbeddings({\n * repoId: 'my-project',\n * onProgress: (p) => console.log(`${p.filesProcessed}/${p.totalFiles}`)\n * });\n * ```\n */\n async waitForEmbeddings(options: WaitForEmbeddingsOptions): Promise<void> {\n const { repoId, commitHash, timeout = 120000, onProgress } = options;\n const startTime = Date.now();\n const pollInterval = 1000; // Poll every 1s\n \n while (Date.now() - startTime < timeout) {\n const statusUrl = `${this.proxyUrl}/v1/repos/${repoId}/embedding-status` +\n (commitHash ? `?commit_hash=${commitHash}` : '');\n \n const response = await fetch(statusUrl, {\n headers: { 'Authorization': `Bearer ${this.apiKey}` }\n });\n \n if (response.status === 404) {\n // No job found yet - might still be creating\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n continue;\n }\n \n if (!response.ok) {\n throw new Error(`Failed to get embedding status: ${response.status}`);\n }\n \n const status = await response.json();\n \n if (onProgress && status.progress) {\n onProgress(status.progress);\n }\n \n if (status.status === 'completed') {\n return; // Done!\n }\n \n if (status.status === 'failed') {\n throw new Error(`Embeddings failed: ${status.error || 'Unknown error'}`);\n }\n \n // Still processing (queued or processing), wait and poll again\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n }\n \n throw new Error(`Embeddings timed out after ${timeout}ms`);\n }\n\n /**\n * Stage a file for commit\n * \n * @example\n * ```ts\n * await morphGit.add({\n * dir: './my-project',\n * filepath: 'src/app.ts'\n * });\n * ```\n */\n async add(options: AddOptions): Promise<void> {\n const { dir, filepath } = options;\n\n await git.add({\n fs,\n dir,\n filepath,\n });\n }\n\n /**\n * Remove a file from staging\n * \n * @example\n * ```ts\n * await morphGit.remove({\n * dir: './my-project',\n * filepath: 'src/old-file.ts'\n * });\n * ```\n */\n async remove(options: AddOptions): Promise<void> {\n const { dir, filepath } = options;\n\n await git.remove({\n fs,\n dir,\n filepath,\n });\n }\n\n /**\n * Commit staged changes\n * \n * @example\n * ```ts\n * await morphGit.commit({\n * dir: './my-project',\n * message: 'Add new feature',\n * author: {\n * name: 'AI Agent',\n * email: 'ai@example.com'\n * },\n * metadata: { issueId: 'PROJ-123', source: 'agent' },\n * chatHistory: [\n * { role: 'user', content: 'Please add a new feature' },\n * { role: 'assistant', content: 'I will add that feature' }\n * ],\n * recordingId: 'rec_123'\n * });\n * ```\n */\n async commit(options: CommitOptions): Promise<string> {\n const { dir, message, author, metadata, chatHistory, recordingId } = options;\n\n // Provide default author if not specified\n const commitAuthor = author || {\n name: 'Morph SDK',\n email: 'sdk@morphllm.com'\n };\n\n const sha = await git.commit({\n fs,\n dir,\n message,\n author: commitAuthor,\n });\n\n // Store notes if any note fields are provided\n if (metadata || chatHistory || recordingId) {\n const notes: MorphNotesSchema = {\n metadata,\n chatHistory,\n recordingId,\n _version: 1\n };\n \n await git.addNote({\n fs,\n dir,\n ref: 'refs/notes/morph-metadata',\n oid: sha,\n note: JSON.stringify(notes, null, 2),\n author: commitAuthor\n });\n }\n\n return sha;\n }\n\n /**\n * Get status of a file\n * \n * @example\n * ```ts\n * const status = await morphGit.status({\n * dir: './my-project',\n * filepath: 'src/app.ts'\n * });\n * console.log(status); // 'modified', '*added', etc.\n * ```\n */\n async status(options: StatusOptions): Promise<string> {\n const { dir, filepath } = options;\n\n if (!filepath) {\n throw new Error('filepath is required for status check');\n }\n\n const status = await git.status({\n fs,\n dir,\n filepath,\n });\n\n return status;\n }\n\n /**\n * Get commit history\n * \n * @example\n * ```ts\n * const commits = await morphGit.log({\n * dir: './my-project',\n * depth: 10\n * });\n * ```\n */\n async log(options: LogOptions): Promise<CommitObject[]> {\n const { dir, depth, ref } = options;\n\n const commits = await git.log({\n fs,\n dir,\n depth,\n ref,\n });\n\n return commits as CommitObject[];\n }\n\n /**\n * Checkout a branch or commit\n * \n * @example\n * ```ts\n * await morphGit.checkout({\n * dir: './my-project',\n * ref: 'feature-branch'\n * });\n * ```\n */\n async checkout(options: CheckoutOptions): Promise<void> {\n const { dir, ref } = options;\n\n await git.checkout({\n fs,\n dir,\n ref,\n });\n }\n\n /**\n * Create a new branch\n * \n * @example\n * ```ts\n * await morphGit.branch({\n * dir: './my-project',\n * name: 'feature-branch',\n * checkout: true\n * });\n * ```\n */\n async branch(options: BranchOptions): Promise<void> {\n const { dir, name, checkout = false } = options;\n\n await git.branch({\n fs,\n dir,\n ref: name,\n checkout,\n });\n }\n\n /**\n * List all branches\n * \n * @example\n * ```ts\n * const branches = await morphGit.listBranches({\n * dir: './my-project'\n * });\n * ```\n */\n async listBranches(options: { dir: string }): Promise<string[]> {\n const { dir } = options;\n\n const branches = await git.listBranches({\n fs,\n dir,\n });\n\n return branches;\n }\n\n /**\n * Get the current branch name\n * \n * @example\n * ```ts\n * const branch = await morphGit.currentBranch({\n * dir: './my-project'\n * });\n * ```\n */\n async currentBranch(options: { dir: string }): Promise<string | undefined> {\n const { dir } = options;\n\n const branch = await git.currentBranch({\n fs,\n dir,\n });\n\n return branch || undefined;\n }\n\n /**\n * Get list of changed files (similar to git diff --name-only)\n * \n * @example\n * ```ts\n * const changes = await morphGit.statusMatrix({\n * dir: './my-project'\n * });\n * ```\n */\n async statusMatrix(options: { dir: string }): Promise<StatusResult[]> {\n const { dir } = options;\n\n const matrix = await git.statusMatrix({\n fs,\n dir,\n });\n\n return matrix.map(([filepath, HEADStatus, workdirStatus, stageStatus]) => {\n let status: StatusResult['status'] = 'unmodified';\n\n // Determine status based on statusMatrix values\n if (HEADStatus === 1 && workdirStatus === 2 && stageStatus === 2) {\n status = 'modified';\n } else if (HEADStatus === 1 && workdirStatus === 2 && stageStatus === 1) {\n status = '*modified';\n } else if (HEADStatus === 0 && workdirStatus === 2 && stageStatus === 2) {\n status = 'added';\n } else if (HEADStatus === 0 && workdirStatus === 2 && stageStatus === 0) {\n status = '*added';\n } else if (HEADStatus === 1 && workdirStatus === 0 && stageStatus === 0) {\n status = 'deleted';\n } else if (HEADStatus === 1 && workdirStatus === 0 && stageStatus === 1) {\n status = '*deleted';\n } else if (HEADStatus === 1 && workdirStatus === 1 && stageStatus === 1) {\n status = 'unmodified';\n } else if (HEADStatus === 0 && workdirStatus === 0 && stageStatus === 0) {\n status = 'absent';\n }\n\n return {\n filepath,\n status,\n };\n });\n }\n\n /**\n * Get the current commit hash\n * \n * @example\n * ```ts\n * const hash = await morphGit.resolveRef({\n * dir: './my-project',\n * ref: 'HEAD'\n * });\n * ```\n */\n async resolveRef(options: { dir: string; ref: string }): Promise<string> {\n const { dir, ref } = options;\n\n const oid = await git.resolveRef({\n fs,\n dir,\n ref,\n });\n\n return oid;\n }\n\n /**\n * Get notes (metadata, chat history, recording ID) attached to a commit\n * \n * @example\n * ```ts\n * const notes = await morphGit.getCommitMetadata({\n * dir: './my-project',\n * commitSha: 'abc123...'\n * });\n * \n * if (notes) {\n * console.log('Metadata:', notes.metadata);\n * console.log('Chat history:', notes.chatHistory);\n * console.log('Recording ID:', notes.recordingId);\n * }\n * ```\n */\n async getCommitMetadata(options: {\n dir: string;\n commitSha: string;\n }): Promise<MorphNotesSchema | null> {\n try {\n const note = await git.readNote({\n fs,\n dir: options.dir,\n ref: 'refs/notes/morph-metadata',\n oid: options.commitSha\n });\n \n const notes: MorphNotesSchema = JSON.parse(new TextDecoder().decode(note));\n return notes;\n } catch (err) {\n // No notes found for this commit\n return null;\n }\n }\n}\n\n"],"mappings":"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","names":[]}
@@ -0,0 +1,12 @@
1
+ // core/resource.ts
2
+ var APIResource = class {
3
+ _client;
4
+ constructor(client) {
5
+ this._client = client;
6
+ }
7
+ };
8
+
9
+ export {
10
+ APIResource
11
+ };
12
+ //# sourceMappingURL=chunk-LKFZBBTD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../core/resource.ts"],"sourcesContent":["/**\n * Base class for every API resource (FastApply, Compact, Reflex, …).\n *\n * Mirrors the OpenAI SDK's `APIResource`: a resource holds nothing but a\n * reference to the transport (`MorphAPIClient`) and delegates all HTTP to it.\n * Sub-resources receive the same client by reference, so configuration and the\n * fetch/retry/auth machinery live in exactly one place.\n */\nimport type { MorphAPIClient } from './client.js';\n\nexport abstract class APIResource {\n protected _client: MorphAPIClient;\n\n constructor(client: MorphAPIClient) {\n this._client = client;\n }\n}\n"],"mappings":";AAUO,IAAe,cAAf,MAA2B;AAAA,EACtB;AAAA,EAEV,YAAY,QAAwB;AAClC,SAAK,UAAU;AAAA,EACjB;AACF;","names":[]}