@langwatch/mcp-server 2.1.0 → 3.0.0

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 (428) hide show
  1. package/.gitignore +7 -0
  2. package/.npmignore +41 -0
  3. package/CHANGELOG.md +218 -201
  4. package/CONTRIBUTING.md +10 -0
  5. package/README.md +70 -68
  6. package/dist/add-dashboard-widget-55UI6H22.js +44 -0
  7. package/dist/add-dashboard-widget-MJHIC3CC.js +45 -0
  8. package/dist/{archive-project-W3IKI7UL.js → archive-project-K5UD7A6X.js} +4 -4
  9. package/dist/archive-project-L4PAKT34.js +19 -0
  10. package/dist/{archive-run-plan-474OKHHU.js → archive-run-plan-5HSQG2HX.js} +4 -4
  11. package/dist/archive-run-plan-AOKNYQIO.js +15 -0
  12. package/dist/archive-scenario-2CWJW2VD.js +19 -0
  13. package/dist/{archive-scenario-V5UNYK26.js → archive-scenario-5IJQESHH.js} +4 -4
  14. package/dist/{archive-test-suite-O7FLDMXK.js → archive-test-suite-OPB7NFI7.js} +4 -4
  15. package/dist/archive-test-suite-ZC3TN6VH.js +15 -0
  16. package/dist/assign-prompt-tag-6DDE6ZZ5.js +23 -0
  17. package/dist/{assign-prompt-tag-Q46WRB6P.js → assign-prompt-tag-D7O23MJM.js} +8 -4
  18. package/dist/chunk-3YLN3ATJ.js +241 -0
  19. package/dist/{chunk-EYXMLE5X.js → chunk-4RX3G62A.js} +56 -47
  20. package/dist/{chunk-UF6XIGYR.js → chunk-6YZUOD34.js} +2 -5
  21. package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
  22. package/dist/chunk-7CZQDZ2K.js +319 -0
  23. package/dist/{chunk-RVAE2MEA.js → chunk-7GETGE6B.js} +7 -7
  24. package/dist/{chunk-OJLYYJWI.js → chunk-AASW2TO2.js} +7 -10
  25. package/dist/{chunk-QAMP3CGR.js → chunk-B4RFWIUP.js} +4 -4
  26. package/dist/{chunk-ZXKLPC2E.js → chunk-BIIKE3EI.js} +1 -1
  27. package/dist/{chunk-G4ZAZTZW.js → chunk-D2HS73VI.js} +7 -10
  28. package/dist/{chunk-37SMPMQS.js → chunk-DMM3JQ42.js} +7 -2
  29. package/dist/{chunk-WT4PO4A3.js → chunk-DULFP3MK.js} +10 -7
  30. package/dist/chunk-EYPJBL7P.js +516 -0
  31. package/dist/{chunk-NUFPTHKU.js → chunk-FOKVY3BK.js} +1 -1
  32. package/dist/chunk-GA5JUSPT.js +64 -0
  33. package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
  34. package/dist/chunk-HLQJXUR6.js +67 -0
  35. package/dist/{chunk-JTQJRNFJ.js → chunk-KILVK3FS.js} +4 -4
  36. package/dist/chunk-MOCU5XWF.js +79 -0
  37. package/dist/chunk-O2WGVCED.js +41 -0
  38. package/dist/{chunk-HV4DWKBI.js → chunk-O7EMWEVJ.js} +2 -4
  39. package/dist/{chunk-UFOYFYI7.js → chunk-QXLMHLRC.js} +6 -9
  40. package/dist/{chunk-QRO35SOM.js → chunk-R5YJIYPF.js} +981 -747
  41. package/dist/{chunk-JR6DJZOU.js → chunk-RABYBFX5.js} +4 -10
  42. package/dist/{chunk-SR6QPRIE.js → chunk-RFC2SBEX.js} +7 -13
  43. package/dist/chunk-SHSVN3SE.js +21 -0
  44. package/dist/{chunk-CKNAH5TG.js → chunk-U24EACC4.js} +3 -10
  45. package/dist/{chunk-56OGTS24.js → chunk-VOUGDY2O.js} +4 -11
  46. package/dist/chunk-WCKZDOGF.js +31 -0
  47. package/dist/chunk-XQYH52SI.js +129 -0
  48. package/dist/{chunk-7E4FZIYJ.js → chunk-XUIJYNRJ.js} +1 -1
  49. package/dist/{chunk-6DJDEXET.js → chunk-YCIUEZVK.js} +6 -12
  50. package/dist/config-2WQGMAEN.js +16 -0
  51. package/dist/config.cjs +109 -0
  52. package/dist/config.js +5 -4
  53. package/dist/{create-agent-JFJ2K6X3.js → create-agent-6JNLMYQD.js} +4 -4
  54. package/dist/create-agent-IRZOU4R5.js +23 -0
  55. package/dist/create-analytics-report-N4L4V5QL.js +19 -0
  56. package/dist/create-analytics-report-QEHXG7FU.js +18 -0
  57. package/dist/{create-annotation-EUXXQ6NS.js → create-annotation-CCEGIZ67.js} +10 -5
  58. package/dist/create-annotation-DTHCMWHB.js +29 -0
  59. package/dist/{create-api-key-BGBB76JX.js → create-api-key-JKM2DSZO.js} +5 -7
  60. package/dist/create-api-key-JPEUIXGM.js +24 -0
  61. package/dist/create-dataset-DJNXYJ5B.js +22 -0
  62. package/dist/{create-dataset-FD5VAXU4.js → create-dataset-WON4SOTC.js} +6 -6
  63. package/dist/create-dataset-records-TMEOTLTO.js +20 -0
  64. package/dist/{create-dataset-records-WQUXXOHI.js → create-dataset-records-UJBW3C7C.js} +5 -7
  65. package/dist/create-evaluator-N5AEHI4K.js +27 -0
  66. package/dist/{create-evaluator-6NV33Z52.js → create-evaluator-XYNY2YFY.js} +4 -4
  67. package/dist/create-mcp-server.cjs +9712 -0
  68. package/dist/create-mcp-server.js +2757 -10
  69. package/dist/{create-project-ZQ7TFIO2.js → create-project-EY4XZ7TH.js} +4 -4
  70. package/dist/create-project-YL345T5L.js +44 -0
  71. package/dist/{create-prompt-BS6QRCUU.js → create-prompt-JZQNQ7I3.js} +5 -7
  72. package/dist/create-prompt-ZUMQHHX7.js +37 -0
  73. package/dist/create-prompt-tag-CJ5FZ436.js +17 -0
  74. package/dist/{create-prompt-tag-FCQ5ELSQ.js → create-prompt-tag-JFP2Q3PO.js} +3 -3
  75. package/dist/create-scenario-CQU2SSFB.js +33 -0
  76. package/dist/{create-scenario-DRPTPXU3.js → create-scenario-S6OWWKJO.js} +5 -5
  77. package/dist/create-test-suite-OLGCAGJA.js +36 -0
  78. package/dist/{create-test-suite-ZIZCCFJ4.js → create-test-suite-Y7P2RI4L.js} +6 -6
  79. package/dist/create-trigger-4CNBTISJ.js +48 -0
  80. package/dist/create-trigger-RQ653WYF.js +49 -0
  81. package/dist/dashboards-BA7M6CMO.js +90 -0
  82. package/dist/dashboards-U663GUIB.js +91 -0
  83. package/dist/{delete-agent-SA4JMUZF.js → delete-agent-J2Q4DRZ2.js} +4 -4
  84. package/dist/delete-agent-ZAU4LTXB.js +18 -0
  85. package/dist/delete-analytics-report-QK6X7P4S.js +19 -0
  86. package/dist/delete-analytics-report-YUYLDHLL.js +18 -0
  87. package/dist/delete-annotation-7X4NYXXM.js +17 -0
  88. package/dist/{delete-annotation-X3KKK7QY.js → delete-annotation-KJOCDLV3.js} +4 -4
  89. package/dist/{delete-dataset-W6EZ44HY.js → delete-dataset-NXP7ZPPV.js} +5 -7
  90. package/dist/delete-dataset-RUTZBBVD.js +18 -0
  91. package/dist/{delete-dataset-records-7CNOTALB.js → delete-dataset-records-4Z7DZCDW.js} +5 -7
  92. package/dist/delete-dataset-records-75UAR5IS.js +19 -0
  93. package/dist/delete-evaluator-E3CUNGTQ.js +16 -0
  94. package/dist/delete-evaluator-RI4GALGX.js +15 -0
  95. package/dist/delete-prompt-tag-LE3WJPKS.js +17 -0
  96. package/dist/{delete-prompt-tag-QB3OCZUV.js → delete-prompt-tag-S4KBZTNG.js} +3 -3
  97. package/dist/delete-workflow-4CZFIQCQ.js +17 -0
  98. package/dist/{delete-workflow-NG2VXYYM.js → delete-workflow-PWQPDW6H.js} +4 -4
  99. package/dist/discover-evaluator-schema-UHWA5HVL.js +120 -0
  100. package/dist/discover-evaluator-schema-XKCLLCB3.js +118 -0
  101. package/dist/discover-scenario-schema-NOJY6S7E.js +137 -0
  102. package/dist/{discover-scenario-schema-W7KBXA4J.js → discover-scenario-schema-OOFIQKOG.js} +37 -17
  103. package/dist/discover-schema-7WHIIATI.js +442 -0
  104. package/dist/{discover-schema-L6QDPON3.js → discover-schema-J2ANOBKO.js} +181 -186
  105. package/dist/get-agent-5T3CXQOR.js +69 -0
  106. package/dist/{get-agent-7THF7HCU.js → get-agent-ZKYQJUQ7.js} +15 -11
  107. package/dist/get-analytics-4MPEK4KV.js +79 -0
  108. package/dist/get-analytics-ZLI3A4F5.js +80 -0
  109. package/dist/get-analytics-report-JCKYMA2S.js +29 -0
  110. package/dist/get-analytics-report-SKIP2JWH.js +30 -0
  111. package/dist/get-dataset-APGZBYMH.js +64 -0
  112. package/dist/get-dataset-LWXDVMVE.js +63 -0
  113. package/dist/get-evaluator-3A7BJBAB.js +47 -0
  114. package/dist/{get-evaluator-RZ44UIN6.js → get-evaluator-IWNJINRY.js} +4 -4
  115. package/dist/get-project-EQVB4LEL.js +26 -0
  116. package/dist/{get-project-QSQEAB33.js → get-project-RK6AJTEP.js} +4 -4
  117. package/dist/{get-prompt-GVKXF5NL.js → get-prompt-TLG2T2DS.js} +53 -58
  118. package/dist/get-prompt-ZER557X3.js +94 -0
  119. package/dist/get-run-plan-5X7DDJRN.js +58 -0
  120. package/dist/{get-run-plan-NY7J5GRE.js → get-run-plan-PEHRO5M3.js} +7 -9
  121. package/dist/{get-scenario-Q3LLQE4T.js → get-scenario-375W5D6I.js} +5 -5
  122. package/dist/get-scenario-UQX45ZZO.js +37 -0
  123. package/dist/{get-simulation-run-WINEYDMK.js → get-simulation-run-2NBXJADG.js} +26 -22
  124. package/dist/get-simulation-run-QZTLGL7W.js +69 -0
  125. package/dist/{get-test-suite-4HKA7OKS.js → get-test-suite-GVIBDG7K.js} +5 -5
  126. package/dist/get-test-suite-OODIR3RI.js +48 -0
  127. package/dist/{get-trace-RCUV7N4O.js → get-trace-AGCHVPJK.js} +11 -13
  128. package/dist/get-trace-KJLYAZRC.js +45 -0
  129. package/dist/get-workflow-3TV2YYC5.js +25 -0
  130. package/dist/{get-workflow-EEOC7Y45.js → get-workflow-7LZSVPP2.js} +4 -4
  131. package/dist/{http-security-EU3CHTY7.js → http-security-DNLBNQZL.js} +2 -2
  132. package/dist/{http-server-WCDUARTH.js → http-server-7CCN3EHJ.js} +4249 -325
  133. package/dist/index.js +59595 -38027
  134. package/dist/langwatch-api-analytics-reports-6CF6KUET.js +17 -0
  135. package/dist/langwatch-api-analytics-reports-RPFB5AO5.js +18 -0
  136. package/dist/{langwatch-api-annotations-6DHVZWUK.js → langwatch-api-annotations-H4AI4TKG.js} +4 -4
  137. package/dist/langwatch-api-annotations-QSJNUQQS.js +17 -0
  138. package/dist/langwatch-api-monitors-ENHLOL3S.js +47 -0
  139. package/dist/{langwatch-api-monitors-6ISFJ7WX.js → langwatch-api-monitors-OHSGADTH.js} +11 -16
  140. package/dist/langwatch-api-secrets-AGW6UUMD.js +55 -0
  141. package/dist/langwatch-api-secrets-CLTS766Q.js +56 -0
  142. package/dist/langwatch-api-triggers-G5UWFNN2.js +22 -0
  143. package/dist/langwatch-api-triggers-QMR7KEXW.js +23 -0
  144. package/dist/langwatch-api-workflows-HKTBIKKY.js +15 -0
  145. package/dist/{langwatch-api-workflows-6UJL5U4Z.js → langwatch-api-workflows-OMROZH2O.js} +4 -4
  146. package/dist/{list-agents-AMVDQPQL.js → list-agents-BYWDNAHT.js} +4 -4
  147. package/dist/list-agents-MG24MHZE.js +42 -0
  148. package/dist/list-analytics-reports-G3EPWGSQ.js +32 -0
  149. package/dist/list-analytics-reports-PPWIFRES.js +33 -0
  150. package/dist/list-annotations-QCLGEK5A.js +38 -0
  151. package/dist/{list-annotations-6PR5NLIC.js → list-annotations-Y4EUBJHG.js} +10 -5
  152. package/dist/list-api-keys-DAVOBPFK.js +42 -0
  153. package/dist/{list-api-keys-GVPNBIHQ.js → list-api-keys-JMW5WRXX.js} +10 -5
  154. package/dist/list-dashboards-2P3VJFRS.js +29 -0
  155. package/dist/list-dashboards-MW5O3MKH.js +30 -0
  156. package/dist/list-dataset-records-KEHT7G6Q.js +43 -0
  157. package/dist/{list-dataset-records-O67HZ35Y.js → list-dataset-records-KMLLMZAZ.js} +14 -10
  158. package/dist/{list-datasets-WXZL6UMP.js → list-datasets-P3JK2ZHS.js} +9 -13
  159. package/dist/list-datasets-Z7OOE4KI.js +56 -0
  160. package/dist/{list-evaluators-PAX72WCN.js → list-evaluators-7RRESBOU.js} +5 -7
  161. package/dist/list-evaluators-VATJVOHR.js +32 -0
  162. package/dist/{list-model-providers-VVLZMLCX.js → list-model-providers-OXDRPUCJ.js} +4 -4
  163. package/dist/list-model-providers-VXQJWDXU.js +35 -0
  164. package/dist/{list-projects-AQVI6SUK.js → list-projects-HUVK7L3W.js} +5 -7
  165. package/dist/list-projects-X72ZXVY5.js +40 -0
  166. package/dist/{list-prompt-tags-WZFBJOHG.js → list-prompt-tags-3I3LWFIR.js} +3 -3
  167. package/dist/list-prompt-tags-DRHUH2ND.js +23 -0
  168. package/dist/list-prompts-6DX3QECJ.js +30 -0
  169. package/dist/{list-prompts-BQOHRHYT.js → list-prompts-PS423RU3.js} +4 -6
  170. package/dist/list-run-plans-5SXPOV3X.js +45 -0
  171. package/dist/{list-run-plans-UBAU2DGH.js → list-run-plans-6VNHINPY.js} +5 -5
  172. package/dist/list-scenarios-EQWCW7Q4.js +45 -0
  173. package/dist/{list-scenarios-MS4IUIVM.js → list-scenarios-GKNH3YND.js} +13 -11
  174. package/dist/{list-simulation-runs-D6YF4ZOU.js → list-simulation-runs-KHY7KALI.js} +12 -8
  175. package/dist/list-simulation-runs-PUDK32C2.js +53 -0
  176. package/dist/list-test-suites-7H2DRILK.js +34 -0
  177. package/dist/{list-test-suites-L7R2O6DR.js → list-test-suites-GY56LGLY.js} +4 -4
  178. package/dist/list-trigger-fires-7RZUP54Y.js +19 -0
  179. package/dist/list-trigger-fires-OZUF65LI.js +20 -0
  180. package/dist/list-triggers-BGUCUXTJ.js +45 -0
  181. package/dist/list-triggers-XC5KMX4C.js +46 -0
  182. package/dist/list-workflows-55NYC3PC.js +33 -0
  183. package/dist/{list-workflows-6MV4XJHF.js → list-workflows-HV7FUWZA.js} +5 -7
  184. package/dist/{rename-prompt-tag-K5LQ4CY6.js → rename-prompt-tag-2I7Z5FCY.js} +3 -3
  185. package/dist/rename-prompt-tag-SZYTOWDX.js +18 -0
  186. package/dist/{rename-test-suite-NTYHAO5X.js → rename-test-suite-27AYY33K.js} +4 -4
  187. package/dist/rename-test-suite-CLIEPZDO.js +20 -0
  188. package/dist/report-issue-5HSL7CNB.js +924 -0
  189. package/dist/{report-issue-RHZZ33IS.js → report-issue-N7ND5TM6.js} +107 -67
  190. package/dist/{rerun-run-plan-MUDWJBE4.js → rerun-run-plan-O3VUZ6CG.js} +5 -5
  191. package/dist/rerun-run-plan-OJTVVGJI.js +21 -0
  192. package/dist/{revoke-api-key-6LAZ3QZZ.js → revoke-api-key-BU6BKGCG.js} +4 -4
  193. package/dist/revoke-api-key-NZNCFOIR.js +15 -0
  194. package/dist/run-agent-244O4Y5M.js +75 -0
  195. package/dist/run-agent-HPCGZGYW.js +74 -0
  196. package/dist/run-plan-2ZPGGZ4H.js +38 -0
  197. package/dist/{run-plan-T4ZYOZGA.js → run-plan-KSXUYQT3.js} +7 -7
  198. package/dist/run-query-4LMOQ5UW.js +47 -0
  199. package/dist/run-query-BQUHIUC2.js +46 -0
  200. package/dist/{run-test-suite-L4MZ7G4D.js → run-test-suite-P3WLVPXC.js} +6 -6
  201. package/dist/run-test-suite-UEOMCON6.js +25 -0
  202. package/dist/run-workflow-EFZ6HG5B.js +36 -0
  203. package/dist/{run-workflow-DFIS23AP.js → run-workflow-I4IHEN54.js} +4 -4
  204. package/dist/search-traces-6IR7PR4L.js +170 -0
  205. package/dist/search-traces-BYML2NQ4.js +171 -0
  206. package/dist/set-model-provider-RBNGWFVI.js +33 -0
  207. package/dist/{set-model-provider-XRNMFOVR.js → set-model-provider-SHEVKWRC.js} +4 -4
  208. package/dist/{update-agent-DUWNYBNA.js → update-agent-PTKTM2B5.js} +4 -4
  209. package/dist/update-agent-ZPXWRMS2.js +20 -0
  210. package/dist/update-dashboard-widget-HKCBXH7X.js +62 -0
  211. package/dist/update-dashboard-widget-IP2TTQ5G.js +63 -0
  212. package/dist/update-dataset-GHIN6JR3.js +22 -0
  213. package/dist/{update-dataset-YSOMDCOB.js → update-dataset-IRVMY5PF.js} +6 -6
  214. package/dist/update-dataset-record-6VI7K2CL.js +19 -0
  215. package/dist/{update-dataset-record-DEA2ITYR.js → update-dataset-record-Z3L7ACNF.js} +4 -4
  216. package/dist/update-evaluator-5NLNE6VY.js +24 -0
  217. package/dist/{update-evaluator-NH7Q5GWV.js → update-evaluator-FEH7H6NS.js} +4 -4
  218. package/dist/update-project-75H3LDQT.js +24 -0
  219. package/dist/{update-project-Q26FBSYH.js → update-project-QPR3QX55.js} +4 -4
  220. package/dist/update-prompt-BCDFTNLK.js +140 -0
  221. package/dist/{update-prompt-ZQQ2C3KU.js → update-prompt-NPRXYSWA.js} +27 -29
  222. package/dist/update-scenario-BNOMDCMV.js +34 -0
  223. package/dist/{update-scenario-WUX34JAR.js → update-scenario-EM5XGMB7.js} +5 -5
  224. package/package.json +35 -39
  225. package/pyproject.toml +23 -8
  226. package/src/config.d.ts +6 -0
  227. package/src/config.ts +22 -29
  228. package/src/create-mcp-server.ts +887 -634
  229. package/src/documentation-fetch.ts +21 -20
  230. package/src/http-security.ts +166 -135
  231. package/src/http-server.ts +189 -224
  232. package/src/index.ts +14 -16
  233. package/src/langwatch-api-agents.ts +18 -21
  234. package/src/langwatch-api-analytics-reports.ts +62 -0
  235. package/src/langwatch-api-annotations.ts +11 -12
  236. package/src/langwatch-api-api-keys.ts +8 -9
  237. package/src/langwatch-api-dashboard-widgets.ts +47 -0
  238. package/src/langwatch-api-dashboards.ts +109 -24
  239. package/src/langwatch-api-datasets.ts +98 -32
  240. package/src/langwatch-api-evaluators.ts +13 -19
  241. package/src/langwatch-api-model-providers.ts +4 -4
  242. package/src/langwatch-api-monitors.ts +14 -18
  243. package/src/langwatch-api-projects.ts +10 -9
  244. package/src/langwatch-api-query.ts +114 -0
  245. package/src/langwatch-api-run-plans.ts +12 -29
  246. package/src/langwatch-api-scenarios.ts +9 -11
  247. package/src/langwatch-api-secrets.ts +31 -24
  248. package/src/langwatch-api-simulation-runs.ts +6 -8
  249. package/src/langwatch-api-test-suites.ts +14 -33
  250. package/src/langwatch-api-triggers.ts +96 -34
  251. package/src/langwatch-api-workflows.ts +9 -9
  252. package/src/langwatch-api.ts +118 -124
  253. package/src/public-http-request.ts +21 -12
  254. package/src/schemas/analytics-metrics.ts +3 -15
  255. package/src/schemas/create-dataset.ts +3 -4
  256. package/src/schemas/run-plan.ts +13 -29
  257. package/src/schemas/suite-fields.ts +6 -23
  258. package/src/schemas/triggers.ts +365 -0
  259. package/src/schemas/widget-sources.ts +33 -0
  260. package/src/tools/add-dashboard-widget.ts +51 -0
  261. package/src/tools/archive-project.ts +2 -4
  262. package/src/tools/archive-run-plan.ts +2 -4
  263. package/src/tools/archive-scenario.ts +2 -4
  264. package/src/tools/archive-test-suite.ts +2 -4
  265. package/src/tools/assign-prompt-tag.ts +6 -2
  266. package/src/tools/create-agent.ts +1 -1
  267. package/src/tools/create-analytics-report.ts +7 -0
  268. package/src/tools/create-annotation.ts +7 -2
  269. package/src/tools/create-api-key.ts +4 -6
  270. package/src/tools/create-dataset-records.ts +4 -8
  271. package/src/tools/create-dataset.ts +5 -7
  272. package/src/tools/create-evaluator.ts +3 -5
  273. package/src/tools/create-project.ts +2 -2
  274. package/src/tools/create-prompt-tag.ts +2 -4
  275. package/src/tools/create-prompt.ts +9 -18
  276. package/src/tools/create-scenario.ts +5 -7
  277. package/src/tools/create-test-suite.ts +4 -9
  278. package/src/tools/create-trigger.ts +55 -0
  279. package/src/tools/dashboard-widget-queries.ts +45 -0
  280. package/src/tools/dashboards.ts +104 -0
  281. package/src/tools/delete-agent.ts +1 -1
  282. package/src/tools/delete-analytics-report.ts +7 -0
  283. package/src/tools/delete-annotation.ts +1 -1
  284. package/src/tools/delete-dataset-records.ts +4 -8
  285. package/src/tools/delete-dataset.ts +3 -7
  286. package/src/tools/delete-evaluator.ts +4 -6
  287. package/src/tools/delete-prompt-tag.ts +2 -4
  288. package/src/tools/delete-workflow.ts +1 -1
  289. package/src/tools/discover-evaluator-schema.ts +34 -25
  290. package/src/tools/discover-scenario-schema.ts +41 -21
  291. package/src/tools/discover-schema.ts +149 -27
  292. package/src/tools/experiment-run-status.ts +2 -8
  293. package/src/tools/format-dataset-mutation.ts +5 -10
  294. package/src/tools/format-run-plan.ts +7 -21
  295. package/src/tools/format-scenario.ts +2 -4
  296. package/src/tools/format-suite-details.ts +6 -12
  297. package/src/tools/get-agent.ts +15 -6
  298. package/src/tools/get-analytics-report.ts +23 -0
  299. package/src/tools/get-analytics.ts +52 -46
  300. package/src/tools/get-dataset.ts +34 -16
  301. package/src/tools/get-evaluator.ts +4 -11
  302. package/src/tools/get-experiment-results.ts +219 -186
  303. package/src/tools/get-project.ts +2 -4
  304. package/src/tools/get-prompt.ts +63 -84
  305. package/src/tools/get-run-plan.ts +4 -6
  306. package/src/tools/get-scenario.ts +4 -6
  307. package/src/tools/get-simulation-run.ts +27 -24
  308. package/src/tools/get-test-suite.ts +2 -5
  309. package/src/tools/get-trace.ts +16 -17
  310. package/src/tools/get-workflow.ts +1 -1
  311. package/src/tools/list-agents.ts +1 -1
  312. package/src/tools/list-analytics-reports.ts +27 -0
  313. package/src/tools/list-annotations.ts +8 -5
  314. package/src/tools/list-api-keys.ts +7 -2
  315. package/src/tools/list-dashboards.ts +20 -21
  316. package/src/tools/list-dataset-records.ts +8 -6
  317. package/src/tools/list-datasets.ts +12 -23
  318. package/src/tools/list-evaluators.ts +4 -8
  319. package/src/tools/list-experiment-runs.ts +5 -9
  320. package/src/tools/list-experiments.ts +5 -11
  321. package/src/tools/list-model-providers.ts +3 -5
  322. package/src/tools/list-projects.ts +2 -4
  323. package/src/tools/list-prompt-tags.ts +3 -3
  324. package/src/tools/list-prompts.ts +4 -8
  325. package/src/tools/list-run-plans.ts +2 -2
  326. package/src/tools/list-scenarios.ts +14 -15
  327. package/src/tools/list-simulation-runs.ts +8 -4
  328. package/src/tools/list-test-suites.ts +1 -1
  329. package/src/tools/list-trigger-fires.ts +17 -0
  330. package/src/tools/list-triggers.ts +39 -0
  331. package/src/tools/list-workflows.ts +2 -4
  332. package/src/tools/rename-prompt-tag.ts +1 -1
  333. package/src/tools/rename-test-suite.ts +2 -5
  334. package/src/tools/report-issue.ts +7 -9
  335. package/src/tools/rerun-run-plan.ts +2 -5
  336. package/src/tools/revoke-api-key.ts +2 -4
  337. package/src/tools/run-agent.ts +29 -26
  338. package/src/tools/run-experiment.ts +37 -34
  339. package/src/tools/run-plan.ts +4 -7
  340. package/src/tools/run-query.ts +47 -0
  341. package/src/tools/run-test-suite.ts +4 -7
  342. package/src/tools/run-workflow.ts +2 -5
  343. package/src/tools/search-traces.ts +161 -47
  344. package/src/tools/set-model-provider.ts +4 -6
  345. package/src/tools/test-agent.ts +2 -2
  346. package/src/tools/update-agent.ts +1 -1
  347. package/src/tools/update-dashboard-widget.ts +86 -0
  348. package/src/tools/update-dataset-record.ts +1 -1
  349. package/src/tools/update-dataset.ts +5 -7
  350. package/src/tools/update-evaluator.ts +3 -5
  351. package/src/tools/update-project.ts +1 -1
  352. package/src/tools/update-prompt.ts +44 -59
  353. package/src/tools/update-scenario.ts +5 -7
  354. package/src/tools/update-test-suite.ts +6 -11
  355. package/src/utils/date-parsing.ts +1 -1
  356. package/src/utils/escape-markdown.ts +3 -8
  357. package/src/utils/format-evaluations.ts +6 -6
  358. package/src/utils/markdown-table.ts +58 -0
  359. package/src/utils/trace-id-shape.ts +20 -0
  360. package/tsconfig.app.json +24 -0
  361. package/tsconfig.json +14 -12
  362. package/uv.lock +667 -341
  363. package/vitest.integration.config.js +10 -0
  364. package/vitest.scenario.config.js +9 -0
  365. package/.eslintrc.cjs +0 -36
  366. package/dist/chunk-AN4OUA4D.js +0 -86
  367. package/dist/chunk-GELJ2MQR.js +0 -226
  368. package/dist/chunk-K37ZNPXK.js +0 -24
  369. package/dist/chunk-S4GVX36W.js +0 -39
  370. package/dist/config.d.ts +0 -17
  371. package/dist/create-dashboard-Z76AIPLS.js +0 -19
  372. package/dist/create-mcp-server.d.ts +0 -10
  373. package/dist/delete-dashboard-LYMRPF27.js +0 -19
  374. package/dist/delete-evaluator-RKYC4TNB.js +0 -16
  375. package/dist/discover-evaluator-schema-ESSHQGPY.js +0 -1912
  376. package/dist/get-analytics-R6AZD3AW.js +0 -73
  377. package/dist/get-dashboard-P4WWVHFU.js +0 -30
  378. package/dist/get-dataset-AKTYSQDI.js +0 -49
  379. package/dist/index.d.ts +0 -2
  380. package/dist/langwatch-api-dashboards-2KJL2M42.js +0 -18
  381. package/dist/langwatch-api-secrets-OEBD6GBU.js +0 -41
  382. package/dist/langwatch-api-triggers-5E6DDGX6.js +0 -31
  383. package/dist/list-dashboards-Z3BZKDGF.js +0 -33
  384. package/dist/run-agent-CAGWGTYT.js +0 -72
  385. package/dist/search-traces-4XTJYXIK.js +0 -79
  386. package/src/__tests__/agent-tools.unit.test.ts +0 -257
  387. package/src/__tests__/all-tools.integration.test.ts +0 -1872
  388. package/src/__tests__/config.unit.test.ts +0 -202
  389. package/src/__tests__/datasets.integration.test.ts +0 -620
  390. package/src/__tests__/datasets.unit.test.ts +0 -244
  391. package/src/__tests__/date-parsing.unit.test.ts +0 -78
  392. package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
  393. package/src/__tests__/discover-schema.unit.test.ts +0 -118
  394. package/src/__tests__/docker.integration.test.ts +0 -318
  395. package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
  396. package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
  397. package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
  398. package/src/__tests__/experiment-status.unit.test.ts +0 -194
  399. package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
  400. package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
  401. package/src/__tests__/http-security-origin.unit.test.ts +0 -97
  402. package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
  403. package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
  404. package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
  405. package/src/__tests__/http-server-origin.integration.test.ts +0 -169
  406. package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
  407. package/src/__tests__/http-transport.integration.test.ts +0 -395
  408. package/src/__tests__/integration.integration.test.ts +0 -284
  409. package/src/__tests__/langwatch-api.unit.test.ts +0 -661
  410. package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
  411. package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
  412. package/src/__tests__/prompt-response-types.unit.test.ts +0 -51
  413. package/src/__tests__/prompts.integration.test.ts +0 -736
  414. package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
  415. package/src/__tests__/report-issue.integration.test.ts +0 -147
  416. package/src/__tests__/run-plan-tools.unit.test.ts +0 -565
  417. package/src/__tests__/scenario-tools.integration.test.ts +0 -286
  418. package/src/__tests__/scenario-tools.unit.test.ts +0 -207
  419. package/src/__tests__/schemas.unit.test.ts +0 -85
  420. package/src/__tests__/simulation-run-tools.unit.test.ts +0 -116
  421. package/src/__tests__/support/http-server-harness.ts +0 -138
  422. package/src/__tests__/test-suite-tools.unit.test.ts +0 -615
  423. package/src/__tests__/tools.integration.test.ts +0 -896
  424. package/src/schemas/filter-fields.ts +0 -119
  425. package/src/schemas/index.ts +0 -9
  426. package/src/tools/create-dashboard.ts +0 -7
  427. package/src/tools/delete-dashboard.ts +0 -7
  428. package/src/tools/get-dashboard.ts +0 -22
