@langwatch/mcp-server 2.2.0 → 3.1.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 (253) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/add-dashboard-widget-3IE3W5RR.js +46 -0
  3. package/dist/add-dashboard-widget-XNAIGV37.js +45 -0
  4. package/dist/{archive-project-KWFM3I5Z.js → archive-project-LAWWNKTX.js} +4 -4
  5. package/dist/{archive-project-SPVHXK6A.js → archive-project-X64627XS.js} +4 -4
  6. package/dist/{archive-run-plan-Z4SYE6BP.js → archive-run-plan-3HKFL5MS.js} +4 -4
  7. package/dist/{archive-run-plan-65QN3XRX.js → archive-run-plan-C35EJACZ.js} +4 -4
  8. package/dist/{archive-scenario-A6QV5LOW.js → archive-scenario-3DOXHOJJ.js} +4 -4
  9. package/dist/{archive-scenario-FXEYQNEH.js → archive-scenario-7KDGEZM5.js} +4 -4
  10. package/dist/{archive-test-suite-NKZDZY3D.js → archive-test-suite-KZOESY2Y.js} +4 -4
  11. package/dist/{archive-test-suite-5ADQ3KPQ.js → archive-test-suite-RPJ6ZKBV.js} +4 -4
  12. package/dist/{assign-prompt-tag-5IUZXJ2T.js → assign-prompt-tag-2A25CXB7.js} +3 -3
  13. package/dist/{assign-prompt-tag-HBZLBIFD.js → assign-prompt-tag-TQRV6D6V.js} +3 -3
  14. package/dist/{chunk-Y34DHR5K.js → chunk-27SS5FBC.js} +2 -2
  15. package/dist/chunk-2RLDGMPZ.js +79 -0
  16. package/dist/{chunk-VMWJD732.js → chunk-3GVTJ7NK.js} +2 -2
  17. package/dist/chunk-6DF65T3B.js +36 -0
  18. package/dist/{chunk-3OCG3QPU.js → chunk-6OLI3LFY.js} +2 -2
  19. package/dist/{chunk-B4J3PJLX.js → chunk-7HJSQOSZ.js} +2 -6
  20. package/dist/{chunk-UWLE5T2F.js → chunk-7MNQDTKJ.js} +46 -27
  21. package/dist/{chunk-I7ATIZED.js → chunk-BHCYKMRH.js} +2 -2
  22. package/dist/{chunk-H6WGMG2T.js → chunk-DULFP3MK.js} +1 -1
  23. package/dist/{chunk-NKMTIHIJ.js → chunk-FSU2ZBUM.js} +2 -2
  24. package/dist/{chunk-SXFC3FNH.js → chunk-I2Z5CBOU.js} +2 -2
  25. package/dist/{chunk-J7PQKBLD.js → chunk-JEMUBKLJ.js} +533 -402
  26. package/dist/{chunk-7VNSRCXO.js → chunk-JOFSQFCN.js} +2 -2
  27. package/dist/{chunk-HGELNIVY.js → chunk-JQN3VXPH.js} +3 -3
  28. package/dist/{chunk-UTJCWXPZ.js → chunk-LXBQK3J3.js} +2 -2
  29. package/dist/{chunk-JRJPH75H.js → chunk-MQRTYXHJ.js} +2 -2
  30. package/dist/{chunk-YCARO42Z.js → chunk-P2JRKSYI.js} +3 -3
  31. package/dist/{chunk-PTDR56Z3.js → chunk-QF7ZGYVI.js} +2 -2
  32. package/dist/{chunk-UNJM3BIL.js → chunk-QTAHHJH3.js} +2 -2
  33. package/dist/chunk-SLRQHMJZ.js +41 -0
  34. package/dist/{chunk-SUPUUC4W.js → chunk-YQWZ4CDN.js} +5 -3
  35. package/dist/{config-EAKW6F26.js → config-2WQGMAEN.js} +2 -2
  36. package/dist/config.js +1 -1
  37. package/dist/{create-agent-S5ZBCEFT.js → create-agent-IE7Q2Z4C.js} +4 -4
  38. package/dist/{create-agent-AYZ3LB3V.js → create-agent-JMCQ5WZC.js} +4 -4
  39. package/dist/create-analytics-report-4X5N7EOT.js +19 -0
  40. package/dist/create-analytics-report-IKWZRS2O.js +18 -0
  41. package/dist/{create-annotation-VUSXULQK.js → create-annotation-IZ53SJOX.js} +4 -4
  42. package/dist/{create-annotation-LHNCLHYP.js → create-annotation-JR6DBHPW.js} +4 -4
  43. package/dist/{create-api-key-T4KSNPKB.js → create-api-key-IKMOTWCD.js} +4 -4
  44. package/dist/{create-api-key-NNYKARMG.js → create-api-key-YUDAGOWL.js} +4 -4
  45. package/dist/{create-dataset-2MC4SD4O.js → create-dataset-54FJCX45.js} +4 -4
  46. package/dist/{create-dataset-LUP5PVDM.js → create-dataset-ONX3RADL.js} +4 -4
  47. package/dist/{create-dataset-records-W4GLN2FV.js → create-dataset-records-HPLMFDJY.js} +4 -4
  48. package/dist/{create-dataset-records-NSKBZP3G.js → create-dataset-records-QZZZF64Z.js} +4 -4
  49. package/dist/{create-evaluator-HMTYO5SS.js → create-evaluator-I5I52HOQ.js} +4 -4
  50. package/dist/{create-evaluator-643G6LXL.js → create-evaluator-L66QGSDX.js} +4 -4
  51. package/dist/create-mcp-server.cjs +851 -597
  52. package/dist/create-mcp-server.js +523 -392
  53. package/dist/{create-project-6N7PIYRY.js → create-project-UPZGETN5.js} +4 -4
  54. package/dist/{create-project-KAIC46UY.js → create-project-Y5EGJKDG.js} +4 -4
  55. package/dist/{create-prompt-PKJ7EDRR.js → create-prompt-RNUJOL25.js} +3 -3
  56. package/dist/{create-prompt-E67LXIYT.js → create-prompt-WGQLJASD.js} +3 -3
  57. package/dist/{create-prompt-tag-OPQUEXWB.js → create-prompt-tag-3ZCA7M7O.js} +3 -3
  58. package/dist/{create-prompt-tag-4YO3FSJ3.js → create-prompt-tag-R6KIAZTB.js} +3 -3
  59. package/dist/{create-scenario-UEM77OE7.js → create-scenario-WIMKZLQO.js} +4 -4
  60. package/dist/{create-scenario-5PJBMAXO.js → create-scenario-WO5NWXVQ.js} +4 -4
  61. package/dist/{create-test-suite-4IPXVSFQ.js → create-test-suite-AVSR7IIM.js} +4 -4
  62. package/dist/{create-test-suite-SZEPVXSE.js → create-test-suite-LRKCNIJA.js} +4 -4
  63. package/dist/{create-trigger-5HZSCRAN.js → create-trigger-CBO2XDYC.js} +4 -4
  64. package/dist/{create-trigger-PRELMT6J.js → create-trigger-M3VFK5UH.js} +4 -4
  65. package/dist/dashboards-4X6QUT3E.js +90 -0
  66. package/dist/dashboards-CX2T6RKH.js +91 -0
  67. package/dist/{delete-agent-QMEK3XHK.js → delete-agent-QUVDMSOC.js} +4 -4
  68. package/dist/{delete-agent-JUIZWAXG.js → delete-agent-Y4QTEQ3B.js} +4 -4
  69. package/dist/delete-analytics-report-T4GIMEOA.js +18 -0
  70. package/dist/delete-analytics-report-WIP24EXV.js +19 -0
  71. package/dist/{delete-annotation-VKIQWUYW.js → delete-annotation-BWO5ZEZY.js} +4 -4
  72. package/dist/{delete-annotation-HY3O2OGR.js → delete-annotation-ESUH3RWN.js} +4 -4
  73. package/dist/{delete-dataset-WKRUW4FP.js → delete-dataset-N4AEYIAA.js} +4 -4
  74. package/dist/{delete-dataset-HQCR66MG.js → delete-dataset-ZRD23FLO.js} +4 -4
  75. package/dist/{delete-dataset-records-SDUHQLLM.js → delete-dataset-records-HC7VLBT7.js} +4 -4
  76. package/dist/{delete-dataset-records-C2IQFFVQ.js → delete-dataset-records-XC2DFVXD.js} +4 -4
  77. package/dist/{delete-evaluator-QP3QHTLN.js → delete-evaluator-27P5XLNV.js} +4 -4
  78. package/dist/{delete-evaluator-4SNSCLEE.js → delete-evaluator-LJII4YLC.js} +4 -4
  79. package/dist/{delete-prompt-tag-YYQ4VMAD.js → delete-prompt-tag-DH7IQO4X.js} +3 -3
  80. package/dist/{delete-prompt-tag-NZ4JQMYG.js → delete-prompt-tag-OC57CN32.js} +3 -3
  81. package/dist/{delete-workflow-5J46T73T.js → delete-workflow-I4IXK3ZL.js} +4 -4
  82. package/dist/{delete-workflow-JSWABL5F.js → delete-workflow-JXREDDW7.js} +4 -4
  83. package/dist/{discover-schema-A33SLMXW.js → discover-schema-ME5BAD2S.js} +4 -4
  84. package/dist/{discover-schema-55YJBFGQ.js → discover-schema-OHYBG3CY.js} +4 -4
  85. package/dist/{get-agent-LJQX7OF4.js → get-agent-6GKIKKL7.js} +4 -4
  86. package/dist/{get-agent-OTIYUFZA.js → get-agent-UKZUBVPB.js} +4 -4
  87. package/dist/{get-analytics-IQZKJHLW.js → get-analytics-TI2U3JLA.js} +3 -3
  88. package/dist/{get-analytics-DCS72353.js → get-analytics-ZGQ4LY3I.js} +3 -3
  89. package/dist/get-analytics-report-PD6XZ4ZA.js +29 -0
  90. package/dist/get-analytics-report-QMXNQ7VA.js +30 -0
  91. package/dist/{get-dataset-ALSP7RTX.js → get-dataset-5QORNVOZ.js} +4 -4
  92. package/dist/{get-dataset-X4B5JDG2.js → get-dataset-E5WLIPNK.js} +4 -4
  93. package/dist/{get-evaluator-XEUZGZCH.js → get-evaluator-GYQFB4F3.js} +4 -4
  94. package/dist/{get-evaluator-ISMC4LLI.js → get-evaluator-QQV65MQB.js} +4 -4
  95. package/dist/{get-project-5VKROSDH.js → get-project-43SGQCAT.js} +4 -4
  96. package/dist/{get-project-RM6FRCBK.js → get-project-W5DCKXZP.js} +4 -4
  97. package/dist/{get-prompt-OWXJZHQQ.js → get-prompt-IUTPSRRI.js} +3 -3
  98. package/dist/{get-prompt-W52DY36E.js → get-prompt-ZTCWGYJV.js} +3 -3
  99. package/dist/{get-run-plan-BE3M2AUX.js → get-run-plan-M3LVXMGO.js} +4 -4
  100. package/dist/{get-run-plan-RUXQ6PAX.js → get-run-plan-MEPEU353.js} +4 -4
  101. package/dist/{get-scenario-RNM7BAX2.js → get-scenario-2DM4XR44.js} +4 -4
  102. package/dist/{get-scenario-YM4ODWW6.js → get-scenario-D6EPSSPW.js} +4 -4
  103. package/dist/{get-simulation-run-6GIATQE5.js → get-simulation-run-53WM2XOO.js} +4 -4
  104. package/dist/{get-simulation-run-LCFSMPGQ.js → get-simulation-run-RKQ52TKP.js} +4 -4
  105. package/dist/{get-test-suite-P5LJ6VLF.js → get-test-suite-DP2HNOQZ.js} +4 -4
  106. package/dist/{get-test-suite-GC2O7YH6.js → get-test-suite-MUSY2CDJ.js} +4 -4
  107. package/dist/{get-trace-SEF3FMR5.js → get-trace-5Z2BIZ3V.js} +3 -3
  108. package/dist/{get-trace-KBRVV4NN.js → get-trace-THPWSLD3.js} +3 -3
  109. package/dist/{get-workflow-YXULW4GC.js → get-workflow-63E7BNLY.js} +4 -4
  110. package/dist/{get-workflow-7PVED7JE.js → get-workflow-R6XUKTZ7.js} +4 -4
  111. package/dist/{http-server-IR4QOS43.js → http-server-4JHSQN56.js} +245 -45
  112. package/dist/index.js +1847 -899
  113. package/dist/langwatch-api-analytics-reports-IIHGTTQA.js +17 -0
  114. package/dist/langwatch-api-analytics-reports-IQ6CHM5Y.js +18 -0
  115. package/dist/{langwatch-api-annotations-TBHLCQ5R.js → langwatch-api-annotations-CN2KYV3Z.js} +4 -4
  116. package/dist/{langwatch-api-annotations-6SA4OB4C.js → langwatch-api-annotations-CRI6JTQR.js} +4 -4
  117. package/dist/{langwatch-api-monitors-CBF3FGIM.js → langwatch-api-monitors-66O5Z5LB.js} +3 -3
  118. package/dist/{langwatch-api-monitors-YNWA2M5Y.js → langwatch-api-monitors-GNHQRPMR.js} +3 -3
  119. package/dist/{langwatch-api-secrets-RNFO4LF2.js → langwatch-api-secrets-B7BURV76.js} +3 -3
  120. package/dist/{langwatch-api-secrets-ADTOJELP.js → langwatch-api-secrets-P6SHZOHE.js} +3 -3
  121. package/dist/{langwatch-api-triggers-KQDQC6L5.js → langwatch-api-triggers-6FR4VWDL.js} +4 -4
  122. package/dist/{langwatch-api-triggers-QS7HDIVW.js → langwatch-api-triggers-VKNGXSJH.js} +4 -4
  123. package/dist/langwatch-api-workflows-22RQFYO7.js +15 -0
  124. package/dist/{langwatch-api-workflows-OKC4FXIF.js → langwatch-api-workflows-KDACD36L.js} +4 -4
  125. package/dist/{list-agents-RBAOCF53.js → list-agents-SVXWLLO7.js} +4 -4
  126. package/dist/{list-agents-HVYWEQMI.js → list-agents-XM5JNCVK.js} +4 -4
  127. package/dist/list-analytics-reports-DEKKC6BU.js +32 -0
  128. package/dist/list-analytics-reports-E7QFC22G.js +33 -0
  129. package/dist/{list-annotations-J4UAHSUN.js → list-annotations-5CGNOIKI.js} +4 -4
  130. package/dist/{list-annotations-HJH4NBLD.js → list-annotations-P26ELIAO.js} +4 -4
  131. package/dist/{list-api-keys-A2PMV435.js → list-api-keys-B4YL7STE.js} +4 -4
  132. package/dist/{list-api-keys-7UTJRZDG.js → list-api-keys-ZIJJH755.js} +4 -4
  133. package/dist/list-dashboards-F4YJPDKD.js +29 -0
  134. package/dist/list-dashboards-XHYTXEQK.js +30 -0
  135. package/dist/{list-dataset-records-WFM7F33C.js → list-dataset-records-SWCEDRPX.js} +4 -4
  136. package/dist/{list-dataset-records-M5TKA6LK.js → list-dataset-records-YWGROVKC.js} +4 -4
  137. package/dist/{list-datasets-B5X4P7BQ.js → list-datasets-32SCF66H.js} +4 -4
  138. package/dist/{list-datasets-THUKQHPX.js → list-datasets-YYADWT4D.js} +4 -4
  139. package/dist/{list-evaluators-MYH2OVCI.js → list-evaluators-KKQKBJKN.js} +4 -4
  140. package/dist/{list-evaluators-NLVWF6K7.js → list-evaluators-V6LP6ZQA.js} +4 -4
  141. package/dist/{list-model-providers-3JUGP4YI.js → list-model-providers-RCPVT7R4.js} +4 -4
  142. package/dist/{list-model-providers-H3XKORFO.js → list-model-providers-TMBSB6EE.js} +4 -4
  143. package/dist/{list-projects-YNNSRMLC.js → list-projects-4Y74TFDZ.js} +4 -4
  144. package/dist/{list-projects-6EJ5YYEW.js → list-projects-R4MTRF3C.js} +4 -4
  145. package/dist/{list-prompt-tags-NVFQO6WX.js → list-prompt-tags-C345AGM2.js} +3 -3
  146. package/dist/{list-prompt-tags-XUQTTAH4.js → list-prompt-tags-RITKQDC5.js} +3 -3
  147. package/dist/{list-prompts-IRI6AIXO.js → list-prompts-DSJ2LUSU.js} +3 -3
  148. package/dist/{list-prompts-HSIMMHTF.js → list-prompts-F7C5L5XK.js} +3 -3
  149. package/dist/{list-run-plans-PX2XI6EK.js → list-run-plans-YPGLC5QG.js} +4 -4
  150. package/dist/{list-run-plans-QALLCN2K.js → list-run-plans-ZHRZHCDL.js} +4 -4
  151. package/dist/{list-scenarios-SSJQEMJP.js → list-scenarios-6HN72TMW.js} +4 -4
  152. package/dist/{list-scenarios-QZRPVHS4.js → list-scenarios-HCYFOTSL.js} +4 -4
  153. package/dist/{list-simulation-runs-OEADLLQR.js → list-simulation-runs-BKVMQQMT.js} +4 -4
  154. package/dist/{list-simulation-runs-KNOLGMDV.js → list-simulation-runs-JNST5PQU.js} +4 -4
  155. package/dist/{list-test-suites-N4WVLBKK.js → list-test-suites-4ZVYYKVB.js} +4 -4
  156. package/dist/{list-test-suites-ANAQBLDG.js → list-test-suites-YY4J3L7H.js} +4 -4
  157. package/dist/{list-trigger-fires-WTW4DVIW.js → list-trigger-fires-3XM6YZWG.js} +4 -4
  158. package/dist/{list-trigger-fires-JV3WFYYG.js → list-trigger-fires-5C5XM2KQ.js} +4 -4
  159. package/dist/{list-triggers-V4Y356AK.js → list-triggers-DARBIIRA.js} +4 -4
  160. package/dist/{list-triggers-SQNIG35Q.js → list-triggers-MRSWN7RR.js} +4 -4
  161. package/dist/{list-workflows-ZHTX5LCL.js → list-workflows-BGUSQUJX.js} +4 -4
  162. package/dist/{list-workflows-IMSX7SXU.js → list-workflows-NXOWP3XS.js} +4 -4
  163. package/dist/{rename-prompt-tag-IQI7MHOI.js → rename-prompt-tag-F3WT4FB4.js} +3 -3
  164. package/dist/{rename-prompt-tag-PA2BRIE6.js → rename-prompt-tag-HR5HZZI2.js} +3 -3
  165. package/dist/{rename-test-suite-NNVLMLKY.js → rename-test-suite-2ZRXG5O7.js} +4 -4
  166. package/dist/{rename-test-suite-4J7UX5S2.js → rename-test-suite-PWXKE7Z4.js} +4 -4
  167. package/dist/{report-issue-AS34ZMJF.js → report-issue-HG7XCPOY.js} +28 -2
  168. package/dist/{report-issue-DCZFLGDO.js → report-issue-TWRFUPGB.js} +28 -2
  169. package/dist/{rerun-run-plan-TG2V4WM4.js → rerun-run-plan-BFRZFEJB.js} +4 -4
  170. package/dist/{rerun-run-plan-ZI5OY3VA.js → rerun-run-plan-LXM3RFZC.js} +4 -4
  171. package/dist/{revoke-api-key-3J3ZA4UB.js → revoke-api-key-GR55PUP4.js} +4 -4
  172. package/dist/{revoke-api-key-SFMEFWJC.js → revoke-api-key-KCDOYPUK.js} +4 -4
  173. package/dist/{run-agent-YNV6ZHW4.js → run-agent-HRVRHRHI.js} +4 -4
  174. package/dist/{run-agent-W4VJP72Z.js → run-agent-WS6TADJQ.js} +4 -4
  175. package/dist/{run-plan-6C77GWG4.js → run-plan-G24DBB5D.js} +4 -4
  176. package/dist/{run-plan-PAARQSI4.js → run-plan-NSXMBEC5.js} +4 -4
  177. package/dist/{run-query-T4QW2Z5O.js → run-query-6YVOA5NV.js} +19 -5
  178. package/dist/{run-query-KJDH544C.js → run-query-7QIYSDVI.js} +19 -5
  179. package/dist/{run-test-suite-STB6NUJM.js → run-test-suite-NTKLJZCJ.js} +4 -4
  180. package/dist/{run-test-suite-SQJELEZX.js → run-test-suite-P33XFQ6H.js} +4 -4
  181. package/dist/{run-workflow-D6PQNBI6.js → run-workflow-E5ZRSXUB.js} +4 -4
  182. package/dist/{run-workflow-SP32SO5M.js → run-workflow-HDF6CRLM.js} +4 -4
  183. package/dist/{search-traces-HCBGOG6R.js → search-traces-X7NSRTTP.js} +3 -3
  184. package/dist/{search-traces-HSTQ6WTQ.js → search-traces-XWZYOZOM.js} +3 -3
  185. package/dist/{set-model-provider-GF7NXUJA.js → set-model-provider-XJF47L6H.js} +4 -4
  186. package/dist/{set-model-provider-KDQ7C4EZ.js → set-model-provider-YPUCFEXG.js} +4 -4
  187. package/dist/{update-agent-MXNOBS4H.js → update-agent-6FHGWOO7.js} +4 -4
  188. package/dist/{update-agent-DWG43T2P.js → update-agent-VEDXQRSM.js} +4 -4
  189. package/dist/update-dashboard-widget-VOKXN7JA.js +64 -0
  190. package/dist/update-dashboard-widget-VUIQZ7F5.js +63 -0
  191. package/dist/{update-dataset-SQZ6T4WX.js → update-dataset-7AQ24NRS.js} +4 -4
  192. package/dist/{update-dataset-DQH3OHOU.js → update-dataset-GHKDCJJQ.js} +4 -4
  193. package/dist/{update-dataset-record-3AT4IPBC.js → update-dataset-record-IRD6FH2C.js} +4 -4
  194. package/dist/{update-dataset-record-7PLDGTMR.js → update-dataset-record-ZZUPG7AS.js} +4 -4
  195. package/dist/{update-evaluator-4LFTKFPT.js → update-evaluator-O6EJFTQJ.js} +4 -4
  196. package/dist/{update-evaluator-IGTX6PX4.js → update-evaluator-PUJFU5LT.js} +4 -4
  197. package/dist/{update-project-PLJIOZS6.js → update-project-HO53IHXC.js} +4 -4
  198. package/dist/{update-project-QVHSJRUP.js → update-project-VTVU6KNP.js} +4 -4
  199. package/dist/{update-prompt-GDKRYJI3.js → update-prompt-FABVQCAC.js} +3 -3
  200. package/dist/{update-prompt-MY263DYF.js → update-prompt-MNRLCLBA.js} +3 -3
  201. package/dist/{update-scenario-MOHRQKAQ.js → update-scenario-MQZZM5CP.js} +4 -4
  202. package/dist/{update-scenario-7KA3JDXA.js → update-scenario-XIZNUH4I.js} +4 -4
  203. package/package.json +2 -2
  204. package/pyproject.toml +17 -2
  205. package/src/config.d.ts +2 -0
  206. package/src/config.ts +2 -0
  207. package/src/create-mcp-server.ts +165 -41
  208. package/src/langwatch-api-analytics-reports.ts +62 -0
  209. package/src/langwatch-api-dashboard-widgets.ts +4 -68
  210. package/src/langwatch-api-dashboards.ts +110 -28
  211. package/src/langwatch-api-projects.ts +0 -17
  212. package/src/langwatch-api-query.ts +6 -0
  213. package/src/langwatch-api.ts +60 -27
  214. package/src/schemas/widget-sources.ts +69 -0
  215. package/src/tools/add-dashboard-widget.ts +23 -32
  216. package/src/tools/create-analytics-report.ts +7 -0
  217. package/src/tools/dashboard-widget-queries.ts +22 -0
  218. package/src/tools/dashboards.ts +104 -0
  219. package/src/tools/delete-analytics-report.ts +7 -0
  220. package/src/tools/get-analytics-report.ts +23 -0
  221. package/src/tools/list-analytics-reports.ts +27 -0
  222. package/src/tools/list-dashboards.ts +20 -21
  223. package/src/tools/report-issue.ts +2 -0
  224. package/src/tools/run-experiment.ts +5 -1
  225. package/src/tools/run-query.ts +23 -1
  226. package/src/tools/update-dashboard-widget.ts +32 -40
  227. package/uv.lock +667 -341
  228. package/dist/add-dashboard-widget-4ZC5UN73.js +0 -50
  229. package/dist/add-dashboard-widget-ACC6QYBG.js +0 -49
  230. package/dist/chunk-5FNCQRCX.js +0 -91
  231. package/dist/chunk-ILZDO25L.js +0 -36
  232. package/dist/chunk-K2I7Z3LZ.js +0 -28
  233. package/dist/create-dashboard-DHVFMEU4.js +0 -18
  234. package/dist/create-dashboard-WTKKS5Z6.js +0 -19
  235. package/dist/delete-dashboard-76N66XXL.js +0 -18
  236. package/dist/delete-dashboard-JVIVHNJM.js +0 -19
  237. package/dist/get-dashboard-5NYJEIX2.js +0 -29
  238. package/dist/get-dashboard-QMTYDQAZ.js +0 -30
  239. package/dist/langwatch-api-dashboards-6EO2VVZW.js +0 -17
  240. package/dist/langwatch-api-dashboards-NHU5BZD7.js +0 -18
  241. package/dist/langwatch-api-workflows-XGJE6SR5.js +0 -15
  242. package/dist/list-dashboard-boards-OPWROHMG.js +0 -33
  243. package/dist/list-dashboard-boards-U2GJ7GC5.js +0 -34
  244. package/dist/list-dashboards-ROSYFLDQ.js +0 -33
  245. package/dist/list-dashboards-RQ635ZU7.js +0 -32
  246. package/dist/update-dashboard-widget-CJKJLCDY.js +0 -71
  247. package/dist/update-dashboard-widget-CYQDS2NR.js +0 -70
  248. package/src/langwatch-api-boards.ts +0 -46
  249. package/src/tools/create-dashboard.ts +0 -7
  250. package/src/tools/dashboard-exists.ts +0 -25
  251. package/src/tools/delete-dashboard.ts +0 -7
  252. package/src/tools/get-dashboard.ts +0 -22
  253. package/src/tools/list-dashboard-boards.ts +0 -28
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-3YLN3ATJ.js";
14
14
  import {
15
15
  testAgent
16
- } from "./chunk-YCARO42Z.js";
16
+ } from "./chunk-JQN3VXPH.js";
17
17
  import {
18
18
  runParametersSchema,
19
19
  runPlanScopeSchema,
@@ -31,19 +31,19 @@ import {
31
31
  } from "./chunk-6YZUOD34.js";
32
32
  import {
33
33
  updateTestSuite
34
- } from "./chunk-VMWJD732.js";
34
+ } from "./chunk-3GVTJ7NK.js";
35
35
  import {
36
36
  LangWatchApiError,
37
37
  makeRequest,
38
38
  package_default
39
- } from "./chunk-UWLE5T2F.js";
39
+ } from "./chunk-7MNQDTKJ.js";
40
40
  import {
41
41
  requireApiKey
42
- } from "./chunk-H6WGMG2T.js";
42
+ } from "./chunk-DULFP3MK.js";
43
43
 
