@langwatch/mcp-server 2.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/.gitignore +7 -0
  2. package/.npmignore +41 -0
  3. package/CHANGELOG.md +218 -201
  4. package/CONTRIBUTING.md +10 -0
  5. package/README.md +70 -68
  6. package/dist/add-dashboard-widget-55UI6H22.js +44 -0
  7. package/dist/add-dashboard-widget-MJHIC3CC.js +45 -0
  8. package/dist/{archive-project-W3IKI7UL.js → archive-project-K5UD7A6X.js} +4 -4
  9. package/dist/archive-project-L4PAKT34.js +19 -0
  10. package/dist/{archive-run-plan-474OKHHU.js → archive-run-plan-5HSQG2HX.js} +4 -4
  11. package/dist/archive-run-plan-AOKNYQIO.js +15 -0
  12. package/dist/archive-scenario-2CWJW2VD.js +19 -0
  13. package/dist/{archive-scenario-V5UNYK26.js → archive-scenario-5IJQESHH.js} +4 -4
  14. package/dist/{archive-test-suite-O7FLDMXK.js → archive-test-suite-OPB7NFI7.js} +4 -4
  15. package/dist/archive-test-suite-ZC3TN6VH.js +15 -0
  16. package/dist/assign-prompt-tag-6DDE6ZZ5.js +23 -0
  17. package/dist/{assign-prompt-tag-Q46WRB6P.js → assign-prompt-tag-D7O23MJM.js} +8 -4
  18. package/dist/chunk-3YLN3ATJ.js +241 -0
  19. package/dist/{chunk-EYXMLE5X.js → chunk-4RX3G62A.js} +56 -47
  20. package/dist/{chunk-UF6XIGYR.js → chunk-6YZUOD34.js} +2 -5
  21. package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
  22. package/dist/chunk-7CZQDZ2K.js +319 -0
  23. package/dist/{chunk-RVAE2MEA.js → chunk-7GETGE6B.js} +7 -7
  24. package/dist/{chunk-OJLYYJWI.js → chunk-AASW2TO2.js} +7 -10
  25. package/dist/{chunk-QAMP3CGR.js → chunk-B4RFWIUP.js} +4 -4
  26. package/dist/{chunk-ZXKLPC2E.js → chunk-BIIKE3EI.js} +1 -1
  27. package/dist/{chunk-G4ZAZTZW.js → chunk-D2HS73VI.js} +7 -10
  28. package/dist/{chunk-37SMPMQS.js → chunk-DMM3JQ42.js} +7 -2
  29. package/dist/{chunk-WT4PO4A3.js → chunk-DULFP3MK.js} +10 -7
  30. package/dist/chunk-EYPJBL7P.js +516 -0
  31. package/dist/{chunk-NUFPTHKU.js → chunk-FOKVY3BK.js} +1 -1
  32. package/dist/chunk-GA5JUSPT.js +64 -0
  33. package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
  34. package/dist/chunk-HLQJXUR6.js +67 -0
  35. package/dist/{chunk-JTQJRNFJ.js → chunk-KILVK3FS.js} +4 -4
  36. package/dist/chunk-MOCU5XWF.js +79 -0
  37. package/dist/chunk-O2WGVCED.js +41 -0
  38. package/dist/{chunk-HV4DWKBI.js → chunk-O7EMWEVJ.js} +2 -4
  39. package/dist/{chunk-UFOYFYI7.js → chunk-QXLMHLRC.js} +6 -9
  40. package/dist/{chunk-QRO35SOM.js → chunk-R5YJIYPF.js} +981 -747
  41. package/dist/{chunk-JR6DJZOU.js → chunk-RABYBFX5.js} +4 -10
  42. package/dist/{chunk-SR6QPRIE.js → chunk-RFC2SBEX.js} +7 -13
  43. package/dist/chunk-SHSVN3SE.js +21 -0
  44. package/dist/{chunk-CKNAH5TG.js → chunk-U24EACC4.js} +3 -10
  45. package/dist/{chunk-56OGTS24.js → chunk-VOUGDY2O.js} +4 -11
  46. package/dist/chunk-WCKZDOGF.js +31 -0
  47. package/dist/chunk-XQYH52SI.js +129 -0
  48. package/dist/{chunk-7E4FZIYJ.js → chunk-XUIJYNRJ.js} +1 -1
  49. package/dist/{chunk-6DJDEXET.js → chunk-YCIUEZVK.js} +6 -12
  50. package/dist/config-2WQGMAEN.js +16 -0
  51. package/dist/config.cjs +109 -0
  52. package/dist/config.js +5 -4
  53. package/dist/{create-agent-JFJ2K6X3.js → create-agent-6JNLMYQD.js} +4 -4
  54. package/dist/create-agent-IRZOU4R5.js +23 -0
  55. package/dist/create-analytics-report-N4L4V5QL.js +19 -0
  56. package/dist/create-analytics-report-QEHXG7FU.js +18 -0
  57. package/dist/{create-annotation-EUXXQ6NS.js → create-annotation-CCEGIZ67.js} +10 -5
  58. package/dist/create-annotation-DTHCMWHB.js +29 -0
  59. package/dist/{create-api-key-BGBB76JX.js → create-api-key-JKM2DSZO.js} +5 -7
  60. package/dist/create-api-key-JPEUIXGM.js +24 -0
  61. package/dist/create-dataset-DJNXYJ5B.js +22 -0
  62. package/dist/{create-dataset-FD5VAXU4.js → create-dataset-WON4SOTC.js} +6 -6
  63. package/dist/create-dataset-records-TMEOTLTO.js +20 -0
  64. package/dist/{create-dataset-records-WQUXXOHI.js → create-dataset-records-UJBW3C7C.js} +5 -7
  65. package/dist/create-evaluator-N5AEHI4K.js +27 -0
  66. package/dist/{create-evaluator-6NV33Z52.js → create-evaluator-XYNY2YFY.js} +4 -4
  67. package/dist/create-mcp-server.cjs +9712 -0
  68. package/dist/create-mcp-server.js +2757 -10
  69. package/dist/{create-project-ZQ7TFIO2.js → create-project-EY4XZ7TH.js} +4 -4
  70. package/dist/create-project-YL345T5L.js +44 -0
  71. package/dist/{create-prompt-BS6QRCUU.js → create-prompt-JZQNQ7I3.js} +5 -7
  72. package/dist/create-prompt-ZUMQHHX7.js +37 -0
  73. package/dist/create-prompt-tag-CJ5FZ436.js +17 -0
  74. package/dist/{create-prompt-tag-FCQ5ELSQ.js → create-prompt-tag-JFP2Q3PO.js} +3 -3
  75. package/dist/create-scenario-CQU2SSFB.js +33 -0
  76. package/dist/{create-scenario-DRPTPXU3.js → create-scenario-S6OWWKJO.js} +5 -5
  77. package/dist/create-test-suite-OLGCAGJA.js +36 -0
  78. package/dist/{create-test-suite-ZIZCCFJ4.js → create-test-suite-Y7P2RI4L.js} +6 -6
  79. package/dist/create-trigger-4CNBTISJ.js +48 -0
  80. package/dist/create-trigger-RQ653WYF.js +49 -0
  81. package/dist/dashboards-BA7M6CMO.js +90 -0
  82. package/dist/dashboards-U663GUIB.js +91 -0
  83. package/dist/{delete-agent-SA4JMUZF.js → delete-agent-J2Q4DRZ2.js} +4 -4
  84. package/dist/delete-agent-ZAU4LTXB.js +18 -0
  85. package/dist/delete-analytics-report-QK6X7P4S.js +19 -0
  86. package/dist/delete-analytics-report-YUYLDHLL.js +18 -0
  87. package/dist/delete-annotation-7X4NYXXM.js +17 -0
  88. package/dist/{delete-annotation-X3KKK7QY.js → delete-annotation-KJOCDLV3.js} +4 -4
  89. package/dist/{delete-dataset-W6EZ44HY.js → delete-dataset-NXP7ZPPV.js} +5 -7
  90. package/dist/delete-dataset-RUTZBBVD.js +18 -0
  91. package/dist/{delete-dataset-records-7CNOTALB.js → delete-dataset-records-4Z7DZCDW.js} +5 -7
  92. package/dist/delete-dataset-records-75UAR5IS.js +19 -0
  93. package/dist/delete-evaluator-E3CUNGTQ.js +16 -0
  94. package/dist/delete-evaluator-RI4GALGX.js +15 -0
  95. package/dist/delete-prompt-tag-LE3WJPKS.js +17 -0
  96. package/dist/{delete-prompt-tag-QB3OCZUV.js → delete-prompt-tag-S4KBZTNG.js} +3 -3
  97. package/dist/delete-workflow-4CZFIQCQ.js +17 -0
  98. package/dist/{delete-workflow-NG2VXYYM.js → delete-workflow-PWQPDW6H.js} +4 -4
  99. package/dist/discover-evaluator-schema-UHWA5HVL.js +120 -0
  100. package/dist/discover-evaluator-schema-XKCLLCB3.js +118 -0
  101. package/dist/discover-scenario-schema-NOJY6S7E.js +137 -0
  102. package/dist/{discover-scenario-schema-W7KBXA4J.js → discover-scenario-schema-OOFIQKOG.js} +37 -17
  103. package/dist/discover-schema-7WHIIATI.js +442 -0
  104. package/dist/{discover-schema-L6QDPON3.js → discover-schema-J2ANOBKO.js} +181 -186
  105. package/dist/get-agent-5T3CXQOR.js +69 -0
  106. package/dist/{get-agent-7THF7HCU.js → get-agent-ZKYQJUQ7.js} +15 -11
  107. package/dist/get-analytics-4MPEK4KV.js +79 -0
  108. package/dist/get-analytics-ZLI3A4F5.js +80 -0
  109. package/dist/get-analytics-report-JCKYMA2S.js +29 -0
  110. package/dist/get-analytics-report-SKIP2JWH.js +30 -0
  111. package/dist/get-dataset-APGZBYMH.js +64 -0
  112. package/dist/get-dataset-LWXDVMVE.js +63 -0
  113. package/dist/get-evaluator-3A7BJBAB.js +47 -0
  114. package/dist/{get-evaluator-RZ44UIN6.js → get-evaluator-IWNJINRY.js} +4 -4
  115. package/dist/get-project-EQVB4LEL.js +26 -0
  116. package/dist/{get-project-QSQEAB33.js → get-project-RK6AJTEP.js} +4 -4
  117. package/dist/{get-prompt-GVKXF5NL.js → get-prompt-TLG2T2DS.js} +53 -58
  118. package/dist/get-prompt-ZER557X3.js +94 -0
  119. package/dist/get-run-plan-5X7DDJRN.js +58 -0
  120. package/dist/{get-run-plan-NY7J5GRE.js → get-run-plan-PEHRO5M3.js} +7 -9
  121. package/dist/{get-scenario-Q3LLQE4T.js → get-scenario-375W5D6I.js} +5 -5
  122. package/dist/get-scenario-UQX45ZZO.js +37 -0
  123. package/dist/{get-simulation-run-WINEYDMK.js → get-simulation-run-2NBXJADG.js} +26 -22
  124. package/dist/get-simulation-run-QZTLGL7W.js +69 -0
  125. package/dist/{get-test-suite-4HKA7OKS.js → get-test-suite-GVIBDG7K.js} +5 -5
  126. package/dist/get-test-suite-OODIR3RI.js +48 -0
  127. package/dist/{get-trace-RCUV7N4O.js → get-trace-AGCHVPJK.js} +11 -13
  128. package/dist/get-trace-KJLYAZRC.js +45 -0
  129. package/dist/get-workflow-3TV2YYC5.js +25 -0
  130. package/dist/{get-workflow-EEOC7Y45.js → get-workflow-7LZSVPP2.js} +4 -4
  131. package/dist/{http-security-EU3CHTY7.js → http-security-DNLBNQZL.js} +2 -2
  132. package/dist/{http-server-WCDUARTH.js → http-server-7CCN3EHJ.js} +4249 -325
  133. package/dist/index.js +59595 -38027
  134. package/dist/langwatch-api-analytics-reports-6CF6KUET.js +17 -0
  135. package/dist/langwatch-api-analytics-reports-RPFB5AO5.js +18 -0
  136. package/dist/{langwatch-api-annotations-6DHVZWUK.js → langwatch-api-annotations-H4AI4TKG.js} +4 -4
  137. package/dist/langwatch-api-annotations-QSJNUQQS.js +17 -0
  138. package/dist/langwatch-api-monitors-ENHLOL3S.js +47 -0
  139. package/dist/{langwatch-api-monitors-6ISFJ7WX.js → langwatch-api-monitors-OHSGADTH.js} +11 -16
  140. package/dist/langwatch-api-secrets-AGW6UUMD.js +55 -0
  141. package/dist/langwatch-api-secrets-CLTS766Q.js +56 -0
  142. package/dist/langwatch-api-triggers-G5UWFNN2.js +22 -0
  143. package/dist/langwatch-api-triggers-QMR7KEXW.js +23 -0
  144. package/dist/langwatch-api-workflows-HKTBIKKY.js +15 -0
  145. package/dist/{langwatch-api-workflows-6UJL5U4Z.js → langwatch-api-workflows-OMROZH2O.js} +4 -4
  146. package/dist/{list-agents-AMVDQPQL.js → list-agents-BYWDNAHT.js} +4 -4
  147. package/dist/list-agents-MG24MHZE.js +42 -0
  148. package/dist/list-analytics-reports-G3EPWGSQ.js +32 -0
  149. package/dist/list-analytics-reports-PPWIFRES.js +33 -0
  150. package/dist/list-annotations-QCLGEK5A.js +38 -0
  151. package/dist/{list-annotations-6PR5NLIC.js → list-annotations-Y4EUBJHG.js} +10 -5
  152. package/dist/list-api-keys-DAVOBPFK.js +42 -0
  153. package/dist/{list-api-keys-GVPNBIHQ.js → list-api-keys-JMW5WRXX.js} +10 -5
  154. package/dist/list-dashboards-2P3VJFRS.js +29 -0
  155. package/dist/list-dashboards-MW5O3MKH.js +30 -0
  156. package/dist/list-dataset-records-KEHT7G6Q.js +43 -0
  157. package/dist/{list-dataset-records-O67HZ35Y.js → list-dataset-records-KMLLMZAZ.js} +14 -10
  158. package/dist/{list-datasets-WXZL6UMP.js → list-datasets-P3JK2ZHS.js} +9 -13
  159. package/dist/list-datasets-Z7OOE4KI.js +56 -0
  160. package/dist/{list-evaluators-PAX72WCN.js → list-evaluators-7RRESBOU.js} +5 -7
  161. package/dist/list-evaluators-VATJVOHR.js +32 -0
  162. package/dist/{list-model-providers-VVLZMLCX.js → list-model-providers-OXDRPUCJ.js} +4 -4
  163. package/dist/list-model-providers-VXQJWDXU.js +35 -0
  164. package/dist/{list-projects-AQVI6SUK.js → list-projects-HUVK7L3W.js} +5 -7
  165. package/dist/list-projects-X72ZXVY5.js +40 -0
  166. package/dist/{list-prompt-tags-WZFBJOHG.js → list-prompt-tags-3I3LWFIR.js} +3 -3
  167. package/dist/list-prompt-tags-DRHUH2ND.js +23 -0
  168. package/dist/list-prompts-6DX3QECJ.js +30 -0
  169. package/dist/{list-prompts-BQOHRHYT.js → list-prompts-PS423RU3.js} +4 -6
  170. package/dist/list-run-plans-5SXPOV3X.js +45 -0
  171. package/dist/{list-run-plans-UBAU2DGH.js → list-run-plans-6VNHINPY.js} +5 -5
  172. package/dist/list-scenarios-EQWCW7Q4.js +45 -0
  173. package/dist/{list-scenarios-MS4IUIVM.js → list-scenarios-GKNH3YND.js} +13 -11
  174. package/dist/{list-simulation-runs-D6YF4ZOU.js → list-simulation-runs-KHY7KALI.js} +12 -8
  175. package/dist/list-simulation-runs-PUDK32C2.js +53 -0
  176. package/dist/list-test-suites-7H2DRILK.js +34 -0
  177. package/dist/{list-test-suites-L7R2O6DR.js → list-test-suites-GY56LGLY.js} +4 -4
  178. package/dist/list-trigger-fires-7RZUP54Y.js +19 -0
  179. package/dist/list-trigger-fires-OZUF65LI.js +20 -0
  180. package/dist/list-triggers-BGUCUXTJ.js +45 -0
  181. package/dist/list-triggers-XC5KMX4C.js +46 -0
  182. package/dist/list-workflows-55NYC3PC.js +33 -0
  183. package/dist/{list-workflows-6MV4XJHF.js → list-workflows-HV7FUWZA.js} +5 -7
  184. package/dist/{rename-prompt-tag-K5LQ4CY6.js → rename-prompt-tag-2I7Z5FCY.js} +3 -3
  185. package/dist/rename-prompt-tag-SZYTOWDX.js +18 -0
  186. package/dist/{rename-test-suite-NTYHAO5X.js → rename-test-suite-27AYY33K.js} +4 -4
  187. package/dist/rename-test-suite-CLIEPZDO.js +20 -0
  188. package/dist/report-issue-5HSL7CNB.js +924 -0
  189. package/dist/{report-issue-RHZZ33IS.js → report-issue-N7ND5TM6.js} +107 -67
  190. package/dist/{rerun-run-plan-MUDWJBE4.js → rerun-run-plan-O3VUZ6CG.js} +5 -5
  191. package/dist/rerun-run-plan-OJTVVGJI.js +21 -0
  192. package/dist/{revoke-api-key-6LAZ3QZZ.js → revoke-api-key-BU6BKGCG.js} +4 -4
  193. package/dist/revoke-api-key-NZNCFOIR.js +15 -0
  194. package/dist/run-agent-244O4Y5M.js +75 -0
  195. package/dist/run-agent-HPCGZGYW.js +74 -0
  196. package/dist/run-plan-2ZPGGZ4H.js +38 -0
  197. package/dist/{run-plan-T4ZYOZGA.js → run-plan-KSXUYQT3.js} +7 -7
  198. package/dist/run-query-4LMOQ5UW.js +47 -0
  199. package/dist/run-query-BQUHIUC2.js +46 -0
  200. package/dist/{run-test-suite-L4MZ7G4D.js → run-test-suite-P3WLVPXC.js} +6 -6
  201. package/dist/run-test-suite-UEOMCON6.js +25 -0
  202. package/dist/run-workflow-EFZ6HG5B.js +36 -0
  203. package/dist/{run-workflow-DFIS23AP.js → run-workflow-I4IHEN54.js} +4 -4
  204. package/dist/search-traces-6IR7PR4L.js +170 -0
  205. package/dist/search-traces-BYML2NQ4.js +171 -0
  206. package/dist/set-model-provider-RBNGWFVI.js +33 -0
  207. package/dist/{set-model-provider-XRNMFOVR.js → set-model-provider-SHEVKWRC.js} +4 -4
  208. package/dist/{update-agent-DUWNYBNA.js → update-agent-PTKTM2B5.js} +4 -4
  209. package/dist/update-agent-ZPXWRMS2.js +20 -0
  210. package/dist/update-dashboard-widget-HKCBXH7X.js +62 -0
  211. package/dist/update-dashboard-widget-IP2TTQ5G.js +63 -0
  212. package/dist/update-dataset-GHIN6JR3.js +22 -0
  213. package/dist/{update-dataset-YSOMDCOB.js → update-dataset-IRVMY5PF.js} +6 -6
  214. package/dist/update-dataset-record-6VI7K2CL.js +19 -0
  215. package/dist/{update-dataset-record-DEA2ITYR.js → update-dataset-record-Z3L7ACNF.js} +4 -4
  216. package/dist/update-evaluator-5NLNE6VY.js +24 -0
  217. package/dist/{update-evaluator-NH7Q5GWV.js → update-evaluator-FEH7H6NS.js} +4 -4
  218. package/dist/update-project-75H3LDQT.js +24 -0
  219. package/dist/{update-project-Q26FBSYH.js → update-project-QPR3QX55.js} +4 -4
  220. package/dist/update-prompt-BCDFTNLK.js +140 -0
  221. package/dist/{update-prompt-ZQQ2C3KU.js → update-prompt-NPRXYSWA.js} +27 -29
  222. package/dist/update-scenario-BNOMDCMV.js +34 -0
  223. package/dist/{update-scenario-WUX34JAR.js → update-scenario-EM5XGMB7.js} +5 -5
  224. package/package.json +35 -39
  225. package/pyproject.toml +23 -8
  226. package/src/config.d.ts +6 -0
  227. package/src/config.ts +22 -29
  228. package/src/create-mcp-server.ts +887 -634
  229. package/src/documentation-fetch.ts +21 -20
  230. package/src/http-security.ts +166 -135
  231. package/src/http-server.ts +189 -224
  232. package/src/index.ts +14 -16
  233. package/src/langwatch-api-agents.ts +18 -21
  234. package/src/langwatch-api-analytics-reports.ts +62 -0
  235. package/src/langwatch-api-annotations.ts +11 -12
  236. package/src/langwatch-api-api-keys.ts +8 -9
  237. package/src/langwatch-api-dashboard-widgets.ts +47 -0
  238. package/src/langwatch-api-dashboards.ts +109 -24
  239. package/src/langwatch-api-datasets.ts +98 -32
  240. package/src/langwatch-api-evaluators.ts +13 -19
  241. package/src/langwatch-api-model-providers.ts +4 -4
  242. package/src/langwatch-api-monitors.ts +14 -18
  243. package/src/langwatch-api-projects.ts +10 -9
  244. package/src/langwatch-api-query.ts +114 -0
  245. package/src/langwatch-api-run-plans.ts +12 -29
  246. package/src/langwatch-api-scenarios.ts +9 -11
  247. package/src/langwatch-api-secrets.ts +31 -24
  248. package/src/langwatch-api-simulation-runs.ts +6 -8
  249. package/src/langwatch-api-test-suites.ts +14 -33
  250. package/src/langwatch-api-triggers.ts +96 -34
  251. package/src/langwatch-api-workflows.ts +9 -9
  252. package/src/langwatch-api.ts +118 -124
  253. package/src/public-http-request.ts +21 -12
  254. package/src/schemas/analytics-metrics.ts +3 -15
  255. package/src/schemas/create-dataset.ts +3 -4
  256. package/src/schemas/run-plan.ts +13 -29
  257. package/src/schemas/suite-fields.ts +6 -23
  258. package/src/schemas/triggers.ts +365 -0
  259. package/src/schemas/widget-sources.ts +33 -0
  260. package/src/tools/add-dashboard-widget.ts +51 -0
  261. package/src/tools/archive-project.ts +2 -4
  262. package/src/tools/archive-run-plan.ts +2 -4
  263. package/src/tools/archive-scenario.ts +2 -4
  264. package/src/tools/archive-test-suite.ts +2 -4
  265. package/src/tools/assign-prompt-tag.ts +6 -2
  266. package/src/tools/create-agent.ts +1 -1
  267. package/src/tools/create-analytics-report.ts +7 -0
  268. package/src/tools/create-annotation.ts +7 -2
  269. package/src/tools/create-api-key.ts +4 -6
  270. package/src/tools/create-dataset-records.ts +4 -8
  271. package/src/tools/create-dataset.ts +5 -7
  272. package/src/tools/create-evaluator.ts +3 -5
  273. package/src/tools/create-project.ts +2 -2
  274. package/src/tools/create-prompt-tag.ts +2 -4
  275. package/src/tools/create-prompt.ts +9 -18
  276. package/src/tools/create-scenario.ts +5 -7
  277. package/src/tools/create-test-suite.ts +4 -9
  278. package/src/tools/create-trigger.ts +55 -0
  279. package/src/tools/dashboard-widget-queries.ts +45 -0
  280. package/src/tools/dashboards.ts +104 -0
  281. package/src/tools/delete-agent.ts +1 -1
  282. package/src/tools/delete-analytics-report.ts +7 -0
  283. package/src/tools/delete-annotation.ts +1 -1
  284. package/src/tools/delete-dataset-records.ts +4 -8
  285. package/src/tools/delete-dataset.ts +3 -7
  286. package/src/tools/delete-evaluator.ts +4 -6
  287. package/src/tools/delete-prompt-tag.ts +2 -4
  288. package/src/tools/delete-workflow.ts +1 -1
  289. package/src/tools/discover-evaluator-schema.ts +34 -25
  290. package/src/tools/discover-scenario-schema.ts +41 -21
  291. package/src/tools/discover-schema.ts +149 -27
  292. package/src/tools/experiment-run-status.ts +2 -8
  293. package/src/tools/format-dataset-mutation.ts +5 -10
  294. package/src/tools/format-run-plan.ts +7 -21
  295. package/src/tools/format-scenario.ts +2 -4
  296. package/src/tools/format-suite-details.ts +6 -12
  297. package/src/tools/get-agent.ts +15 -6
  298. package/src/tools/get-analytics-report.ts +23 -0
  299. package/src/tools/get-analytics.ts +52 -46
  300. package/src/tools/get-dataset.ts +34 -16
  301. package/src/tools/get-evaluator.ts +4 -11
  302. package/src/tools/get-experiment-results.ts +219 -186
  303. package/src/tools/get-project.ts +2 -4
  304. package/src/tools/get-prompt.ts +63 -84
  305. package/src/tools/get-run-plan.ts +4 -6
  306. package/src/tools/get-scenario.ts +4 -6
  307. package/src/tools/get-simulation-run.ts +27 -24
  308. package/src/tools/get-test-suite.ts +2 -5
  309. package/src/tools/get-trace.ts +16 -17
  310. package/src/tools/get-workflow.ts +1 -1
  311. package/src/tools/list-agents.ts +1 -1
  312. package/src/tools/list-analytics-reports.ts +27 -0
  313. package/src/tools/list-annotations.ts +8 -5
  314. package/src/tools/list-api-keys.ts +7 -2
  315. package/src/tools/list-dashboards.ts +20 -21
  316. package/src/tools/list-dataset-records.ts +8 -6
  317. package/src/tools/list-datasets.ts +12 -23
  318. package/src/tools/list-evaluators.ts +4 -8
  319. package/src/tools/list-experiment-runs.ts +5 -9
  320. package/src/tools/list-experiments.ts +5 -11
  321. package/src/tools/list-model-providers.ts +3 -5
  322. package/src/tools/list-projects.ts +2 -4
  323. package/src/tools/list-prompt-tags.ts +3 -3
  324. package/src/tools/list-prompts.ts +4 -8
  325. package/src/tools/list-run-plans.ts +2 -2
  326. package/src/tools/list-scenarios.ts +14 -15
  327. package/src/tools/list-simulation-runs.ts +8 -4
  328. package/src/tools/list-test-suites.ts +1 -1
  329. package/src/tools/list-trigger-fires.ts +17 -0
  330. package/src/tools/list-triggers.ts +39 -0
  331. package/src/tools/list-workflows.ts +2 -4
  332. package/src/tools/rename-prompt-tag.ts +1 -1
  333. package/src/tools/rename-test-suite.ts +2 -5
  334. package/src/tools/report-issue.ts +7 -9
  335. package/src/tools/rerun-run-plan.ts +2 -5
  336. package/src/tools/revoke-api-key.ts +2 -4
  337. package/src/tools/run-agent.ts +29 -26
  338. package/src/tools/run-experiment.ts +37 -34
  339. package/src/tools/run-plan.ts +4 -7
  340. package/src/tools/run-query.ts +47 -0
  341. package/src/tools/run-test-suite.ts +4 -7
  342. package/src/tools/run-workflow.ts +2 -5
  343. package/src/tools/search-traces.ts +161 -47
  344. package/src/tools/set-model-provider.ts +4 -6
  345. package/src/tools/test-agent.ts +2 -2
  346. package/src/tools/update-agent.ts +1 -1
  347. package/src/tools/update-dashboard-widget.ts +86 -0
  348. package/src/tools/update-dataset-record.ts +1 -1
  349. package/src/tools/update-dataset.ts +5 -7
  350. package/src/tools/update-evaluator.ts +3 -5
  351. package/src/tools/update-project.ts +1 -1
  352. package/src/tools/update-prompt.ts +44 -59
  353. package/src/tools/update-scenario.ts +5 -7
  354. package/src/tools/update-test-suite.ts +6 -11
  355. package/src/utils/date-parsing.ts +1 -1
  356. package/src/utils/escape-markdown.ts +3 -8
  357. package/src/utils/format-evaluations.ts +6 -6
  358. package/src/utils/markdown-table.ts +58 -0
  359. package/src/utils/trace-id-shape.ts +20 -0
  360. package/tsconfig.app.json +24 -0
  361. package/tsconfig.json +14 -12
  362. package/uv.lock +667 -341
  363. package/vitest.integration.config.js +10 -0
  364. package/vitest.scenario.config.js +9 -0
  365. package/.eslintrc.cjs +0 -36
  366. package/dist/chunk-AN4OUA4D.js +0 -86
  367. package/dist/chunk-GELJ2MQR.js +0 -226
  368. package/dist/chunk-K37ZNPXK.js +0 -24
  369. package/dist/chunk-S4GVX36W.js +0 -39
  370. package/dist/config.d.ts +0 -17
  371. package/dist/create-dashboard-Z76AIPLS.js +0 -19
  372. package/dist/create-mcp-server.d.ts +0 -10
  373. package/dist/delete-dashboard-LYMRPF27.js +0 -19
  374. package/dist/delete-evaluator-RKYC4TNB.js +0 -16
  375. package/dist/discover-evaluator-schema-ESSHQGPY.js +0 -1912
  376. package/dist/get-analytics-R6AZD3AW.js +0 -73
  377. package/dist/get-dashboard-P4WWVHFU.js +0 -30
  378. package/dist/get-dataset-AKTYSQDI.js +0 -49
  379. package/dist/index.d.ts +0 -2
  380. package/dist/langwatch-api-dashboards-2KJL2M42.js +0 -18
  381. package/dist/langwatch-api-secrets-OEBD6GBU.js +0 -41
  382. package/dist/langwatch-api-triggers-5E6DDGX6.js +0 -31
  383. package/dist/list-dashboards-Z3BZKDGF.js +0 -33
  384. package/dist/run-agent-CAGWGTYT.js +0 -72
  385. package/dist/search-traces-4XTJYXIK.js +0 -79
  386. package/src/__tests__/agent-tools.unit.test.ts +0 -257
  387. package/src/__tests__/all-tools.integration.test.ts +0 -1872
  388. package/src/__tests__/config.unit.test.ts +0 -202
  389. package/src/__tests__/datasets.integration.test.ts +0 -620
  390. package/src/__tests__/datasets.unit.test.ts +0 -244
  391. package/src/__tests__/date-parsing.unit.test.ts +0 -78
  392. package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
  393. package/src/__tests__/discover-schema.unit.test.ts +0 -118
  394. package/src/__tests__/docker.integration.test.ts +0 -318
  395. package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
  396. package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
  397. package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
  398. package/src/__tests__/experiment-status.unit.test.ts +0 -194
  399. package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
  400. package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
  401. package/src/__tests__/http-security-origin.unit.test.ts +0 -97
  402. package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
  403. package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
  404. package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
  405. package/src/__tests__/http-server-origin.integration.test.ts +0 -169
  406. package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
  407. package/src/__tests__/http-transport.integration.test.ts +0 -395
  408. package/src/__tests__/integration.integration.test.ts +0 -284
  409. package/src/__tests__/langwatch-api.unit.test.ts +0 -661
  410. package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
  411. package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
  412. package/src/__tests__/prompt-response-types.unit.test.ts +0 -51
  413. package/src/__tests__/prompts.integration.test.ts +0 -736
  414. package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
  415. package/src/__tests__/report-issue.integration.test.ts +0 -147
  416. package/src/__tests__/run-plan-tools.unit.test.ts +0 -565
  417. package/src/__tests__/scenario-tools.integration.test.ts +0 -286
  418. package/src/__tests__/scenario-tools.unit.test.ts +0 -207
  419. package/src/__tests__/schemas.unit.test.ts +0 -85
  420. package/src/__tests__/simulation-run-tools.unit.test.ts +0 -116
  421. package/src/__tests__/support/http-server-harness.ts +0 -138
  422. package/src/__tests__/test-suite-tools.unit.test.ts +0 -615
  423. package/src/__tests__/tools.integration.test.ts +0 -896
  424. package/src/schemas/filter-fields.ts +0 -119
  425. package/src/schemas/index.ts +0 -9
  426. package/src/tools/create-dashboard.ts +0 -7
  427. package/src/tools/delete-dashboard.ts +0 -7
  428. package/src/tools/get-dashboard.ts +0 -22
