@langwatch/mcp-server 2.0.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 (430) hide show
  1. package/.gitignore +7 -0
  2. package/.npmignore +41 -0
  3. package/CHANGELOG.md +280 -200
  4. package/CONTRIBUTING.md +10 -0
  5. package/README.md +82 -52
  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-4EQGLBJJ.js → archive-project-SPVHXK6A.js} +4 -4
  10. package/dist/archive-run-plan-65QN3XRX.js +16 -0
  11. package/dist/archive-run-plan-Z4SYE6BP.js +15 -0
  12. package/dist/{archive-scenario-W6BXYDZ3.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-NKZDZY3D.js +16 -0
  16. package/dist/assign-prompt-tag-5IUZXJ2T.js +23 -0
  17. package/dist/{assign-prompt-tag-VLXUWEKU.js → assign-prompt-tag-HBZLBIFD.js} +8 -4
  18. package/dist/{chunk-CDYQOY5U.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-6YZUOD34.js +55 -0
  22. package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
  23. package/dist/chunk-7VNSRCXO.js +129 -0
  24. package/dist/{chunk-7RHG56OH.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-TOXJQDIZ.js → chunk-HGELNIVY.js} +135 -51
  30. package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
  31. package/dist/{chunk-J42FWRJ2.js → chunk-I7ATIZED.js} +7 -7
  32. package/dist/{chunk-AQJO2EI5.js → chunk-ILZDO25L.js} +7 -10
  33. package/dist/{chunk-4QC7SA2L.js → chunk-J7PQKBLD.js} +884 -559
  34. package/dist/{chunk-YX3A3CFM.js → chunk-JRJPH75H.js} +7 -13
  35. package/dist/chunk-K2I7Z3LZ.js +28 -0
  36. package/dist/{chunk-5CCZFUXS.js → chunk-NKMTIHIJ.js} +6 -9
  37. package/dist/chunk-O7EMWEVJ.js +44 -0
  38. package/dist/chunk-PTDR56Z3.js +37 -0
  39. package/dist/chunk-RABYBFX5.js +43 -0
  40. package/dist/chunk-SUPUUC4W.js +64 -0
  41. package/dist/{chunk-SFB4MU6H.js → chunk-SXFC3FNH.js} +4 -4
  42. package/dist/chunk-U24EACC4.js +67 -0
  43. package/dist/chunk-UNJM3BIL.js +21 -0
  44. package/dist/{chunk-ZWIL4EFL.js → chunk-UTJCWXPZ.js} +4 -4
  45. package/dist/chunk-UWLE5T2F.js +312 -0
  46. package/dist/chunk-VMWJD732.js +57 -0
  47. package/dist/chunk-XUIJYNRJ.js +15 -0
  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-7XHO6UIS.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-YQXRQC6A.js → create-annotation-VUSXULQK.js} +10 -5
  57. package/dist/{create-api-key-YUS36KBU.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-4Z5JO5LB.js → create-dashboard-WTKKS5Z6.js} +4 -4
  61. package/dist/{create-dataset-E6NMSVX7.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-SKHPRD2K.js → create-dataset-records-W4GLN2FV.js} +5 -7
  65. package/dist/{create-evaluator-JXF5PF33.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 -5
  69. package/dist/create-project-6N7PIYRY.js +44 -0
  70. package/dist/{create-project-CS2CB57Y.js → create-project-KAIC46UY.js} +4 -4
  71. package/dist/{create-prompt-F5RMX3L3.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-GMRWTEFR.js → create-prompt-tag-OPQUEXWB.js} +3 -3
  75. package/dist/create-scenario-5PJBMAXO.js +33 -0
  76. package/dist/{create-scenario-JDR2VB2H.js → create-scenario-UEM77OE7.js} +11 -4
  77. package/dist/create-test-suite-4IPXVSFQ.js +37 -0
  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-O3EEH4S5.js → delete-agent-QMEK3XHK.js} +4 -4
  83. package/dist/delete-annotation-HY3O2OGR.js +17 -0
  84. package/dist/{delete-annotation-XP6FQM7A.js → delete-annotation-VKIQWUYW.js} +4 -4
  85. package/dist/delete-dashboard-76N66XXL.js +18 -0
  86. package/dist/{delete-dashboard-RFUNYCNP.js → delete-dashboard-JVIVHNJM.js} +4 -4
  87. package/dist/delete-dataset-HQCR66MG.js +18 -0
  88. package/dist/{delete-dataset-3MJFRDLP.js → delete-dataset-WKRUW4FP.js} +5 -7
  89. package/dist/{delete-dataset-records-WPMU5GL5.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-KNMZVSPB.js → delete-prompt-tag-YYQ4VMAD.js} +3 -3
  95. package/dist/{delete-workflow-3NUXO46U.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-OOFIQKOG.js +139 -0
  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-OTIYUFZA.js +70 -0
  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-KHBEGZGL.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-ADMKVWYZ.js → get-evaluator-ISMC4LLI.js} +4 -4
  112. package/dist/get-evaluator-XEUZGZCH.js +47 -0
  113. package/dist/{get-project-RAK7URQJ.js → get-project-5VKROSDH.js} +4 -4
  114. package/dist/get-project-RM6FRCBK.js +26 -0
  115. package/dist/get-prompt-OWXJZHQQ.js +95 -0
  116. package/dist/get-prompt-W52DY36E.js +94 -0
  117. package/dist/get-run-plan-BE3M2AUX.js +59 -0
  118. package/dist/get-run-plan-RUXQ6PAX.js +58 -0
  119. package/dist/get-scenario-RNM7BAX2.js +37 -0
  120. package/dist/{get-scenario-ZTAJJL5T.js → get-scenario-YM4ODWW6.js} +8 -4
  121. package/dist/get-simulation-run-6GIATQE5.js +69 -0
  122. package/dist/{get-simulation-run-T2ZQWYH2.js → get-simulation-run-LCFSMPGQ.js} +33 -20
  123. package/dist/get-test-suite-GC2O7YH6.js +49 -0
  124. package/dist/get-test-suite-P5LJ6VLF.js +48 -0
  125. package/dist/get-trace-KBRVV4NN.js +45 -0
  126. package/dist/{get-trace-K7U234Q4.js → get-trace-SEF3FMR5.js} +11 -13
  127. package/dist/get-workflow-7PVED7JE.js +25 -0
  128. package/dist/{get-workflow-L5L2PSK3.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-YXHFPPGA.js → http-server-IR4QOS43.js} +4071 -342
  131. package/dist/index.js +60221 -38077
  132. package/dist/langwatch-api-annotations-6SA4OB4C.js +17 -0
  133. package/dist/{langwatch-api-annotations-FDAS6NQ7.js → langwatch-api-annotations-TBHLCQ5R.js} +4 -4
  134. package/dist/langwatch-api-dashboards-6EO2VVZW.js +17 -0
  135. package/dist/{langwatch-api-dashboards-JTVCS7ZJ.js → langwatch-api-dashboards-NHU5BZD7.js} +4 -4
  136. package/dist/langwatch-api-monitors-CBF3FGIM.js +47 -0
  137. package/dist/{langwatch-api-monitors-3J7UIQME.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-NBJX5KOG.js → langwatch-api-workflows-OKC4FXIF.js} +4 -4
  143. package/dist/langwatch-api-workflows-XGJE6SR5.js +15 -0
  144. package/dist/list-agents-HVYWEQMI.js +43 -0
  145. package/dist/list-agents-RBAOCF53.js +42 -0
  146. package/dist/list-annotations-HJH4NBLD.js +38 -0
  147. package/dist/{list-annotations-ZTVP4EEL.js → list-annotations-J4UAHSUN.js} +10 -5
  148. package/dist/{list-api-keys-CWD4UQT5.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-PWG6P6KR.js → list-dashboards-ROSYFLDQ.js} +4 -4
  153. package/dist/list-dashboards-RQ635ZU7.js +32 -0
  154. package/dist/{list-dataset-records-IOE7LQXS.js → list-dataset-records-M5TKA6LK.js} +14 -10
  155. package/dist/list-dataset-records-WFM7F33C.js +43 -0
  156. package/dist/{list-datasets-ZT4JYUDT.js → list-datasets-B5X4P7BQ.js} +9 -13
  157. package/dist/list-datasets-THUKQHPX.js +56 -0
  158. package/dist/{list-evaluators-SJHC7VBH.js → list-evaluators-MYH2OVCI.js} +5 -7
  159. package/dist/list-evaluators-NLVWF6K7.js +32 -0
  160. package/dist/{list-model-providers-PPD2WPD2.js → list-model-providers-3JUGP4YI.js} +4 -4
  161. package/dist/list-model-providers-H3XKORFO.js +35 -0
  162. package/dist/{list-projects-K7QAIX2I.js → list-projects-6EJ5YYEW.js} +5 -7
  163. package/dist/list-projects-YNNSRMLC.js +40 -0
  164. package/dist/{list-prompt-tags-FOO6TNHB.js → list-prompt-tags-NVFQO6WX.js} +3 -3
  165. package/dist/list-prompt-tags-XUQTTAH4.js +23 -0
  166. package/dist/{list-prompts-SC2HAUFG.js → list-prompts-HSIMMHTF.js} +4 -6
  167. package/dist/list-prompts-IRI6AIXO.js +30 -0
  168. package/dist/list-run-plans-PX2XI6EK.js +46 -0
  169. package/dist/list-run-plans-QALLCN2K.js +45 -0
  170. package/dist/list-scenarios-QZRPVHS4.js +46 -0
  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-KF5THG5H.js → list-simulation-runs-OEADLLQR.js} +19 -9
  174. package/dist/list-test-suites-ANAQBLDG.js +34 -0
  175. package/dist/list-test-suites-N4WVLBKK.js +35 -0
  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-QSJWURCK.js → list-workflows-IMSX7SXU.js} +5 -7
  181. package/dist/list-workflows-ZHTX5LCL.js +33 -0
  182. package/dist/{rename-prompt-tag-EKWU5QF3.js → rename-prompt-tag-IQI7MHOI.js} +3 -3
  183. package/dist/rename-prompt-tag-PA2BRIE6.js +18 -0
  184. package/dist/rename-test-suite-4J7UX5S2.js +21 -0
  185. package/dist/rename-test-suite-NNVLMLKY.js +20 -0
  186. package/dist/report-issue-AS34ZMJF.js +898 -0
  187. package/dist/report-issue-DCZFLGDO.js +899 -0
  188. package/dist/rerun-run-plan-TG2V4WM4.js +22 -0
  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-FTRTZMOF.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-PAARQSI4.js +39 -0
  196. package/dist/run-query-KJDH544C.js +47 -0
  197. package/dist/run-query-T4QW2Z5O.js +46 -0
  198. package/dist/run-test-suite-SQJELEZX.js +26 -0
  199. package/dist/run-test-suite-STB6NUJM.js +25 -0
  200. package/dist/{run-workflow-QPXC627O.js → run-workflow-D6PQNBI6.js} +4 -4
  201. package/dist/{run-agent-6SM4XNA7.js → run-workflow-SP32SO5M.js} +10 -11
  202. package/dist/search-traces-HCBGOG6R.js +170 -0
  203. package/dist/search-traces-HSTQ6WTQ.js +171 -0
  204. package/dist/{set-model-provider-3WKT63ZN.js → set-model-provider-GF7NXUJA.js} +4 -4
  205. package/dist/set-model-provider-KDQ7C4EZ.js +33 -0
  206. package/dist/{update-agent-SMAEHLXH.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-BDUK7TUO.js → update-dataset-SQZ6T4WX.js} +6 -6
  212. package/dist/{update-dataset-record-4ZSDRBSW.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-LS6TIBY7.js → update-evaluator-IGTX6PX4.js} +4 -4
  216. package/dist/{update-project-LKVYXENH.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-MY263DYF.js +141 -0
  220. package/dist/update-scenario-7KA3JDXA.js +34 -0
  221. package/dist/{update-scenario-NEXCAQI7.js → update-scenario-MOHRQKAQ.js} +11 -4
  222. package/package.json +39 -44
  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 +1021 -596
  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 +202 -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 +140 -0
  244. package/src/langwatch-api-scenarios.ts +17 -10
  245. package/src/langwatch-api-secrets.ts +31 -24
  246. package/src/langwatch-api-simulation-runs.ts +10 -7
  247. package/src/langwatch-api-test-suites.ts +116 -0
  248. package/src/langwatch-api-triggers.ts +96 -34
  249. package/src/langwatch-api-workflows.ts +9 -9
  250. package/src/langwatch-api.ts +143 -109
  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 +76 -0
  255. package/src/schemas/suite-fields.ts +132 -0
  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 +10 -0
  260. package/src/tools/archive-scenario.ts +2 -4
  261. package/src/tools/archive-test-suite.ts +10 -0
  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 +11 -5
  274. package/src/tools/create-test-suite.ts +38 -0
  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 +86 -12
  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 +54 -0
  292. package/src/tools/format-scenario.ts +12 -0
  293. package/src/tools/format-suite-details.ts +90 -0
  294. package/src/tools/get-agent.ts +54 -3
  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 +100 -37
  302. package/src/tools/get-run-plan.ts +60 -0
  303. package/src/tools/get-scenario.ts +6 -5
  304. package/src/tools/get-simulation-run.ts +32 -20
  305. package/src/tools/get-test-suite.ts +46 -0
  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 +20 -3
  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 +47 -0
  323. package/src/tools/list-scenarios.ts +26 -17
  324. package/src/tools/list-simulation-runs.ts +13 -5
  325. package/src/tools/list-test-suites.ts +35 -0
  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 +15 -0
  331. package/src/tools/report-issue.ts +5 -9
  332. package/src/tools/rerun-run-plan.ts +18 -0
  333. package/src/tools/revoke-api-key.ts +2 -4
  334. package/src/tools/run-agent.ts +65 -14
  335. package/src/tools/run-experiment.ts +36 -37
  336. package/src/tools/run-plan.ts +46 -0
  337. package/src/tools/run-query.ts +47 -0
  338. package/src/tools/run-test-suite.ts +27 -0
  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 +18 -0
  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 +185 -15
  350. package/src/tools/update-scenario.ts +11 -5
  351. package/src/tools/update-test-suite.ts +40 -0
  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 +19 -12
  359. package/uv.lock +416 -296
  360. package/vitest.integration.config.js +10 -0
  361. package/vitest.scenario.config.js +9 -0
  362. package/.eslintrc.cjs +0 -36
  363. package/dist/archive-suite-4T6BSRS7.js +0 -16
  364. package/dist/chunk-77BNWQ3U.js +0 -86
  365. package/dist/chunk-A2LEVYQ5.js +0 -217
  366. package/dist/chunk-TJCXFNDT.js +0 -24
  367. package/dist/chunk-YZLYHLLI.js +0 -48
  368. package/dist/config.d.ts +0 -17
  369. package/dist/create-mcp-server.d.ts +0 -10
  370. package/dist/create-suite-LZS6QIAF.js +0 -39
  371. package/dist/delete-evaluator-33SP2JFX.js +0 -16
  372. package/dist/discover-evaluator-schema-XTAD4X7D.js +0 -2191
  373. package/dist/discover-scenario-schema-FE64QK2D.js +0 -67
  374. package/dist/get-agent-Y7MWZ65F.js +0 -29
  375. package/dist/get-analytics-TETCSOK6.js +0 -73
  376. package/dist/get-dataset-RCMU5VAH.js +0 -49
  377. package/dist/get-prompt-OY5B7TRI.js +0 -46
  378. package/dist/get-suite-J7JVWO6O.js +0 -45
  379. package/dist/index.d.ts +0 -2
  380. package/dist/langwatch-api-secrets-BUBSNCNO.js +0 -41
  381. package/dist/langwatch-api-triggers-EDFUCJN6.js +0 -31
  382. package/dist/list-agents-KFHKGPXV.js +0 -33
  383. package/dist/list-scenarios-F2WYNRIE.js +0 -41
  384. package/dist/list-suites-CRY4VWW6.js +0 -43
  385. package/dist/report-issue-XYVAPAYJ.js +0 -412
  386. package/dist/run-suite-NKZCJ2IN.js +0 -30
  387. package/dist/search-traces-A6HFKPLJ.js +0 -79
  388. package/dist/update-prompt-ODCRQRN6.js +0 -25
  389. package/dist/update-suite-SNO3GS7T.js +0 -40
  390. package/src/__tests__/all-tools.integration.test.ts +0 -1626
  391. package/src/__tests__/config.unit.test.ts +0 -202
  392. package/src/__tests__/datasets.integration.test.ts +0 -620
  393. package/src/__tests__/datasets.unit.test.ts +0 -244
  394. package/src/__tests__/date-parsing.unit.test.ts +0 -78
  395. package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
  396. package/src/__tests__/discover-schema.unit.test.ts +0 -118
  397. package/src/__tests__/docker.integration.test.ts +0 -318
  398. package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
  399. package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
  400. package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
  401. package/src/__tests__/experiment-status.unit.test.ts +0 -194
  402. package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
  403. package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
  404. package/src/__tests__/http-security-origin.unit.test.ts +0 -97
  405. package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
  406. package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
  407. package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
  408. package/src/__tests__/http-server-origin.integration.test.ts +0 -169
  409. package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
  410. package/src/__tests__/http-transport.integration.test.ts +0 -395
  411. package/src/__tests__/integration.integration.test.ts +0 -288
  412. package/src/__tests__/langwatch-api.unit.test.ts +0 -661
  413. package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
  414. package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
  415. package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
  416. package/src/__tests__/report-issue.integration.test.ts +0 -147
  417. package/src/__tests__/scenario-tools.integration.test.ts +0 -286
  418. package/src/__tests__/scenario-tools.unit.test.ts +0 -188
  419. package/src/__tests__/schemas.unit.test.ts +0 -85
  420. package/src/__tests__/support/http-server-harness.ts +0 -138
  421. package/src/__tests__/tools.unit.test.ts +0 -924
  422. package/src/langwatch-api-suites.ts +0 -118
  423. package/src/schemas/filter-fields.ts +0 -119
  424. package/src/schemas/index.ts +0 -4
  425. package/src/tools/archive-suite.ts +0 -12
  426. package/src/tools/create-suite.ts +0 -42
  427. package/src/tools/get-suite.ts +0 -47
  428. package/src/tools/list-suites.ts +0 -43
  429. package/src/tools/run-suite.ts +0 -28
  430. package/src/tools/update-suite.ts +0 -44
@@ -0,0 +1,241 @@
1
+ // src/schemas/triggers.ts
2
+ import { z } from "zod";
3
+ var triggerActionSchema = z.enum([
4
+ "SEND_EMAIL",
5
+ "SEND_SLACK_MESSAGE",
6
+ "SEND_WEBHOOK",
7
+ "ADD_TO_DATASET",
8
+ "ADD_TO_ANNOTATION_QUEUE"
9
+ ]);
10
+ var alertTypeSchema = z.enum(["CRITICAL", "WARNING", "INFO"]);
11
+ var emailActionParamsSchema = z.object({
12
+ members: z.array(z.string()).min(1).describe("Who receives the email. Any address, not only teammates.")
13
+ }).passthrough();
14
+ var slackActionParamsSchema = z.object({
15
+ slackIntegrationId: z.string().optional().describe(
16
+ "The Slack connection to post through (an organization connection or one of this project's; they are listed in LangWatch under Settings, Integrations, Slack). A bot connection also needs `slackChannelId`; a webhook connection needs nothing else. Preferred over `slackWebhook` and `slackBotToken`."
17
+ ),
18
+ slackDelivery: z.enum(["webhook", "bot"]).optional().describe(
19
+ "How the message reaches Slack. `webhook` posts to an incoming webhook URL, `bot` posts as the LangWatch Slack app. With `slackIntegrationId` it follows the connection's kind. Absent without a connection means `webhook`."
20
+ ),
21
+ slackWebhook: z.string().optional().describe(
22
+ "Legacy, accepted for one release: an incoming webhook URL (https://hooks.slack.com/...). It is stored as a Slack connection and the automation keeps only the connection id. Send `slackIntegrationId` instead."
23
+ ),
24
+ slackChannelId: z.string().optional().describe("The channel the bot posts in, for a bot connection or `bot` delivery."),
25
+ slackBotToken: z.string().optional().describe(
26
+ "Legacy, accepted for one release: a bot token, stored as a Slack connection. It never reads back. Send `slackIntegrationId` instead."
27
+ ),
28
+ slackBotTokenSet: z.boolean().optional().describe(
29
+ "Legacy. Read: whether an automation not yet moved to a connection stores its own bot token. Write: true keeps it."
30
+ )
31
+ }).passthrough();
32
+ var webhookActionParamsSchema = z.object({
33
+ url: z.string().describe("Where the request goes. https only, and not a private host."),
34
+ method: z.enum(["POST", "PUT", "PATCH"]).optional(),
35
+ headers: z.record(z.string(), z.string()).optional().describe(
36
+ "Static headers sent with every delivery. The values are credentials: they read back as [redacted], and sending [redacted] back keeps the stored ones. Changing `url` means sending the values again in the same call."
37
+ ),
38
+ bodyTemplate: z.string().nullable().optional().describe(
39
+ "A Liquid template for the JSON body. Absent sends the standard LangWatch envelope."
40
+ ),
41
+ signingSecret: z.string().nullable().optional().describe("Signs every delivery so the receiver can verify it.")
42
+ }).passthrough();
43
+ var datasetActionParamsSchema = z.object({
44
+ datasetId: z.string().describe("The dataset matched traces are appended to."),
45
+ datasetMapping: z.object({
46
+ mapping: z.record(z.string(), z.unknown()),
47
+ expansions: z.array(z.string()).optional()
48
+ }).describe("How a trace becomes a row in that dataset.")
49
+ }).passthrough();
50
+ var annotationQueueActionParamsSchema = z.object({
51
+ annotators: z.array(z.object({ id: z.string(), name: z.string() })).min(1).describe("Who the queued items go to.")
52
+ }).passthrough();
53
+ var actionParamsSchema = z.union([
54
+ emailActionParamsSchema,
55
+ slackActionParamsSchema,
56
+ webhookActionParamsSchema,
57
+ datasetActionParamsSchema,
58
+ annotationQueueActionParamsSchema
59
+ ]);
60
+ var slackActionParamsWriteSchema = slackActionParamsSchema.superRefine((params, ctx) => {
61
+ const delivery = params.slackDelivery ?? "webhook";
62
+ if (delivery === "bot" && !params.slackChannelId) {
63
+ ctx.addIssue({
64
+ code: "custom",
65
+ path: ["slackChannelId"],
66
+ message: params.slackIntegrationId ? "a bot connection needs the channel to post in" : "bot delivery needs the channel to post in"
67
+ });
68
+ }
69
+ if (params.slackIntegrationId) return;
70
+ if (delivery === "webhook" && !params.slackWebhook) {
71
+ ctx.addIssue({
72
+ code: "custom",
73
+ path: ["slackIntegrationId"],
74
+ message: "name the Slack connection to post through"
75
+ });
76
+ }
77
+ if (delivery === "bot" && !params.slackBotToken && params.slackBotTokenSet !== true) {
78
+ ctx.addIssue({
79
+ code: "custom",
80
+ path: ["slackIntegrationId"],
81
+ message: "bot delivery needs the Slack connection to post through"
82
+ });
83
+ }
84
+ });
85
+ var ACTION_PARAMS_SCHEMA_BY_ACTION = {
86
+ SEND_EMAIL: emailActionParamsSchema,
87
+ SEND_SLACK_MESSAGE: slackActionParamsWriteSchema,
88
+ SEND_WEBHOOK: webhookActionParamsSchema,
89
+ ADD_TO_DATASET: datasetActionParamsSchema,
90
+ ADD_TO_ANNOTATION_QUEUE: annotationQueueActionParamsSchema
91
+ };
92
+ function validateActionParamsForAction({
93
+ action,
94
+ actionParams
95
+ }) {
96
+ const schema = ACTION_PARAMS_SCHEMA_BY_ACTION[action] ?? actionParamsSchema;
97
+ const parsed = schema.safeParse(actionParams);
98
+ if (parsed.success) return { ok: true };
99
+ const issues = parsed.error.issues.map((issue) => `${issue.path.join(".") || "(actionParams)"}: ${issue.message}`).join("; ");
100
+ return {
101
+ ok: false,
102
+ message: `actionParams does not fit ${action} \u2014 ${issues}`
103
+ };
104
+ }
105
+ var TRIGGER_FILTERS_DESCRIPTION = [
106
+ "Trace conditions as a JSON object string.",
107
+ 'Unkeyed fields take a list of values: {"traces.error":["true"]}.',
108
+ 'Keyed fields nest a key above the list. evaluations.* is keyed by the MONITOR id (the `id` from `platform_list_monitors` / GET /api/v1/monitors, not its evaluatorId): {"evaluations.passed":{"<monitorId>":["false"]}}.',
109
+ 'metadata.value is keyed by the metadata key: {"metadata.value":{"<key>":["true"]}}.',
110
+ "A keyed field sent as a bare list, or keyed by anything but a monitor id, is refused."
111
+ ].join(" ");
112
+ var TRIGGER_FILTER_QUERY_DESCRIPTION = [
113
+ "Trace query in the syntax the traces view uses; the alternative to `filters`, and it supersedes them.",
114
+ 'Examples: status:error \xB7 evaluator:"<evaluator name>" AND evaluatorVerdict:fail \xB7 trace.attribute.<key>:<value>.'
115
+ ].join(" ");
116
+ var SLACK_DELIVERY_NOTE = 'For SEND_SLACK_MESSAGE, send {"slackIntegrationId":"<connection id>"} for a webhook connection, or {"slackIntegrationId":"<connection id>","slackChannelId":"C..."} for a bot connection. Slack connections are listed and added in LangWatch under Settings, Integrations, Slack (organization-wide or for one project); they are also listed by GET /api/v1/slack-connections and `langwatch slack-connection list`, or ask the user for the id. slackIntegrationId is preferred: a legacy {"slackWebhook":"https://hooks.slack.com/..."} or {"slackDelivery":"bot","slackBotToken":"xoxb-...","slackChannelId":"C..."} is still accepted for one release and is stored as a connection. A Slack automation with no connection will never post.';
117
+ var graphAlertSchema = z.object({
118
+ seriesName: z.string().describe("The series on the graph to watch."),
119
+ operator: z.enum(["gt", "lt", "gte", "lte", "eq"]),
120
+ threshold: z.number(),
121
+ timePeriod: z.union([
122
+ z.literal(1),
123
+ z.literal(5),
124
+ z.literal(15),
125
+ z.literal(30),
126
+ z.literal(60),
127
+ z.literal(1440)
128
+ ]).describe("The window, in minutes, the series is read over.")
129
+ }).describe("The rule an alert fires by. Send it with `customGraphId` and `alertType`.");
130
+ var reportSchema = z.object({
131
+ source: z.discriminatedUnion("kind", [
132
+ z.object({
133
+ kind: z.literal("dashboard"),
134
+ dashboardId: z.string()
135
+ }),
136
+ z.object({
137
+ kind: z.literal("customGraph"),
138
+ customGraphId: z.string()
139
+ }),
140
+ z.object({
141
+ kind: z.literal("traceQuery"),
142
+ filters: z.record(z.string(), z.unknown()).optional(),
143
+ metric: z.string().optional(),
144
+ topN: z.number().int().min(1).max(100).optional()
145
+ })
146
+ ]).describe("What the report renders: a dashboard, one graph, or a table of traces."),
147
+ schedule: z.object({
148
+ cron: z.string().describe(
149
+ 'A 5-field cron expression (minute hour day-of-month month day-of-week), for example "0 9 * * 1". It can send at most every 15 minutes.'
150
+ ),
151
+ timezone: z.string().describe('An IANA timezone, for example "Europe/Amsterdam" or "UTC".')
152
+ }).describe("When it sends."),
153
+ compareToPrevious: z.boolean().optional().describe("Include a this-period-versus-last comparison.")
154
+ }).describe(
155
+ "What a scheduled report renders and when. Send it with a channel that can carry a message: email or Slack."
156
+ );
157
+ var templatesSchema = z.object({
158
+ slackTemplateType: z.enum(["string", "block_kit"]).nullable().optional(),
159
+ slackTemplate: z.string().nullable().optional(),
160
+ emailSubjectTemplate: z.string().nullable().optional(),
161
+ emailBodyTemplate: z.string().nullable().optional()
162
+ }).describe(
163
+ "The Liquid templates the message is rendered from. Absent fields render the LangWatch default."
164
+ );
165
+ var notificationCadenceSchema = z.enum(["immediate", "5min_digest", "15min_digest", "hourly_digest"]).describe(
166
+ "How often a notification automation may send. A new one starts on a five-minute digest."
167
+ );
168
+ var triggerSchema = z.object({
169
+ id: z.string(),
170
+ name: z.string(),
171
+ action: z.string(),
172
+ /** Where it delivers. The rule it fires by is stated separately, below,
173
+ * the same way a write states it. */
174
+ actionParams: z.record(z.string(), z.unknown()).default({}),
175
+ graphAlert: graphAlertSchema.nullable().optional(),
176
+ // A read stays tolerant of a deployment that words this differently; a
177
+ // write is held to `reportSchema`.
178
+ report: z.record(z.string(), z.unknown()).nullable().optional(),
179
+ filters: z.record(z.string(), z.unknown()).default({}),
180
+ filterQuery: z.string().nullable().optional(),
181
+ kind: z.string().optional(),
182
+ customGraphId: z.string().nullable().optional(),
183
+ notificationCadence: z.string().nullable().optional(),
184
+ traceDebounceMs: z.number().nullable().optional(),
185
+ templates: z.record(z.string(), z.unknown()).optional(),
186
+ active: z.boolean(),
187
+ message: z.string().nullable(),
188
+ alertType: z.string().nullable(),
189
+ createdAt: z.string(),
190
+ updatedAt: z.string(),
191
+ platformUrl: z.string().optional()
192
+ }).passthrough();
193
+ var triggerFireSchema = z.object({
194
+ id: z.string(),
195
+ triggerId: z.string(),
196
+ customGraphId: z.string().nullable(),
197
+ firedAt: z.string(),
198
+ resolvedAt: z.string().nullable()
199
+ }).passthrough();
200
+ var triggerFirePageSchema = z.union([
201
+ z.array(triggerFireSchema).transform((fires) => ({ fires, nextCursor: null })),
202
+ z.object({
203
+ fires: z.array(triggerFireSchema).optional(),
204
+ data: z.array(triggerFireSchema).optional(),
205
+ nextCursor: z.string().nullable().optional()
206
+ }).transform(({ fires, data, nextCursor }) => ({
207
+ fires: fires ?? data ?? [],
208
+ nextCursor: nextCursor ?? null
209
+ }))
210
+ ]);
211
+ var testFireResultSchema = z.object({
212
+ channel: z.string(),
213
+ recipientCount: z.number(),
214
+ usedDefault: z.boolean(),
215
+ missingVariables: z.array(z.string()).default([]),
216
+ errors: z.array(z.string()).default([]),
217
+ httpStatus: z.number().optional()
218
+ }).passthrough();
219
+ var deletedTriggerSchema = z.object({
220
+ id: z.string(),
221
+ deleted: z.boolean()
222
+ });
223
+
224
+ export {
225
+ triggerActionSchema,
226
+ alertTypeSchema,
227
+ actionParamsSchema,
228
+ validateActionParamsForAction,
229
+ TRIGGER_FILTERS_DESCRIPTION,
230
+ TRIGGER_FILTER_QUERY_DESCRIPTION,
231
+ SLACK_DELIVERY_NOTE,
232
+ graphAlertSchema,
233
+ reportSchema,
234
+ templatesSchema,
235
+ notificationCadenceSchema,
236
+ triggerSchema,
237
+ triggerFirePageSchema,
238
+ testFireResultSchema,
239
+ deletedTriggerSchema
240
+ };
241
+ //# sourceMappingURL=chunk-3YLN3ATJ.js.map
@@ -0,0 +1,91 @@
1
+ import {
2
+ getBoard
3
+ } from "./chunk-K2I7Z3LZ.js";
4
+ import {
5
+ LangWatchApiError,
6
+ makeRequest
7
+ } from "./chunk-UWLE5T2F.js";
8
+
9
+ // src/langwatch-api-dashboard-widgets.ts
10
+ async function createDashboardWidget(params) {
11
+ const { projectId, ...data } = params;
12
+ return makeRequest(
13
+ "POST",
14
+ `/api/v1/projects/${encodeURIComponent(projectId)}/analytics/dashboard-widgets`,
15
+ data
16
+ );
17
+ }
18
+ async function getDashboardWidget(params) {
19
+ return makeRequest(
20
+ "GET",
21
+ `/api/v1/projects/${encodeURIComponent(params.projectId)}/analytics/dashboard-widgets/${encodeURIComponent(params.widgetId)}`
22
+ );
23
+ }
24
+ async function updateDashboardWidget(params) {
25
+ const { projectId, widgetId, ...data } = params;
26
+ return makeRequest(
27
+ "PATCH",
28
+ `/api/v1/projects/${encodeURIComponent(projectId)}/analytics/dashboard-widgets/${encodeURIComponent(widgetId)}`,
29
+ data
30
+ );
31
+ }
32
+ async function assignDashboardWidgetToDashboard(params) {
33
+ return makeRequest(
34
+ "POST",
35
+ `/api/v1/projects/${encodeURIComponent(params.projectId)}/analytics/dashboard-widgets/${encodeURIComponent(params.widgetId)}/dashboard`,
36
+ { dashboardId: params.dashboardId }
37
+ );
38
+ }
39
+ async function deleteDashboardWidget(params) {
40
+ await makeRequest(
41
+ "DELETE",
42
+ `/api/v1/projects/${encodeURIComponent(params.projectId)}/analytics/dashboard-widgets/${encodeURIComponent(params.widgetId)}`
43
+ );
44
+ }
45
+
46
+ // src/tools/dashboard-exists.ts
47
+ async function assertDashboardExists({
48
+ projectId,
49
+ dashboardId
50
+ }) {
51
+ try {
52
+ await getBoard({ projectId, boardId: dashboardId });
53
+ } catch (error) {
54
+ if (error instanceof LangWatchApiError && error.status === 404) {
55
+ throw new Error(
56
+ `No dashboard with ID "${dashboardId}" was found in this project. Use list_dashboard_boards to find a valid dashboard ID.`
57
+ );
58
+ }
59
+ throw error;
60
+ }
61
+ }
62
+
63
+ // src/tools/dashboard-widget-queries.ts
64
+ var MAX_DASHBOARD_WIDGET_QUERIES = 8;
65
+ function normalizeDashboardWidgetQueries({
66
+ queries
67
+ }) {
68
+ const normalized = Array.isArray(queries) ? queries : Object.entries(queries).map(([name, sql]) => ({ name, sql }));
69
+ if (normalized.length === 0) {
70
+ throw new Error(
71
+ "Provide at least one named LWQL query in `queries`. Validate each query's SQL first with run_query."
72
+ );
73
+ }
74
+ if (normalized.length > MAX_DASHBOARD_WIDGET_QUERIES) {
75
+ throw new Error(
76
+ `A widget may declare at most ${MAX_DASHBOARD_WIDGET_QUERIES} queries, got ${normalized.length}.`
77
+ );
78
+ }
79
+ return normalized;
80
+ }
81
+
82
+ export {
83
+ createDashboardWidget,
84
+ getDashboardWidget,
85
+ updateDashboardWidget,
86
+ assignDashboardWidgetToDashboard,
87
+ deleteDashboardWidget,
88
+ assertDashboardExists,
89
+ normalizeDashboardWidgetQueries
90
+ };
91
+ //# sourceMappingURL=chunk-5FNCQRCX.js.map
@@ -0,0 +1,55 @@
1
+ // src/tools/format-suite-details.ts
2
+ function describeMapping(mapping) {
3
+ return mapping.type === "value" ? JSON.stringify(mapping.value) : `${mapping.sourceId}.${mapping.path.join(".")}`;
4
+ }
5
+ function formatSuiteFields(fields) {
6
+ if (!fields || fields.length === 0) return [];
7
+ return ["\n## Fields", ...fields.map((field) => `- ${field.identifier} (${field.type})`)];
8
+ }
9
+ function formatEvaluatorAttachments(evaluators) {
10
+ if (!evaluators || evaluators.length === 0) return [];
11
+ const lines = ["\n## Evaluators"];
12
+ for (const attachment of evaluators) {
13
+ const gate = attachment.required ? "required" : "reports only";
14
+ lines.push(`- ${attachment.evaluatorId} (${gate}, attachment ${attachment.id})`);
15
+ for (const [input, mapping] of Object.entries(attachment.mappings)) {
16
+ lines.push(` - ${input}: ${describeMapping(mapping)}`);
17
+ }
18
+ }
19
+ return lines;
20
+ }
21
+ var PENDING_EVALUATION_STATUS = "PENDING_EVALUATION";
22
+ function formatRunStatus(status) {
23
+ if (status === PENDING_EVALUATION_STATUS) return "evaluating";
24
+ if (status === "SUCCESS") return "pass";
25
+ if (status === "FAILED") return "FAIL";
26
+ return status;
27
+ }
28
+ function pendingEvaluationNote(status) {
29
+ if (status !== PENDING_EVALUATION_STATUS) return [];
30
+ return [
31
+ "> The evaluators attached to this run have not been recorded yet. A required one may still fail it, so read the verdict again once the status changes."
32
+ ];
33
+ }
34
+ function formatEvaluations(evaluations) {
35
+ if (!evaluations || evaluations.length === 0) return [];
36
+ const lines = ["\n## Evaluators"];
37
+ for (const evaluation of evaluations) {
38
+ const parts = [evaluation.status];
39
+ if (evaluation.score !== void 0) parts.push(`score ${evaluation.score}`);
40
+ if (evaluation.label !== void 0) parts.push(evaluation.label);
41
+ if (evaluation.required) parts.push("required");
42
+ lines.push(`- **${evaluation.name}**: ${parts.join(", ")}`);
43
+ if (evaluation.details) lines.push(` ${evaluation.details}`);
44
+ }
45
+ return lines;
46
+ }
47
+
48
+ export {
49
+ formatSuiteFields,
50
+ formatEvaluatorAttachments,
51
+ formatRunStatus,
52
+ pendingEvaluationNote,
53
+ formatEvaluations
54
+ };
55
+ //# sourceMappingURL=chunk-6YZUOD34.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  escapeMarkdown
3
- } from "./chunk-NUFPTHKU.js";
3
+ } from "./chunk-FOKVY3BK.js";
4
4
 