44
44
  // src/create-mcp-server.ts
45
45
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
46
- import { z as z2 } from "zod";
46
+ import { z as z3 } from "zod";
47
47
 
48
48
  // src/documentation-fetch.ts
49
49
  var TRUSTED_DOCUMENTATION_ORIGIN = "https://langwatch.ai";
@@ -158,6 +158,38 @@ var createDatasetSchema = z.object({
158
158
  columnTypes: z.array(datasetColumnDefinitionSchema).optional().describe("Column definitions for the dataset")
159
159
  });
160
160
 
161
+ // src/schemas/widget-sources.ts
162
+ import { z as z2 } from "zod";
163
+ var isAllWord = (id) => id.trim().toLowerCase() === "all";
164
+ var WIDGET_SOURCES = [
165
+ "application",
166
+ "simulation",
167
+ "evaluation",
168
+ "sample",
169
+ "coding_agent",
170
+ "ai_tool",
171
+ "gateway",
172
+ "workflow",
173
+ "playground",
174
+ "langy",
175
+ "other"
176
+ ];
177
+ var widgetSourcesInput = z2.array(z2.enum(WIDGET_SOURCES)).max(WIDGET_SOURCES.length).nullable().optional().describe(
178
+ `The trace origins every query of the widget counts: any of ${WIDGET_SOURCES.join(", ")} (other = any origin not listed). A new widget counts ["application"]; add "langy" to count your own conversations, as a widget about Langy's requests needs. null makes it unset again, counting the default.`
179
+ );
180
+ var ALL_NOT_STORED = 'projects holds project ids; "all" is not stored in a widget';
181
+ var widgetProjectsInput = z2.array(z2.string().min(1), {
182
+ error: (issue) => typeof issue.input === "string" && isAllWord(issue.input) ? ALL_NOT_STORED : void 0
183
+ }).min(1).refine((ids) => !ids.some(isAllWord), { message: ALL_NOT_STORED }).nullable().optional().describe(
184
+ "The project ids every query of the widget reads, each one you can read. A new widget reads its board's project. null makes it unset again, reading the board's project."
185
+ );
186
+ var runQueryProjectsInput = z2.union([
187
+ z2.string().refine(isAllWord),
188
+ z2.array(z2.string().min(1)).min(1).refine((ids) => !ids.some(isAllWord), {
189
+ message: '"all" stands alone; send it by itself, or list project ids'
190
+ })
191
+ ]);
192
+
161
193
  // src/tools/experiment-run-status.ts
162
194
  var INTERRUPTED_THRESHOLD_MS = 5 * 60 * 1e3;