@@ -1,565 +0,0 @@
1
- /**
2
- * Digests of the run plan tools.
3
- *
4
- * @see specs/mcp-server/run-plan-tools.feature
5
- */
6
- import { beforeEach, describe, expect, it, vi } from "vitest";
7
-
8
- vi.mock("../langwatch-api-run-plans.js", () => ({
9
- listRunPlans: vi.fn(),
10
- getRunPlan: vi.fn(),
11
- runRunPlan: vi.fn(),
12
- rerunRunPlan: vi.fn(),
13
- archiveRunPlan: vi.fn(),
14
- }));
15
-
16
- import {
17
- archiveRunPlan,
18
- getRunPlan,
19
- listRunPlans,
20
- rerunRunPlan,
21
- runRunPlan,
22
- type RunPlan,
23
- type RunPlanRunResult,
24
- } from "../langwatch-api-run-plans.js";
25
-
26
- import { handleArchiveRunPlan } from "../tools/archive-run-plan.js";
27
- import { handleGetRunPlan } from "../tools/get-run-plan.js";
28
- import { handleListRunPlans } from "../tools/list-run-plans.js";
29
- import { handleRerunRunPlan } from "../tools/rerun-run-plan.js";
30
- import { handleRunPlan } from "../tools/run-plan.js";
31
-
32
- const mockListRunPlans = vi.mocked(listRunPlans);
33
- const mockGetRunPlan = vi.mocked(getRunPlan);
34
- const mockRunRunPlan = vi.mocked(runRunPlan);
35
- const mockRerunRunPlan = vi.mocked(rerunRunPlan);
36
- const mockArchiveRunPlan = vi.mocked(archiveRunPlan);
37
-
38
- const samplePlan: RunPlan = {
39
- id: "plan_abc123",
40
- name: "Regression Plan",
41
- slug: "regression-plan",
42
- scope: { mode: "labels", labels: ["auth", "checkout"] },
43
- scenarioIds: ["scen_abc123"],
44
- targets: [{ type: "http", referenceId: "agent_abc" }],
45
- repeatCount: 3,
46
- simulatorModel: "openai/gpt-5-mini",
47
- judgeModel: "openai/gpt-5-mini",
48
- labels: ["nightly"],
49
- archivedAt: null,
50
- createdAt: "2024-01-01T00:00:00Z",
51
- updatedAt: "2024-01-02T00:00:00Z",
52
- platformUrl: "https://app.langwatch.ai/proj/agent-testing/results/regression-plan",
53
- };
54
-
55
- const sampleRun: RunPlanRunResult = {
56
- scheduled: true,
57
- batchRunId: "batch_123",
58
- setId: "set_456",
59
- jobCount: 6,
60
- skippedArchived: { scenarios: [], targets: [] },
61
- items: [],
62
- runPlanId: "plan_abc123",
63
- planName: "Regression Plan",
64
- created: true,
65
- platformUrl: "https://app.langwatch.ai/proj/agent-testing/results/regression-plan",
66
- };
67
-
68
- const runInput = {
69
- scope: { mode: "labels" as const, labels: ["auth"] },
70
- targets: [{ type: "http" as const, referenceId: "agent_abc" }],
71
- };
72
-
73
- beforeEach(() => {
74
- vi.clearAllMocks();
75
- });
76
-
77
- describe("handleRunPlan()", () => {
78
- describe("when the name no plan carries yet", () => {
79
- let result: string;
80
-
81
- beforeEach(async () => {
82
- mockRunRunPlan.mockResolvedValue({ ...sampleRun, created: true });
83
- result = await handleRunPlan({ name: "Regression Plan", ...runInput });
84
- });
85
-
86
- /** @scenario "Agent runs a name that no plan carries yet" */
87
- it("says the plan was created and started", () => {
88
- expect(result).toContain(
89
- 'Run plan "Regression Plan" created and started.',
90
- );
91
- });
92
-
93
- /** @scenario "Agent reads the batch a run started" */
94
- it("names the plan, the batch and the job count", () => {
95
- expect(result).toContain("**Plan**: Regression Plan (plan_abc123)");
96
- expect(result).toContain("**Batch Run ID**: batch_123");
97
- expect(result).toContain("**Jobs**: 6");
98
- });
99
-
100
- it("includes the platform URL of the batch", () => {
101
- expect(result).toContain(
102
- "**View**: https://app.langwatch.ai/proj/agent-testing/results/regression-plan",
103
- );
104
- });
105
-
106
- it("sends the configuration under config and the note beside it", async () => {
107
- await handleRunPlan({
108
- name: "Regression Plan",
109
- ...runInput,
110
- repeatCount: 2,
111
- note: "nightly regression",
112
- });
113
-
114
- expect(mockRunRunPlan).toHaveBeenLastCalledWith({
115
- name: "Regression Plan",
116
- config: {
117
- scope: { mode: "labels", labels: ["auth"] },
118
- targets: [{ type: "http", referenceId: "agent_abc" }],
119
- repeatCount: 2,
120
- simulatorModel: undefined,
121
- judgeModel: undefined,
122
- scenarioIds: undefined,
123
- },
124
- idempotencyKey: undefined,
125
- parameters: undefined,
126
- note: "nightly regression",
127
- });
128
- });
129
- });
130
-
131
- describe("when a plan already carries the name", () => {
132
- /** @scenario "Agent runs a name an existing plan carries" */
133
- it("says the plan ran with the configuration of this run", async () => {
134
- mockRunRunPlan.mockResolvedValue({ ...sampleRun, created: false });
135
-
136
- const result = await handleRunPlan({
137
- name: "Regression Plan",
138
- ...runInput,
139
- });
140
-
141
- expect(result).toContain(
142
- 'Run plan "Regression Plan" started with the configuration of this run.',
143
- );
144
- });
145
- });
146
-
147
- describe("when two targets name the same agent with different parameters", () => {
148
- /** @scenario "Agent compares one agent on two models in one run" */
149
- it("sends both targets, each carrying its own runParameters", async () => {
150
- await handleRunPlan({
151
- scope: { mode: "labels", labels: ["auth"] },
152
- targets: [
153
- {
154
- type: "http",
155
- referenceId: "agent_abc",
156
- parameters: { model: "gpt-5" },
157
- },
158
- {
159
- type: "http",
160
- referenceId: "agent_abc",
161
- parameters: { model: "gpt-5-mini" },
162
- },
163
- ],
164
- });
165
-
166
- expect(mockRunRunPlan).toHaveBeenLastCalledWith(
167
- expect.objectContaining({
168
- config: expect.objectContaining({
169
- targets: [
170
- {
171
- type: "http",
172
- referenceId: "agent_abc",
173
- runParameters: { model: "gpt-5" },
174
- },
175
- {
176
- type: "http",
177
- referenceId: "agent_abc",
178
- runParameters: { model: "gpt-5-mini" },
179
- },
180
- ],
181
- }),
182
- }),
183
- );
184
- });
185
-
186
- /** @scenario "Agent compares one agent on two models in one run" */
187
- it("keeps the run-level parameters, which a target overrides for itself", async () => {
188
- await handleRunPlan({
189
- ...runInput,
190
- targets: [
191
- {
192
- type: "http",
193
- referenceId: "agent_abc",
194
- parameters: { model: "gpt-5" },
195
- },
196
- ],
197
- parameters: { model: "gpt-5-mini", account_tier: "gold" },
198
- });
199
-
200
- expect(mockRunRunPlan).toHaveBeenLastCalledWith(
201
- expect.objectContaining({
202
- parameters: { model: "gpt-5-mini", account_tier: "gold" },
203
- config: expect.objectContaining({
204
- targets: [
205
- {
206
- type: "http",
207
- referenceId: "agent_abc",
208
- runParameters: { model: "gpt-5" },
209
- },
210
- ],
211
- }),
212
- }),
213
- );
214
- });
215
-
216
- it("leaves runParameters out of a target that names none", async () => {
217
- await handleRunPlan(runInput);
218
-
219
- expect(mockRunRunPlan).toHaveBeenLastCalledWith(
220
- expect.objectContaining({
221
- config: expect.objectContaining({
222
- targets: [{ type: "http", referenceId: "agent_abc" }],
223
- }),
224
- }),
225
- );
226
- });
227
- });
228
-
229
- describe("when the run skipped archived rows", () => {
230
- /** @scenario "A run reports what it skipped as archived" */
231
- it("lists the skipped scenarios and the skipped targets", async () => {
232
- mockRunRunPlan.mockResolvedValue({
233
- ...sampleRun,
234
- skippedArchived: {
235
- scenarios: ["scen_gone"],
236
- targets: ["agent_gone"],
237
- },
238
- });
239
-
240
- const result = await handleRunPlan(runInput);
241
-
242
- expect(result).toContain("**Skipped archived scenarios**: scen_gone");
243
- expect(result).toContain("**Skipped archived targets**: agent_gone");
244
- });
245
- });
246
- });
247
-
248
- describe("handleListRunPlans()", () => {
249
- describe("when run plans exist", () => {
250
- let result: string;
251
-
252
- beforeEach(async () => {
253
- mockListRunPlans.mockResolvedValue([samplePlan]);
254
- result = await handleListRunPlans({});
255
- });
256
-
257
- /** @scenario "Agent lists the run plans of a project" */
258
- it("lists each plan with what it covers", () => {
259
- expect(result).toContain("# Run Plans (1 total)");
260
- expect(result).toContain("## Regression Plan");
261
- expect(result).toContain("**Covers**: labels: auth, checkout");
262
- });
263
-
264
- it("includes the targets and the repeat count", () => {
265
- expect(result).toContain("**Targets**: 1 (http:agent_abc)");
266
- expect(result).toContain("**Repeat**: 3x");
267
- });
268
-
269
- it("asks the API for non-archived plans by default", () => {
270
- expect(mockListRunPlans).toHaveBeenCalledWith({
271
- includeArchived: undefined,
272
- });
273
- });
274
- });
275
-
276
- describe("when includeArchived is set", () => {
277
- it("marks an archived plan as archived", async () => {
278
- mockListRunPlans.mockResolvedValue([
279
- { ...samplePlan, archivedAt: "2024-02-01T00:00:00Z" },
280
- ]);
281
-
282
- const result = await handleListRunPlans({ includeArchived: true });
283
-
284
- expect(result).toContain("## Regression Plan (archived)");
285
- expect(mockListRunPlans).toHaveBeenCalledWith({ includeArchived: true });
286
- });
287
- });
288
-
289
- describe("when no run plans exist", () => {
290
- let result: string;
291
-
292
- beforeEach(async () => {
293
- mockListRunPlans.mockResolvedValue([]);
294
- result = await handleListRunPlans({});
295
- });
296
-
297
- /** @scenario "Agent lists run plans when none exist" */
298
- it("returns a no-plans message", () => {
299
- expect(result).toContain("No run plans found");
300
- });
301
-
302
- it("includes a tip to use platform_run_plan", () => {
303
- expect(result).toContain("platform_run_plan");
304
- });
305
- });
306
-
307
- describe("when format is json", () => {
308
- it("returns valid parseable JSON matching the plan structure", async () => {
309
- mockListRunPlans.mockResolvedValue([samplePlan]);
310
-
311
- const result = await handleListRunPlans({ format: "json" });
312
-
313
- expect(JSON.parse(result)).toEqual([samplePlan]);
314
- });
315
- });
316
- });
317
-
318
- describe("handleGetRunPlan()", () => {
319
- describe("when the plan names labels, targets and models", () => {
320
- let result: string;
321
-
322
- beforeEach(async () => {
323
- mockGetRunPlan.mockResolvedValue(samplePlan);
324
- result = await handleGetRunPlan({ id: "plan_abc123" });
325
- });
326
-
327
- /** @scenario "Agent reads the full configuration of a run plan" */
328
- it("includes the scope, the targets, the repeat count and the models", () => {
329
- expect(result).toContain("**Covers**: labels: auth, checkout");
330
- expect(result).toContain("- http:agent_abc");
331
- expect(result).toContain("**Repeat**: 3x");
332
- expect(result).toContain("**Simulator model**: openai/gpt-5-mini");
333
- expect(result).toContain("**Judge model**: openai/gpt-5-mini");
334
- });
335
-
336
- it("includes the plan name in the heading", () => {
337
- expect(result).toContain("# Run Plan: Regression Plan");
338
- });
339
- });
340
-
341
- describe("when a plan compares one agent on two models", () => {
342
- /** @scenario "Agent reads the full configuration of a run plan" */
343
- it("reads the two targets apart by the parameters each one runs with", async () => {
344
- mockGetRunPlan.mockResolvedValue({
345
- ...samplePlan,
346
- targets: [
347
- {
348
- type: "http",
349
- referenceId: "agent_abc",
350
- runParameters: { model: "gpt-5" },
351
- },
352
- {
353
- type: "http",
354
- referenceId: "agent_abc",
355
- runParameters: { model: "gpt-5-mini" },
356
- },
357
- ],
358
- });
359
-
360
- const result = await handleGetRunPlan({ id: "plan_abc123" });
361
-
362
- expect(result).toContain("- http:agent_abc (model=gpt-5)");
363
- expect(result).toContain("- http:agent_abc (model=gpt-5-mini)");
364
- });
365
- });
366
-
367
- describe("when the scope names test suites", () => {
368
- /** @scenario "Agent reads a plan that runs the scenarios of a test suite" */
369
- it("says the plan covers the scenarios of those test suites", async () => {
370
- mockGetRunPlan.mockResolvedValue({
371
- ...samplePlan,
372
- scope: { mode: "test_suites", testSuiteIds: ["suite_a", "suite_b"] },
373
- });
374
-
375
- const result = await handleGetRunPlan({ id: "plan_abc123" });
376
-
377
- expect(result).toContain("**Covers**: test suites: suite_a, suite_b");
378
- });
379
- });
380
-
381
- describe("when the plan names no models", () => {
382
- /** @scenario "Agent reads a plan that names its own models" */
383
- it("says both models are the project default", async () => {
384
- mockGetRunPlan.mockResolvedValue({
385
- ...samplePlan,
386
- simulatorModel: null,
387
- judgeModel: null,
388
- });
389
-
390
- const result = await handleGetRunPlan({ id: "plan_abc123" });
391
-
392
- expect(result).toContain("**Simulator model**: project default");
393
- expect(result).toContain("**Judge model**: project default");
394
- });
395
- });
396
-
397
- describe("when the plan carries no scope", () => {
398
- it("reads as the hand-picked scenario list it already held", async () => {
399
- mockGetRunPlan.mockResolvedValue({ ...samplePlan, scope: null });
400
-
401
- const result = await handleGetRunPlan({ id: "plan_abc123" });
402
-
403
- expect(result).toContain("**Covers**: hand-picked scenarios (1)");
404
- });
405
- });
406
-
407
- describe("when format is json", () => {
408
- it("returns valid parseable JSON matching the plan structure", async () => {
409
- mockGetRunPlan.mockResolvedValue(samplePlan);
410
-
411
- const result = await handleGetRunPlan({
412
- id: "plan_abc123",
413
- format: "json",
414
- });
415
-
416
- expect(JSON.parse(result)).toEqual(samplePlan);
417
- });
418
- });
419
- });
420
-
421
- describe("handleRerunRunPlan()", () => {
422
- describe("when the plan is run again", () => {
423
- let result: string;
424
-
425
- beforeEach(async () => {
426
- mockRerunRunPlan.mockResolvedValue({ ...sampleRun, created: false });
427
- result = await handleRerunRunPlan({
428
- id: "plan_abc123",
429
- note: "after the retry fix",
430
- });
431
- });
432
-
433
- /** @scenario "Agent runs a plan again with the configuration it holds" */
434
- it("says the plan ran with the configuration of this run", () => {
435
- expect(result).toContain(
436
- 'Run plan "Regression Plan" started with the configuration of this run.',
437
- );
438
- });
439
-
440
- it("includes the batch run id", () => {
441
- expect(result).toContain("**Batch Run ID**: batch_123");
442
- });
443
-
444
- it("sends only the parameters and the note", () => {
445
- expect(mockRerunRunPlan).toHaveBeenCalledWith("plan_abc123", {
446
- parameters: undefined,
447
- note: "after the retry fix",
448
- });
449
- });
450
- });
451
- });
452
-
453
- describe("handleArchiveRunPlan()", () => {
454
- describe("when the plan is archived", () => {
455
- let result: string;
456
-
457
- beforeEach(async () => {
458
- mockArchiveRunPlan.mockResolvedValue({
459
- id: "plan_abc123",
460
- archived: true,
461
- });
462
- result = await handleArchiveRunPlan({ id: "plan_abc123" });
463
- });
464
-
465
- /** @scenario "Agent archives a run plan" */
466
- it("confirms the plan is archived", () => {
467
- expect(result).toContain("Run plan plan_abc123 is archived");
468
- });
469
-
470
- it("says the past runs stay readable", () => {
471
- expect(result).toContain("past runs stay readable");
472
- });
473
- });
474
- });
475
-
476
- describe("handleRunPlan()", () => {
477
- describe("when the plan carries its own evaluators", () => {
478
- /** @scenario "Agent runs a plan with its own evaluators" */
479
- it("sends the attachments inside the configuration, with an id and a gate settled", async () => {
480
- mockRunRunPlan.mockResolvedValue({
481
- scheduled: true,
482
- batchRunId: "batch_1",
483
- setId: "set_1",
484
- jobCount: 1,
485
- skippedArchived: { scenarios: [], targets: [] },
486
- items: [],
487
- runPlanId: "plan_1",
488
- planName: "Nightly",
489
- created: true,
490
- platformUrl: "https://app.langwatch.ai/proj/agent-testing/results/nightly",
491
- });
492
-
493
- await handleRunPlan({
494
- scope: { mode: "all" },
495
- targets: [{ type: "http", referenceId: "agent_abc" }],
496
- evaluators: [
497
- {
498
- evaluatorId: "evaluator_pii",
499
- required: false,
500
- mappings: {
501
- input: { type: "source", sourceId: "conversation", path: ["transcript"] },
502
- },
503
- },
504
- ],
505
- });
506
-
507
- expect(mockRunRunPlan).toHaveBeenLastCalledWith(
508
- expect.objectContaining({
509
- config: expect.objectContaining({
510
- evaluators: [
511
- {
512
- id: expect.stringMatching(/^att_/),
513
- evaluatorId: "evaluator_pii",
514
- required: false,
515
- mappings: {
516
- input: { type: "source", sourceId: "conversation", path: ["transcript"] },
517
- },
518
- },
519
- ],
520
- }),
521
- }),
522
- );
523
- });
524
- });
525
- });
526
-
527
- describe("handleGetRunPlan()", () => {
528
- describe("when the plan carries evaluators", () => {
529
- /** @scenario "Agent reads a run plan that carries evaluators" */
530
- it("lists each evaluator with its gate and its mappings", async () => {
531
- mockGetRunPlan.mockResolvedValue({
532
- id: "plan_1",
533
- name: "Nightly",
534
- slug: "nightly",
535
- scope: { mode: "all" },
536
- scenarioIds: [],
537
- targets: [{ type: "http", referenceId: "agent_abc" }],
538
- repeatCount: 1,
539
- simulatorModel: null,
540
- judgeModel: null,
541
- labels: [],
542
- archivedAt: null,
543
- createdAt: "2026-01-01T00:00:00Z",
544
- updatedAt: "2026-01-02T00:00:00Z",
545
- platformUrl: "https://app.langwatch.ai/proj/agent-testing/results/nightly",
546
- evaluators: [
547
- {
548
- id: "att_pii",
549
- evaluatorId: "evaluator_pii",
550
- required: false,
551
- mappings: {
552
- input: { type: "source", sourceId: "conversation", path: ["transcript"] },
553
- },
554
- },
555
- ],
556
- });
557
-
558
- const result = await handleGetRunPlan({ id: "plan_1" });
559
-
560
- expect(result).toContain("## Evaluators");
561
- expect(result).toContain("evaluator_pii (reports only, attachment att_pii)");
562
- expect(result).toContain("input: conversation.transcript");
563
- });
564
- });
565
- });