5
5
  // src/tools/format-dataset-mutation.ts
6
6
  function formatDatasetMutationDetails(result) {
@@ -18,4 +18,4 @@ function formatDatasetMutationDetails(result) {
18
18
  export {
19
19
  formatDatasetMutationDetails
20
20
  };
21
- //# sourceMappingURL=chunk-WVI5CJ6S.js.map
21
+ //# sourceMappingURL=chunk-7AQLPVFL.js.map
@@ -0,0 +1,129 @@
1
+ import {
2
+ LangWatchApiError,
3
+ makeRequest
4
+ } from "./chunk-UWLE5T2F.js";
5
+
6
+ // src/langwatch-api-datasets.ts
7
+ var DATASET_PREVIEW_MAX_RECORDS = 100;
8
+ var DATASET_PREVIEW_MAX_BYTES = 1024 * 1024;
9
+ async function listDatasets(params) {
10
+ const query = new URLSearchParams();
11
+ if (params?.page != null) query.set("page", String(params.page));
12
+ if (params?.limit != null) query.set("limit", String(params.limit));
13
+ const qs = query.toString();
14
+ const path = qs ? `/api/v1/dataset?${qs}` : "/api/v1/dataset";
15
+ return makeRequest("GET", path);
16
+ }
17
+ async function getDataset(slugOrId) {
18
+ const page = await readPreviewPage(slugOrId);
19
+ if (!page?.dataset) {
20
+ return makeRequest(
21
+ "GET",
22
+ `/api/v1/dataset/${encodeURIComponent(slugOrId)}`
23
+ );
24
+ }
25
+ const data = [];
26
+ let bytes = 0;
27
+ for (const record of page.data) {
28
+ bytes += JSON.stringify(record).length;
29
+ if (bytes > DATASET_PREVIEW_MAX_BYTES) break;
30
+ data.push(record);
31
+ }
32
+ const { id, name, slug, columnTypes, createdAt, updatedAt } = page.dataset;
33
+ const totalRecords = page.pagination.total;
34
+ return {
35
+ id,
36
+ name,
37
+ slug,
38
+ columnTypes,
39
+ createdAt,
40
+ updatedAt,
41
+ data,
42
+ totalRecords,
43
+ omittedRecords: Math.max(0, totalRecords - data.length)
44
+ };
45
+ }
46
+ async function readPreviewPage(slugOrId) {
47
+ let limit = DATASET_PREVIEW_MAX_RECORDS;
48
+ for (; ; ) {
49
+ try {
50
+ return await listDatasetRecords({ slugOrId, page: 1, limit });
51
+ } catch (error) {
52
+ if (!(error instanceof LangWatchApiError)) throw error;
53
+ if (error.status === 404) return null;
54
+ if (error.status !== 413 || limit <= 1) throw error;
55
+ limit = smallerLimit(limit, error.responseBody);
56
+ }
57
+ }
58
+ }
59
+ function smallerLimit(limit, responseBody) {
60
+ const half = Math.max(1, Math.floor(limit / 2));
61
+ try {
62
+ const suggested = JSON.parse(responseBody).meta?.suggestedLimit;
63
+ const usable = typeof suggested === "number" && Number.isInteger(suggested) && suggested >= 1 && suggested < limit;
64
+ return usable ? suggested : half;
65
+ } catch {
66
+ return half;
67
+ }
68
+ }
69
+ async function createDataset(data) {
70
+ return makeRequest("POST", "/api/v1/dataset", data);
71
+ }
72
+ async function updateDataset(params) {
73
+ const { slugOrId, ...data } = params;
74
+ return makeRequest(
75
+ "PATCH",
76
+ `/api/v1/dataset/${encodeURIComponent(slugOrId)}`,
77
+ data
78
+ );
79
+ }
80
+ async function deleteDataset(slugOrId) {
81
+ return makeRequest(
82
+ "DELETE",
83
+ `/api/v1/dataset/${encodeURIComponent(slugOrId)}`
84
+ );
85
+ }
86
+ async function createDatasetRecords(params) {
87
+ const { slugOrId, entries } = params;
88
+ return makeRequest("POST", `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records`, {
89
+ entries
90
+ });
91
+ }
92
+ async function updateDatasetRecord(params) {
93
+ const { slugOrId, recordId, entry } = params;
94
+ return makeRequest(
95
+ "PATCH",
96
+ `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records/${encodeURIComponent(recordId)}`,
97
+ { entry }
98
+ );
99
+ }
100
+ async function deleteDatasetRecords(params) {
101
+ const { slugOrId, recordIds } = params;
102
+ return makeRequest("DELETE", `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records`, {
103
+ recordIds
104
+ });
105
+ }
106
+ async function listDatasetRecords(params) {
107
+ const { slugOrId } = params;
108
+ const query = new URLSearchParams();
109
+ if (params.page != null) query.set("page", String(params.page));
110
+ if (params.limit != null) query.set("limit", String(params.limit));
111
+ const qs = query.toString();
112
+ const path = `/api/v1/dataset/${encodeURIComponent(slugOrId)}/records${qs ? `?${qs}` : ""}`;
113
+ return makeRequest("GET", path);
114
+ }
115
+
116
+ export {
117
+ DATASET_PREVIEW_MAX_RECORDS,
118
+ DATASET_PREVIEW_MAX_BYTES,
119
+ listDatasets,
120
+ getDataset,
121
+ createDataset,
122
+ updateDataset,
123
+ deleteDataset,
124
+ createDatasetRecords,
125
+ updateDatasetRecord,
126
+ deleteDatasetRecords,
127
+ listDatasetRecords
128
+ };
129
+ //# sourceMappingURL=chunk-7VNSRCXO.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  makeRequest
3
- } from "./chunk-A2LEVYQ5.js";
3
+ } from "./chunk-UWLE5T2F.js";
4
4
 
