@langwatch/mcp-server 2.1.0 → 2.2.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 (415) hide show
  1. package/.gitignore +7 -0
  2. package/.npmignore +41 -0
  3. package/CHANGELOG.md +192 -201
  4. package/CONTRIBUTING.md +10 -0
  5. package/README.md +70 -68
  6. package/dist/add-dashboard-widget-4ZC5UN73.js +50 -0
  7. package/dist/add-dashboard-widget-ACC6QYBG.js +49 -0
  8. package/dist/archive-project-KWFM3I5Z.js +19 -0
  9. package/dist/{archive-project-W3IKI7UL.js → archive-project-SPVHXK6A.js} +4 -4
  10. package/dist/{archive-run-plan-474OKHHU.js → archive-run-plan-65QN3XRX.js} +4 -4
  11. package/dist/archive-run-plan-Z4SYE6BP.js +15 -0
  12. package/dist/{archive-scenario-V5UNYK26.js → archive-scenario-A6QV5LOW.js} +4 -4
  13. package/dist/archive-scenario-FXEYQNEH.js +19 -0
  14. package/dist/archive-test-suite-5ADQ3KPQ.js +15 -0
  15. package/dist/{archive-test-suite-O7FLDMXK.js → archive-test-suite-NKZDZY3D.js} +4 -4
  16. package/dist/assign-prompt-tag-5IUZXJ2T.js +23 -0
  17. package/dist/{assign-prompt-tag-Q46WRB6P.js → assign-prompt-tag-HBZLBIFD.js} +8 -4
  18. package/dist/{chunk-OJLYYJWI.js → chunk-3OCG3QPU.js} +7 -10
  19. package/dist/chunk-3YLN3ATJ.js +241 -0
  20. package/dist/chunk-5FNCQRCX.js +91 -0
  21. package/dist/{chunk-UF6XIGYR.js → chunk-6YZUOD34.js} +2 -5
  22. package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
  23. package/dist/chunk-7VNSRCXO.js +129 -0
  24. package/dist/{chunk-G4ZAZTZW.js → chunk-B4J3PJLX.js} +11 -10
  25. package/dist/{chunk-ZXKLPC2E.js → chunk-BIIKE3EI.js} +1 -1
  26. package/dist/{chunk-37SMPMQS.js → chunk-DMM3JQ42.js} +7 -2
  27. package/dist/{chunk-NUFPTHKU.js → chunk-FOKVY3BK.js} +1 -1
  28. package/dist/{chunk-WT4PO4A3.js → chunk-H6WGMG2T.js} +10 -7
  29. package/dist/{chunk-EYXMLE5X.js → chunk-HGELNIVY.js} +56 -47
  30. package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
  31. package/dist/{chunk-RVAE2MEA.js → chunk-I7ATIZED.js} +7 -7
  32. package/dist/{chunk-S4GVX36W.js → chunk-ILZDO25L.js} +7 -10
  33. package/dist/{chunk-QRO35SOM.js → chunk-J7PQKBLD.js} +652 -528
  34. package/dist/{chunk-SR6QPRIE.js → chunk-JRJPH75H.js} +7 -13
  35. package/dist/chunk-K2I7Z3LZ.js +28 -0
  36. package/dist/{chunk-UFOYFYI7.js → chunk-NKMTIHIJ.js} +6 -9
  37. package/dist/{chunk-HV4DWKBI.js → chunk-O7EMWEVJ.js} +2 -4
  38. package/dist/{chunk-56OGTS24.js → chunk-PTDR56Z3.js} +4 -11
  39. package/dist/{chunk-JR6DJZOU.js → chunk-RABYBFX5.js} +4 -10
  40. package/dist/chunk-SUPUUC4W.js +64 -0
  41. package/dist/{chunk-JTQJRNFJ.js → chunk-SXFC3FNH.js} +4 -4
  42. package/dist/{chunk-CKNAH5TG.js → chunk-U24EACC4.js} +3 -10
  43. package/dist/chunk-UNJM3BIL.js +21 -0
  44. package/dist/{chunk-QAMP3CGR.js → chunk-UTJCWXPZ.js} +4 -4
  45. package/dist/chunk-UWLE5T2F.js +312 -0
  46. package/dist/{chunk-6DJDEXET.js → chunk-VMWJD732.js} +6 -12
  47. package/dist/{chunk-7E4FZIYJ.js → chunk-XUIJYNRJ.js} +1 -1
  48. package/dist/chunk-Y34DHR5K.js +67 -0
  49. package/dist/chunk-YCARO42Z.js +516 -0
  50. package/dist/config-EAKW6F26.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-AYZ3LB3V.js} +4 -4
  54. package/dist/create-agent-S5ZBCEFT.js +23 -0
  55. package/dist/create-annotation-LHNCLHYP.js +29 -0
  56. package/dist/{create-annotation-EUXXQ6NS.js → create-annotation-VUSXULQK.js} +10 -5
  57. package/dist/{create-api-key-BGBB76JX.js → create-api-key-NNYKARMG.js} +5 -7
  58. package/dist/create-api-key-T4KSNPKB.js +24 -0
  59. package/dist/create-dashboard-DHVFMEU4.js +18 -0
  60. package/dist/{create-dashboard-Z76AIPLS.js → create-dashboard-WTKKS5Z6.js} +4 -4
  61. package/dist/{create-dataset-FD5VAXU4.js → create-dataset-2MC4SD4O.js} +6 -6
  62. package/dist/create-dataset-LUP5PVDM.js +22 -0
  63. package/dist/create-dataset-records-NSKBZP3G.js +20 -0
  64. package/dist/{create-dataset-records-WQUXXOHI.js → create-dataset-records-W4GLN2FV.js} +5 -7
  65. package/dist/{create-evaluator-6NV33Z52.js → create-evaluator-643G6LXL.js} +4 -4
  66. package/dist/create-evaluator-HMTYO5SS.js +27 -0
  67. package/dist/create-mcp-server.cjs +9513 -0
  68. package/dist/create-mcp-server.js +2647 -10
  69. package/dist/create-project-6N7PIYRY.js +44 -0
  70. package/dist/{create-project-ZQ7TFIO2.js → create-project-KAIC46UY.js} +4 -4
  71. package/dist/{create-prompt-BS6QRCUU.js → create-prompt-E67LXIYT.js} +5 -7
  72. package/dist/create-prompt-PKJ7EDRR.js +37 -0
  73. package/dist/create-prompt-tag-4YO3FSJ3.js +17 -0
  74. package/dist/{create-prompt-tag-FCQ5ELSQ.js → create-prompt-tag-OPQUEXWB.js} +3 -3
  75. package/dist/create-scenario-5PJBMAXO.js +33 -0
  76. package/dist/{create-scenario-DRPTPXU3.js → create-scenario-UEM77OE7.js} +5 -5
  77. package/dist/{create-test-suite-ZIZCCFJ4.js → create-test-suite-4IPXVSFQ.js} +6 -6
  78. package/dist/create-test-suite-SZEPVXSE.js +36 -0
  79. package/dist/create-trigger-5HZSCRAN.js +49 -0
  80. package/dist/create-trigger-PRELMT6J.js +48 -0
  81. package/dist/delete-agent-JUIZWAXG.js +18 -0
  82. package/dist/{delete-agent-SA4JMUZF.js → delete-agent-QMEK3XHK.js} +4 -4
  83. package/dist/delete-annotation-HY3O2OGR.js +17 -0
  84. package/dist/{delete-annotation-X3KKK7QY.js → delete-annotation-VKIQWUYW.js} +4 -4
  85. package/dist/delete-dashboard-76N66XXL.js +18 -0
  86. package/dist/{delete-dashboard-LYMRPF27.js → delete-dashboard-JVIVHNJM.js} +4 -4
  87. package/dist/delete-dataset-HQCR66MG.js +18 -0
  88. package/dist/{delete-dataset-W6EZ44HY.js → delete-dataset-WKRUW4FP.js} +5 -7
  89. package/dist/{delete-dataset-records-7CNOTALB.js → delete-dataset-records-C2IQFFVQ.js} +5 -7
  90. package/dist/delete-dataset-records-SDUHQLLM.js +19 -0
  91. package/dist/delete-evaluator-4SNSCLEE.js +16 -0
  92. package/dist/delete-evaluator-QP3QHTLN.js +15 -0
  93. package/dist/delete-prompt-tag-NZ4JQMYG.js +17 -0
  94. package/dist/{delete-prompt-tag-QB3OCZUV.js → delete-prompt-tag-YYQ4VMAD.js} +3 -3
  95. package/dist/{delete-workflow-NG2VXYYM.js → delete-workflow-5J46T73T.js} +4 -4
  96. package/dist/delete-workflow-JSWABL5F.js +17 -0
  97. package/dist/discover-evaluator-schema-UHWA5HVL.js +120 -0
  98. package/dist/discover-evaluator-schema-XKCLLCB3.js +118 -0
  99. package/dist/discover-scenario-schema-NOJY6S7E.js +137 -0
  100. package/dist/{discover-scenario-schema-W7KBXA4J.js → discover-scenario-schema-OOFIQKOG.js} +37 -17
  101. package/dist/{discover-schema-L6QDPON3.js → discover-schema-55YJBFGQ.js} +181 -186
  102. package/dist/discover-schema-A33SLMXW.js +442 -0
  103. package/dist/get-agent-LJQX7OF4.js +69 -0
  104. package/dist/{get-agent-7THF7HCU.js → get-agent-OTIYUFZA.js} +15 -11
  105. package/dist/get-analytics-DCS72353.js +80 -0
  106. package/dist/get-analytics-IQZKJHLW.js +79 -0
  107. package/dist/get-dashboard-5NYJEIX2.js +29 -0
  108. package/dist/{get-dashboard-P4WWVHFU.js → get-dashboard-QMTYDQAZ.js} +4 -4
  109. package/dist/get-dataset-ALSP7RTX.js +64 -0
  110. package/dist/get-dataset-X4B5JDG2.js +63 -0
  111. package/dist/{get-evaluator-RZ44UIN6.js → get-evaluator-ISMC4LLI.js} +4 -4
  112. package/dist/get-evaluator-XEUZGZCH.js +47 -0
  113. package/dist/{get-project-QSQEAB33.js → get-project-5VKROSDH.js} +4 -4
  114. package/dist/get-project-RM6FRCBK.js +26 -0
  115. package/dist/{get-prompt-GVKXF5NL.js → get-prompt-OWXJZHQQ.js} +53 -58
  116. package/dist/get-prompt-W52DY36E.js +94 -0
  117. package/dist/{get-run-plan-NY7J5GRE.js → get-run-plan-BE3M2AUX.js} +7 -9
  118. package/dist/get-run-plan-RUXQ6PAX.js +58 -0
  119. package/dist/get-scenario-RNM7BAX2.js +37 -0
  120. package/dist/{get-scenario-Q3LLQE4T.js → get-scenario-YM4ODWW6.js} +5 -5
  121. package/dist/get-simulation-run-6GIATQE5.js +69 -0
  122. package/dist/{get-simulation-run-WINEYDMK.js → get-simulation-run-LCFSMPGQ.js} +26 -22
  123. package/dist/{get-test-suite-4HKA7OKS.js → get-test-suite-GC2O7YH6.js} +5 -5
  124. package/dist/get-test-suite-P5LJ6VLF.js +48 -0
  125. package/dist/get-trace-KBRVV4NN.js +45 -0
  126. package/dist/{get-trace-RCUV7N4O.js → get-trace-SEF3FMR5.js} +11 -13
  127. package/dist/get-workflow-7PVED7JE.js +25 -0
  128. package/dist/{get-workflow-EEOC7Y45.js → get-workflow-YXULW4GC.js} +4 -4
  129. package/dist/{http-security-EU3CHTY7.js → http-security-DNLBNQZL.js} +2 -2
  130. package/dist/{http-server-WCDUARTH.js → http-server-IR4QOS43.js} +4071 -347
  131. package/dist/index.js +58671 -37983
  132. package/dist/langwatch-api-annotations-6SA4OB4C.js +17 -0
  133. package/dist/{langwatch-api-annotations-6DHVZWUK.js → langwatch-api-annotations-TBHLCQ5R.js} +4 -4
  134. package/dist/langwatch-api-dashboards-6EO2VVZW.js +17 -0
  135. package/dist/{langwatch-api-dashboards-2KJL2M42.js → langwatch-api-dashboards-NHU5BZD7.js} +4 -4
  136. package/dist/langwatch-api-monitors-CBF3FGIM.js +47 -0
  137. package/dist/{langwatch-api-monitors-6ISFJ7WX.js → langwatch-api-monitors-YNWA2M5Y.js} +11 -16
  138. package/dist/langwatch-api-secrets-ADTOJELP.js +56 -0
  139. package/dist/langwatch-api-secrets-RNFO4LF2.js +55 -0
  140. package/dist/langwatch-api-triggers-KQDQC6L5.js +22 -0
  141. package/dist/langwatch-api-triggers-QS7HDIVW.js +23 -0
  142. package/dist/{langwatch-api-workflows-6UJL5U4Z.js → langwatch-api-workflows-OKC4FXIF.js} +4 -4
  143. package/dist/langwatch-api-workflows-XGJE6SR5.js +15 -0
  144. package/dist/{list-agents-AMVDQPQL.js → list-agents-HVYWEQMI.js} +4 -4
  145. package/dist/list-agents-RBAOCF53.js +42 -0
  146. package/dist/list-annotations-HJH4NBLD.js +38 -0
  147. package/dist/{list-annotations-6PR5NLIC.js → list-annotations-J4UAHSUN.js} +10 -5
  148. package/dist/{list-api-keys-GVPNBIHQ.js → list-api-keys-7UTJRZDG.js} +10 -5
  149. package/dist/list-api-keys-A2PMV435.js +42 -0
  150. package/dist/list-dashboard-boards-OPWROHMG.js +33 -0
  151. package/dist/list-dashboard-boards-U2GJ7GC5.js +34 -0
  152. package/dist/{list-dashboards-Z3BZKDGF.js → list-dashboards-ROSYFLDQ.js} +4 -4
  153. package/dist/list-dashboards-RQ635ZU7.js +32 -0
  154. package/dist/{list-dataset-records-O67HZ35Y.js → list-dataset-records-M5TKA6LK.js} +14 -10
  155. package/dist/list-dataset-records-WFM7F33C.js +43 -0
  156. package/dist/{list-datasets-WXZL6UMP.js → list-datasets-B5X4P7BQ.js} +9 -13
  157. package/dist/list-datasets-THUKQHPX.js +56 -0
  158. package/dist/{list-evaluators-PAX72WCN.js → list-evaluators-MYH2OVCI.js} +5 -7
  159. package/dist/list-evaluators-NLVWF6K7.js +32 -0
  160. package/dist/{list-model-providers-VVLZMLCX.js → list-model-providers-3JUGP4YI.js} +4 -4
  161. package/dist/list-model-providers-H3XKORFO.js +35 -0
  162. package/dist/{list-projects-AQVI6SUK.js → list-projects-6EJ5YYEW.js} +5 -7
  163. package/dist/list-projects-YNNSRMLC.js +40 -0
  164. package/dist/{list-prompt-tags-WZFBJOHG.js → list-prompt-tags-NVFQO6WX.js} +3 -3
  165. package/dist/list-prompt-tags-XUQTTAH4.js +23 -0
  166. package/dist/{list-prompts-BQOHRHYT.js → list-prompts-HSIMMHTF.js} +4 -6
  167. package/dist/list-prompts-IRI6AIXO.js +30 -0
  168. package/dist/{list-run-plans-UBAU2DGH.js → list-run-plans-PX2XI6EK.js} +5 -5
  169. package/dist/list-run-plans-QALLCN2K.js +45 -0
  170. package/dist/{list-scenarios-MS4IUIVM.js → list-scenarios-QZRPVHS4.js} +13 -11
  171. package/dist/list-scenarios-SSJQEMJP.js +45 -0
  172. package/dist/list-simulation-runs-KNOLGMDV.js +53 -0
  173. package/dist/{list-simulation-runs-D6YF4ZOU.js → list-simulation-runs-OEADLLQR.js} +12 -8
  174. package/dist/list-test-suites-ANAQBLDG.js +34 -0
  175. package/dist/{list-test-suites-L7R2O6DR.js → list-test-suites-N4WVLBKK.js} +4 -4
  176. package/dist/list-trigger-fires-JV3WFYYG.js +19 -0
  177. package/dist/list-trigger-fires-WTW4DVIW.js +20 -0
  178. package/dist/list-triggers-SQNIG35Q.js +45 -0
  179. package/dist/list-triggers-V4Y356AK.js +46 -0
  180. package/dist/{list-workflows-6MV4XJHF.js → list-workflows-IMSX7SXU.js} +5 -7
  181. package/dist/list-workflows-ZHTX5LCL.js +33 -0
  182. package/dist/{rename-prompt-tag-K5LQ4CY6.js → rename-prompt-tag-IQI7MHOI.js} +3 -3
  183. package/dist/rename-prompt-tag-PA2BRIE6.js +18 -0
  184. package/dist/{rename-test-suite-NTYHAO5X.js → rename-test-suite-4J7UX5S2.js} +4 -4
  185. package/dist/rename-test-suite-NNVLMLKY.js +20 -0
  186. package/dist/report-issue-AS34ZMJF.js +898 -0
  187. package/dist/{report-issue-RHZZ33IS.js → report-issue-DCZFLGDO.js} +81 -67
  188. package/dist/{rerun-run-plan-MUDWJBE4.js → rerun-run-plan-TG2V4WM4.js} +5 -5
  189. package/dist/rerun-run-plan-ZI5OY3VA.js +21 -0
  190. package/dist/revoke-api-key-3J3ZA4UB.js +15 -0
  191. package/dist/{revoke-api-key-6LAZ3QZZ.js → revoke-api-key-SFMEFWJC.js} +4 -4
  192. package/dist/run-agent-W4VJP72Z.js +75 -0
  193. package/dist/run-agent-YNV6ZHW4.js +74 -0
  194. package/dist/run-plan-6C77GWG4.js +38 -0
  195. package/dist/{run-plan-T4ZYOZGA.js → run-plan-PAARQSI4.js} +7 -7
  196. package/dist/run-query-KJDH544C.js +47 -0
  197. package/dist/run-query-T4QW2Z5O.js +46 -0
  198. package/dist/{run-test-suite-L4MZ7G4D.js → run-test-suite-SQJELEZX.js} +6 -6
  199. package/dist/run-test-suite-STB6NUJM.js +25 -0
  200. package/dist/{run-workflow-DFIS23AP.js → run-workflow-D6PQNBI6.js} +4 -4
  201. package/dist/run-workflow-SP32SO5M.js +36 -0
  202. package/dist/search-traces-HCBGOG6R.js +170 -0
  203. package/dist/search-traces-HSTQ6WTQ.js +171 -0
  204. package/dist/{set-model-provider-XRNMFOVR.js → set-model-provider-GF7NXUJA.js} +4 -4
  205. package/dist/set-model-provider-KDQ7C4EZ.js +33 -0
  206. package/dist/{update-agent-DUWNYBNA.js → update-agent-DWG43T2P.js} +4 -4
  207. package/dist/update-agent-MXNOBS4H.js +20 -0
  208. package/dist/update-dashboard-widget-CJKJLCDY.js +71 -0
  209. package/dist/update-dashboard-widget-CYQDS2NR.js +70 -0
  210. package/dist/update-dataset-DQH3OHOU.js +22 -0
  211. package/dist/{update-dataset-YSOMDCOB.js → update-dataset-SQZ6T4WX.js} +6 -6
  212. package/dist/{update-dataset-record-DEA2ITYR.js → update-dataset-record-3AT4IPBC.js} +4 -4
  213. package/dist/update-dataset-record-7PLDGTMR.js +19 -0
  214. package/dist/update-evaluator-4LFTKFPT.js +24 -0
  215. package/dist/{update-evaluator-NH7Q5GWV.js → update-evaluator-IGTX6PX4.js} +4 -4
  216. package/dist/{update-project-Q26FBSYH.js → update-project-PLJIOZS6.js} +4 -4
  217. package/dist/update-project-QVHSJRUP.js +24 -0
  218. package/dist/update-prompt-GDKRYJI3.js +140 -0
  219. package/dist/{update-prompt-ZQQ2C3KU.js → update-prompt-MY263DYF.js} +27 -29
  220. package/dist/update-scenario-7KA3JDXA.js +34 -0
  221. package/dist/{update-scenario-WUX34JAR.js → update-scenario-MOHRQKAQ.js} +5 -5
  222. package/package.json +35 -39
  223. package/pyproject.toml +8 -8
  224. package/src/config.d.ts +4 -0
  225. package/src/config.ts +20 -29
  226. package/src/create-mcp-server.ts +755 -609
  227. package/src/documentation-fetch.ts +21 -20
  228. package/src/http-security.ts +166 -135
  229. package/src/http-server.ts +189 -224
  230. package/src/index.ts +14 -16
  231. package/src/langwatch-api-agents.ts +18 -21
  232. package/src/langwatch-api-annotations.ts +11 -12
  233. package/src/langwatch-api-api-keys.ts +8 -9
  234. package/src/langwatch-api-boards.ts +46 -0
  235. package/src/langwatch-api-dashboard-widgets.ts +112 -0
  236. package/src/langwatch-api-dashboards.ts +13 -10
  237. package/src/langwatch-api-datasets.ts +98 -32
  238. package/src/langwatch-api-evaluators.ts +13 -19
  239. package/src/langwatch-api-model-providers.ts +4 -4
  240. package/src/langwatch-api-monitors.ts +14 -18
  241. package/src/langwatch-api-projects.ts +27 -9
  242. package/src/langwatch-api-query.ts +114 -0
  243. package/src/langwatch-api-run-plans.ts +12 -29
  244. package/src/langwatch-api-scenarios.ts +9 -11
  245. package/src/langwatch-api-secrets.ts +31 -24
  246. package/src/langwatch-api-simulation-runs.ts +6 -8
  247. package/src/langwatch-api-test-suites.ts +14 -33
  248. package/src/langwatch-api-triggers.ts +96 -34
  249. package/src/langwatch-api-workflows.ts +9 -9
  250. package/src/langwatch-api.ts +108 -124
  251. package/src/public-http-request.ts +21 -12
  252. package/src/schemas/analytics-metrics.ts +3 -15
  253. package/src/schemas/create-dataset.ts +3 -4
  254. package/src/schemas/run-plan.ts +13 -29
  255. package/src/schemas/suite-fields.ts +6 -23
  256. package/src/schemas/triggers.ts +365 -0
  257. package/src/tools/add-dashboard-widget.ts +63 -0
  258. package/src/tools/archive-project.ts +2 -4
  259. package/src/tools/archive-run-plan.ts +2 -4
  260. package/src/tools/archive-scenario.ts +2 -4
  261. package/src/tools/archive-test-suite.ts +2 -4
  262. package/src/tools/assign-prompt-tag.ts +6 -2
  263. package/src/tools/create-agent.ts +1 -1
  264. package/src/tools/create-annotation.ts +7 -2
  265. package/src/tools/create-api-key.ts +4 -6
  266. package/src/tools/create-dashboard.ts +1 -1
  267. package/src/tools/create-dataset-records.ts +4 -8
  268. package/src/tools/create-dataset.ts +5 -7
  269. package/src/tools/create-evaluator.ts +3 -5
  270. package/src/tools/create-project.ts +2 -2
  271. package/src/tools/create-prompt-tag.ts +2 -4
  272. package/src/tools/create-prompt.ts +9 -18
  273. package/src/tools/create-scenario.ts +5 -7
  274. package/src/tools/create-test-suite.ts +4 -9
  275. package/src/tools/create-trigger.ts +55 -0
  276. package/src/tools/dashboard-exists.ts +25 -0
  277. package/src/tools/dashboard-widget-queries.ts +32 -0
  278. package/src/tools/delete-agent.ts +1 -1
  279. package/src/tools/delete-annotation.ts +1 -1
  280. package/src/tools/delete-dashboard.ts +1 -1
  281. package/src/tools/delete-dataset-records.ts +4 -8
  282. package/src/tools/delete-dataset.ts +3 -7
  283. package/src/tools/delete-evaluator.ts +4 -6
  284. package/src/tools/delete-prompt-tag.ts +2 -4
  285. package/src/tools/delete-workflow.ts +1 -1
  286. package/src/tools/discover-evaluator-schema.ts +34 -25
  287. package/src/tools/discover-scenario-schema.ts +41 -21
  288. package/src/tools/discover-schema.ts +149 -27
  289. package/src/tools/experiment-run-status.ts +2 -8
  290. package/src/tools/format-dataset-mutation.ts +5 -10
  291. package/src/tools/format-run-plan.ts +7 -21
  292. package/src/tools/format-scenario.ts +2 -4
  293. package/src/tools/format-suite-details.ts +6 -12
  294. package/src/tools/get-agent.ts +15 -6
  295. package/src/tools/get-analytics.ts +52 -46
  296. package/src/tools/get-dashboard.ts +1 -1
  297. package/src/tools/get-dataset.ts +34 -16
  298. package/src/tools/get-evaluator.ts +4 -11
  299. package/src/tools/get-experiment-results.ts +219 -186
  300. package/src/tools/get-project.ts +2 -4
  301. package/src/tools/get-prompt.ts +63 -84
  302. package/src/tools/get-run-plan.ts +4 -6
  303. package/src/tools/get-scenario.ts +4 -6
  304. package/src/tools/get-simulation-run.ts +27 -24
  305. package/src/tools/get-test-suite.ts +2 -5
  306. package/src/tools/get-trace.ts +16 -17
  307. package/src/tools/get-workflow.ts +1 -1
  308. package/src/tools/list-agents.ts +1 -1
  309. package/src/tools/list-annotations.ts +8 -5
  310. package/src/tools/list-api-keys.ts +7 -2
  311. package/src/tools/list-dashboard-boards.ts +28 -0
  312. package/src/tools/list-dashboards.ts +1 -1
  313. package/src/tools/list-dataset-records.ts +8 -6
  314. package/src/tools/list-datasets.ts +12 -23
  315. package/src/tools/list-evaluators.ts +4 -8
  316. package/src/tools/list-experiment-runs.ts +5 -9
  317. package/src/tools/list-experiments.ts +5 -11
  318. package/src/tools/list-model-providers.ts +3 -5
  319. package/src/tools/list-projects.ts +2 -4
  320. package/src/tools/list-prompt-tags.ts +3 -3
  321. package/src/tools/list-prompts.ts +4 -8
  322. package/src/tools/list-run-plans.ts +2 -2
  323. package/src/tools/list-scenarios.ts +14 -15
  324. package/src/tools/list-simulation-runs.ts +8 -4
  325. package/src/tools/list-test-suites.ts +1 -1
  326. package/src/tools/list-trigger-fires.ts +17 -0
  327. package/src/tools/list-triggers.ts +39 -0
  328. package/src/tools/list-workflows.ts +2 -4
  329. package/src/tools/rename-prompt-tag.ts +1 -1
  330. package/src/tools/rename-test-suite.ts +2 -5
  331. package/src/tools/report-issue.ts +5 -9
  332. package/src/tools/rerun-run-plan.ts +2 -5
  333. package/src/tools/revoke-api-key.ts +2 -4
  334. package/src/tools/run-agent.ts +29 -26
  335. package/src/tools/run-experiment.ts +36 -37
  336. package/src/tools/run-plan.ts +4 -7
  337. package/src/tools/run-query.ts +47 -0
  338. package/src/tools/run-test-suite.ts +4 -7
  339. package/src/tools/run-workflow.ts +2 -5
  340. package/src/tools/search-traces.ts +161 -47
  341. package/src/tools/set-model-provider.ts +4 -6
  342. package/src/tools/test-agent.ts +2 -2
  343. package/src/tools/update-agent.ts +1 -1
  344. package/src/tools/update-dashboard-widget.ts +97 -0
  345. package/src/tools/update-dataset-record.ts +1 -1
  346. package/src/tools/update-dataset.ts +5 -7
  347. package/src/tools/update-evaluator.ts +3 -5
  348. package/src/tools/update-project.ts +1 -1
  349. package/src/tools/update-prompt.ts +44 -59
  350. package/src/tools/update-scenario.ts +5 -7
  351. package/src/tools/update-test-suite.ts +6 -11
  352. package/src/utils/date-parsing.ts +1 -1
  353. package/src/utils/escape-markdown.ts +3 -8
  354. package/src/utils/format-evaluations.ts +6 -6
  355. package/src/utils/markdown-table.ts +58 -0
  356. package/src/utils/trace-id-shape.ts +20 -0
  357. package/tsconfig.app.json +24 -0
  358. package/tsconfig.json +14 -12
  359. package/vitest.integration.config.js +10 -0
  360. package/vitest.scenario.config.js +9 -0
  361. package/.eslintrc.cjs +0 -36
  362. package/dist/chunk-AN4OUA4D.js +0 -86
  363. package/dist/chunk-GELJ2MQR.js +0 -226
  364. package/dist/chunk-K37ZNPXK.js +0 -24
  365. package/dist/config.d.ts +0 -17
  366. package/dist/create-mcp-server.d.ts +0 -10
  367. package/dist/delete-evaluator-RKYC4TNB.js +0 -16
  368. package/dist/discover-evaluator-schema-ESSHQGPY.js +0 -1912
  369. package/dist/get-analytics-R6AZD3AW.js +0 -73
  370. package/dist/get-dataset-AKTYSQDI.js +0 -49
  371. package/dist/index.d.ts +0 -2
  372. package/dist/langwatch-api-secrets-OEBD6GBU.js +0 -41
  373. package/dist/langwatch-api-triggers-5E6DDGX6.js +0 -31
  374. package/dist/run-agent-CAGWGTYT.js +0 -72
  375. package/dist/search-traces-4XTJYXIK.js +0 -79
  376. package/src/__tests__/agent-tools.unit.test.ts +0 -257
  377. package/src/__tests__/all-tools.integration.test.ts +0 -1872
  378. package/src/__tests__/config.unit.test.ts +0 -202
  379. package/src/__tests__/datasets.integration.test.ts +0 -620
  380. package/src/__tests__/datasets.unit.test.ts +0 -244
  381. package/src/__tests__/date-parsing.unit.test.ts +0 -78
  382. package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
  383. package/src/__tests__/discover-schema.unit.test.ts +0 -118
  384. package/src/__tests__/docker.integration.test.ts +0 -318
  385. package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
  386. package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
  387. package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
  388. package/src/__tests__/experiment-status.unit.test.ts +0 -194
  389. package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
  390. package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
  391. package/src/__tests__/http-security-origin.unit.test.ts +0 -97
  392. package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
  393. package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
  394. package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
  395. package/src/__tests__/http-server-origin.integration.test.ts +0 -169
  396. package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
  397. package/src/__tests__/http-transport.integration.test.ts +0 -395
  398. package/src/__tests__/integration.integration.test.ts +0 -284
  399. package/src/__tests__/langwatch-api.unit.test.ts +0 -661
  400. package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
  401. package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
  402. package/src/__tests__/prompt-response-types.unit.test.ts +0 -51
  403. package/src/__tests__/prompts.integration.test.ts +0 -736
  404. package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
  405. package/src/__tests__/report-issue.integration.test.ts +0 -147
  406. package/src/__tests__/run-plan-tools.unit.test.ts +0 -565
  407. package/src/__tests__/scenario-tools.integration.test.ts +0 -286
  408. package/src/__tests__/scenario-tools.unit.test.ts +0 -207
  409. package/src/__tests__/schemas.unit.test.ts +0 -85
  410. package/src/__tests__/simulation-run-tools.unit.test.ts +0 -116
  411. package/src/__tests__/support/http-server-harness.ts +0 -138
  412. package/src/__tests__/test-suite-tools.unit.test.ts +0 -615
  413. package/src/__tests__/tools.integration.test.ts +0 -896
  414. package/src/schemas/filter-fields.ts +0 -119
  415. package/src/schemas/index.ts +0 -9
@@ -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
- });