163
195
  var deriveRunStatus = (timestamps, now = Date.now()) => {
@@ -537,7 +569,8 @@ async function handleExperimentList(params) {
537
569
  async function handleRunExperiment(params) {
538
570
  const result = await makeRequest(
539
571
  "POST",
540
- `/api/v1/experiments/${encodeURIComponent(params.slug)}/run`
572
+ `/api/v1/experiments/${encodeURIComponent(params.slug)}/run`,
573
+ params.concurrency !== void 0 ? { concurrency: params.concurrency } : void 0
541
574
  );
542
575
  const lines = [];
543
576
  lines.push(`Evaluation started!
@@ -688,8 +721,8 @@ async function handleUpdateTestSuite(params) {
688
721
  }
689
722
 
690
723
  // src/create-mcp-server.ts
691
- var modelSchema = z2.string().describe(
692
- 'Model in "provider/model-name" format, e.g., "openai/gpt-4o", "anthropic/claude-sonnet-4-5-20250929"'
724
+ var modelSchema = z3.string().describe(
725
+ 'Model in "provider/model-name" format, e.g., "openai/gpt-6-luna", "anthropic/claude-sonnet-4-5-20250929"'
693
726
  );
694
727
  function createMcpServer() {
695
728
  const server = new McpServer({
@@ -724,6 +757,7 @@ function registerTools(server) {
724
757
  registerEvaluatorTools(server);
725
758
  registerModelProviderTools(server);
726
759
  registerAgentTools(server);
760
+ registerAnalyticsReportTools(server);
727
761
  registerDashboardTools(server);
728
762
  registerWorkflowTools(server);
729
763
  registerAnnotationTools(server);
@@ -740,7 +774,7 @@ function registerDocsTools(server) {
740
774
  "fetch_langwatch_docs",
741
775
  "Fetches the LangWatch docs for understanding how to implement LangWatch in your codebase. Always use this tool when the user asks for help with LangWatch. Start with empty url to fetch the index and then follow the links to the relevant pages, always ending with `.md` extension",
742
776
  {
743
- url: z2.string().optional().describe(
777
+ url: z3.string().optional().describe(
744
778
  "The full url of the specific doc page. If not provided, the docs index will be fetched."
745
779
  )
746
780
  },
@@ -753,21 +787,21 @@ function registerDocsTools(server) {
753
787
  "report_issue",
754
788
  "Report an issue to the LangWatch team: anything that did not work, confused you, or took trial and error while using LangWatch (docs, MCP tools, CLI, SDKs, the platform). Use it whenever you struggled, it is how rough edges get fixed for every agent. Ask the user for permission first, then call with user_approved=true. Works without an API key. Put VERBATIM error messages in the summary; optionally attach raw session content. Secrets, API keys, emails and phone numbers are redacted locally before anything is sent.",
755
789
  {
756
- user_approved: z2.boolean().describe(
790
+ user_approved: z3.boolean().describe(
757
791
  "Must be true, and only after the user explicitly agreed to send this report to LangWatch"
758
792
  ),
759
- title: z2.string().max(300).describe("One-line description of the issue"),
760
- summary: z2.string().optional().describe(
793
+ title: z3.string().max(300).describe("One-line description of the issue"),
794
+ summary: z3.string().optional().describe(
761
795
  "What you were trying to do, what went wrong (verbatim errors), and what you had to figure out the hard way"
762
796
  ),
763
- session_content: z2.string().optional().describe(
797
+ session_content: z3.string().optional().describe(
764
798
  "Optional raw session transcript or log excerpt (JSONL or plain text); redacted locally before sending"
765
799
  ),
766
- contact_email: z2.string().optional().describe("Optional contact email for follow-up"),
767
- agent: z2.string().optional().describe("Which coding agent this is, e.g. claude-code, codex, cursor")
800
+ contact_email: z3.string().optional().describe("Optional contact email for follow-up"),
801
+ agent: z3.string().optional().describe("Which coding agent this is, e.g. claude-code, codex, cursor")
768
802
  },
769
803
  withToolLogging("report_issue", async (params) => {
770
- const { handleReportIssue } = await import("./report-issue-AS34ZMJF.js");
804
+ const { handleReportIssue } = await import("./report-issue-HG7XCPOY.js");
771
805
  return {
772
806
  content: [{ type: "text", text: await handleReportIssue(params) }]
773
807
  };
@@ -777,7 +811,7 @@ function registerDocsTools(server) {
777
811
  "fetch_scenario_docs",
778
812
  "Fetches the Scenario docs for understanding how to implement Scenario agent tests in your codebase. Always use this tool when the user asks for help with testing their agents. Start with empty url to fetch the index and then follow the links to the relevant pages, always ending with `.md` extension",
779
813
  {
780
- url: z2.string().optional().describe(
814
+ url: z3.string().optional().describe(
781
815
  "The full url of the specific doc page. If not provided, the docs index will be fetched."
782
816
  )
783
817
  },
@@ -792,7 +826,7 @@ function registerObservabilityTools(server) {
792
826
  "discover_schema",
793
827
  "Discover what LangWatch can be queried with: the trace filter fields and syntax, the analytics SQL views and columns, the analytics metrics, aggregation types, group-by options, scenario schema and evaluator types. Call this before using search_traces, run_query, get_analytics, scenario tools or evaluator tools, so you never guess a field, a column or a value.",
794
828
  {
795
- category: z2.enum([
829
+ category: z3.enum([
796
830
  "filters",
797
831
  "lwql",
798
832
  "metrics",
@@ -804,7 +838,7 @@ function registerObservabilityTools(server) {
804
838
  ]).describe(
805
839
  "Which schema category to discover. 'filters' is the trace filter language, 'lwql' the analytics SQL views; both are read from the platform and need the API key"
806
840
  ),
807
- evaluatorType: z2.string().optional().describe(
841
+ evaluatorType: z3.string().optional().describe(
808
842
  "When category is 'evaluators', provide a specific evaluator type (e.g. 'langevals/llm_boolean') to get its full schema details"
809
843
  )
810
844
  },
@@ -821,7 +855,7 @@ function registerObservabilityTools(server) {
821
855
  content: [{ type: "text", text: formatEvaluatorSchema(evaluatorType) }]
822
856
  };
823
857
  }
824
- const { formatSchema, needsQueryReference } = await import("./discover-schema-A33SLMXW.js");
858
+ const { formatSchema, needsQueryReference } = await import("./discover-schema-ME5BAD2S.js");
825
859
  if (needsQueryReference(category)) requireApiKey();
826
860
  let text = await formatSchema(category);
827
861
  if (category === "all") {
@@ -837,16 +871,22 @@ function registerObservabilityTools(server) {
837
871
  "run_query",
838
872
  "Run one read-only analytics SQL statement (LangWatchQL) over this project's traces, spans, evaluations and metrics, and get the rows back as a table. This is the tool for a count, a rate, a sum, a percentile or any of them grouped or over time \u2014 questions search_traces would need many calls to answer. The statement runs exactly as written. Call discover_schema with category 'lwql' first for the views, columns and worked statements.",
839
873
  {
840
- sql: z2.string().describe(
874
+ sql: z3.string().describe(
841
875
  "The SELECT to run. Filter on the dataset's time column so the read is bounded, and never select a whole attribute map"
842
876
  ),
843
- parameters: z2.record(z2.string(), z2.union([z2.string(), z2.number(), z2.boolean(), z2.null()])).optional().describe(
877
+ parameters: z3.record(z3.string(), z3.union([z3.string(), z3.number(), z3.boolean(), z3.null()])).optional().describe(
844
878
  'Values for the parameters the statement declares, e.g. {"days": 7} for {days:UInt32}'
879
+ ),
880
+ projects: runQueryProjectsInput.optional().describe(
881
+ 'The project ids to read, or the string "all" for every project the key can read (params.dashboard_context_projects lists them). A key that reaches several projects must name them or send "all"; a key that reads one project defaults to it'
882
+ ),
883
+ sources: z3.array(z3.string()).optional().describe(
884
+ "The trace sources {dashboard_context_sources:Array(String)} is bound to (default application). Only a statement that reads that parameter is kept to them; a SOURCES_IGNORED diagnostic says it did not"
845
885
  )
846
886
  },
847
887
  withToolLogging("run_query", async (params) => {
848
888
  requireApiKey();
849
- const { handleRunQuery } = await import("./run-query-T4QW2Z5O.js");
889
+ const { handleRunQuery } = await import("./run-query-6YVOA5NV.js");
850
890
  return {
851
891
  content: [{ type: "text", text: await handleRunQuery(params) }]
852
892
  };
@@ -856,29 +896,29 @@ function registerObservabilityTools(server) {
856
896
  "search_traces",
857
897
  "Search LangWatch traces by content, with filters and a date range. Returns AI-readable trace digests by default. Use format: 'json' for full raw data. To fetch a trace you already have the ID for, use get_trace instead \u2014 free text does not match trace IDs.",
858
898
  {
859
- query: z2.string().optional().describe(
899
+ query: z3.string().optional().describe(
860
900
  "Text search query. Matches captured input/output, the trace name and span names ONLY. It does not match trace IDs \u2014 to fetch a known trace ID use get_trace, or pass traceIds here for several at once."
861
901
  ),
862
- traceIds: z2.array(z2.string().min(1)).min(1).max(1e3).optional().describe(
902
+ traceIds: z3.array(z3.string().min(1)).min(1).max(1e3).optional().describe(
863
903
  "Exact trace IDs to fetch (1\u20131000). Use instead of query when you already know the IDs. When set and no startDate is given, the window defaults to the last 90 days rather than 24 hours."
864
904
  ),
865
- filters: z2.record(z2.string(), z2.array(z2.string())).optional().describe(
905
+ filters: z3.record(z3.string(), z3.array(z3.string())).optional().describe(
866
906
  'Filter traces by the older per-field map. Format: {"field": ["value"]}. Use discover_schema for field names.'
867
907
  ),
868
- filter: z2.string().optional().describe(
908
+ filter: z3.string().optional().describe(
869
909
  'Filter traces with the Trace Explorer\'s own query language: "status:error AND model:gpt-*", "trace.attribute.langwatch.user_id:alice", "evaluatorVerdict:fail", a quoted phrase for free text. Reaches attribute keys, span events and evaluator verdicts that the `filters` map cannot. Combined with `filters` and `query` when you send more than one. Call discover_schema with category \'filters\' for every field and the syntax.'
870
910
  ),
871
- startDate: z2.string().min(1).optional().describe(
911
+ startDate: z3.string().min(1).optional().describe(
872
912
  'Start of the window: ISO date, or relative like "24h", "7d", "4w", "3m" \u2014 units are h (hours), d (days), w (weeks), m (30-day months). Defaults to 24h ago for a text search, or 90d when traceIds is set. Widen this when a search comes back empty.'
873
913
  ),
874
- endDate: z2.string().min(1).optional().describe("End of the window: ISO date or relative. Default: now"),
875
- pageSize: z2.number().optional().describe("Results per page (default: 25, max: 1000)"),
876
- scrollId: z2.string().optional().describe("Pagination token from previous search"),
877
- format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
914
+ endDate: z3.string().min(1).optional().describe("End of the window: ISO date or relative. Default: now"),
915
+ pageSize: z3.number().optional().describe("Results per page (default: 25, max: 1000)"),
916
+ scrollId: z3.string().optional().describe("Pagination token from previous search"),
917
+ format: z3.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
878
918
  },
879
919
  withToolLogging("search_traces", async (params) => {
880
920
  requireApiKey();
881
- const { handleSearchTraces } = await import("./search-traces-HCBGOG6R.js");
921
+ const { handleSearchTraces } = await import("./search-traces-X7NSRTTP.js");
882
922
  return {
883
923
  content: [{ type: "text", text: await handleSearchTraces(params) }]
884
924
  };
@@ -888,14 +928,14 @@ function registerObservabilityTools(server) {
888
928
  "get_trace",
889
929
  "Get full details of a single trace by ID. This is the right tool whenever you have a trace ID \u2014 search_traces does not match IDs. A full ID resolves at any age; a unique 8\u201331 character hex prefix resolves within the last 90 days. Returns AI-readable trace digest by default. Use format: 'json' for full raw data including all spans.",
890
930
  {
891
- traceId: z2.string().describe(
931
+ traceId: z3.string().describe(
892
932
  "The trace ID to retrieve. A full ID resolves at any age; a unique 8\u201331 character hex prefix also resolves, git-style, within the last 90 days."
893
933
  ),
894
- format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
934
+ format: z3.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
895
935
  },
896
936
  withToolLogging("get_trace", async (params) => {
897
937
  requireApiKey();
898
- const { handleGetTrace } = await import("./get-trace-KBRVV4NN.js");
938
+ const { handleGetTrace } = await import("./get-trace-THPWSLD3.js");
899
939
  return {
900
940
  content: [{ type: "text", text: await handleGetTrace(params) }]
901
941
  };
@@ -905,21 +945,21 @@ function registerObservabilityTools(server) {
905
945
  "get_analytics",
906
946
  'Query analytics timeseries from LangWatch. Metrics use "category.name" format (e.g., "performance.completion_time"). Use discover_schema to see available metrics.',
907
947
  {
908
- metric: z2.string().describe(
948
+ metric: z3.string().describe(
909
949
  'Metric in "category.name" format, e.g., "metadata.trace_id", "performance.total_cost"'
910
950
  ),
911
- aggregation: z2.string().optional().describe(
951
+ aggregation: z3.string().optional().describe(
912
952
  "Aggregation type: avg, sum, min, max, median, p90, p95, p99, cardinality, terms. Default: avg"
913
953
  ),
914
- startDate: z2.string().optional().describe('Start date: ISO or relative ("7d", "30d"). Default: 7 days ago'),
915
- endDate: z2.string().optional().describe("End date. Default: now"),
916
- timeZone: z2.string().optional().describe("Timezone. Default: UTC"),
917
- groupBy: z2.string().optional().describe("Group results by field. Use discover_schema for options."),
918
- filters: z2.record(z2.string(), z2.array(z2.string())).optional().describe("Filters to apply")
954
+ startDate: z3.string().optional().describe('Start date: ISO or relative ("7d", "30d"). Default: 7 days ago'),
955
+ endDate: z3.string().optional().describe("End date. Default: now"),
956
+ timeZone: z3.string().optional().describe("Timezone. Default: UTC"),
957
+ groupBy: z3.string().optional().describe("Group results by field. Use discover_schema for options."),
958
+ filters: z3.record(z3.string(), z3.array(z3.string())).optional().describe("Filters to apply")
919
959
  },
920
960
  withToolLogging("get_analytics", async (params) => {
921
961
  requireApiKey();
922
- const { handleGetAnalytics } = await import("./get-analytics-IQZKJHLW.js");
962
+ const { handleGetAnalytics } = await import("./get-analytics-TI2U3JLA.js");
923
963
  return {
924
964
  content: [{ type: "text", text: await handleGetAnalytics(params) }]
925
965
  };
@@ -938,22 +978,22 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
938
978
  2. Platform-based (LangWatch UI): If the user wants to manage prompts directly on the LangWatch platform, use the \`platform_\` MCP tools (\`platform_create_prompt\`, \`platform_update_prompt\`, etc.).
939
979
  `,
940
980
  {
941
- name: z2.string().describe("Prompt display name"),
942
- handle: z2.string().optional().describe("URL-friendly handle (auto-generated from name if omitted)"),
943
- messages: z2.array(
944
- z2.object({
945
- role: z2.enum(["system", "user", "assistant"]).describe("Message role"),
946
- content: z2.string().describe("Message content")
981
+ name: z3.string().describe("Prompt display name"),
982
+ handle: z3.string().optional().describe("URL-friendly handle (auto-generated from name if omitted)"),
983
+ messages: z3.array(
984
+ z3.object({
985
+ role: z3.enum(["system", "user", "assistant"]).describe("Message role"),
986
+ content: z3.string().describe("Message content")
947
987
  })
948
988
  ).describe("Prompt messages"),
949
989
  model: modelSchema,
950
- tags: z2.array(z2.string()).optional().describe(
990
+ tags: z3.array(z3.string()).optional().describe(
951
991
  'Tags to assign to the initial version (e.g., ["production", "staging"]). Built-in tags: "latest" (auto-assigned), "production", "staging". Custom tags must be created first.'
952
992
  )
953
993
  },
954
994
  withToolLogging("platform_create_prompt", async (params) => {
955
995
  requireApiKey();
956
- const { handleCreatePrompt } = await import("./create-prompt-PKJ7EDRR.js");
996
+ const { handleCreatePrompt } = await import("./create-prompt-RNUJOL25.js");
957
997
  return {
958
998
  content: [{ type: "text", text: await handleCreatePrompt(params) }]
959
999
  };
@@ -965,7 +1005,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
965
1005
  {},
966
1006
  withToolLogging("platform_list_prompts", async () => {
967
1007
  requireApiKey();
968
- const { handleListPrompts } = await import("./list-prompts-IRI6AIXO.js");
1008
+ const { handleListPrompts } = await import("./list-prompts-DSJ2LUSU.js");
969
1009
  return {
970
1010
  content: [{ type: "text", text: await handleListPrompts() }]
971
1011
  };
@@ -975,12 +1015,12 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
975
1015
  "platform_get_prompt",
976
1016
  "Get a specific prompt from the LangWatch platform by ID or handle, including messages, model config, and version history. Use format: 'json' for the full raw API payload, or 'digest' (default) for a formatted summary.",
977
1017
  {
978
- idOrHandle: z2.string().describe("Prompt ID or handle"),
979
- version: z2.number().optional().describe("Specific version number (default: latest)"),
980
- tag: z2.string().optional().describe(
1018
+ idOrHandle: z3.string().describe("Prompt ID or handle"),
1019
+ version: z3.number().optional().describe("Specific version number (default: latest)"),
1020
+ tag: z3.string().optional().describe(
981
1021
  'Fetch the version pointed to by this tag (e.g., "production", "staging"). Alternatively, use shorthand in idOrHandle: "pizza-prompt:production"'
982
1022
  ),
983
- format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
1023
+ format: z3.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
984
1024
  },
985
1025
  withToolLogging("platform_get_prompt", async (params) => {
986
1026
  if (params.version != null && params.tag) {
@@ -990,7 +1030,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
990
1030
  };
991
1031
  }
992
1032
  requireApiKey();
993
- const { handleGetPrompt } = await import("./get-prompt-W52DY36E.js");
1033
+ const { handleGetPrompt } = await import("./get-prompt-ZTCWGYJV.js");
994
1034
  return {
995
1035
  content: [{ type: "text", text: await handleGetPrompt(params) }]
996
1036
  };
@@ -1000,20 +1040,20 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
1000
1040
  "platform_update_prompt",
1001
1041
  "Update an existing prompt on the LangWatch platform. Every update creates a new version.",
1002
1042
  {
1003
- idOrHandle: z2.string().describe("Prompt ID or handle to update"),
1004
- messages: z2.array(
1005
- z2.object({
1006
- role: z2.enum(["system", "user", "assistant"]),
1007
- content: z2.string()
1043
+ idOrHandle: z3.string().describe("Prompt ID or handle to update"),
1044
+ messages: z3.array(
1045
+ z3.object({
1046
+ role: z3.enum(["system", "user", "assistant"]),
1047
+ content: z3.string()
1008
1048
  })
1009
1049
  ).optional().describe("Updated messages"),
1010
1050
  model: modelSchema.optional(),
1011
- commitMessage: z2.string().describe("Commit message describing the change"),
1012
- tags: z2.array(z2.string()).optional().describe("Tags to assign to the new version created by this update.")
1051
+ commitMessage: z3.string().describe("Commit message describing the change"),
1052
+ tags: z3.array(z3.string()).optional().describe("Tags to assign to the new version created by this update.")
1013
1053
  },
1014
1054
  withToolLogging("platform_update_prompt", async (params) => {
1015
1055
  requireApiKey();
1016
- const { handleUpdatePrompt } = await import("./update-prompt-GDKRYJI3.js");
1056
+ const { handleUpdatePrompt } = await import("./update-prompt-FABVQCAC.js");
1017
1057
  return {
1018
1058
  content: [{ type: "text", text: await handleUpdatePrompt(params) }]
1019
1059
  };
@@ -1023,13 +1063,13 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
1023
1063
  "platform_assign_prompt_tag",
1024
1064
  'Assign a tag (e.g. "production") to a specific version of a prompt. Use this to "deploy" a version by promoting it to the production tag.',
1025
1065
  {
1026
- idOrHandle: z2.string().describe("Prompt ID or handle"),
1027
- tag: z2.string().describe('Tag name (e.g., "production", "staging")'),
1028
- versionId: z2.string().describe("The version ID to assign the tag to")
1066
+ idOrHandle: z3.string().describe("Prompt ID or handle"),
1067
+ tag: z3.string().describe('Tag name (e.g., "production", "staging")'),
1068
+ versionId: z3.string().describe("The version ID to assign the tag to")
1029
1069
  },
1030
1070
  withToolLogging("platform_assign_prompt_tag", async (params) => {
1031
1071
  requireApiKey();
1032
- const { handleAssignPromptTag } = await import("./assign-prompt-tag-5IUZXJ2T.js");
1072
+ const { handleAssignPromptTag } = await import("./assign-prompt-tag-2A25CXB7.js");
1033
1073
  return {
1034
1074
  content: [{ type: "text", text: await handleAssignPromptTag(params) }]
1035
1075
  };
@@ -1041,7 +1081,7 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
1041
1081
  {},
1042
1082
  withToolLogging("platform_list_prompt_tags", async () => {
1043
1083
  requireApiKey();
1044
- const { handleListPromptTags } = await import("./list-prompt-tags-XUQTTAH4.js");
1084
+ const { handleListPromptTags } = await import("./list-prompt-tags-RITKQDC5.js");
1045
1085
  return {
1046
1086
  content: [{ type: "text", text: await handleListPromptTags() }]
1047
1087
  };
@@ -1051,11 +1091,11 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
1051
1091
  "platform_create_prompt_tag",
1052
1092
  'Create a custom prompt tag definition for the organization. Tag names must be non-numeric and not "latest".',
1053
1093
  {
1054
- name: z2.string().describe("Tag name to create")
1094
+ name: z3.string().describe("Tag name to create")
1055
1095
  },
1056
1096
  withToolLogging("platform_create_prompt_tag", async (params) => {
1057
1097
  requireApiKey();
1058
- const { handleCreatePromptTag } = await import("./create-prompt-tag-4YO3FSJ3.js");
1098
+ const { handleCreatePromptTag } = await import("./create-prompt-tag-R6KIAZTB.js");
1059
1099
  return {
1060
1100
  content: [{ type: "text", text: await handleCreatePromptTag(params) }]
1061
1101
  };
@@ -1065,12 +1105,12 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
1065
1105
  "platform_rename_prompt_tag",
1066
1106
  'Rename an existing prompt tag. The "latest" tag cannot be renamed.',
1067
1107
  {
1068
- tag: z2.string().describe("Current tag name to rename"),
1069
- name: z2.string().describe("New tag name")
1108
+ tag: z3.string().describe("Current tag name to rename"),
1109
+ name: z3.string().describe("New tag name")
1070
1110
  },
1071
1111
  withToolLogging("platform_rename_prompt_tag", async (params) => {
1072
1112
  requireApiKey();
1073
- const { handleRenamePromptTag } = await import("./rename-prompt-tag-PA2BRIE6.js");
1113
+ const { handleRenamePromptTag } = await import("./rename-prompt-tag-HR5HZZI2.js");
1074
1114
  return {
1075
1115
  content: [{ type: "text", text: await handleRenamePromptTag(params) }]
1076
1116
  };
@@ -1080,11 +1120,11 @@ NOTE: Prompts can be managed two ways. Determine which approach the user needs:
1080
1120
  "platform_delete_prompt_tag",
1081
1121
  'Delete a prompt tag and all its assignments. The "latest" tag cannot be deleted.',
1082
1122
  {
1083
- tag: z2.string().describe("Tag name to delete")
1123
+ tag: z3.string().describe("Tag name to delete")
1084
1124
  },
1085
1125
  withToolLogging("platform_delete_prompt_tag", async (params) => {
1086
1126
  requireApiKey();
1087
- const { handleDeletePromptTag } = await import("./delete-prompt-tag-NZ4JQMYG.js");
1127
+ const { handleDeletePromptTag } = await import("./delete-prompt-tag-OC57CN32.js");
1088
1128
  return {
1089
1129
  content: [{ type: "text", text: await handleDeletePromptTag(params) }]
1090
1130
  };
@@ -1103,18 +1143,18 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1103
1143
  2. Platform-based (LangWatch UI): If the user wants to manage scenarios directly on the LangWatch platform, use the \`platform_\` MCP tools (\`platform_create_scenario\`, \`platform_update_scenario\`, etc.).
1104
1144
  `,
1105
1145
  {
1106
- name: z2.string().describe("Scenario name"),
1107
- situation: z2.string().describe("The context or setup describing what the user/agent is doing"),
1108
- criteria: z2.array(z2.string()).optional().describe("Pass/fail conditions the agent's response must satisfy"),
1109
- labels: z2.array(z2.string()).optional().describe("Tags for organizing and filtering scenarios"),
1110
- testSuiteId: z2.string().nullish().describe(
1146
+ name: z3.string().describe("Scenario name"),
1147
+ situation: z3.string().describe("The context or setup describing what the user/agent is doing"),
1148
+ criteria: z3.array(z3.string()).optional().describe("Pass/fail conditions the agent's response must satisfy"),
1149
+ labels: z3.array(z3.string()).optional().describe("Tags for organizing and filtering scenarios"),
1150
+ testSuiteId: z3.string().nullish().describe(
1111
1151
  "The test suite to file this scenario in. Pass a test suite ID, or null to unfile it."
1112
1152
  ),
1113
1153
  fields: scenarioFieldValuesSchema.optional()
1114
1154
  },
1115
1155
  withToolLogging("platform_create_scenario", async (params) => {
1116
1156
  requireApiKey();
1117
- const { handleCreateScenario } = await import("./create-scenario-5PJBMAXO.js");
1157
+ const { handleCreateScenario } = await import("./create-scenario-WO5NWXVQ.js");
1118
1158
  return {
1119
1159
  content: [{ type: "text", text: await handleCreateScenario(params) }]
1120
1160
  };
@@ -1124,12 +1164,12 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1124
1164
  "platform_list_scenarios",
1125
1165
  "List all scenarios on the LangWatch platform. Returns AI-readable digest by default.",
1126
1166
  {
1127
- testSuiteId: z2.string().optional().describe("Only the scenarios filed in this test suite"),
1128
- format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
1167
+ testSuiteId: z3.string().optional().describe("Only the scenarios filed in this test suite"),
1168
+ format: z3.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
1129
1169
  },
1130
1170
  withToolLogging("platform_list_scenarios", async (params) => {
1131
1171
  requireApiKey();
1132
- const { handleListScenarios } = await import("./list-scenarios-SSJQEMJP.js");
1172
+ const { handleListScenarios } = await import("./list-scenarios-6HN72TMW.js");
1133
1173
  return {
1134
1174
  content: [{ type: "text", text: await handleListScenarios(params) }]
1135
1175
  };
@@ -1139,12 +1179,12 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1139
1179
  "platform_get_scenario",
1140
1180
  "Get full details of a scenario on the LangWatch platform by ID, including situation, criteria, and labels.",
1141
1181
  {
1142
- scenarioId: z2.string().describe("The scenario ID to retrieve"),
1143
- format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
1182
+ scenarioId: z3.string().describe("The scenario ID to retrieve"),
1183
+ format: z3.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
1144
1184
  },
1145
1185
  withToolLogging("platform_get_scenario", async (params) => {
1146
1186
  requireApiKey();
1147
- const { handleGetScenario } = await import("./get-scenario-RNM7BAX2.js");
1187
+ const { handleGetScenario } = await import("./get-scenario-2DM4XR44.js");
1148
1188
  return {
1149
1189
  content: [{ type: "text", text: await handleGetScenario(params) }]
1150
1190
  };
@@ -1154,19 +1194,19 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1154
1194
  "platform_update_scenario",
1155
1195
  "Update an existing scenario on the LangWatch platform.",
1156
1196
  {
1157
- scenarioId: z2.string().describe("The scenario ID to update"),
1158
- name: z2.string().optional().describe("Updated scenario name"),
1159
- situation: z2.string().optional().describe("Updated situation"),
1160
- criteria: z2.array(z2.string()).optional().describe("Updated criteria"),
1161
- labels: z2.array(z2.string()).optional().describe("Updated labels"),
1162
- testSuiteId: z2.string().nullish().describe(
1197
+ scenarioId: z3.string().describe("The scenario ID to update"),
1198
+ name: z3.string().optional().describe("Updated scenario name"),
1199
+ situation: z3.string().optional().describe("Updated situation"),
1200
+ criteria: z3.array(z3.string()).optional().describe("Updated criteria"),
1201
+ labels: z3.array(z3.string()).optional().describe("Updated labels"),
1202
+ testSuiteId: z3.string().nullish().describe(
1163
1203
  "The test suite to file this scenario in. Pass a test suite ID, or null to unfile it."
1164
1204
  ),
1165
1205
  fields: scenarioFieldValuesSchema.optional()
1166
1206
  },
1167
1207
  withToolLogging("platform_update_scenario", async (params) => {
1168
1208
  requireApiKey();
1169
- const { handleUpdateScenario } = await import("./update-scenario-7KA3JDXA.js");
1209
+ const { handleUpdateScenario } = await import("./update-scenario-XIZNUH4I.js");
1170
1210
  return {
1171
1211
  content: [{ type: "text", text: await handleUpdateScenario(params) }]
1172
1212
  };
@@ -1176,11 +1216,11 @@ NOTE: Scenarios can be created two ways. Determine which approach the user needs
1176
1216
  "platform_archive_scenario",
1177
1217
  "Archive (soft-delete) a scenario on the LangWatch platform.",
1178
1218
  {
1179
- scenarioId: z2.string().describe("The scenario ID to archive")
1219
+ scenarioId: z3.string().describe("The scenario ID to archive")
1180
1220
  },
1181
1221
  withToolLogging("platform_archive_scenario", async (params) => {
1182
1222
  requireApiKey();
1183
- const { handleArchiveScenario } = await import("./archive-scenario-FXEYQNEH.js");
1223
+ const { handleArchiveScenario } = await import("./archive-scenario-7KDGEZM5.js");
1184
1224
  return {
1185
1225
  content: [{ type: "text", text: await handleArchiveScenario(params) }]
1186
1226
  };
@@ -1192,33 +1232,33 @@ function registerRunPlanTools(server) {
1192
1232
  "platform_run_plan",
1193
1233
  "Run scenarios against targets. The plan name identifies the run plan: an existing name is re-run with the configuration you send here, a new name creates the plan. Configuration is the scope, the targets, the repeat count and the models; parameters, the note and the idempotency key belong to this run alone. Send more than one target to compare them in the same run, and give a target its own parameters to compare one agent on two models.",
1194
1234
  {
1195
- name: z2.string().optional().describe(
1235
+ name: z3.string().optional().describe(
1196
1236
  "The run plan to run. An existing name is replaced with this configuration, a new name creates the plan. Omit to let the server name it after the suite and the target."
1197
1237
  ),
1198
1238
  scope: runPlanScopeSchema.describe(
1199
1239
  "What the plan covers: every scenario in the project, the scenarios filed in given test suites, the scenarios carrying given labels, or the hand-picked list in scenarioIds."
1200
1240
  ),
1201
- scenarioIds: z2.array(z2.string()).optional().describe("The scenarios to run. Read only when scope.mode is 'scenarios'."),
1202
- targets: z2.array(runPlanTargetSchema).describe(
1241
+ scenarioIds: z3.array(z3.string()).optional().describe("The scenarios to run. Read only when scope.mode is 'scenarios'."),
1242
+ targets: z3.array(runPlanTargetSchema).describe(
1203
1243
  "What to run the scenarios against. Every target runs every scenario, and the results show one column for each, so this is how one run compares two agents or one agent on two models."
1204
1244
  ),
1205
- repeatCount: z2.number().int().min(1).max(5).optional().describe("How many times to run each scenario against each target (1 to 5, default 1)"),
1206
- simulatorModel: z2.string().optional().describe("Model that plays the user. Omit for the project default."),
1207
- judgeModel: z2.string().optional().describe("Model that judges the criteria. Omit for the project default."),
1245
+ repeatCount: z3.number().int().min(1).max(5).optional().describe("How many times to run each scenario against each target (1 to 5, default 1)"),
1246
+ simulatorModel: z3.string().optional().describe("Model that plays the user. Omit for the project default."),
1247
+ judgeModel: z3.string().optional().describe("Model that judges the criteria. Omit for the project default."),
1208
1248
  evaluators: evaluatorAttachmentsSchema.optional().describe(
1209
1249
  "The plan's own evaluators, run beside the ones attached to the test suites its scenarios belong to. A plan evaluator reads the conversation and the trace, never a scenario field. Omit to keep what the plan already holds. See discover_schema({ category: 'scenarios' }) for the mapping paths."
1210
1250
  ),
1211
1251
  parameters: runParametersSchema.optional().describe(
1212
1252
  "Values for the parameters the scenarios declare, by name. They apply to every target; a target that names the same parameter overrides them for itself."
1213
1253
  ),
1214
- note: z2.string().max(200).optional().describe("One short line saying why this run was started (max 200 characters)"),
1215
- idempotencyKey: z2.string().optional().describe(
1254
+ note: z3.string().max(200).optional().describe("One short line saying why this run was started (max 200 characters)"),
1255
+ idempotencyKey: z3.string().optional().describe(
1216
1256
  "Send the same key to make a retry join the run it already started instead of starting a second one."
1217
1257
  )
1218
1258
  },
1219
1259
  withToolLogging("platform_run_plan", async (params) => {
1220
1260
  requireApiKey();
1221
- const { handleRunPlan } = await import("./run-plan-6C77GWG4.js");
1261
+ const { handleRunPlan } = await import("./run-plan-G24DBB5D.js");
1222
1262
  return {
1223
1263
  content: [{ type: "text", text: await handleRunPlan(params) }]
1224
1264
  };
@@ -1228,12 +1268,12 @@ function registerRunPlanTools(server) {
1228
1268
  "platform_list_run_plans",
1229
1269
  "List the run plans of the project. A run plan holds the configuration a run used, keyed by its name.",
1230
1270
  {
1231
- includeArchived: z2.boolean().optional().describe("Include archived plans (default false)"),
1232
- format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default) or 'json' (raw data)")
1271
+ includeArchived: z3.boolean().optional().describe("Include archived plans (default false)"),
1272
+ format: z3.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default) or 'json' (raw data)")
1233
1273
  },
1234
1274
  withToolLogging("platform_list_run_plans", async (params) => {
1235
1275
  requireApiKey();
1236
- const { handleListRunPlans } = await import("./list-run-plans-QALLCN2K.js");
1276
+ const { handleListRunPlans } = await import("./list-run-plans-ZHRZHCDL.js");
1237
1277
  return {
1238
1278
  content: [{ type: "text", text: await handleListRunPlans(params) }]
1239
1279
  };
@@ -1243,12 +1283,12 @@ function registerRunPlanTools(server) {
1243
1283
  "platform_get_run_plan",
1244
1284
  "Get the full configuration of a run plan: what it covers, its targets, its repeat count and its models.",
1245
1285
  {
1246
- id: z2.string().describe("The run plan ID"),
1247
- format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default) or 'json'")
1286
+ id: z3.string().describe("The run plan ID"),
1287
+ format: z3.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default) or 'json'")
1248
1288
  },
1249
1289
  withToolLogging("platform_get_run_plan", async (params) => {
1250
1290
  requireApiKey();
1251
- const { handleGetRunPlan } = await import("./get-run-plan-RUXQ6PAX.js");
1291
+ const { handleGetRunPlan } = await import("./get-run-plan-MEPEU353.js");
1252
1292
  return {
1253
1293
  content: [{ type: "text", text: await handleGetRunPlan(params) }]
1254
1294
  };
@@ -1258,13 +1298,13 @@ function registerRunPlanTools(server) {
1258
1298
  "platform_rerun_run_plan",
1259
1299
  "Run a plan again with the configuration it already holds. Only the parameters and the note belong to the new run.",
1260
1300
  {
1261
- id: z2.string().describe("The run plan ID to run again"),
1301
+ id: z3.string().describe("The run plan ID to run again"),
1262
1302
  parameters: runParametersSchema.optional().describe("Values for the parameters the scenarios declare, by name."),
1263
- note: z2.string().max(200).optional().describe("One short line saying why this run was started (max 200 characters)")
1303
+ note: z3.string().max(200).optional().describe("One short line saying why this run was started (max 200 characters)")
1264
1304
  },
1265
1305
  withToolLogging("platform_rerun_run_plan", async (params) => {
1266
1306
  requireApiKey();
1267
- const { handleRerunRunPlan } = await import("./rerun-run-plan-ZI5OY3VA.js");
1307
+ const { handleRerunRunPlan } = await import("./rerun-run-plan-LXM3RFZC.js");
1268
1308
  return {
1269
1309
  content: [{ type: "text", text: await handleRerunRunPlan(params) }]
1270
1310
  };
@@ -1274,11 +1314,11 @@ function registerRunPlanTools(server) {
1274
1314
  "platform_archive_run_plan",
1275
1315
  "Archive a run plan. Its past runs stay readable and the name is free for a new plan.",
1276
1316
  {
1277
- id: z2.string().describe("The run plan ID to archive")
1317
+ id: z3.string().describe("The run plan ID to archive")
1278
1318
  },
1279
1319
  withToolLogging("platform_archive_run_plan", async (params) => {
1280
1320
  requireApiKey();
1281
- const { handleArchiveRunPlan } = await import("./archive-run-plan-Z4SYE6BP.js");
1321
+ const { handleArchiveRunPlan } = await import("./archive-run-plan-3HKFL5MS.js");
1282
1322
  return {
1283
1323
  content: [{ type: "text", text: await handleArchiveRunPlan(params) }]
1284
1324
  };
@@ -1290,11 +1330,11 @@ function registerTestSuiteTools(server) {
1290
1330
  "platform_list_test_suites",
1291
1331
  "List the test suites of the project. A test suite groups scenarios.",
1292
1332
  {
1293
- format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default) or 'json' (raw data)")
1333
+ format: z3.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default) or 'json' (raw data)")
1294
1334
  },
1295
1335
  withToolLogging("platform_list_test_suites", async (params) => {
1296
1336
  requireApiKey();
1297
- const { handleListTestSuites } = await import("./list-test-suites-ANAQBLDG.js");
1337
+ const { handleListTestSuites } = await import("./list-test-suites-YY4J3L7H.js");
1298
1338
  return {
1299
1339
  content: [{ type: "text", text: await handleListTestSuites(params) }]
1300
1340
  };
@@ -1304,13 +1344,13 @@ function registerTestSuiteTools(server) {
1304
1344
  "platform_create_test_suite",
1305
1345
  "Create a test suite. A test suite groups scenarios: file a scenario in it by passing the suite ID as testSuiteId on platform_create_scenario or platform_update_scenario. A suite can declare typed fields every scenario carries a value for, and attach saved evaluators that run after every scenario run with mappings from their inputs to the conversation, the scenario's fields or the trace. Call discover_schema({ category: 'scenarios' }) first for the field rules and the mapping paths.",
1306
1346
  {
1307
- name: z2.string().describe("Test suite name"),
1347
+ name: z3.string().describe("Test suite name"),
1308
1348
  fields: suiteFieldsSchema.optional(),
1309
1349
  evaluators: evaluatorAttachmentsSchema.optional()
1310
1350
  },
1311
1351
  withToolLogging("platform_create_test_suite", async (params) => {
1312
1352
  requireApiKey();
1313
- const { handleCreateTestSuite } = await import("./create-test-suite-SZEPVXSE.js");
1353
+ const { handleCreateTestSuite } = await import("./create-test-suite-LRKCNIJA.js");
1314
1354
  return {
1315
1355
  content: [{ type: "text", text: await handleCreateTestSuite(params) }]
1316
1356
  };
@@ -1320,12 +1360,12 @@ function registerTestSuiteTools(server) {
1320
1360
  "platform_get_test_suite",
1321
1361
  "Get a test suite and the scenarios filed in it.",
1322
1362
  {
1323
- id: z2.string().describe("The test suite ID"),
1324
- format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default) or 'json'")
1363
+ id: z3.string().describe("The test suite ID"),
1364
+ format: z3.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default) or 'json'")
1325
1365
  },
1326
1366
  withToolLogging("platform_get_test_suite", async (params) => {
1327
1367
  requireApiKey();
1328
- const { handleGetTestSuite } = await import("./get-test-suite-P5LJ6VLF.js");
1368
+ const { handleGetTestSuite } = await import("./get-test-suite-DP2HNOQZ.js");
1329
1369
  return {
1330
1370
  content: [{ type: "text", text: await handleGetTestSuite(params) }]
1331
1371
  };
@@ -1335,8 +1375,8 @@ function registerTestSuiteTools(server) {
1335
1375
  "platform_update_test_suite",
1336
1376
  "Edit a test suite: any of its name, its fields and its evaluators. A field list or an evaluator list replaces the one the suite holds; a key left out keeps what the suite has. A field an attached evaluator still reads cannot be removed. Call discover_schema({ category: 'scenarios' }) first for the field rules and the mapping paths.",
1337
1377
  {
1338
- id: z2.string().describe("The test suite ID"),
1339
- name: z2.string().optional().describe("The new name. The slug is kept."),
1378
+ id: z3.string().describe("The test suite ID"),
1379
+ name: z3.string().optional().describe("The new name. The slug is kept."),
1340
1380
  fields: suiteFieldsSchema.optional().describe(
1341
1381
  "The full list of fields the suite declares. It replaces the list the suite holds."
1342
1382
  ),
@@ -1355,12 +1395,12 @@ function registerTestSuiteTools(server) {
1355
1395
  "platform_rename_test_suite",
1356
1396
  "Rename a test suite.",
1357
1397
  {
1358
- id: z2.string().describe("The test suite ID"),
1359
- name: z2.string().describe("The new name")
1398
+ id: z3.string().describe("The test suite ID"),
1399
+ name: z3.string().describe("The new name")
1360
1400
  },
1361
1401
  withToolLogging("platform_rename_test_suite", async (params) => {
1362
1402
  requireApiKey();
1363
- const { handleRenameTestSuite } = await import("./rename-test-suite-NNVLMLKY.js");
1403
+ const { handleRenameTestSuite } = await import("./rename-test-suite-2ZRXG5O7.js");
1364
1404
  return {
1365
1405
  content: [{ type: "text", text: await handleRenameTestSuite(params) }]
1366
1406
  };
@@ -1370,11 +1410,11 @@ function registerTestSuiteTools(server) {
1370
1410
  "platform_archive_test_suite",
1371
1411
  "Archive a test suite. The scenarios filed in it are archived with it.",
1372
1412
  {
1373
- id: z2.string().describe("The test suite ID to archive")
1413
+ id: z3.string().describe("The test suite ID to archive")
1374
1414
  },
1375
1415
  withToolLogging("platform_archive_test_suite", async (params) => {
1376
1416
  requireApiKey();
1377
- const { handleArchiveTestSuite } = await import("./archive-test-suite-5ADQ3KPQ.js");
1417
+ const { handleArchiveTestSuite } = await import("./archive-test-suite-RPJ6ZKBV.js");
1378
1418
  return {
1379
1419
  content: [{ type: "text", text: await handleArchiveTestSuite(params) }]
1380
1420
  };
@@ -1384,24 +1424,24 @@ function registerTestSuiteTools(server) {
1384
1424
  "platform_run_test_suite",
1385
1425
  "Run every scenario of a test suite against targets. This creates or joins the run plan named '<suite name> <target name>' unless you send a name of your own. Send more than one target to compare them in the same run, and give a target its own parameters to compare one agent on two models.",
1386
1426
  {
1387
- id: z2.string().describe("The test suite ID to run"),
1388
- targets: z2.array(runPlanTargetSchema).describe(
1427
+ id: z3.string().describe("The test suite ID to run"),
1428
+ targets: z3.array(runPlanTargetSchema).describe(
1389
1429
  "What to run the scenarios against. Every target runs every scenario, and the results show one column for each."
1390
1430
  ),
1391
- name: z2.string().optional().describe(
1431
+ name: z3.string().optional().describe(
1392
1432
  "The run plan to run. Omit to let the server name it after the suite and the target."
1393
1433
  ),
1394
- repeatCount: z2.number().int().min(1).max(5).optional().describe("How many times to run each scenario against each target (1 to 5, default 1)"),
1395
- simulatorModel: z2.string().optional().describe("Model that plays the user. Omit for the project default."),
1396
- judgeModel: z2.string().optional().describe("Model that judges the criteria. Omit for the project default."),
1434
+ repeatCount: z3.number().int().min(1).max(5).optional().describe("How many times to run each scenario against each target (1 to 5, default 1)"),
1435
+ simulatorModel: z3.string().optional().describe("Model that plays the user. Omit for the project default."),
1436
+ judgeModel: z3.string().optional().describe("Model that judges the criteria. Omit for the project default."),
1397
1437
  parameters: runParametersSchema.optional().describe(
1398
1438
  "Values for the parameters the scenarios declare, by name. They apply to every target; a target that names the same parameter overrides them for itself."
1399
1439
  ),
1400
- note: z2.string().max(200).optional().describe("One short line saying why this run was started (max 200 characters)")
1440
+ note: z3.string().max(200).optional().describe("One short line saying why this run was started (max 200 characters)")
1401
1441
  },
1402
1442
  withToolLogging("platform_run_test_suite", async (params) => {
1403
1443
  requireApiKey();
1404
- const { handleRunTestSuite } = await import("./run-test-suite-STB6NUJM.js");
1444
+ const { handleRunTestSuite } = await import("./run-test-suite-NTKLJZCJ.js");
1405
1445
  return {
1406
1446
  content: [{ type: "text", text: await handleRunTestSuite(params) }]
1407
1447
  };
@@ -1413,14 +1453,14 @@ function registerSimulationRunTools(server) {
1413
1453
  "platform_list_simulation_runs",
1414
1454
  "List simulation run results. Filter by scenario set or batch run ID to see specific results.",
1415
1455
  {
1416
- scenarioSetId: z2.string().optional().describe("Filter by scenario set ID"),
1417
- batchRunId: z2.string().optional().describe("Filter by batch run ID"),
1418
- limit: z2.number().optional().describe("Max results to return (default: 20)"),
1419
- format: z2.enum(["digest", "json"]).optional().describe("Output format")
1456
+ scenarioSetId: z3.string().optional().describe("Filter by scenario set ID"),
1457
+ batchRunId: z3.string().optional().describe("Filter by batch run ID"),
1458
+ limit: z3.number().optional().describe("Max results to return (default: 20)"),
1459
+ format: z3.enum(["digest", "json"]).optional().describe("Output format")
1420
1460
  },
1421
1461
  withToolLogging("platform_list_simulation_runs", async (params) => {
1422
1462
  requireApiKey();
1423
- const { handleListSimulationRuns } = await import("./list-simulation-runs-KNOLGMDV.js");
1463
+ const { handleListSimulationRuns } = await import("./list-simulation-runs-JNST5PQU.js");
1424
1464
  return {
1425
1465
  content: [{ type: "text", text: await handleListSimulationRuns(params) }]
1426
1466
  };
@@ -1430,12 +1470,12 @@ function registerSimulationRunTools(server) {
1430
1470
  "platform_get_simulation_run",
1431
1471
  "Get full details of a simulation run including conversation messages, results, costs, the verdict and the result of every evaluator attached to its test suite or run plan.",
1432
1472
  {
1433
- scenarioRunId: z2.string().describe("The simulation run ID"),
1434
- format: z2.enum(["digest", "json"]).optional().describe("Output format")
1473
+ scenarioRunId: z3.string().describe("The simulation run ID"),
1474
+ format: z3.enum(["digest", "json"]).optional().describe("Output format")
1435
1475
  },
1436
1476
  withToolLogging("platform_get_simulation_run", async (params) => {
1437
1477
  requireApiKey();
1438
- const { handleGetSimulationRun } = await import("./get-simulation-run-6GIATQE5.js");
1478
+ const { handleGetSimulationRun } = await import("./get-simulation-run-53WM2XOO.js");
1439
1479
  return {
1440
1480
  content: [{ type: "text", text: await handleGetSimulationRun(params) }]
1441
1481
  };
@@ -1447,14 +1487,14 @@ function registerEvaluatorTools(server) {
1447
1487
  "platform_create_evaluator",
1448
1488
  `Create an evaluator on the LangWatch platform. Useful for setting up LLM-as-judge and other evaluators to use in evaluation notebooks. Call discover_schema({ category: 'evaluators' }) first to see available evaluator types and their settings.`,
1449
1489
  {
1450
- name: z2.string().describe("Evaluator name"),
1451
- config: z2.record(z2.string(), z2.unknown()).describe(
1490
+ name: z3.string().describe("Evaluator name"),
1491
+ config: z3.record(z3.string(), z3.unknown()).describe(
1452
1492
  'Evaluator config object. Must include "evaluatorType" (e.g. "langevals/llm_boolean") and optional "settings" overrides.'
1453
1493
  )
1454
1494
  },
1455
1495
  withToolLogging("platform_create_evaluator", async (params) => {
1456
1496
  requireApiKey();
1457
- const { handleCreateEvaluator } = await import("./create-evaluator-HMTYO5SS.js");
1497
+ const { handleCreateEvaluator } = await import("./create-evaluator-I5I52HOQ.js");
1458
1498
  return {
1459
1499
  content: [{ type: "text", text: await handleCreateEvaluator(params) }]
1460
1500
  };
@@ -1466,7 +1506,7 @@ function registerEvaluatorTools(server) {
1466
1506
  {},
1467
1507
  withToolLogging("platform_list_evaluators", async () => {
1468
1508
  requireApiKey();
1469
- const { handleListEvaluators } = await import("./list-evaluators-NLVWF6K7.js");
1509
+ const { handleListEvaluators } = await import("./list-evaluators-V6LP6ZQA.js");
1470
1510
  return {
1471
1511
  content: [{ type: "text", text: await handleListEvaluators() }]
1472
1512
  };
@@ -1476,11 +1516,11 @@ function registerEvaluatorTools(server) {
1476
1516
  "platform_get_evaluator",
1477
1517
  "Get full details of an evaluator on the LangWatch platform by ID or slug, including config, input fields, and output fields.",
1478
1518
  {
1479
- idOrSlug: z2.string().describe("The evaluator ID or slug to retrieve")
1519
+ idOrSlug: z3.string().describe("The evaluator ID or slug to retrieve")
1480
1520
  },
1481
1521
  withToolLogging("platform_get_evaluator", async (params) => {
1482
1522
  requireApiKey();
1483
- const { handleGetEvaluator } = await import("./get-evaluator-XEUZGZCH.js");
1523
+ const { handleGetEvaluator } = await import("./get-evaluator-GYQFB4F3.js");
1484
1524
  return {
1485
1525
  content: [{ type: "text", text: await handleGetEvaluator(params) }]
1486
1526
  };
@@ -1490,13 +1530,13 @@ function registerEvaluatorTools(server) {
1490
1530
  "platform_update_evaluator",
1491
1531
  "Update an existing evaluator on the LangWatch platform. The evaluatorType in config cannot be changed after creation.",
1492
1532
  {
1493
- evaluatorId: z2.string().describe("The evaluator ID to update"),
1494
- name: z2.string().optional().describe("Updated evaluator name"),
1495
- config: z2.record(z2.string(), z2.unknown()).optional().describe("Updated config settings. Note: evaluatorType cannot be changed after creation.")
1533
+ evaluatorId: z3.string().describe("The evaluator ID to update"),
1534
+ name: z3.string().optional().describe("Updated evaluator name"),
1535
+ config: z3.record(z3.string(), z3.unknown()).optional().describe("Updated config settings. Note: evaluatorType cannot be changed after creation.")
1496
1536
  },
1497
1537
  withToolLogging("platform_update_evaluator", async (params) => {
1498
1538
  requireApiKey();
1499
- const { handleUpdateEvaluator } = await import("./update-evaluator-4LFTKFPT.js");
1539
+ const { handleUpdateEvaluator } = await import("./update-evaluator-O6EJFTQJ.js");
1500
1540
  return {
1501
1541
  content: [{ type: "text", text: await handleUpdateEvaluator(params) }]
1502
1542
  };
@@ -1506,11 +1546,11 @@ function registerEvaluatorTools(server) {
1506
1546
  "platform_delete_evaluator",
1507
1547
  "Archive (soft-delete) an evaluator by ID or slug.",
1508
1548
  {
1509
- idOrSlug: z2.string().describe("The evaluator ID or slug to archive")
1549
+ idOrSlug: z3.string().describe("The evaluator ID or slug to archive")
1510
1550
  },
1511
1551
  withToolLogging("platform_delete_evaluator", async (params) => {
1512
1552
  requireApiKey();
1513
- const { handleDeleteEvaluator } = await import("./delete-evaluator-QP3QHTLN.js");
1553
+ const { handleDeleteEvaluator } = await import("./delete-evaluator-27P5XLNV.js");
1514
1554
  return {
1515
1555
  content: [{ type: "text", text: await handleDeleteEvaluator(params) }]
1516
1556
  };
@@ -1522,16 +1562,16 @@ function registerModelProviderTools(server) {
1522
1562
  "platform_set_model_provider",
1523
1563
  `Set or update a model provider on the LangWatch platform. Use this to configure API keys (e.g. OPENAI_API_KEY) needed to run evaluators. The API key is stored securely and never returned in responses. Omit customKeys to update other settings without changing existing keys.`,
1524
1564
  {
1525
- provider: z2.string().describe('Provider name, e.g., "openai", "anthropic", "azure", "custom"'),
1526
- enabled: z2.boolean().describe("Whether the provider is enabled"),
1527
- customKeys: z2.record(z2.string(), z2.unknown()).optional().describe(
1565
+ provider: z3.string().describe('Provider name, e.g., "openai", "anthropic", "azure", "custom"'),
1566
+ enabled: z3.boolean().describe("Whether the provider is enabled"),
1567
+ customKeys: z3.record(z3.string(), z3.unknown()).optional().describe(
1528
1568
  'API key configuration, e.g. { "OPENAI_API_KEY": "sk-..." }. Omit to keep existing keys.'
1529
1569
  ),
1530
- defaultModel: z2.string().optional().describe("Set as project default model")
1570
+ defaultModel: z3.string().optional().describe("Set as project default model")
1531
1571
  },
1532
1572
  withToolLogging("platform_set_model_provider", async (params) => {
1533
1573
  requireApiKey();
1534
- const { handleSetModelProvider } = await import("./set-model-provider-KDQ7C4EZ.js");
1574
+ const { handleSetModelProvider } = await import("./set-model-provider-YPUCFEXG.js");
1535
1575
  return {
1536
1576
  content: [{ type: "text", text: await handleSetModelProvider(params) }]
1537
1577
  };
@@ -1543,7 +1583,7 @@ function registerModelProviderTools(server) {
1543
1583
  {},
1544
1584
  withToolLogging("platform_list_model_providers", async () => {
1545
1585
  requireApiKey();
1546
- const { handleListModelProviders } = await import("./list-model-providers-H3XKORFO.js");
1586
+ const { handleListModelProviders } = await import("./list-model-providers-TMBSB6EE.js");
1547
1587
  return {
1548
1588
  content: [{ type: "text", text: await handleListModelProviders() }]
1549
1589
  };
@@ -1557,7 +1597,7 @@ function registerAgentTools(server) {
1557
1597
  {},
1558
1598
  withToolLogging("platform_list_agents", async () => {
1559
1599
  requireApiKey();
1560
- const { handleListAgents } = await import("./list-agents-RBAOCF53.js");
1600
+ const { handleListAgents } = await import("./list-agents-SVXWLLO7.js");
1561
1601
  return {
1562
1602
  content: [{ type: "text", text: await handleListAgents() }]
1563
1603
  };
@@ -1567,11 +1607,11 @@ function registerAgentTools(server) {
1567
1607
  "platform_get_agent",
1568
1608
  "Get detailed information about a specific agent by its ID, including its configuration. A connected agent also shows its environment, status, the run parameters it declared (with options and defaults) and the instances connected right now.",
1569
1609
  {
1570
- id: z2.string().describe("The agent ID")
1610
+ id: z3.string().describe("The agent ID")
1571
1611
  },
1572
1612
  withToolLogging("platform_get_agent", async (params) => {
1573
1613
  requireApiKey();
1574
- const { handleGetAgent } = await import("./get-agent-LJQX7OF4.js");
1614
+ const { handleGetAgent } = await import("./get-agent-6GKIKKL7.js");
1575
1615
  return {
1576
1616
  content: [{ type: "text", text: await handleGetAgent(params) }]
1577
1617
  };
@@ -1581,13 +1621,13 @@ function registerAgentTools(server) {
1581
1621
  "platform_create_agent",
1582
1622
  "Create a new agent. Supported types: 'signature' (LLM prompt), 'code' (Python), 'workflow' (sub-workflow), 'http' (external API). A 'connected' agent is not created here: it registers itself from code, with connectAgent from langwatch/agent in TypeScript or langwatch.connect_agent in Python, and appears in the list once that process runs.",
1583
1623
  {
1584
- name: z2.string().describe("Agent name"),
1585
- type: z2.enum(["signature", "code", "workflow", "http"]).describe("Agent type"),
1586
- config: z2.string().optional().describe("Agent configuration as JSON string (will be parsed)")
1624
+ name: z3.string().describe("Agent name"),
1625
+ type: z3.enum(["signature", "code", "workflow", "http"]).describe("Agent type"),
1626
+ config: z3.string().optional().describe("Agent configuration as JSON string (will be parsed)")
1587
1627
  },
1588
1628
  withToolLogging("platform_create_agent", async (params) => {
1589
1629
  requireApiKey();
1590
- const { handleCreateAgent } = await import("./create-agent-S5ZBCEFT.js");
1630
+ const { handleCreateAgent } = await import("./create-agent-IE7Q2Z4C.js");
1591
1631
  const parsedConfig = params.config ? JSON.parse(params.config) : void 0;
1592
1632
  return {
1593
1633
  content: [
@@ -1600,14 +1640,14 @@ function registerAgentTools(server) {
1600
1640
  "platform_update_agent",
1601
1641
  "Update an existing agent's name, type, or configuration.",
1602
1642
  {
1603
- id: z2.string().describe("The agent ID"),
1604
- name: z2.string().optional().describe("New agent name"),
1605
- type: z2.string().optional().describe("New agent type: signature, code, workflow, or http"),
1606
- config: z2.string().optional().describe("Updated configuration as JSON string (will be parsed)")
1643
+ id: z3.string().describe("The agent ID"),
1644
+ name: z3.string().optional().describe("New agent name"),
1645
+ type: z3.string().optional().describe("New agent type: signature, code, workflow, or http"),
1646
+ config: z3.string().optional().describe("Updated configuration as JSON string (will be parsed)")
1607
1647
  },
1608
1648
  withToolLogging("platform_update_agent", async (params) => {
1609
1649
  requireApiKey();
1610
- const { handleUpdateAgent } = await import("./update-agent-MXNOBS4H.js");
1650
+ const { handleUpdateAgent } = await import("./update-agent-6FHGWOO7.js");
1611
1651
  const parsedConfig = params.config ? JSON.parse(params.config) : void 0;
1612
1652
  return {
1613
1653
  content: [
@@ -1620,11 +1660,11 @@ function registerAgentTools(server) {
1620
1660
  "platform_delete_agent",
1621
1661
  "Archive (soft-delete) an agent by its ID.",
1622
1662
  {
1623
- id: z2.string().describe("The agent ID to archive")
1663
+ id: z3.string().describe("The agent ID to archive")
1624
1664
  },
1625
1665
  withToolLogging("platform_delete_agent", async (params) => {
1626
1666
  requireApiKey();
1627
- const { handleDeleteAgent } = await import("./delete-agent-JUIZWAXG.js");
1667
+ const { handleDeleteAgent } = await import("./delete-agent-Y4QTEQ3B.js");
1628
1668
  return {
1629
1669
  content: [{ type: "text", text: await handleDeleteAgent(params) }]
1630
1670
  };
@@ -1634,17 +1674,17 @@ function registerAgentTools(server) {
1634
1674
  "platform_run_agent",
1635
1675
  "Run one turn of an agent. A connected agent runs through the platform relay on a live instance: give `message` (one user turn) or `input` with a `messages` list, plus `parameters` and `threadId` to continue a conversation. HTTP agents call their configured URL directly; workflow-linked agents execute via the workflow engine.",
1636
1676
  {
1637
- id: z2.string().describe("The agent ID to run"),
1638
- input: z2.string().optional().describe(
1677
+ id: z3.string().describe("The agent ID to run"),
1678
+ input: z3.string().optional().describe(
1639
1679
  "Input data as a JSON object string. For a connected agent it is the relay body: messages (OpenAI style), and optionally threadId, session and params."
1640
1680
  ),
1641
- message: z2.string().optional().describe("One user message to send to a connected agent, instead of input"),
1642
- parameters: z2.record(z2.string(), z2.union([z2.string(), z2.number(), z2.boolean()])).optional().describe("Run parameter values for a connected agent, by name"),
1643
- threadId: z2.string().optional().describe("Continue a conversation on a connected agent")
1681
+ message: z3.string().optional().describe("One user message to send to a connected agent, instead of input"),
1682
+ parameters: z3.record(z3.string(), z3.union([z3.string(), z3.number(), z3.boolean()])).optional().describe("Run parameter values for a connected agent, by name"),
1683
+ threadId: z3.string().optional().describe("Continue a conversation on a connected agent")
1644
1684
  },
1645
1685
  withToolLogging("platform_run_agent", async (params) => {
1646
1686
  requireApiKey();
1647
- const { handleRunAgent } = await import("./run-agent-YNV6ZHW4.js");
1687
+ const { handleRunAgent } = await import("./run-agent-HRVRHRHI.js");
1648
1688
  return {
1649
1689
  content: [{ type: "text", text: await handleRunAgent(params) }]
1650
1690
  };
@@ -1654,7 +1694,7 @@ function registerAgentTools(server) {
1654
1694
  "platform_test_agent",
1655
1695
  'Test an agent with one scripted scenario run: the user sends "ping", the agent answers, and the run succeeds when the answer arrives. No model is used, and no scenario, run plan or test suite is added to the project. Answers at once with the scenario run id to follow with platform_get_simulation_run; the run itself is asynchronous.',
1656
1696
  {
1657
- id: z2.string().describe("The agent ID to test")
1697
+ id: z3.string().describe("The agent ID to test")
1658
1698
  },
1659
1699
  withToolLogging("platform_test_agent", async (params) => {
1660
1700
  requireApiKey();
@@ -1664,91 +1704,103 @@ function registerAgentTools(server) {
1664
1704
  })
1665
1705
  );
1666
1706
  }
1667
- function registerDashboardTools(server) {
1707
+ function registerAnalyticsReportTools(server) {
1668
1708
  server.tool(
1669
- "platform_list_dashboards",
1670
- "List all analytics dashboards in the LangWatch project.",
1709
+ "platform_list_analytics_reports",
1710
+ "List the Analytics Reports in the LangWatch project (/api/v1/analytics/reports). Dashboards, which hold widgets, are listed by list_dashboards.",
1671
1711
  {},
1672
- withToolLogging("platform_list_dashboards", async () => {
1712
+ withToolLogging("platform_list_analytics_reports", async () => {
1673
1713
  requireApiKey();
1674
- const { handleListDashboards } = await import("./list-dashboards-RQ635ZU7.js");
1714
+ const { handleListAnalyticsReports } = await import("./list-analytics-reports-DEKKC6BU.js");
1675
1715
  return {
1676
- content: [{ type: "text", text: await handleListDashboards() }]
1716
+ content: [{ type: "text", text: await handleListAnalyticsReports() }]
1677
1717
  };
1678
1718
  })
1679
1719
  );
1680
1720
  server.tool(
1681
- "platform_get_dashboard",
1682
- "Get a dashboard by its ID, including its graphs.",
1721
+ "platform_get_analytics_report",
1722
+ "Get an Analytics Report by its ID, including its graphs. A Dashboards dashboard's ID is not found here; read it with get_dashboard.",
1683
1723
  {
1684
- id: z2.string().describe("The dashboard ID")
1724
+ reportId: z3.string().describe("The Analytics Report ID")
1685
1725
  },
1686
- withToolLogging("platform_get_dashboard", async (params) => {
1726
+ withToolLogging("platform_get_analytics_report", async (params) => {
1687
1727
  requireApiKey();
1688
- const { handleGetDashboard } = await import("./get-dashboard-5NYJEIX2.js");
1728
+ const { handleGetAnalyticsReport } = await import("./get-analytics-report-PD6XZ4ZA.js");
1689
1729
  return {
1690
- content: [{ type: "text", text: await handleGetDashboard(params) }]
1730
+ content: [{ type: "text", text: await handleGetAnalyticsReport(params) }]
1691
1731
  };
1692
1732
  })
1693
1733
  );
1694
1734
  server.tool(
1695
- "platform_create_dashboard",
1696
- "Create a new analytics dashboard.",
1735
+ "platform_create_analytics_report",
1736
+ "Create a new Analytics Report.",
1697
1737
  {
1698
- name: z2.string().describe("Dashboard name")
1738
+ name: z3.string().describe("Analytics Report name")
1699
1739
  },
1700
- withToolLogging("platform_create_dashboard", async (params) => {
1740
+ withToolLogging("platform_create_analytics_report", async (params) => {
1701
1741
  requireApiKey();
1702
- const { handleCreateDashboard } = await import("./create-dashboard-DHVFMEU4.js");
1742
+ const { handleCreateAnalyticsReport } = await import("./create-analytics-report-IKWZRS2O.js");
1703
1743
  return {
1704
- content: [{ type: "text", text: await handleCreateDashboard(params) }]
1744
+ content: [
1745
+ {
1746
+ type: "text",
1747
+ text: await handleCreateAnalyticsReport(params)
1748
+ }
1749
+ ]
1705
1750
  };
1706
1751
  })
1707
1752
  );
1708
1753
  server.tool(
1709
- "platform_delete_dashboard",
1710
- "Delete a dashboard and all its graphs.",
1754
+ "platform_delete_analytics_report",
1755
+ "Delete an Analytics Report and all its graphs.",
1711
1756
  {
1712
- id: z2.string().describe("The dashboard ID to delete")
1757
+ reportId: z3.string().describe("The Analytics Report ID to delete")
1713
1758
  },
1714
- withToolLogging("platform_delete_dashboard", async (params) => {
1759
+ withToolLogging("platform_delete_analytics_report", async (params) => {
1715
1760
  requireApiKey();
1716
- const { handleDeleteDashboard } = await import("./delete-dashboard-76N66XXL.js");
1761
+ const { handleDeleteAnalyticsReport } = await import("./delete-analytics-report-T4GIMEOA.js");
1717
1762
  return {
1718
- content: [{ type: "text", text: await handleDeleteDashboard(params) }]
1763
+ content: [
1764
+ {
1765
+ type: "text",
1766
+ text: await handleDeleteAnalyticsReport(params)
1767
+ }
1768
+ ]
1719
1769
  };
1720
1770
  })
1721
1771
  );
1722
1772
  server.tool(
1723
- "platform_rename_dashboard",
1724
- "Rename a dashboard.",
1773
+ "platform_rename_analytics_report",
1774
+ "Rename an Analytics Report.",
1725
1775
  {
1726
- id: z2.string().describe("The dashboard ID to rename"),
1727
- name: z2.string().describe("The new name for the dashboard")
1776
+ reportId: z3.string().describe("The Analytics Report ID to rename"),
1777
+ name: z3.string().describe("The new name for the Analytics Report")
1728
1778
  },
1729
- withToolLogging("platform_rename_dashboard", async (params) => {
1779
+ withToolLogging("platform_rename_analytics_report", async (params) => {
1730
1780
  requireApiKey();
1731
- const { renameDashboard } = await import("./langwatch-api-dashboards-6EO2VVZW.js");
1732
- const result = await renameDashboard(params.id, { name: params.name });
1781
+ const { renameAnalyticsReport } = await import("./langwatch-api-analytics-reports-IIHGTTQA.js");
1782
+ const result = await renameAnalyticsReport({ reportId: params.reportId, name: params.name });
1733
1783
  return {
1734
1784
  content: [
1735
1785
  {
1736
1786
  type: "text",
1737
- text: `Dashboard "${result.name}" renamed successfully (ID: ${result.id}).`
1787
+ text: `Analytics Report "${result.name}" renamed successfully (ID: ${result.id}).`
1738
1788
  }
1739
1789
  ]
1740
1790
  };
1741
1791
  })
1742
1792
  );
1793
+ }
1794
+ function registerDashboardTools(server) {
1743
1795
  server.tool(
1744
- "list_dashboard_boards",
1745
- "Lists the project's boards in the Dashboards area, with each one's ID and widget count. Use an ID from here as the dashboardId of add_dashboard_widget and update_dashboard_widget; the analytics dashboards platform_list_dashboards lists hold no widgets.",
1796
+ "list_dashboards",
1797
+ "Lists the project's dashboards in the Dashboards area, with each one's ID and widget count. Use an ID from here as the dashboardId of add_dashboard_widget and update_dashboard_widget; the Analytics Reports platform_list_analytics_reports lists hold no widgets.",
1746
1798
  {},
1747
- withToolLogging("list_dashboard_boards", async () => {
1799
+ withToolLogging("list_dashboards", async () => {
1748
1800
  requireApiKey();
1749
- const { handleListDashboardBoards } = await import("./list-dashboard-boards-OPWROHMG.js");
1801
+ const { handleListDashboards } = await import("./list-dashboards-F4YJPDKD.js");
1750
1802
  return {
1751
- content: [{ type: "text", text: await handleListDashboardBoards() }]
1803
+ content: [{ type: "text", text: await handleListDashboards() }]
1752
1804
  };
1753
1805
  })
1754
1806
  );
@@ -1756,26 +1808,28 @@ function registerDashboardTools(server) {
1756
1808
  "add_dashboard_widget",
1757
1809
  "Creates a custom dashboard widget and places it on the given dashboard. A widget's `code` is a TSX file run in a sandbox: it receives a global `LW` with `LW.useChartQuery(name)` (reads one of the widget's own named queries), `LW.navigate` and `LW.theme`. `queries` are named LangWatchQL SQL statements the code can read by name \u2014 validate each statement's SQL first with run_query before calling this tool, since a query only runs inside the sandbox at render time and a mistake surfaces there, not here. Up to 8 queries per widget.",
1758
1810
  {
1759
- dashboardId: z2.string().describe("The Dashboards board to add the widget to, as list_dashboard_boards lists it"),
1760
- name: z2.string().describe("The widget's display name"),
1761
- code: z2.string().describe(
1811
+ dashboardId: z3.string().describe("The dashboard to add the widget to, as list_dashboards lists it"),
1812
+ name: z3.string().describe("The widget's display name"),
1813
+ code: z3.string().describe(
1762
1814
  "The widget's TSX source. Runs sandboxed with a global LW (LW.useChartQuery(name), LW.navigate, LW.theme) in scope."
1763
1815
  ),
1764
- queries: z2.union([
1765
- z2.record(z2.string(), z2.string()).describe('{"<name>": "<LWQL SQL>"}'),
1766
- z2.array(
1767
- z2.object({
1768
- name: z2.string().describe('Referenced from code as LW.useChartQuery("name")'),
1769
- sql: z2.string().describe("The LangWatchQL statement")
1816
+ queries: z3.union([
1817
+ z3.record(z3.string(), z3.string()).describe('{"<name>": "<LWQL SQL>"}'),
1818
+ z3.array(
1819
+ z3.object({
1820
+ name: z3.string().describe('Referenced from code as LW.useChartQuery("name")'),
1821
+ sql: z3.string().describe("The LangWatchQL statement")
1770
1822
  })
1771
1823
  ).describe("Named LWQL queries, array form")
1772
1824
  ]).describe(
1773
1825
  "The widget's named LangWatchQL queries: either {name: sql} or an array of {name, sql}. Max 8. Validate each statement with run_query first."
1774
- )
1826
+ ),
1827
+ sources: widgetSourcesInput,
1828
+ projects: widgetProjectsInput
1775
1829
  },
1776
1830
  withToolLogging("add_dashboard_widget", async (params) => {
1777
1831
  requireApiKey();
1778
- const { handleAddDashboardWidget } = await import("./add-dashboard-widget-ACC6QYBG.js");
1832
+ const { handleAddDashboardWidget } = await import("./add-dashboard-widget-XNAIGV37.js");
1779
1833
  return {
1780
1834
  content: [{ type: "text", text: await handleAddDashboardWidget(params) }]
1781
1835
  };
@@ -1783,35 +1837,109 @@ function registerDashboardTools(server) {
1783
1837
  );
1784
1838
  server.tool(
1785
1839
  "update_dashboard_widget",
1786
- "Changes one custom widget on a dashboard: its name, its TSX `code`, its named LangWatchQL `queries` or its `description`. Pass only the fields to change; every field left out keeps its stored value. Validate any new query's SQL with run_query first. Returns the updated widget.",
1840
+ "Changes one custom widget on a dashboard: its name, its TSX `code`, its named LangWatchQL `queries`, its `description` or the `sources` its queries count. Pass only the fields to change; every field left out keeps its stored value. Validate any new query's SQL with run_query first. Returns the updated widget.",
1787
1841
  {
1788
- dashboardId: z2.string().describe("The dashboard the widget is on"),
1789
- widgetId: z2.string().describe("The widget to change, as add_dashboard_widget returned it"),
1790
- name: z2.string().optional().describe("The widget's new display name"),
1791
- code: z2.string().optional().describe(
1842
+ dashboardId: z3.string().describe("The dashboard the widget is on"),
1843
+ widgetId: z3.string().describe("The widget to change, as add_dashboard_widget returned it"),
1844
+ name: z3.string().optional().describe("The widget's new display name"),
1845
+ code: z3.string().optional().describe(
1792
1846
  "The widget's new TSX source. Runs sandboxed with a global LW (LW.useChartQuery(name), LW.navigate, LW.theme) in scope."
1793
1847
  ),
1794
- queries: z2.union([
1795
- z2.record(z2.string(), z2.string()).describe('{"<name>": "<LWQL SQL>"}'),
1796
- z2.array(
1797
- z2.object({
1798
- name: z2.string().describe('Referenced from code as LW.useChartQuery("name")'),
1799
- sql: z2.string().describe("The LangWatchQL statement")
1848
+ queries: z3.union([
1849
+ z3.record(z3.string(), z3.string()).describe('{"<name>": "<LWQL SQL>"}'),
1850
+ z3.array(
1851
+ z3.object({
1852
+ name: z3.string().describe('Referenced from code as LW.useChartQuery("name")'),
1853
+ sql: z3.string().describe("The LangWatchQL statement")
1800
1854
  })
1801
1855
  ).describe("Named LWQL queries, array form")
1802
1856
  ]).optional().describe(
1803
1857
  "The widget's new named LangWatchQL queries, replacing the stored set: either {name: sql} or an array of {name, sql}. Max 8."
1804
1858
  ),
1805
- description: z2.string().optional().describe("What the widget's info tip says: a sentence or two")
1859
+ description: z3.string().optional().describe("What the widget's info tip says: a sentence or two"),
1860
+ sources: widgetSourcesInput,
1861
+ projects: widgetProjectsInput
1806
1862
  },
1807
1863
  withToolLogging("update_dashboard_widget", async (params) => {
1808
1864
  requireApiKey();
1809
- const { handleUpdateDashboardWidget } = await import("./update-dashboard-widget-CYQDS2NR.js");
1865
+ const { handleUpdateDashboardWidget } = await import("./update-dashboard-widget-VUIQZ7F5.js");
1810
1866
  return {
1811
1867
  content: [{ type: "text", text: await handleUpdateDashboardWidget(params) }]
1812
1868
  };
1813
1869
  })
1814
1870
  );
1871
+ registerDashboardCrudTools(server);
1872
+ }
1873
+ function registerDashboardCrudTools(server) {
1874
+ const dashboardId = z3.string().describe("The dashboard's ID, as list_dashboards lists it");
1875
+ const text = (value) => ({ content: [{ type: "text", text: value }] });
1876
+ server.tool(
1877
+ "get_dashboard",
1878
+ "Reads one dashboard in the Dashboards area: its name, scope, description and address. An Analytics Report's ID is not found here; read it with platform_get_analytics_report.",
1879
+ { dashboardId },
1880
+ withToolLogging("get_dashboard", async (params) => {
1881
+ requireApiKey();
1882
+ const { handleGetDashboard } = await import("./dashboards-4X6QUT3E.js");
1883
+ return text(await handleGetDashboard(params));
1884
+ })
1885
+ );
1886
+ server.tool(
1887
+ "create_dashboard",
1888
+ "Creates an empty dashboard in the Dashboards area. Add widgets to it with add_dashboard_widget.",
1889
+ { name: z3.string().describe("The dashboard's name") },
1890
+ withToolLogging("create_dashboard", async (params) => {
1891
+ requireApiKey();
1892
+ const { handleCreateDashboard } = await import("./dashboards-4X6QUT3E.js");
1893
+ return text(await handleCreateDashboard(params));
1894
+ })
1895
+ );
1896
+ server.tool(
1897
+ "rename_dashboard",
1898
+ "Changes a dashboard's name and/or description; a field left out keeps its value.",
1899
+ {
1900
+ dashboardId,
1901
+ name: z3.string().optional().describe("The dashboard's new name"),
1902
+ description: z3.string().optional().describe("The dashboard's new description")
1903
+ },
1904
+ withToolLogging("rename_dashboard", async (params) => {
1905
+ requireApiKey();
1906
+ const { handleRenameDashboard } = await import("./dashboards-4X6QUT3E.js");
1907
+ return text(await handleRenameDashboard(params));
1908
+ })
1909
+ );
1910
+ server.tool(
1911
+ "delete_dashboard",
1912
+ "Deletes a dashboard together with the widgets on it. This cannot be undone.",
1913
+ { dashboardId },
1914
+ withToolLogging("delete_dashboard", async (params) => {
1915
+ requireApiKey();
1916
+ const { handleDeleteDashboard } = await import("./dashboards-4X6QUT3E.js");
1917
+ return text(await handleDeleteDashboard(params));
1918
+ })
1919
+ );
1920
+ server.tool(
1921
+ "list_dashboard_widgets",
1922
+ "Lists the custom widgets on one dashboard, with each widget's ID and query names.",
1923
+ { dashboardId },
1924
+ withToolLogging("list_dashboard_widgets", async (params) => {
1925
+ requireApiKey();
1926
+ const { handleListDashboardWidgets } = await import("./dashboards-4X6QUT3E.js");
1927
+ return text(await handleListDashboardWidgets(params));
1928
+ })
1929
+ );
1930
+ server.tool(
1931
+ "delete_dashboard_widget",
1932
+ "Deletes one custom widget from a dashboard. A widget on another dashboard is not found.",
1933
+ {
1934
+ dashboardId,
1935
+ widgetId: z3.string().describe("The widget's ID, as list_dashboard_widgets lists it")
1936
+ },
1937
+ withToolLogging("delete_dashboard_widget", async (params) => {
1938
+ requireApiKey();
1939
+ const { handleDeleteDashboardWidget } = await import("./dashboards-4X6QUT3E.js");
1940
+ return text(await handleDeleteDashboardWidget(params));
1941
+ })
1942
+ );
1815
1943
  }
1816
1944
  function registerWorkflowTools(server) {
1817
1945
  server.tool(
@@ -1820,7 +1948,7 @@ function registerWorkflowTools(server) {
1820
1948
  {},
1821
1949
  withToolLogging("platform_list_workflows", async () => {
1822
1950
  requireApiKey();
1823
- const { handleListWorkflows } = await import("./list-workflows-ZHTX5LCL.js");
1951
+ const { handleListWorkflows } = await import("./list-workflows-BGUSQUJX.js");
1824
1952
  return {
1825
1953
  content: [{ type: "text", text: await handleListWorkflows() }]
1826
1954
  };
@@ -1830,11 +1958,11 @@ function registerWorkflowTools(server) {
1830
1958
  "platform_get_workflow",
1831
1959
  "Get a workflow by its ID.",
1832
1960
  {
1833
- id: z2.string().describe("The workflow ID")
1961
+ id: z3.string().describe("The workflow ID")
1834
1962
  },
1835
1963
  withToolLogging("platform_get_workflow", async (params) => {
1836
1964
  requireApiKey();
1837
- const { handleGetWorkflow } = await import("./get-workflow-7PVED7JE.js");
1965
+ const { handleGetWorkflow } = await import("./get-workflow-R6XUKTZ7.js");
1838
1966
  return {
1839
1967
  content: [{ type: "text", text: await handleGetWorkflow(params) }]
1840
1968
  };
@@ -1844,11 +1972,11 @@ function registerWorkflowTools(server) {
1844
1972
  "platform_delete_workflow",
1845
1973
  "Archive (soft-delete) a workflow by its ID.",
1846
1974
  {
1847
- id: z2.string().describe("The workflow ID to archive")
1975
+ id: z3.string().describe("The workflow ID to archive")
1848
1976
  },
1849
1977
  withToolLogging("platform_delete_workflow", async (params) => {
1850
1978
  requireApiKey();
1851
- const { handleDeleteWorkflow } = await import("./delete-workflow-JSWABL5F.js");
1979
+ const { handleDeleteWorkflow } = await import("./delete-workflow-JXREDDW7.js");
1852
1980
  return {
1853
1981
  content: [{ type: "text", text: await handleDeleteWorkflow(params) }]
1854
1982
  };
@@ -1858,12 +1986,12 @@ function registerWorkflowTools(server) {
1858
1986
  "platform_run_workflow",
1859
1987
  "Execute a workflow with JSON input. Returns the workflow output.",
1860
1988
  {
1861
- id: z2.string().describe("The workflow ID to run"),
1862
- input: z2.string().optional().describe("Input data as a JSON object string")
1989
+ id: z3.string().describe("The workflow ID to run"),
1990
+ input: z3.string().optional().describe("Input data as a JSON object string")
1863
1991
  },
1864
1992
  withToolLogging("platform_run_workflow", async (params) => {
1865
1993
  requireApiKey();
1866
- const { handleRunWorkflow } = await import("./run-workflow-SP32SO5M.js");
1994
+ const { handleRunWorkflow } = await import("./run-workflow-HDF6CRLM.js");
1867
1995
  return {
1868
1996
  content: [{ type: "text", text: await handleRunWorkflow(params) }]
1869
1997
  };
@@ -1875,11 +2003,11 @@ function registerAnnotationTools(server) {
1875
2003
  "platform_list_annotations",
1876
2004
  "List all annotations for the project, optionally filtered by trace ID.",
1877
2005
  {
1878
- traceId: z2.string().optional().describe("Filter annotations by trace ID")
2006
+ traceId: z3.string().optional().describe("Filter annotations by trace ID")
1879
2007
  },
1880
2008
  withToolLogging("platform_list_annotations", async (params) => {
1881
2009
  requireApiKey();
1882
- const { handleListAnnotations } = await import("./list-annotations-HJH4NBLD.js");
2010
+ const { handleListAnnotations } = await import("./list-annotations-P26ELIAO.js");
1883
2011
  return {
1884
2012
  content: [{ type: "text", text: await handleListAnnotations(params) }]
1885
2013
  };
@@ -1889,14 +2017,14 @@ function registerAnnotationTools(server) {
1889
2017
  "platform_create_annotation",
1890
2018
  "Create an annotation (thumbs up/down, comment) for a trace.",
1891
2019
  {
1892
- traceId: z2.string().describe("The trace ID to annotate"),
1893
- comment: z2.string().optional().describe("Annotation comment"),
1894
- isThumbsUp: z2.boolean().optional().describe("True for positive feedback, false for negative"),
1895
- email: z2.string().optional().describe("Email of the annotator")
2020
+ traceId: z3.string().describe("The trace ID to annotate"),
2021
+ comment: z3.string().optional().describe("Annotation comment"),
2022
+ isThumbsUp: z3.boolean().optional().describe("True for positive feedback, false for negative"),
2023
+ email: z3.string().optional().describe("Email of the annotator")
1896
2024
  },
1897
2025
  withToolLogging("platform_create_annotation", async (params) => {
1898
2026
  requireApiKey();
1899
- const { handleCreateAnnotation } = await import("./create-annotation-LHNCLHYP.js");
2027
+ const { handleCreateAnnotation } = await import("./create-annotation-JR6DBHPW.js");
1900
2028
  return {
1901
2029
  content: [{ type: "text", text: await handleCreateAnnotation(params) }]
1902
2030
  };
@@ -1906,11 +2034,11 @@ function registerAnnotationTools(server) {
1906
2034
  "platform_delete_annotation",
1907
2035
  "Delete an annotation by its ID.",
1908
2036
  {
1909
- id: z2.string().describe("The annotation ID to delete")
2037
+ id: z3.string().describe("The annotation ID to delete")
1910
2038
  },
1911
2039
  withToolLogging("platform_delete_annotation", async (params) => {
1912
2040
  requireApiKey();
1913
- const { handleDeleteAnnotation } = await import("./delete-annotation-HY3O2OGR.js");
2041
+ const { handleDeleteAnnotation } = await import("./delete-annotation-ESUH3RWN.js");
1914
2042
  return {
1915
2043
  content: [{ type: "text", text: await handleDeleteAnnotation(params) }]
1916
2044
  };
@@ -1920,11 +2048,11 @@ function registerAnnotationTools(server) {
1920
2048
  "platform_get_annotation",
1921
2049
  "Get annotation details by ID.",
1922
2050
  {
1923
- id: z2.string().describe("The annotation ID")
2051
+ id: z3.string().describe("The annotation ID")
1924
2052
  },
1925
2053
  withToolLogging("platform_get_annotation", async (params) => {
1926
2054
  requireApiKey();
1927
- const { getAnnotation } = await import("./langwatch-api-annotations-6SA4OB4C.js");
2055
+ const { getAnnotation } = await import("./langwatch-api-annotations-CRI6JTQR.js");
1928
2056
  const annotation = await getAnnotation(params.id);
1929
2057
  const lines = [
1930
2058
  `**ID**: ${annotation.id}`,
@@ -1944,11 +2072,11 @@ function registerTriggerTools(server) {
1944
2072
  "platform_list_triggers",
1945
2073
  "List all triggers (automations) in the project. Triggers automate actions like sending emails, Slack messages, or adding to datasets when conditions are met.",
1946
2074
  {
1947
- format: z2.enum(["digest", "json"]).optional().describe("Output format")
2075
+ format: z3.enum(["digest", "json"]).optional().describe("Output format")
1948
2076
  },
1949
2077
  withToolLogging("platform_list_triggers", async (params) => {
1950
2078
  requireApiKey();
1951
- const { handleListTriggers } = await import("./list-triggers-SQNIG35Q.js");
2079
+ const { handleListTriggers } = await import("./list-triggers-MRSWN7RR.js");
1952
2080
  return { content: [{ type: "text", text: await handleListTriggers(params) }] };
1953
2081
  })
1954
2082
  );
@@ -1956,11 +2084,11 @@ function registerTriggerTools(server) {
1956
2084
  "platform_get_trigger",
1957
2085
  "Read one trigger (automation) by its ID, including its delivery configuration. Credential values come back as [redacted]; sending them back unchanged on an update keeps the stored values.",
1958
2086
  {
1959
- id: z2.string().describe("The trigger ID")
2087
+ id: z3.string().describe("The trigger ID")
1960
2088
  },
1961
2089
  withToolLogging("platform_get_trigger", async (params) => {
1962
2090
  requireApiKey();
1963
- const { getTrigger } = await import("./langwatch-api-triggers-KQDQC6L5.js");
2091
+ const { getTrigger } = await import("./langwatch-api-triggers-6FR4VWDL.js");
1964
2092
  const trigger = await getTrigger(params.id);
1965
2093
  return { content: [{ type: "text", text: JSON.stringify(trigger, null, 2) }] };
1966
2094
  })
@@ -1977,22 +2105,22 @@ function registerTriggerTools(server) {
1977
2105
  "The delivery channel cannot be changed afterwards."
1978
2106
  ].join("\n"),
1979
2107
  {
1980
- name: z2.string().describe("Trigger name"),
2108
+ name: z3.string().describe("Trigger name"),
1981
2109
  action: triggerActionSchema.describe("Which channel it delivers on"),
1982
2110
  actionParams: actionParamsSchema.optional().describe("The delivery configuration the channel named in `action` reads. Defaults to {}"),
1983
- filters: z2.string().optional().describe(TRIGGER_FILTERS_DESCRIPTION),
1984
- filterQuery: z2.string().optional().describe(TRIGGER_FILTER_QUERY_DESCRIPTION),
1985
- customGraphId: z2.string().optional().describe("Set to make this an alert on that graph"),
2111
+ filters: z3.string().optional().describe(TRIGGER_FILTERS_DESCRIPTION),
2112
+ filterQuery: z3.string().optional().describe(TRIGGER_FILTER_QUERY_DESCRIPTION),
2113
+ customGraphId: z3.string().optional().describe("Set to make this an alert on that graph"),
1986
2114
  graphAlert: graphAlertSchema.optional(),
1987
2115
  report: reportSchema.optional().describe("Set to make this a scheduled report"),
1988
2116
  templates: templatesSchema.optional(),
1989
2117
  notificationCadence: notificationCadenceSchema.optional(),
1990
- message: z2.string().optional().describe("Custom alert message"),
2118
+ message: z3.string().optional().describe("Custom alert message"),
1991
2119
  alertType: alertTypeSchema.optional().describe("Alert severity. Required for a graph alert.")
1992
2120
  },
1993
2121
  withToolLogging("platform_create_trigger", async (params) => {
1994
2122
  requireApiKey();
1995
- const { handleCreateTrigger } = await import("./create-trigger-PRELMT6J.js");
2123
+ const { handleCreateTrigger } = await import("./create-trigger-M3VFK5UH.js");
1996
2124
  return handleCreateTrigger(params);
1997
2125
  })
1998
2126
  );
@@ -2005,22 +2133,22 @@ function registerTriggerTools(server) {
2005
2133
  "The delivery channel, the kind of automation and an alert's graph cannot be changed."
2006
2134
  ].join("\n"),
2007
2135
  {
2008
- id: z2.string().describe("The trigger ID"),
2009
- name: z2.string().optional().describe("New name"),
2010
- active: z2.boolean().optional().describe("Resume or pause it"),
2136
+ id: z3.string().describe("The trigger ID"),
2137
+ name: z3.string().optional().describe("New name"),
2138
+ active: z3.boolean().optional().describe("Resume or pause it"),
2011
2139
  actionParams: actionParamsSchema.optional().describe("The delivery configuration this automation should have from now on"),
2012
- filters: z2.string().optional().describe(TRIGGER_FILTERS_DESCRIPTION),
2013
- filterQuery: z2.string().nullable().optional().describe(`${TRIGGER_FILTER_QUERY_DESCRIPTION} null clears the saved query.`),
2140
+ filters: z3.string().optional().describe(TRIGGER_FILTERS_DESCRIPTION),
2141
+ filterQuery: z3.string().nullable().optional().describe(`${TRIGGER_FILTER_QUERY_DESCRIPTION} null clears the saved query.`),
2014
2142
  graphAlert: graphAlertSchema.optional().describe("Only for an automation that is already a graph alert"),
2015
2143
  report: reportSchema.optional().describe("Only for an automation that is already a scheduled report"),
2016
2144
  templates: templatesSchema.optional(),
2017
2145
  notificationCadence: notificationCadenceSchema.optional(),
2018
- message: z2.string().nullable().optional().describe("New alert message. null removes the custom message"),
2146
+ message: z3.string().nullable().optional().describe("New alert message. null removes the custom message"),
2019
2147
  alertType: alertTypeSchema.nullable().optional().describe("New alert severity. null clears it")
2020
2148
  },
2021
2149
  withToolLogging("platform_update_trigger", async (params) => {
2022
2150
  requireApiKey();
2023
- const { getTrigger, updateTrigger } = await import("./langwatch-api-triggers-KQDQC6L5.js");
2151
+ const { getTrigger, updateTrigger } = await import("./langwatch-api-triggers-6FR4VWDL.js");
2024
2152
  if (params.actionParams !== void 0) {
2025
2153
  const saved = await getTrigger(params.id);
2026
2154
  const boundParams = validateActionParamsForAction({
@@ -2028,11 +2156,11 @@ function registerTriggerTools(server) {
2028
2156
  actionParams: params.actionParams
2029
2157
  });
2030
2158
  if (!boundParams.ok) {
2031
- const { toolError: toolError2 } = await import("./create-trigger-PRELMT6J.js");
2159
+ const { toolError: toolError2 } = await import("./create-trigger-M3VFK5UH.js");
2032
2160
  return toolError2(boundParams.message);
2033
2161
  }
2034
2162
  }
2035
- const { parseJsonObject, toolError } = await import("./create-trigger-PRELMT6J.js");
2163
+ const { parseJsonObject, toolError } = await import("./create-trigger-M3VFK5UH.js");
2036
2164
  const filters = params.filters ? parseJsonObject(params.filters) : void 0;
2037
2165
  if (params.filters && !filters) {
2038
2166
  return toolError("filters must be a JSON object");
@@ -2049,11 +2177,11 @@ function registerTriggerTools(server) {
2049
2177
  "platform_test_fire_trigger",
2050
2178
  "Send a trigger's message to the destination it is configured with, to confirm it arrives. Nothing is recorded as a fire.",
2051
2179
  {
2052
- id: z2.string().describe("The trigger ID")
2180
+ id: z3.string().describe("The trigger ID")
2053
2181
  },
2054
2182
  withToolLogging("platform_test_fire_trigger", async (params) => {
2055
2183
  requireApiKey();
2056
- const { testFireTrigger } = await import("./langwatch-api-triggers-KQDQC6L5.js");
2184
+ const { testFireTrigger } = await import("./langwatch-api-triggers-6FR4VWDL.js");
2057
2185
  const result = await testFireTrigger(params.id);
2058
2186
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
2059
2187
  })
@@ -2062,13 +2190,13 @@ function registerTriggerTools(server) {
2062
2190
  "platform_list_trigger_fires",
2063
2191
  "What an automation has done, newest first. Metadata only \u2014 no message content. Answers with `nextCursor`; pass it back as `cursor` for the next page (null means there is none).",
2064
2192
  {
2065
- id: z2.string().describe("The trigger ID"),
2066
- limit: z2.number().int().positive().optional().describe("How many fires to return"),
2067
- cursor: z2.string().optional().describe("The `nextCursor` a previous call answered with")
2193
+ id: z3.string().describe("The trigger ID"),
2194
+ limit: z3.number().int().positive().optional().describe("How many fires to return"),
2195
+ cursor: z3.string().optional().describe("The `nextCursor` a previous call answered with")
2068
2196
  },
2069
2197
  withToolLogging("platform_list_trigger_fires", async (params) => {
2070
2198
  requireApiKey();
2071
- const { handleListTriggerFires } = await import("./list-trigger-fires-JV3WFYYG.js");
2199
+ const { handleListTriggerFires } = await import("./list-trigger-fires-5C5XM2KQ.js");
2072
2200
  return { content: [{ type: "text", text: await handleListTriggerFires(params) }] };
2073
2201
  })
2074
2202
  );
@@ -2076,11 +2204,11 @@ function registerTriggerTools(server) {
2076
2204
  "platform_delete_trigger",
2077
2205
  "Delete a trigger (automation).",
2078
2206
  {
2079
- id: z2.string().describe("The trigger ID to delete")
2207
+ id: z3.string().describe("The trigger ID to delete")
2080
2208
  },
2081
2209
  withToolLogging("platform_delete_trigger", async (params) => {
2082
2210
  requireApiKey();
2083
- const { deleteTrigger } = await import("./langwatch-api-triggers-KQDQC6L5.js");
2211
+ const { deleteTrigger } = await import("./langwatch-api-triggers-6FR4VWDL.js");
2084
2212
  const result = await deleteTrigger(params.id);
2085
2213
  return { content: [{ type: "text", text: `Trigger ${result.id} deleted.` }] };
2086
2214
  })
@@ -2093,7 +2221,7 @@ function registerMonitorTools(server) {
2093
2221
  {},
2094
2222
  withToolLogging("platform_list_monitors", async () => {
2095
2223
  requireApiKey();
2096
- const { listMonitors } = await import("./langwatch-api-monitors-CBF3FGIM.js");
2224
+ const { listMonitors } = await import("./langwatch-api-monitors-66O5Z5LB.js");
2097
2225
  const monitors = await listMonitors();
2098
2226
  if (monitors.length === 0) {
2099
2227
  return { content: [{ type: "text", text: "No monitors found." }] };
@@ -2116,11 +2244,11 @@ ${lines.join("\n")}`
2116
2244
  "platform_get_monitor",
2117
2245
  "Get details of a specific online evaluation monitor.",
2118
2246
  {
2119
- id: z2.string().describe("The monitor ID")
2247
+ id: z3.string().describe("The monitor ID")
2120
2248
  },
2121
2249
  withToolLogging("platform_get_monitor", async (params) => {
2122
2250
  requireApiKey();
2123
- const { getMonitor } = await import("./langwatch-api-monitors-CBF3FGIM.js");
2251
+ const { getMonitor } = await import("./langwatch-api-monitors-66O5Z5LB.js");
2124
2252
  const m = await getMonitor(params.id);
2125
2253
  const lines = [
2126
2254
  `**${m.name}** (${m.id})`,
@@ -2139,15 +2267,15 @@ ${lines.join("\n")}`
2139
2267
  "platform_create_monitor",
2140
2268
  "Create a new online evaluation monitor that runs an evaluator on incoming traces.",
2141
2269
  {
2142
- name: z2.string().describe("Monitor name"),
2143
- checkType: z2.string().describe("Evaluator check type (e.g. ragas/toxicity, custom/my-eval)"),
2144
- executionMode: z2.enum(["ON_MESSAGE", "AS_GUARDRAIL", "MANUALLY"]).optional().describe("When to run: ON_MESSAGE (default), AS_GUARDRAIL, or MANUALLY"),
2145
- sample: z2.number().min(0).max(1).optional().describe("Sampling rate 0.0-1.0 (default: 1.0)"),
2146
- evaluatorId: z2.string().optional().describe("Link to a saved evaluator by ID")
2270
+ name: z3.string().describe("Monitor name"),
2271
+ checkType: z3.string().describe("Evaluator check type (e.g. ragas/toxicity, custom/my-eval)"),
2272
+ executionMode: z3.enum(["ON_MESSAGE", "AS_GUARDRAIL", "MANUALLY"]).optional().describe("When to run: ON_MESSAGE (default), AS_GUARDRAIL, or MANUALLY"),
2273
+ sample: z3.number().min(0).max(1).optional().describe("Sampling rate 0.0-1.0 (default: 1.0)"),
2274
+ evaluatorId: z3.string().optional().describe("Link to a saved evaluator by ID")
2147
2275
  },
2148
2276
  withToolLogging("platform_create_monitor", async (params) => {
2149
2277
  requireApiKey();
2150
- const { createMonitor } = await import("./langwatch-api-monitors-CBF3FGIM.js");
2278
+ const { createMonitor } = await import("./langwatch-api-monitors-66O5Z5LB.js");
2151
2279
  const monitor = await createMonitor(params);
2152
2280
  return {
2153
2281
  content: [
@@ -2163,15 +2291,15 @@ ${lines.join("\n")}`
2163
2291
  "platform_update_monitor",
2164
2292
  "Update an existing online evaluation monitor.",
2165
2293
  {
2166
- id: z2.string().describe("The monitor ID to update"),
2167
- name: z2.string().optional().describe("New monitor name"),
2168
- enabled: z2.boolean().optional().describe("Enable or disable the monitor"),
2169
- executionMode: z2.enum(["ON_MESSAGE", "AS_GUARDRAIL", "MANUALLY"]).optional().describe("New execution mode"),
2170
- sample: z2.number().min(0).max(1).optional().describe("New sampling rate")
2294
+ id: z3.string().describe("The monitor ID to update"),
2295
+ name: z3.string().optional().describe("New monitor name"),
2296
+ enabled: z3.boolean().optional().describe("Enable or disable the monitor"),
2297
+ executionMode: z3.enum(["ON_MESSAGE", "AS_GUARDRAIL", "MANUALLY"]).optional().describe("New execution mode"),
2298
+ sample: z3.number().min(0).max(1).optional().describe("New sampling rate")
2171
2299
  },
2172
2300
  withToolLogging("platform_update_monitor", async (params) => {
2173
2301
  requireApiKey();
2174
- const { updateMonitor } = await import("./langwatch-api-monitors-CBF3FGIM.js");
2302
+ const { updateMonitor } = await import("./langwatch-api-monitors-66O5Z5LB.js");
2175
2303
  const monitor = await updateMonitor(params);
2176
2304
  return {
2177
2305
  content: [
@@ -2187,11 +2315,11 @@ ${lines.join("\n")}`
2187
2315
  "platform_delete_monitor",
2188
2316
  "Delete an online evaluation monitor.",
2189
2317
  {
2190
- id: z2.string().describe("The monitor ID to delete")
2318
+ id: z3.string().describe("The monitor ID to delete")
2191
2319
  },
2192
2320
  withToolLogging("platform_delete_monitor", async (params) => {
2193
2321
  requireApiKey();
2194
- const { deleteMonitor } = await import("./langwatch-api-monitors-CBF3FGIM.js");
2322
+ const { deleteMonitor } = await import("./langwatch-api-monitors-66O5Z5LB.js");
2195
2323
  const result = await deleteMonitor(params.id);
2196
2324
  return {
2197
2325
  content: [{ type: "text", text: `Monitor ${result.id} deleted.` }]
@@ -2206,7 +2334,7 @@ function registerSecretTools(server) {
2206
2334
  {},
2207
2335
  withToolLogging("platform_list_secrets", async () => {
2208
2336
  requireApiKey();
2209
- const { listSecrets } = await import("./langwatch-api-secrets-RNFO4LF2.js");
2337
+ const { listSecrets } = await import("./langwatch-api-secrets-B7BURV76.js");
2210
2338
  const secrets = await listSecrets();
2211
2339
  if (secrets.length === 0) {
2212
2340
  return { content: [{ type: "text", text: "No secrets found." }] };
@@ -2227,12 +2355,12 @@ ${lines.join("\n")}`
2227
2355
  "platform_create_secret",
2228
2356
  "Create a new encrypted project secret. Name must be UPPER_SNAKE_CASE (e.g. MY_API_KEY).",
2229
2357
  {
2230
- name: z2.string().describe("Secret name in UPPER_SNAKE_CASE (e.g. OPENAI_API_KEY)"),
2231
- value: z2.string().describe("The secret value (will be encrypted at rest)")
2358
+ name: z3.string().describe("Secret name in UPPER_SNAKE_CASE (e.g. OPENAI_API_KEY)"),
2359
+ value: z3.string().describe("The secret value (will be encrypted at rest)")
2232
2360
  },
2233
2361
  withToolLogging("platform_create_secret", async (params) => {
2234
2362
  requireApiKey();
2235
- const { createSecret } = await import("./langwatch-api-secrets-RNFO4LF2.js");
2363
+ const { createSecret } = await import("./langwatch-api-secrets-B7BURV76.js");
2236
2364
  const secret = await createSecret({ name: params.name, value: params.value });
2237
2365
  return {
2238
2366
  content: [
@@ -2248,12 +2376,12 @@ ${lines.join("\n")}`
2248
2376
  "platform_update_secret",
2249
2377
  "Update an existing project secret's value.",
2250
2378
  {
2251
- id: z2.string().describe("The secret ID to update"),
2252
- value: z2.string().describe("The new secret value (will be encrypted at rest)")
2379
+ id: z3.string().describe("The secret ID to update"),
2380
+ value: z3.string().describe("The new secret value (will be encrypted at rest)")
2253
2381
  },
2254
2382
  withToolLogging("platform_update_secret", async (params) => {
2255
2383
  requireApiKey();
2256
- const { updateSecret } = await import("./langwatch-api-secrets-RNFO4LF2.js");
2384
+ const { updateSecret } = await import("./langwatch-api-secrets-B7BURV76.js");
2257
2385
  const secret = await updateSecret({ id: params.id, value: params.value });
2258
2386
  return {
2259
2387
  content: [
@@ -2269,11 +2397,11 @@ ${lines.join("\n")}`
2269
2397
  "platform_delete_secret",
2270
2398
  "Delete a project secret.",
2271
2399
  {
2272
- id: z2.string().describe("The secret ID to delete")
2400
+ id: z3.string().describe("The secret ID to delete")
2273
2401
  },
2274
2402
  withToolLogging("platform_delete_secret", async (params) => {
2275
2403
  requireApiKey();
2276
- const { deleteSecret } = await import("./langwatch-api-secrets-RNFO4LF2.js");
2404
+ const { deleteSecret } = await import("./langwatch-api-secrets-B7BURV76.js");
2277
2405
  const result = await deleteSecret(params.id);
2278
2406
  return { content: [{ type: "text", text: `Secret ${result.id} deleted.` }] };
2279
2407
  })
@@ -2284,7 +2412,10 @@ function registerExperimentTools(server) {
2284
2412
  "platform_run_experiment",
2285
2413
  "Start an experiment run by slug. Returns a run ID for polling status.",
2286
2414
  {
2287
- slug: z2.string().describe("The experiment slug to run")
2415
+ slug: z3.string().describe("The experiment slug to run"),
2416
+ concurrency: z3.number().int().min(1).max(24).optional().describe(
2417
+ "Cells (one row against one target) to run at once, for this run only (default: the server's setting). Use 1 to run them one at a time, in order."
2418
+ )
2288
2419
  },
2289
2420
  withToolLogging("platform_run_experiment", async (params) => {
2290
2421
  requireApiKey();
@@ -2297,8 +2428,8 @@ function registerExperimentTools(server) {
2297
2428
  "platform_experiment_status",
2298
2429
  "Check the status of an experiment run (running, completed, stopped, or interrupted) plus its progress. Works for both platform-run and SDK-logged experiments; pass experimentSlug for SDK runs or runs older than 24h.",
2299
2430
  {
2300
- runId: z2.string().describe("The run ID returned from platform_run_experiment"),
2301
- experimentSlug: z2.string().optional().describe(
2431
+ runId: z3.string().describe("The run ID returned from platform_run_experiment"),
2432
+ experimentSlug: z3.string().optional().describe(
2302
2433
  "Experiment slug \u2014 required for SDK-logged runs and runs older than 24h (the Redis run-state they would otherwise be read from is absent/expired). Use platform_experiment_list_runs to find the slug."
2303
2434
  )
2304
2435
  },
@@ -2313,7 +2444,7 @@ function registerExperimentTools(server) {
2313
2444
  "platform_experiment_list",
2314
2445
  "List experiments configured in the LangWatch project. Returns a markdown table with each experiment's slug, name, last-run timestamp, and run count. Use this to discover experiment slugs before drilling into runs with platform_experiment_list_runs. Output is capped (default 25, max 100) to protect the agent's context window.",
2315
2446
  {
2316
- limit: z2.number().int().positive().max(100).optional().describe("Maximum number of experiments to include (default 25, hard-capped at 100)")
2447
+ limit: z3.number().int().positive().max(100).optional().describe("Maximum number of experiments to include (default 25, hard-capped at 100)")
2317
2448
  },
2318
2449
  withToolLogging("platform_experiment_list", async (params) => {
2319
2450
  requireApiKey();
@@ -2326,8 +2457,8 @@ function registerExperimentTools(server) {
2326
2457
  "platform_experiment_list_runs",
2327
2458
  "List experiment runs for a specific experiment slug. Returns a markdown table with each run's id, status, started/finished timestamps, and pass-rate summary. Use this to discover run ids before calling platform_experiment_results. Output is capped (default 25, max 100) to protect the agent's context window.",
2328
2459
  {
2329
- experimentSlug: z2.string().describe("Experiment slug from platform_experiment_list (e.g. 'checkout-flow')"),
2330
- limit: z2.number().int().positive().max(100).optional().describe("Maximum number of runs to include (default 25, hard-capped at 100)")
2460
+ experimentSlug: z3.string().describe("Experiment slug from platform_experiment_list (e.g. 'checkout-flow')"),
2461
+ limit: z3.number().int().positive().max(100).optional().describe("Maximum number of runs to include (default 25, hard-capped at 100)")
2331
2462
  },
2332
2463
  withToolLogging("platform_experiment_list_runs", async (params) => {
2333
2464
  requireApiKey();
@@ -2340,15 +2471,15 @@ function registerExperimentTools(server) {
2340
2471
  "platform_experiment_results",
2341
2472
  "Fetch per-row results for an experiment run so you can debug evaluator scores and missed rows. Serves partial results for runs that are still running or were interrupted (it does not require a completed run), with the run status noted in the output. Returns a markdown report: per-evaluator averages plus row-by-row scores and failure details. Output is capped at 50 rows to protect the agent's context window \u2014 narrow with `filter: 'failed'` or `evaluator` to see what matters.",
2342
2473
  {
2343
- runId: z2.string().describe("The run ID returned from platform_run_experiment"),
2344
- experimentSlug: z2.string().optional().describe(
2474
+ runId: z3.string().describe("The run ID returned from platform_run_experiment"),
2475
+ experimentSlug: z3.string().optional().describe(
2345
2476
  "Experiment slug \u2014 required when fetching results for runs older than 24h (Redis state may have expired). Use platform_experiment_list_runs to find the slug."
2346
2477
  ),
2347
- filter: z2.enum(["all", "failed"]).optional().describe(
2478
+ filter: z3.enum(["all", "failed"]).optional().describe(
2348
2479
  "Filter rows: 'failed' shows only rows that errored or failed an evaluation; 'all' (default) shows everything"
2349
2480
  ),
2350
- evaluator: z2.string().optional().describe("Show only this evaluator's results (matched on `evaluator` field)"),
2351
- limit: z2.number().int().positive().max(50).optional().describe(
2481
+ evaluator: z3.string().optional().describe("Show only this evaluator's results (matched on `evaluator` field)"),
2482
+ limit: z3.number().int().positive().max(50).optional().describe(
2352
2483
  "Maximum number of rows to include in the markdown output (default 50, hard-capped at 50)."
2353
2484
  )
2354
2485
  },
@@ -2365,12 +2496,12 @@ function registerDatasetTools(server) {
2365
2496
  "platform_list_datasets",
2366
2497
  "List all datasets on the LangWatch platform with their names, slugs, columns, and record counts. Returns AI-readable digest by default.",
2367
2498
  {
2368
- format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
2499
+ format: z3.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
2369
2500
  },
2370
2501
  async (params) => {
2371
2502
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2372
2503
  requireApiKey2();
2373
- const { handleListDatasets } = await import("./list-datasets-THUKQHPX.js");
2504
+ const { handleListDatasets } = await import("./list-datasets-YYADWT4D.js");
2374
2505
  return {
2375
2506
  content: [{ type: "text", text: await handleListDatasets(params) }]
2376
2507
  };
@@ -2380,13 +2511,13 @@ function registerDatasetTools(server) {
2380
2511
  "platform_get_dataset",
2381
2512
  "Get full details of a dataset on the LangWatch platform by slug or ID, including column definitions and a preview of records.",
2382
2513
  {
2383
- slugOrId: z2.string().describe("The dataset slug or ID to retrieve"),
2384
- format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
2514
+ slugOrId: z3.string().describe("The dataset slug or ID to retrieve"),
2515
+ format: z3.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
2385
2516
  },
2386
2517
  async (params) => {
2387
2518
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2388
2519
  requireApiKey2();
2389
- const { handleGetDataset } = await import("./get-dataset-X4B5JDG2.js");
2520
+ const { handleGetDataset } = await import("./get-dataset-E5WLIPNK.js");
2390
2521
  return {
2391
2522
  content: [{ type: "text", text: await handleGetDataset(params) }]
2392
2523
  };
@@ -2399,7 +2530,7 @@ function registerDatasetTools(server) {
2399
2530
  async (params) => {
2400
2531
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2401
2532
  requireApiKey2();
2402
- const { handleCreateDataset } = await import("./create-dataset-LUP5PVDM.js");
2533
+ const { handleCreateDataset } = await import("./create-dataset-ONX3RADL.js");
2403
2534
  return {
2404
2535
  content: [{ type: "text", text: await handleCreateDataset(params) }]
2405
2536
  };
@@ -2409,14 +2540,14 @@ function registerDatasetTools(server) {
2409
2540
  "platform_update_dataset",
2410
2541
  "Update an existing dataset on the LangWatch platform (name and/or column types).",
2411
2542
  {
2412
- slugOrId: z2.string().describe("The dataset slug or ID to update"),
2413
- name: z2.string().optional().describe("Updated dataset name"),
2414
- columnTypes: z2.array(datasetColumnDefinitionSchema).optional().describe("Updated column definitions")
2543
+ slugOrId: z3.string().describe("The dataset slug or ID to update"),
2544
+ name: z3.string().optional().describe("Updated dataset name"),
2545
+ columnTypes: z3.array(datasetColumnDefinitionSchema).optional().describe("Updated column definitions")
2415
2546
  },
2416
2547
  async (params) => {
2417
2548
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2418
2549
  requireApiKey2();
2419
- const { handleUpdateDataset } = await import("./update-dataset-DQH3OHOU.js");
2550
+ const { handleUpdateDataset } = await import("./update-dataset-GHKDCJJQ.js");
2420
2551
  return {
2421
2552
  content: [{ type: "text", text: await handleUpdateDataset(params) }]
2422
2553
  };
@@ -2426,12 +2557,12 @@ function registerDatasetTools(server) {
2426
2557
  "platform_delete_dataset",
2427
2558
  "Delete (archive) a dataset on the LangWatch platform.",
2428
2559
  {
2429
- slugOrId: z2.string().describe("The dataset slug or ID to delete")
2560
+ slugOrId: z3.string().describe("The dataset slug or ID to delete")
2430
2561
  },
2431
2562
  async (params) => {
2432
2563
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2433
2564
  requireApiKey2();
2434
- const { handleDeleteDataset } = await import("./delete-dataset-HQCR66MG.js");
2565
+ const { handleDeleteDataset } = await import("./delete-dataset-ZRD23FLO.js");
2435
2566
  return {
2436
2567
  content: [{ type: "text", text: await handleDeleteDataset(params) }]
2437
2568
  };
@@ -2441,15 +2572,15 @@ function registerDatasetTools(server) {
2441
2572
  "platform_list_dataset_records",
2442
2573
  "List records in a dataset on the LangWatch platform with pagination.",
2443
2574
  {
2444
- slugOrId: z2.string().describe("The dataset slug or ID to list records from"),
2445
- page: z2.number().int().min(1).optional().describe("Page number (default: 1)"),
2446
- limit: z2.number().int().min(1).max(1e3).optional().describe("Records per page (default: 50, max: 1000)"),
2447
- format: z2.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
2575
+ slugOrId: z3.string().describe("The dataset slug or ID to list records from"),
2576
+ page: z3.number().int().min(1).optional().describe("Page number (default: 1)"),
2577
+ limit: z3.number().int().min(1).max(1e3).optional().describe("Records per page (default: 50, max: 1000)"),
2578
+ format: z3.enum(["digest", "json"]).optional().describe("Output format: 'digest' (default, AI-readable) or 'json' (full raw data)")
2448
2579
  },
2449
2580
  async (params) => {
2450
2581
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2451
2582
  requireApiKey2();
2452
- const { handleListDatasetRecords } = await import("./list-dataset-records-WFM7F33C.js");
2583
+ const { handleListDatasetRecords } = await import("./list-dataset-records-SWCEDRPX.js");
2453
2584
  return {
2454
2585
  content: [{ type: "text", text: await handleListDatasetRecords(params) }]
2455
2586
  };
@@ -2459,13 +2590,13 @@ function registerDatasetTools(server) {
2459
2590
  "platform_create_dataset_records",
2460
2591
  "Add records to a dataset on the LangWatch platform in batch (max 1000 per call).",
2461
2592
  {
2462
- slugOrId: z2.string().describe("The dataset slug or ID to add records to"),
2463
- entries: z2.array(z2.record(z2.string(), z2.unknown())).min(1).max(1e3).describe("Array of record entries to create (key-value objects matching dataset columns)")
2593
+ slugOrId: z3.string().describe("The dataset slug or ID to add records to"),
2594
+ entries: z3.array(z3.record(z3.string(), z3.unknown())).min(1).max(1e3).describe("Array of record entries to create (key-value objects matching dataset columns)")
2464
2595
  },
2465
2596
  async (params) => {
2466
2597
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2467
2598
  requireApiKey2();
2468
- const { handleCreateDatasetRecords } = await import("./create-dataset-records-NSKBZP3G.js");
2599
+ const { handleCreateDatasetRecords } = await import("./create-dataset-records-QZZZF64Z.js");
2469
2600
  return {
2470
2601
  content: [{ type: "text", text: await handleCreateDatasetRecords(params) }]
2471
2602
  };
@@ -2475,14 +2606,14 @@ function registerDatasetTools(server) {
2475
2606
  "platform_update_dataset_record",
2476
2607
  "Update a single record in a dataset on the LangWatch platform.",
2477
2608
  {
2478
- slugOrId: z2.string().describe("The dataset slug or ID containing the record"),
2479
- recordId: z2.string().describe("The record ID to update"),
2480
- entry: z2.record(z2.string(), z2.unknown()).describe("Updated record entry (key-value object)")
2609
+ slugOrId: z3.string().describe("The dataset slug or ID containing the record"),
2610
+ recordId: z3.string().describe("The record ID to update"),
2611
+ entry: z3.record(z3.string(), z3.unknown()).describe("Updated record entry (key-value object)")
2481
2612
  },
2482
2613
  async (params) => {
2483
2614
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2484
2615
  requireApiKey2();
2485
- const { handleUpdateDatasetRecord } = await import("./update-dataset-record-7PLDGTMR.js");
2616
+ const { handleUpdateDatasetRecord } = await import("./update-dataset-record-ZZUPG7AS.js");
2486
2617
  return {
2487
2618
  content: [{ type: "text", text: await handleUpdateDatasetRecord(params) }]
2488
2619
  };
@@ -2492,13 +2623,13 @@ function registerDatasetTools(server) {
2492
2623
  "platform_delete_dataset_records",
2493
2624
  "Delete records from a dataset on the LangWatch platform by their IDs.",
2494
2625
  {
2495
- slugOrId: z2.string().describe("The dataset slug or ID containing the records"),
2496
- recordIds: z2.array(z2.string()).min(1).max(1e3).describe("Array of record IDs to delete")
2626
+ slugOrId: z3.string().describe("The dataset slug or ID containing the records"),
2627
+ recordIds: z3.array(z3.string()).min(1).max(1e3).describe("Array of record IDs to delete")
2497
2628
  },
2498
2629
  async (params) => {
2499
2630
  const { requireApiKey: requireApiKey2 } = await import("./config.js");
2500
2631
  requireApiKey2();
2501
- const { handleDeleteDatasetRecords } = await import("./delete-dataset-records-SDUHQLLM.js");
2632
+ const { handleDeleteDatasetRecords } = await import("./delete-dataset-records-HC7VLBT7.js");
2502
2633
  return {
2503
2634
  content: [{ type: "text", text: await handleDeleteDatasetRecords(params) }]
2504
2635
  };
@@ -2510,12 +2641,12 @@ function registerProjectTools(server) {
2510
2641
  "platform_list_projects",
2511
2642
  "List all projects in your LangWatch organization. Requires an org-level API key.",
2512
2643
  {
2513
- page: z2.number().int().positive().optional().describe("Page number (default: 1)"),
2514
- limit: z2.number().int().positive().max(1e3).optional().describe("Results per page (default: 100)")
2644
+ page: z3.number().int().positive().optional().describe("Page number (default: 1)"),
2645
+ limit: z3.number().int().positive().max(1e3).optional().describe("Results per page (default: 100)")
2515
2646
  },
2516
2647
  withToolLogging("platform_list_projects", async (params) => {
2517
2648
  requireApiKey();
2518
- const { handleListProjects } = await import("./list-projects-YNNSRMLC.js");
2649
+ const { handleListProjects } = await import("./list-projects-4Y74TFDZ.js");
2519
2650
  return {
2520
2651
  content: [{ type: "text", text: await handleListProjects(params) }]
2521
2652
  };
@@ -2525,11 +2656,11 @@ function registerProjectTools(server) {
2525
2656
  "platform_get_project",
2526
2657
  "Get details of a specific project by its ID.",
2527
2658
  {
2528
- id: z2.string().describe("The project ID")
2659
+ id: z3.string().describe("The project ID")
2529
2660
  },
2530
2661
  withToolLogging("platform_get_project", async (params) => {
2531
2662
  requireApiKey();
2532
- const { handleGetProject } = await import("./get-project-RM6FRCBK.js");
2663
+ const { handleGetProject } = await import("./get-project-W5DCKXZP.js");
2533
2664
  return {
2534
2665
  content: [{ type: "text", text: await handleGetProject(params) }]
2535
2666
  };
@@ -2541,15 +2672,15 @@ function registerProjectTools(server) {
2541
2672
 
2542
2673
  You must provide either teamId (to add the project to an existing team) or newTeamName (to create a new team for the project).`,
2543
2674
  {
2544
- name: z2.string().describe("Project name"),
2545
- language: z2.string().describe('Programming language (e.g. "python", "typescript")'),
2546
- framework: z2.string().describe('Framework (e.g. "openai", "langchain", "custom")'),
2547
- teamId: z2.string().optional().describe("ID of an existing team to add the project to"),
2548
- newTeamName: z2.string().optional().describe("Name for a new team to create for this project")
2675
+ name: z3.string().describe("Project name"),
2676
+ language: z3.string().describe('Programming language (e.g. "python", "typescript")'),
2677
+ framework: z3.string().describe('Framework (e.g. "openai", "langchain", "custom")'),
2678
+ teamId: z3.string().optional().describe("ID of an existing team to add the project to"),
2679
+ newTeamName: z3.string().optional().describe("Name for a new team to create for this project")
2549
2680
  },
2550
2681
  withToolLogging("platform_create_project", async (params) => {
2551
2682
  requireApiKey();
2552
- const { handleCreateProject } = await import("./create-project-6N7PIYRY.js");
2683
+ const { handleCreateProject } = await import("./create-project-UPZGETN5.js");
2553
2684
  return {
2554
2685
  content: [{ type: "text", text: await handleCreateProject(params) }]
2555
2686
  };
@@ -2559,15 +2690,15 @@ You must provide either teamId (to add the project to an existing team) or newTe
2559
2690
  "platform_update_project",
2560
2691
  "Update an existing project's name, language, framework, or PII redaction level.",
2561
2692
  {
2562
- id: z2.string().describe("The project ID to update"),
2563
- name: z2.string().optional().describe("New project name"),
2564
- language: z2.string().optional().describe("New programming language"),
2565
- framework: z2.string().optional().describe("New framework"),
2566
- piiRedactionLevel: z2.enum(["STRICT", "ESSENTIAL", "DISABLED"]).optional().describe("PII redaction level")
2693
+ id: z3.string().describe("The project ID to update"),
2694
+ name: z3.string().optional().describe("New project name"),
2695
+ language: z3.string().optional().describe("New programming language"),
2696
+ framework: z3.string().optional().describe("New framework"),
2697
+ piiRedactionLevel: z3.enum(["STRICT", "ESSENTIAL", "DISABLED"]).optional().describe("PII redaction level")
2567
2698
  },
2568
2699
  withToolLogging("platform_update_project", async (params) => {
2569
2700
  requireApiKey();
2570
- const { handleUpdateProject } = await import("./update-project-QVHSJRUP.js");
2701
+ const { handleUpdateProject } = await import("./update-project-VTVU6KNP.js");
2571
2702
  return {
2572
2703
  content: [{ type: "text", text: await handleUpdateProject(params) }]
2573
2704
  };
@@ -2577,11 +2708,11 @@ You must provide either teamId (to add the project to an existing team) or newTe
2577
2708
  "platform_archive_project",
2578
2709
  "Archive (soft-delete) a project. The project can be restored later if needed.",
2579
2710
  {
2580
- id: z2.string().describe("The project ID to archive")
2711
+ id: z3.string().describe("The project ID to archive")
2581
2712
  },
2582
2713
  withToolLogging("platform_archive_project", async (params) => {
2583
2714
  requireApiKey();
2584
- const { handleArchiveProject } = await import("./archive-project-KWFM3I5Z.js");
2715
+ const { handleArchiveProject } = await import("./archive-project-LAWWNKTX.js");
2585
2716
  return {
2586
2717
  content: [{ type: "text", text: await handleArchiveProject(params) }]
2587
2718
  };
@@ -2595,7 +2726,7 @@ function registerApiKeyTools(server) {
2595
2726
  {},
2596
2727
  withToolLogging("platform_list_api_keys", async () => {
2597
2728
  requireApiKey();
2598
- const { handleListApiKeys } = await import("./list-api-keys-A2PMV435.js");
2729
+ const { handleListApiKeys } = await import("./list-api-keys-B4YL7STE.js");
2599
2730
  return {
2600
2731
  content: [{ type: "text", text: await handleListApiKeys() }]
2601
2732
  };
@@ -2610,22 +2741,22 @@ function registerApiKeyTools(server) {
2610
2741
 
2611
2742
  The token is returned once and cannot be retrieved again.`,
2612
2743
  {
2613
- keyType: z2.enum(["personal", "service"]).describe("Key type: 'personal' (user-tied) or 'service' (headless)"),
2614
- name: z2.string().describe("Key name (max 100 chars)"),
2615
- description: z2.string().optional().describe("Key description (max 500 chars)"),
2616
- expiresAt: z2.string().optional().describe("Expiration date (ISO string)"),
2617
- bindings: z2.array(
2618
- z2.object({
2619
- role: z2.enum(["ADMIN", "MEMBER", "VIEWER"]).describe("Role"),
2620
- scopeType: z2.enum(["ORGANIZATION", "TEAM", "PROJECT"]).describe("Scope type"),
2621
- scopeId: z2.string().describe("Scope ID (org, team, or project ID)")
2744
+ keyType: z3.enum(["personal", "service"]).describe("Key type: 'personal' (user-tied) or 'service' (headless)"),
2745
+ name: z3.string().describe("Key name (max 100 chars)"),
2746
+ description: z3.string().optional().describe("Key description (max 500 chars)"),
2747
+ expiresAt: z3.string().optional().describe("Expiration date (ISO string)"),
2748
+ bindings: z3.array(
2749
+ z3.object({
2750
+ role: z3.enum(["ADMIN", "MEMBER", "VIEWER"]).describe("Role"),
2751
+ scopeType: z3.enum(["ORGANIZATION", "TEAM", "PROJECT"]).describe("Scope type"),
2752
+ scopeId: z3.string().describe("Scope ID (org, team, or project ID)")
2622
2753
  })
2623
2754
  ).optional().describe("Role bindings (required for personal keys)"),
2624
- projectIds: z2.array(z2.string()).optional().describe("Project IDs for service keys (creates ADMIN bindings per project)")
2755
+ projectIds: z3.array(z3.string()).optional().describe("Project IDs for service keys (creates ADMIN bindings per project)")
2625
2756
  },
2626
2757
  withToolLogging("platform_create_api_key", async (params) => {
2627
2758
  requireApiKey();
2628
- const { handleCreateApiKey } = await import("./create-api-key-T4KSNPKB.js");
2759
+ const { handleCreateApiKey } = await import("./create-api-key-IKMOTWCD.js");
2629
2760
  return {
2630
2761
  content: [{ type: "text", text: await handleCreateApiKey(params) }]
2631
2762
  };
@@ -2635,11 +2766,11 @@ The token is returned once and cannot be retrieved again.`,
2635
2766
  "platform_revoke_api_key",
2636
2767
  "Revoke an API key. Once revoked, the key can no longer be used for authentication.",
2637
2768
  {
2638
- id: z2.string().describe("The API key ID to revoke")
2769
+ id: z3.string().describe("The API key ID to revoke")
2639
2770
  },
2640
2771
  withToolLogging("platform_revoke_api_key", async (params) => {
2641
2772
  requireApiKey();
2642
- const { handleRevokeApiKey } = await import("./revoke-api-key-3J3ZA4UB.js");
2773
+ const { handleRevokeApiKey } = await import("./revoke-api-key-GR55PUP4.js");
2643
2774
  return {
2644
2775
  content: [{ type: "text", text: await handleRevokeApiKey(params) }]
2645
2776
  };