5
5
  // src/langwatch-api-projects.ts
6
6
  async function listProjects(params) {
@@ -8,37 +8,38 @@ async function listProjects(params) {
8
8
  if (params?.page) query.set("page", String(params.page));
9
9
  if (params?.limit) query.set("limit", String(params.limit));
10
10
  const qs = query.toString() ? `?${query}` : "";
11
- return makeRequest("GET", `/api/projects${qs}`);
11
+ return makeRequest("GET", `/api/v1/projects${qs}`);
12
12
  }
13
13
  async function getProject(id) {
14
14
  return makeRequest(
15
15
  "GET",
16
- `/api/projects/${encodeURIComponent(id)}`
16
+ `/api/v1/projects/${encodeURIComponent(id)}`
17
17
  );
18
18
  }
19
+ async function getCurrentProject() {
20
+ return makeRequest("GET", "/api/v1/me/project");
21
+ }
19
22
  async function createProject(data) {
20
- return makeRequest("POST", "/api/projects", data);
23
+ return makeRequest("POST", "/api/v1/projects", data);
21
24
  }
22
25
  async function updateProject(params) {
23
26
  const { id, ...data } = params;
24
27
  return makeRequest(
25
28
  "PATCH",
26
- `/api/projects/${encodeURIComponent(id)}`,
29
+ `/api/v1/projects/${encodeURIComponent(id)}`,
27
30
  data
28
31
  );
29
32
  }
30
33
  async function archiveProject(id) {
31
- return makeRequest(
32
- "DELETE",
33
- `/api/projects/${encodeURIComponent(id)}`
34
- );
34
+ return makeRequest("DELETE", `/api/v1/projects/${encodeURIComponent(id)}`);
35
35
  }
36
36
 
37
37
  export {
38
38
  listProjects,
39
39
  getProject,
40
+ getCurrentProject,
40
41
  createProject,
41
42
  updateProject,
42
43
  archiveProject
43
44
  };
44
- //# sourceMappingURL=chunk-7RHG56OH.js.map
45
+ //# sourceMappingURL=chunk-B4J3PJLX.js.map
@@ -24,4 +24,4 @@ function parseRelativeDate(input) {
24
24
  export {
25
25
  parseRelativeDate
26
26
  };
27
- //# sourceMappingURL=chunk-ZXKLPC2E.js.map
27
+ //# sourceMappingURL=chunk-BIIKE3EI.js.map
@@ -1,7 +1,12 @@
1
1
  // src/utils/format-evaluations.ts
2
2
  function formatEvaluationLines(evaluations) {
3
3
  return evaluations.map((evaluation) => {
4
- const status = evaluation.passed === true ? "PASSED" : evaluation.passed === false ? "FAILED" : "N/A";
4
+ let status = "N/A";
5
+ if (evaluation.passed === true) {
6
+ status = "PASSED";
7
+ } else if (evaluation.passed === false) {
8
+ status = "FAILED";
9
+ }
5
10
  return `- **${evaluation.name || evaluation.evaluator_id}**: ${status}${evaluation.score != null ? ` (score: ${evaluation.score})` : ""}${evaluation.label ? ` [${evaluation.label}]` : ""}`;
6
11
  });
7
12
  }
@@ -9,4 +14,4 @@ function formatEvaluationLines(evaluations) {
9
14
  export {
10
15
  formatEvaluationLines
11
16
  };
12
- //# sourceMappingURL=chunk-37SMPMQS.js.map
17
+ //# sourceMappingURL=chunk-DMM3JQ42.js.map
@@ -6,4 +6,4 @@ function escapeMarkdown(value) {
6
6
  export {
7
7
  escapeMarkdown
8
8
  };
9
- //# sourceMappingURL=chunk-NUFPTHKU.js.map
9
+ //# sourceMappingURL=chunk-FOKVY3BK.js.map
@@ -33,21 +33,23 @@ function initConfig(args) {
33
33
  state.globalConfig = {
34
34
  apiKey: args.apiKey || process.env.LANGWATCH_API_KEY,
35
35
  endpoint: normalizeEndpoint(args.endpoint ?? "") || normalizeEndpoint(process.env.LANGWATCH_ENDPOINT ?? "") || "https://app.langwatch.ai",
36
- projectId: process.env.LANGWATCH_PROJECT_ID
36
+ projectId: args.projectId ?? process.env.LANGWATCH_PROJECT_ID
37
37
  };
38
38
  }
39
- function getConfig() {
39
+ function tryGetConfig() {
40
40
  const state = getGlobalState();
41
- const scoped = state.configStorage.getStore();
42
- if (scoped) return scoped;
43
- if (!state.globalConfig) {
41
+ return state.configStorage.getStore() ?? state.globalConfig;
42
+ }
43
+ function getConfig() {
44
+ const config = tryGetConfig();
45
+ if (!config) {
44
46
  console.error(
45
47
  "[MCP config] getConfig() failed: globalConfig is null, no scoped config active. Was initConfig() called? Stack:",
46
48
  new Error().stack
47
49
  );
48
50
  throw new Error("Config not initialized");
49
51
  }
50
- return state.globalConfig;
52
+ return config;
51
53
  }
52
54
  function requireApiKey() {
53
55
  const config = getConfig();
@@ -71,8 +73,9 @@ function runWithConfig(config, fn) {
71
73
 
72
74
  export {
73
75
  initConfig,
76
+ tryGetConfig,
74
77
  getConfig,
75
78
  requireApiKey,
76
79
  runWithConfig
77
80
  };
78
- //# sourceMappingURL=chunk-WT4PO4A3.js.map
81
+ //# sourceMappingURL=chunk-H6WGMG2T.js.map