@@ -1,190 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
-
3
- vi.mock("../langwatch-api-model-providers.js", () => ({
4
- listModelProviders: vi.fn(),
5
- setModelProvider: vi.fn(),
6
- }));
7
-
8
- import {
9
- listModelProviders,
10
- setModelProvider,
11
- } from "../langwatch-api-model-providers.js";
12
-
13
- import { handleListModelProviders } from "../tools/list-model-providers.js";
14
- import { handleSetModelProvider } from "../tools/set-model-provider.js";
15
-
16
- const mockListModelProviders = vi.mocked(listModelProviders);
17
- const mockSetModelProvider = vi.mocked(setModelProvider);
18
-
19
- beforeEach(() => {
20
- vi.clearAllMocks();
21
- });
22
-
23
- describe("handleListModelProviders()", () => {
24
- const sampleProviders = {
25
- openai: {
26
- provider: "openai",
27
- enabled: true,
28
- customKeys: { OPENAI_API_KEY: "HAS_KEY" },
29
- models: ["gpt-4o", "gpt-4o-mini"],
30
- embeddingsModels: ["text-embedding-3-small"],
31
- deploymentMapping: null,
32
- extraHeaders: [],
33
- },
34
- anthropic: {
35
- provider: "anthropic",
36
- enabled: false,
37
- customKeys: null,
38
- models: ["claude-sonnet-4-5-20250929"],
39
- embeddingsModels: null,
40
- deploymentMapping: null,
41
- extraHeaders: [],
42
- },
43
- };
44
-
45
- describe("when providers exist", () => {
46
- let result: string;
47
-
48
- beforeEach(async () => {
49
- mockListModelProviders.mockResolvedValue(sampleProviders);
50
- result = await handleListModelProviders();
51
- });
52
-
53
- it("includes the total count header", () => {
54
- expect(result).toContain("# Model Providers (2 total)");
55
- });
56
-
57
- it("includes provider name", () => {
58
- expect(result).toContain("## openai");
59
- });
60
-
61
- it("shows enabled status", () => {
62
- expect(result).toContain("**Status**: enabled");
63
- });
64
-
65
- it("shows disabled status", () => {
66
- expect(result).toContain("**Status**: disabled");
67
- });
68
-
69
- it("shows key fields that are set", () => {
70
- expect(result).toContain("OPENAI_API_KEY: set");
71
- });
72
-
73
- it("shows model count", () => {
74
- expect(result).toContain("2 available");
75
- });
76
- });
77
-
78
- describe("when no providers exist", () => {
79
- let result: string;
80
-
81
- beforeEach(async () => {
82
- mockListModelProviders.mockResolvedValue({});
83
- result = await handleListModelProviders();
84
- });
85
-
86
- it("returns a no-providers message", () => {
87
- expect(result).toContain("No model providers configured");
88
- });
89
-
90
- it("includes a tip to use platform_set_model_provider", () => {
91
- expect(result).toContain("platform_set_model_provider");
92
- });
93
- });
94
- });
95
-
96
- describe("handleSetModelProvider()", () => {
97
- describe("when update succeeds", () => {
98
- let result: string;
99
-
100
- beforeEach(async () => {
101
- mockSetModelProvider.mockResolvedValue({
102
- openai: {
103
- provider: "openai",
104
- enabled: true,
105
- customKeys: { OPENAI_API_KEY: "HAS_KEY" },
106
- models: ["gpt-4o"],
107
- embeddingsModels: null,
108
- deploymentMapping: null,
109
- extraHeaders: [],
110
- },
111
- });
112
- result = await handleSetModelProvider({
113
- provider: "openai",
114
- enabled: true,
115
- customKeys: { OPENAI_API_KEY: "sk-test123" },
116
- });
117
- });
118
-
119
- it("confirms update", () => {
120
- expect(result).toContain("Model provider updated successfully!");
121
- });
122
-
123
- it("includes provider name", () => {
124
- expect(result).toContain("**Provider**: openai");
125
- });
126
-
127
- it("shows enabled status", () => {
128
- expect(result).toContain("**Status**: enabled");
129
- });
130
-
131
- it("shows key fields", () => {
132
- expect(result).toContain("OPENAI_API_KEY: set");
133
- });
134
- });
135
-
136
- describe("when setting default model without provider prefix", () => {
137
- let result: string;
138
-
139
- beforeEach(async () => {
140
- mockSetModelProvider.mockResolvedValue({
141
- openai: {
142
- provider: "openai",
143
- enabled: true,
144
- customKeys: null,
145
- models: ["gpt-4o"],
146
- embeddingsModels: null,
147
- deploymentMapping: null,
148
- extraHeaders: [],
149
- },
150
- });
151
- result = await handleSetModelProvider({
152
- provider: "openai",
153
- enabled: true,
154
- defaultModel: "gpt-4o",
155
- });
156
- });
157
-
158
- it("prepends provider prefix in response", () => {
159
- expect(result).toContain("**Default Model**: openai/gpt-4o");
160
- });
161
- });
162
-
163
- describe("when setting default model with provider prefix already", () => {
164
- let result: string;
165
-
166
- beforeEach(async () => {
167
- mockSetModelProvider.mockResolvedValue({
168
- openai: {
169
- provider: "openai",
170
- enabled: true,
171
- customKeys: null,
172
- models: ["gpt-4o"],
173
- embeddingsModels: null,
174
- deploymentMapping: null,
175
- extraHeaders: [],
176
- },
177
- });
178
- result = await handleSetModelProvider({
179
- provider: "openai",
180
- enabled: true,
181
- defaultModel: "openai/gpt-4o",
182
- });
183
- });
184
-
185
- it("keeps the prefix as-is", () => {
186
- expect(result).toContain("**Default Model**: openai/gpt-4o");
187
- expect(result).not.toContain("openai/openai/");
188
- });
189
- });
190
- });
@@ -1,451 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
-
3
- vi.mock("../langwatch-api-projects.js", () => ({
4
- listProjects: vi.fn(),
5
- getProject: vi.fn(),
6
- createProject: vi.fn(),
7
- updateProject: vi.fn(),
8
- archiveProject: vi.fn(),
9
- }));
10
-
11
- vi.mock("../langwatch-api-api-keys.js", () => ({
12
- listApiKeys: vi.fn(),
13
- createApiKey: vi.fn(),
14
- revokeApiKey: vi.fn(),
15
- }));
16
-
17
- import {
18
- listProjects,
19
- getProject,
20
- createProject,
21
- updateProject,
22
- archiveProject,
23
- } from "../langwatch-api-projects.js";
24
-
25
- import {
26
- listApiKeys,
27
- createApiKey,
28
- revokeApiKey,
29
- } from "../langwatch-api-api-keys.js";
30
-
31
- import { handleListProjects } from "../tools/list-projects.js";
32
- import { handleGetProject } from "../tools/get-project.js";
33
- import { handleCreateProject } from "../tools/create-project.js";
34
- import { handleUpdateProject } from "../tools/update-project.js";
35
- import { handleArchiveProject } from "../tools/archive-project.js";
36
- import { handleListApiKeys } from "../tools/list-api-keys.js";
37
- import { handleCreateApiKey } from "../tools/create-api-key.js";
38
- import { handleRevokeApiKey } from "../tools/revoke-api-key.js";
39
-
40
- const mockListProjects = vi.mocked(listProjects);
41
- const mockGetProject = vi.mocked(getProject);
42
- const mockCreateProject = vi.mocked(createProject);
43
- const mockUpdateProject = vi.mocked(updateProject);
44
- const mockArchiveProject = vi.mocked(archiveProject);
45
- const mockListApiKeys = vi.mocked(listApiKeys);
46
- const mockCreateApiKey = vi.mocked(createApiKey);
47
- const mockRevokeApiKey = vi.mocked(revokeApiKey);
48
-
49
- beforeEach(() => {
50
- vi.clearAllMocks();
51
- });
52
-
53
- // --- Project Tools ---
54
-
55
- describe("handleListProjects()", () => {
56
- const sampleProjects = [
57
- {
58
- id: "proj_abc123",
59
- name: "My Project",
60
- slug: "my-project",
61
- language: "python",
62
- framework: "openai",
63
- teamId: "team_1",
64
- piiRedactionLevel: "ESSENTIAL",
65
- createdAt: "2024-01-01T00:00:00Z",
66
- updatedAt: "2024-06-01T00:00:00Z",
67
- },
68
- {
69
- id: "proj_def456",
70
- name: "Another Project",
71
- slug: "another-project",
72
- language: "typescript",
73
- framework: "langchain",
74
- teamId: "team_1",
75
- piiRedactionLevel: "DISABLED",
76
- createdAt: "2024-02-01T00:00:00Z",
77
- updatedAt: "2024-07-01T00:00:00Z",
78
- },
79
- ];
80
-
81
- describe("when projects exist", () => {
82
- let result: string;
83
-
84
- beforeEach(async () => {
85
- mockListProjects.mockResolvedValue({
86
- data: sampleProjects,
87
- pagination: { page: 1, limit: 100, total: 2, totalPages: 1 },
88
- });
89
- result = await handleListProjects();
90
- });
91
-
92
- it("includes project count", () => {
93
- expect(result).toContain("2 total");
94
- });
95
-
96
- it("includes project names", () => {
97
- expect(result).toContain("My Project");
98
- expect(result).toContain("Another Project");
99
- });
100
-
101
- it("includes project IDs", () => {
102
- expect(result).toContain("proj_abc123");
103
- expect(result).toContain("proj_def456");
104
- });
105
-
106
- it("includes language and framework", () => {
107
- expect(result).toContain("python");
108
- expect(result).toContain("openai");
109
- });
110
- });
111
-
112
- describe("when no projects exist", () => {
113
- it("returns empty state with tip", async () => {
114
- mockListProjects.mockResolvedValue({
115
- data: [],
116
- pagination: { page: 1, limit: 100, total: 0, totalPages: 0 },
117
- });
118
- const result = await handleListProjects();
119
- expect(result).toContain("No projects found");
120
- expect(result).toContain("platform_create_project");
121
- });
122
- });
123
-
124
- describe("when paginated", () => {
125
- it("shows pagination hint", async () => {
126
- mockListProjects.mockResolvedValue({
127
- data: [sampleProjects[0]!],
128
- pagination: { page: 1, limit: 1, total: 5, totalPages: 5 },
129
- });
130
- const result = await handleListProjects({ limit: 1 });
131
- expect(result).toContain("page 1 of 5");
132
- });
133
- });
134
- });
135
-
136
- describe("handleGetProject()", () => {
137
- it("returns formatted project details", async () => {
138
- mockGetProject.mockResolvedValue({
139
- id: "proj_abc123",
140
- name: "My Project",
141
- slug: "my-project",
142
- language: "python",
143
- framework: "openai",
144
- teamId: "team_1",
145
- piiRedactionLevel: "ESSENTIAL",
146
- createdAt: "2024-01-01T00:00:00Z",
147
- updatedAt: "2024-06-01T00:00:00Z",
148
- });
149
-
150
- const result = await handleGetProject({ id: "proj_abc123" });
151
-
152
- expect(result).toContain("My Project");
153
- expect(result).toContain("proj_abc123");
154
- expect(result).toContain("python");
155
- expect(result).toContain("ESSENTIAL");
156
- });
157
- });
158
-
159
- describe("handleCreateProject()", () => {
160
- it("returns project details with service API key", async () => {
161
- mockCreateProject.mockResolvedValue({
162
- id: "proj_new",
163
- name: "New Project",
164
- slug: "new-project",
165
- language: "typescript",
166
- framework: "custom",
167
- teamId: "team_1",
168
- piiRedactionLevel: "DISABLED",
169
- createdAt: "2024-01-01T00:00:00Z",
170
- updatedAt: "2024-01-01T00:00:00Z",
171
- serviceApiKey: "lw_sk_abc123secret",
172
- serviceApiKeyId: "key_svc_1",
173
- });
174
-
175
- const result = await handleCreateProject({
176
- name: "New Project",
177
- language: "typescript",
178
- framework: "custom",
179
- newTeamName: "My Team",
180
- });
181
-
182
- expect(result).toContain("created successfully");
183
- expect(result).toContain("New Project");
184
- expect(result).toContain("proj_new");
185
- expect(result).toContain("lw_sk_abc123secret");
186
- expect(result).toContain("Save the service API key now");
187
- });
188
- });
189
-
190
- describe("handleUpdateProject()", () => {
191
- it("returns updated project details", async () => {
192
- mockUpdateProject.mockResolvedValue({
193
- id: "proj_abc123",
194
- name: "Renamed Project",
195
- slug: "my-project",
196
- language: "python",
197
- framework: "openai",
198
- teamId: "team_1",
199
- piiRedactionLevel: "STRICT",
200
- createdAt: "2024-01-01T00:00:00Z",
201
- updatedAt: "2024-08-01T00:00:00Z",
202
- });
203
-
204
- const result = await handleUpdateProject({
205
- id: "proj_abc123",
206
- name: "Renamed Project",
207
- piiRedactionLevel: "STRICT",
208
- });
209
-
210
- expect(result).toContain("updated successfully");
211
- expect(result).toContain("Renamed Project");
212
- expect(result).toContain("STRICT");
213
- });
214
- });
215
-
216
- describe("handleArchiveProject()", () => {
217
- it("returns archive confirmation", async () => {
218
- mockArchiveProject.mockResolvedValue({
219
- id: "proj_abc123",
220
- name: "My Project",
221
- archivedAt: "2024-09-01T00:00:00Z",
222
- });
223
-
224
- const result = await handleArchiveProject({ id: "proj_abc123" });
225
-
226
- expect(result).toContain("archived successfully");
227
- expect(result).toContain("proj_abc123");
228
- expect(result).toContain("My Project");
229
- });
230
- });
231
-
232
- // --- API Key Tools ---
233
-
234
- describe("handleListApiKeys()", () => {
235
- describe("when keys exist", () => {
236
- it("shows key metadata and status", async () => {
237
- mockListApiKeys.mockResolvedValue({
238
- data: [
239
- {
240
- id: "key_1",
241
- name: "Production Key",
242
- description: "Main production API key",
243
- createdAt: "2024-01-01T00:00:00Z",
244
- expiresAt: null,
245
- lastUsedAt: "2024-06-01T00:00:00Z",
246
- revokedAt: null,
247
- roleBindings: [
248
- { id: "rb_1", role: "ADMIN", scopeType: "PROJECT", scopeId: "proj_abc" },
249
- ],
250
- },
251
- {
252
- id: "key_2",
253
- name: "Revoked Key",
254
- description: null,
255
- createdAt: "2024-01-01T00:00:00Z",
256
- expiresAt: null,
257
- lastUsedAt: null,
258
- revokedAt: "2024-05-01T00:00:00Z",
259
- roleBindings: [],
260
- },
261
- ],
262
- });
263
-
264
- const result = await handleListApiKeys();
265
-
266
- expect(result).toContain("2 total");
267
- expect(result).toContain("Production Key");
268
- expect(result).toContain("ACTIVE");
269
- expect(result).toContain("Revoked Key");
270
- expect(result).toContain("REVOKED");
271
- expect(result).toContain("ADMIN on PROJECT:proj_abc");
272
- });
273
- });
274
-
275
- describe("when no keys exist", () => {
276
- it("returns empty state with tip", async () => {
277
- mockListApiKeys.mockResolvedValue({ data: [] });
278
-
279
- const result = await handleListApiKeys();
280
-
281
- expect(result).toContain("No API keys found");
282
- expect(result).toContain("platform_create_api_key");
283
- });
284
- });
285
- });
286
-
287
- describe("handleCreateApiKey()", () => {
288
- it("returns token with save warning", async () => {
289
- mockCreateApiKey.mockResolvedValue({
290
- token: "lw_pat_secret_token_123",
291
- apiKey: {
292
- id: "key_new",
293
- name: "My New Key",
294
- createdAt: "2024-01-01T00:00:00Z",
295
- },
296
- });
297
-
298
- const result = await handleCreateApiKey({
299
- keyType: "personal",
300
- name: "My New Key",
301
- bindings: [
302
- { role: "ADMIN", scopeType: "ORGANIZATION", scopeId: "org_1" },
303
- ],
304
- });
305
-
306
- expect(result).toContain("created successfully");
307
- expect(result).toContain("My New Key");
308
- expect(result).toContain("lw_pat_secret_token_123");
309
- expect(result).toContain("Save this token now");
310
- });
311
- });
312
-
313
- describe("handleRevokeApiKey()", () => {
314
- it("confirms revocation", async () => {
315
- mockRevokeApiKey.mockResolvedValue({ success: true });
316
-
317
- const result = await handleRevokeApiKey({ id: "key_123" });
318
-
319
- expect(result).toContain("key_123");
320
- expect(result).toContain("revoked successfully");
321
- });
322
- });
323
-
324
- // --- Error-path tests ---
325
-
326
- describe("handleCreateProject() validation", () => {
327
- describe("when neither teamId nor newTeamName is provided", () => {
328
- it("returns a validation error without calling the API", async () => {
329
- const result = await handleCreateProject({
330
- name: "Test Project",
331
- language: "python",
332
- framework: "openai",
333
- });
334
-
335
- expect(result).toContain("Error");
336
- expect(result).toContain("teamId");
337
- expect(result).toContain("newTeamName");
338
- expect(mockCreateProject).not.toHaveBeenCalled();
339
- });
340
- });
341
-
342
- describe("when API does not return a serviceApiKey", () => {
343
- it("throws an error to prevent silent data loss", async () => {
344
- mockCreateProject.mockResolvedValue({
345
- id: "proj_new",
346
- name: "New Project",
347
- slug: "new-project",
348
- language: "typescript",
349
- framework: "custom",
350
- teamId: "team_1",
351
- piiRedactionLevel: "DISABLED",
352
- createdAt: "2024-01-01T00:00:00Z",
353
- updatedAt: "2024-01-01T00:00:00Z",
354
- serviceApiKey: "",
355
- serviceApiKeyId: "key_svc_1",
356
- } as never);
357
-
358
- await expect(
359
- handleCreateProject({
360
- name: "New Project",
361
- language: "typescript",
362
- framework: "custom",
363
- newTeamName: "My Team",
364
- }),
365
- ).rejects.toThrow("service API key");
366
- });
367
- });
368
- });
369
-
370
- describe("handleListProjects() edge cases", () => {
371
- describe("when API returns non-array data", () => {
372
- it("returns empty state message", async () => {
373
- mockListProjects.mockResolvedValue({
374
- data: null as never,
375
- pagination: { page: 1, limit: 100, total: 0, totalPages: 0 },
376
- });
377
-
378
- const result = await handleListProjects();
379
-
380
- expect(result).toContain("No projects found");
381
- });
382
- });
383
-
384
- describe("when API call throws", () => {
385
- it("propagates the error", async () => {
386
- mockListProjects.mockRejectedValue(
387
- new Error('LangWatch API error 403: {"error":"Forbidden","message":"Insufficient permissions"}'),
388
- );
389
-
390
- await expect(handleListProjects()).rejects.toThrow("403");
391
- });
392
- });
393
- });
394
-
395
- describe("handleListApiKeys() edge cases", () => {
396
- describe("when a key has a past expiration date", () => {
397
- it("shows EXPIRED status", async () => {
398
- mockListApiKeys.mockResolvedValue({
399
- data: [
400
- {
401
- id: "key_exp",
402
- name: "Expired Key",
403
- description: null,
404
- createdAt: "2024-01-01T00:00:00Z",
405
- expiresAt: "2024-06-01T00:00:00Z",
406
- lastUsedAt: null,
407
- revokedAt: null,
408
- roleBindings: [],
409
- },
410
- ],
411
- });
412
-
413
- const result = await handleListApiKeys();
414
-
415
- expect(result).toContain("EXPIRED");
416
- });
417
- });
418
-
419
- describe("when a key has a future expiration date", () => {
420
- it("shows ACTIVE status", async () => {
421
- mockListApiKeys.mockResolvedValue({
422
- data: [
423
- {
424
- id: "key_future",
425
- name: "Future Key",
426
- description: null,
427
- createdAt: "2024-01-01T00:00:00Z",
428
- expiresAt: "2099-12-31T23:59:59Z",
429
- lastUsedAt: null,
430
- revokedAt: null,
431
- roleBindings: [],
432
- },
433
- ],
434
- });
435
-
436
- const result = await handleListApiKeys();
437
-
438
- expect(result).toContain("ACTIVE");
439
- });
440
- });
441
-
442
- describe("when API returns non-array data", () => {
443
- it("returns empty state message", async () => {
444
- mockListApiKeys.mockResolvedValue({ data: null as never });
445
-
446
- const result = await handleListApiKeys();
447
-
448
- expect(result).toContain("No API keys found");
449
- });
450
- });
451
- });
@@ -1,51 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import type {
3
- PromptDetailResponse,
4
- PromptMutationResponse,
5
- } from "../langwatch-api.js";
6
-
7
- describe("Prompt response type interfaces", () => {
8
- describe("given fully-populated PromptDetailResponse and PromptMutationResponse fixtures", () => {
9
- /** @scenario Declaring every rendered field on the typed response interfaces */
10
- it("declares every field the prompt tools render, with no `as` cast needed", () => {
11
- // Mirrors apiResponsePromptWithVersionDataSchema (the real GET
12
- // /api/prompts/:id contract): version data flattened to the top level,
13
- // parameters as an object map, tags as { name, versionId } objects,
14
- // and no nested versions array.
15
- const detail: PromptDetailResponse = {
16
- id: "p1",
17
- handle: "greeting-bot",
18
- name: "Greeting Bot",
19
- version: 3,
20
- versionId: "ver_abc123",
21
- commitMessage: "Updated tone",
22
- model: "openai/gpt-4o",
23
- messages: [{ role: "system", content: "You are a friendly bot." }],
24
- prompt: "You are a friendly bot.",
25
- temperature: 0.7,
26
- maxTokens: 512,
27
- responseFormat: { type: "json_object" },
28
- parameters: { reasoning_effort: "low" },
29
- inputs: [{ identifier: "question", type: "str" }],
30
- outputs: [{ identifier: "answer", type: "str" }],
31
- tags: [
32
- { name: "production", versionId: "ver_abc123" },
33
- { name: "latest", versionId: "ver_abc123" },
34
- ],
35
- };
36
-
37
- const mutation: PromptMutationResponse = {
38
- id: "p1",
39
- handle: "greeting-bot",
40
- name: "Greeting Bot",
41
- latestVersionNumber: 4,
42
- versionId: "ver_def456",
43
- tags: ["production"],
44
- };
45
-
46
- expect(detail.versionId).toBe("ver_abc123");
47
- expect(detail.tags?.[0]?.versionId).toBe("ver_abc123");
48
- expect(mutation.versionId).toBe("ver_def456");
49
- });
50
- });
51
- });