@langwatch/mcp-server 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/.gitignore +7 -0
  2. package/.npmignore +41 -0
  3. package/CHANGELOG.md +192 -201
  4. package/CONTRIBUTING.md +10 -0
  5. package/README.md +70 -68
  6. package/dist/add-dashboard-widget-4ZC5UN73.js +50 -0
  7. package/dist/add-dashboard-widget-ACC6QYBG.js +49 -0
  8. package/dist/archive-project-KWFM3I5Z.js +19 -0
  9. package/dist/{archive-project-W3IKI7UL.js → archive-project-SPVHXK6A.js} +4 -4
  10. package/dist/{archive-run-plan-474OKHHU.js → archive-run-plan-65QN3XRX.js} +4 -4
  11. package/dist/archive-run-plan-Z4SYE6BP.js +15 -0
  12. package/dist/{archive-scenario-V5UNYK26.js → archive-scenario-A6QV5LOW.js} +4 -4
  13. package/dist/archive-scenario-FXEYQNEH.js +19 -0
  14. package/dist/archive-test-suite-5ADQ3KPQ.js +15 -0
  15. package/dist/{archive-test-suite-O7FLDMXK.js → archive-test-suite-NKZDZY3D.js} +4 -4
  16. package/dist/assign-prompt-tag-5IUZXJ2T.js +23 -0
  17. package/dist/{assign-prompt-tag-Q46WRB6P.js → assign-prompt-tag-HBZLBIFD.js} +8 -4
  18. package/dist/{chunk-OJLYYJWI.js → chunk-3OCG3QPU.js} +7 -10
  19. package/dist/chunk-3YLN3ATJ.js +241 -0
  20. package/dist/chunk-5FNCQRCX.js +91 -0
  21. package/dist/{chunk-UF6XIGYR.js → chunk-6YZUOD34.js} +2 -5
  22. package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
  23. package/dist/chunk-7VNSRCXO.js +129 -0
  24. package/dist/{chunk-G4ZAZTZW.js → chunk-B4J3PJLX.js} +11 -10
  25. package/dist/{chunk-ZXKLPC2E.js → chunk-BIIKE3EI.js} +1 -1
  26. package/dist/{chunk-37SMPMQS.js → chunk-DMM3JQ42.js} +7 -2
  27. package/dist/{chunk-NUFPTHKU.js → chunk-FOKVY3BK.js} +1 -1
  28. package/dist/{chunk-WT4PO4A3.js → chunk-H6WGMG2T.js} +10 -7
  29. package/dist/{chunk-EYXMLE5X.js → chunk-HGELNIVY.js} +56 -47
  30. package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
  31. package/dist/{chunk-RVAE2MEA.js → chunk-I7ATIZED.js} +7 -7
  32. package/dist/{chunk-S4GVX36W.js → chunk-ILZDO25L.js} +7 -10
  33. package/dist/{chunk-QRO35SOM.js → chunk-J7PQKBLD.js} +652 -528
  34. package/dist/{chunk-SR6QPRIE.js → chunk-JRJPH75H.js} +7 -13
  35. package/dist/chunk-K2I7Z3LZ.js +28 -0
  36. package/dist/{chunk-UFOYFYI7.js → chunk-NKMTIHIJ.js} +6 -9
  37. package/dist/{chunk-HV4DWKBI.js → chunk-O7EMWEVJ.js} +2 -4
  38. package/dist/{chunk-56OGTS24.js → chunk-PTDR56Z3.js} +4 -11
  39. package/dist/{chunk-JR6DJZOU.js → chunk-RABYBFX5.js} +4 -10
  40. package/dist/chunk-SUPUUC4W.js +64 -0
  41. package/dist/{chunk-JTQJRNFJ.js → chunk-SXFC3FNH.js} +4 -4
  42. package/dist/{chunk-CKNAH5TG.js → chunk-U24EACC4.js} +3 -10
  43. package/dist/chunk-UNJM3BIL.js +21 -0
  44. package/dist/{chunk-QAMP3CGR.js → chunk-UTJCWXPZ.js} +4 -4
  45. package/dist/chunk-UWLE5T2F.js +312 -0
  46. package/dist/{chunk-6DJDEXET.js → chunk-VMWJD732.js} +6 -12
  47. package/dist/{chunk-7E4FZIYJ.js → chunk-XUIJYNRJ.js} +1 -1
  48. package/dist/chunk-Y34DHR5K.js +67 -0
  49. package/dist/chunk-YCARO42Z.js +516 -0
  50. package/dist/config-EAKW6F26.js +16 -0
  51. package/dist/config.cjs +109 -0
  52. package/dist/config.js +5 -4
  53. package/dist/{create-agent-JFJ2K6X3.js → create-agent-AYZ3LB3V.js} +4 -4
  54. package/dist/create-agent-S5ZBCEFT.js +23 -0
  55. package/dist/create-annotation-LHNCLHYP.js +29 -0
  56. package/dist/{create-annotation-EUXXQ6NS.js → create-annotation-VUSXULQK.js} +10 -5
  57. package/dist/{create-api-key-BGBB76JX.js → create-api-key-NNYKARMG.js} +5 -7
  58. package/dist/create-api-key-T4KSNPKB.js +24 -0
  59. package/dist/create-dashboard-DHVFMEU4.js +18 -0
  60. package/dist/{create-dashboard-Z76AIPLS.js → create-dashboard-WTKKS5Z6.js} +4 -4
  61. package/dist/{create-dataset-FD5VAXU4.js → create-dataset-2MC4SD4O.js} +6 -6
  62. package/dist/create-dataset-LUP5PVDM.js +22 -0
  63. package/dist/create-dataset-records-NSKBZP3G.js +20 -0
  64. package/dist/{create-dataset-records-WQUXXOHI.js → create-dataset-records-W4GLN2FV.js} +5 -7
  65. package/dist/{create-evaluator-6NV33Z52.js → create-evaluator-643G6LXL.js} +4 -4
  66. package/dist/create-evaluator-HMTYO5SS.js +27 -0
  67. package/dist/create-mcp-server.cjs +9513 -0
  68. package/dist/create-mcp-server.js +2647 -10
  69. package/dist/create-project-6N7PIYRY.js +44 -0
  70. package/dist/{create-project-ZQ7TFIO2.js → create-project-KAIC46UY.js} +4 -4
  71. package/dist/{create-prompt-BS6QRCUU.js → create-prompt-E67LXIYT.js} +5 -7
  72. package/dist/create-prompt-PKJ7EDRR.js +37 -0
  73. package/dist/create-prompt-tag-4YO3FSJ3.js +17 -0
  74. package/dist/{create-prompt-tag-FCQ5ELSQ.js → create-prompt-tag-OPQUEXWB.js} +3 -3
  75. package/dist/create-scenario-5PJBMAXO.js +33 -0
  76. package/dist/{create-scenario-DRPTPXU3.js → create-scenario-UEM77OE7.js} +5 -5
  77. package/dist/{create-test-suite-ZIZCCFJ4.js → create-test-suite-4IPXVSFQ.js} +6 -6
  78. package/dist/create-test-suite-SZEPVXSE.js +36 -0
  79. package/dist/create-trigger-5HZSCRAN.js +49 -0
  80. package/dist/create-trigger-PRELMT6J.js +48 -0
  81. package/dist/delete-agent-JUIZWAXG.js +18 -0
  82. package/dist/{delete-agent-SA4JMUZF.js → delete-agent-QMEK3XHK.js} +4 -4
  83. package/dist/delete-annotation-HY3O2OGR.js +17 -0
  84. package/dist/{delete-annotation-X3KKK7QY.js → delete-annotation-VKIQWUYW.js} +4 -4
  85. package/dist/delete-dashboard-76N66XXL.js +18 -0
  86. package/dist/{delete-dashboard-LYMRPF27.js → delete-dashboard-JVIVHNJM.js} +4 -4
  87. package/dist/delete-dataset-HQCR66MG.js +18 -0
  88. package/dist/{delete-dataset-W6EZ44HY.js → delete-dataset-WKRUW4FP.js} +5 -7
  89. package/dist/{delete-dataset-records-7CNOTALB.js → delete-dataset-records-C2IQFFVQ.js} +5 -7
  90. package/dist/delete-dataset-records-SDUHQLLM.js +19 -0
  91. package/dist/delete-evaluator-4SNSCLEE.js +16 -0
  92. package/dist/delete-evaluator-QP3QHTLN.js +15 -0
  93. package/dist/delete-prompt-tag-NZ4JQMYG.js +17 -0
  94. package/dist/{delete-prompt-tag-QB3OCZUV.js → delete-prompt-tag-YYQ4VMAD.js} +3 -3
  95. package/dist/{delete-workflow-NG2VXYYM.js → delete-workflow-5J46T73T.js} +4 -4
  96. package/dist/delete-workflow-JSWABL5F.js +17 -0
  97. package/dist/discover-evaluator-schema-UHWA5HVL.js +120 -0
  98. package/dist/discover-evaluator-schema-XKCLLCB3.js +118 -0
  99. package/dist/discover-scenario-schema-NOJY6S7E.js +137 -0
  100. package/dist/{discover-scenario-schema-W7KBXA4J.js → discover-scenario-schema-OOFIQKOG.js} +37 -17
  101. package/dist/{discover-schema-L6QDPON3.js → discover-schema-55YJBFGQ.js} +181 -186
  102. package/dist/discover-schema-A33SLMXW.js +442 -0
  103. package/dist/get-agent-LJQX7OF4.js +69 -0
  104. package/dist/{get-agent-7THF7HCU.js → get-agent-OTIYUFZA.js} +15 -11
  105. package/dist/get-analytics-DCS72353.js +80 -0
  106. package/dist/get-analytics-IQZKJHLW.js +79 -0
  107. package/dist/get-dashboard-5NYJEIX2.js +29 -0
  108. package/dist/{get-dashboard-P4WWVHFU.js → get-dashboard-QMTYDQAZ.js} +4 -4
  109. package/dist/get-dataset-ALSP7RTX.js +64 -0
  110. package/dist/get-dataset-X4B5JDG2.js +63 -0
  111. package/dist/{get-evaluator-RZ44UIN6.js → get-evaluator-ISMC4LLI.js} +4 -4
  112. package/dist/get-evaluator-XEUZGZCH.js +47 -0
  113. package/dist/{get-project-QSQEAB33.js → get-project-5VKROSDH.js} +4 -4
  114. package/dist/get-project-RM6FRCBK.js +26 -0
  115. package/dist/{get-prompt-GVKXF5NL.js → get-prompt-OWXJZHQQ.js} +53 -58
  116. package/dist/get-prompt-W52DY36E.js +94 -0
  117. package/dist/{get-run-plan-NY7J5GRE.js → get-run-plan-BE3M2AUX.js} +7 -9
  118. package/dist/get-run-plan-RUXQ6PAX.js +58 -0
  119. package/dist/get-scenario-RNM7BAX2.js +37 -0
  120. package/dist/{get-scenario-Q3LLQE4T.js → get-scenario-YM4ODWW6.js} +5 -5
  121. package/dist/get-simulation-run-6GIATQE5.js +69 -0
  122. package/dist/{get-simulation-run-WINEYDMK.js → get-simulation-run-LCFSMPGQ.js} +26 -22
  123. package/dist/{get-test-suite-4HKA7OKS.js → get-test-suite-GC2O7YH6.js} +5 -5
  124. package/dist/get-test-suite-P5LJ6VLF.js +48 -0
  125. package/dist/get-trace-KBRVV4NN.js +45 -0
  126. package/dist/{get-trace-RCUV7N4O.js → get-trace-SEF3FMR5.js} +11 -13
  127. package/dist/get-workflow-7PVED7JE.js +25 -0
  128. package/dist/{get-workflow-EEOC7Y45.js → get-workflow-YXULW4GC.js} +4 -4
  129. package/dist/{http-security-EU3CHTY7.js → http-security-DNLBNQZL.js} +2 -2
  130. package/dist/{http-server-WCDUARTH.js → http-server-IR4QOS43.js} +4071 -347
  131. package/dist/index.js +58671 -37983
  132. package/dist/langwatch-api-annotations-6SA4OB4C.js +17 -0
  133. package/dist/{langwatch-api-annotations-6DHVZWUK.js → langwatch-api-annotations-TBHLCQ5R.js} +4 -4
  134. package/dist/langwatch-api-dashboards-6EO2VVZW.js +17 -0
  135. package/dist/{langwatch-api-dashboards-2KJL2M42.js → langwatch-api-dashboards-NHU5BZD7.js} +4 -4
  136. package/dist/langwatch-api-monitors-CBF3FGIM.js +47 -0
  137. package/dist/{langwatch-api-monitors-6ISFJ7WX.js → langwatch-api-monitors-YNWA2M5Y.js} +11 -16
  138. package/dist/langwatch-api-secrets-ADTOJELP.js +56 -0
  139. package/dist/langwatch-api-secrets-RNFO4LF2.js +55 -0
  140. package/dist/langwatch-api-triggers-KQDQC6L5.js +22 -0
  141. package/dist/langwatch-api-triggers-QS7HDIVW.js +23 -0
  142. package/dist/{langwatch-api-workflows-6UJL5U4Z.js → langwatch-api-workflows-OKC4FXIF.js} +4 -4
  143. package/dist/langwatch-api-workflows-XGJE6SR5.js +15 -0
  144. package/dist/{list-agents-AMVDQPQL.js → list-agents-HVYWEQMI.js} +4 -4
  145. package/dist/list-agents-RBAOCF53.js +42 -0
  146. package/dist/list-annotations-HJH4NBLD.js +38 -0
  147. package/dist/{list-annotations-6PR5NLIC.js → list-annotations-J4UAHSUN.js} +10 -5
  148. package/dist/{list-api-keys-GVPNBIHQ.js → list-api-keys-7UTJRZDG.js} +10 -5
  149. package/dist/list-api-keys-A2PMV435.js +42 -0
  150. package/dist/list-dashboard-boards-OPWROHMG.js +33 -0
  151. package/dist/list-dashboard-boards-U2GJ7GC5.js +34 -0
  152. package/dist/{list-dashboards-Z3BZKDGF.js → list-dashboards-ROSYFLDQ.js} +4 -4
  153. package/dist/list-dashboards-RQ635ZU7.js +32 -0
  154. package/dist/{list-dataset-records-O67HZ35Y.js → list-dataset-records-M5TKA6LK.js} +14 -10
  155. package/dist/list-dataset-records-WFM7F33C.js +43 -0
  156. package/dist/{list-datasets-WXZL6UMP.js → list-datasets-B5X4P7BQ.js} +9 -13
  157. package/dist/list-datasets-THUKQHPX.js +56 -0
  158. package/dist/{list-evaluators-PAX72WCN.js → list-evaluators-MYH2OVCI.js} +5 -7
  159. package/dist/list-evaluators-NLVWF6K7.js +32 -0
  160. package/dist/{list-model-providers-VVLZMLCX.js → list-model-providers-3JUGP4YI.js} +4 -4
  161. package/dist/list-model-providers-H3XKORFO.js +35 -0
  162. package/dist/{list-projects-AQVI6SUK.js → list-projects-6EJ5YYEW.js} +5 -7
  163. package/dist/list-projects-YNNSRMLC.js +40 -0
  164. package/dist/{list-prompt-tags-WZFBJOHG.js → list-prompt-tags-NVFQO6WX.js} +3 -3
  165. package/dist/list-prompt-tags-XUQTTAH4.js +23 -0
  166. package/dist/{list-prompts-BQOHRHYT.js → list-prompts-HSIMMHTF.js} +4 -6
  167. package/dist/list-prompts-IRI6AIXO.js +30 -0
  168. package/dist/{list-run-plans-UBAU2DGH.js → list-run-plans-PX2XI6EK.js} +5 -5
  169. package/dist/list-run-plans-QALLCN2K.js +45 -0
  170. package/dist/{list-scenarios-MS4IUIVM.js → list-scenarios-QZRPVHS4.js} +13 -11
  171. package/dist/list-scenarios-SSJQEMJP.js +45 -0
  172. package/dist/list-simulation-runs-KNOLGMDV.js +53 -0
  173. package/dist/{list-simulation-runs-D6YF4ZOU.js → list-simulation-runs-OEADLLQR.js} +12 -8
  174. package/dist/list-test-suites-ANAQBLDG.js +34 -0
  175. package/dist/{list-test-suites-L7R2O6DR.js → list-test-suites-N4WVLBKK.js} +4 -4
  176. package/dist/list-trigger-fires-JV3WFYYG.js +19 -0
  177. package/dist/list-trigger-fires-WTW4DVIW.js +20 -0
  178. package/dist/list-triggers-SQNIG35Q.js +45 -0
  179. package/dist/list-triggers-V4Y356AK.js +46 -0
  180. package/dist/{list-workflows-6MV4XJHF.js → list-workflows-IMSX7SXU.js} +5 -7
  181. package/dist/list-workflows-ZHTX5LCL.js +33 -0
  182. package/dist/{rename-prompt-tag-K5LQ4CY6.js → rename-prompt-tag-IQI7MHOI.js} +3 -3
  183. package/dist/rename-prompt-tag-PA2BRIE6.js +18 -0
  184. package/dist/{rename-test-suite-NTYHAO5X.js → rename-test-suite-4J7UX5S2.js} +4 -4
  185. package/dist/rename-test-suite-NNVLMLKY.js +20 -0
  186. package/dist/report-issue-AS34ZMJF.js +898 -0
  187. package/dist/{report-issue-RHZZ33IS.js → report-issue-DCZFLGDO.js} +81 -67
  188. package/dist/{rerun-run-plan-MUDWJBE4.js → rerun-run-plan-TG2V4WM4.js} +5 -5
  189. package/dist/rerun-run-plan-ZI5OY3VA.js +21 -0
  190. package/dist/revoke-api-key-3J3ZA4UB.js +15 -0
  191. package/dist/{revoke-api-key-6LAZ3QZZ.js → revoke-api-key-SFMEFWJC.js} +4 -4
  192. package/dist/run-agent-W4VJP72Z.js +75 -0
  193. package/dist/run-agent-YNV6ZHW4.js +74 -0
  194. package/dist/run-plan-6C77GWG4.js +38 -0
  195. package/dist/{run-plan-T4ZYOZGA.js → run-plan-PAARQSI4.js} +7 -7
  196. package/dist/run-query-KJDH544C.js +47 -0
  197. package/dist/run-query-T4QW2Z5O.js +46 -0
  198. package/dist/{run-test-suite-L4MZ7G4D.js → run-test-suite-SQJELEZX.js} +6 -6
  199. package/dist/run-test-suite-STB6NUJM.js +25 -0
  200. package/dist/{run-workflow-DFIS23AP.js → run-workflow-D6PQNBI6.js} +4 -4
  201. package/dist/run-workflow-SP32SO5M.js +36 -0
  202. package/dist/search-traces-HCBGOG6R.js +170 -0
  203. package/dist/search-traces-HSTQ6WTQ.js +171 -0
  204. package/dist/{set-model-provider-XRNMFOVR.js → set-model-provider-GF7NXUJA.js} +4 -4
  205. package/dist/set-model-provider-KDQ7C4EZ.js +33 -0
  206. package/dist/{update-agent-DUWNYBNA.js → update-agent-DWG43T2P.js} +4 -4
  207. package/dist/update-agent-MXNOBS4H.js +20 -0
  208. package/dist/update-dashboard-widget-CJKJLCDY.js +71 -0
  209. package/dist/update-dashboard-widget-CYQDS2NR.js +70 -0
  210. package/dist/update-dataset-DQH3OHOU.js +22 -0
  211. package/dist/{update-dataset-YSOMDCOB.js → update-dataset-SQZ6T4WX.js} +6 -6
  212. package/dist/{update-dataset-record-DEA2ITYR.js → update-dataset-record-3AT4IPBC.js} +4 -4
  213. package/dist/update-dataset-record-7PLDGTMR.js +19 -0
  214. package/dist/update-evaluator-4LFTKFPT.js +24 -0
  215. package/dist/{update-evaluator-NH7Q5GWV.js → update-evaluator-IGTX6PX4.js} +4 -4
  216. package/dist/{update-project-Q26FBSYH.js → update-project-PLJIOZS6.js} +4 -4
  217. package/dist/update-project-QVHSJRUP.js +24 -0
  218. package/dist/update-prompt-GDKRYJI3.js +140 -0
  219. package/dist/{update-prompt-ZQQ2C3KU.js → update-prompt-MY263DYF.js} +27 -29
  220. package/dist/update-scenario-7KA3JDXA.js +34 -0
  221. package/dist/{update-scenario-WUX34JAR.js → update-scenario-MOHRQKAQ.js} +5 -5
  222. package/package.json +35 -39
  223. package/pyproject.toml +8 -8
  224. package/src/config.d.ts +4 -0
  225. package/src/config.ts +20 -29
  226. package/src/create-mcp-server.ts +755 -609
  227. package/src/documentation-fetch.ts +21 -20
  228. package/src/http-security.ts +166 -135
  229. package/src/http-server.ts +189 -224
  230. package/src/index.ts +14 -16
  231. package/src/langwatch-api-agents.ts +18 -21
  232. package/src/langwatch-api-annotations.ts +11 -12
  233. package/src/langwatch-api-api-keys.ts +8 -9
  234. package/src/langwatch-api-boards.ts +46 -0
  235. package/src/langwatch-api-dashboard-widgets.ts +112 -0
  236. package/src/langwatch-api-dashboards.ts +13 -10
  237. package/src/langwatch-api-datasets.ts +98 -32
  238. package/src/langwatch-api-evaluators.ts +13 -19
  239. package/src/langwatch-api-model-providers.ts +4 -4
  240. package/src/langwatch-api-monitors.ts +14 -18
  241. package/src/langwatch-api-projects.ts +27 -9
  242. package/src/langwatch-api-query.ts +114 -0
  243. package/src/langwatch-api-run-plans.ts +12 -29
  244. package/src/langwatch-api-scenarios.ts +9 -11
  245. package/src/langwatch-api-secrets.ts +31 -24
  246. package/src/langwatch-api-simulation-runs.ts +6 -8
  247. package/src/langwatch-api-test-suites.ts +14 -33
  248. package/src/langwatch-api-triggers.ts +96 -34
  249. package/src/langwatch-api-workflows.ts +9 -9
  250. package/src/langwatch-api.ts +108 -124
  251. package/src/public-http-request.ts +21 -12
  252. package/src/schemas/analytics-metrics.ts +3 -15
  253. package/src/schemas/create-dataset.ts +3 -4
  254. package/src/schemas/run-plan.ts +13 -29
  255. package/src/schemas/suite-fields.ts +6 -23
  256. package/src/schemas/triggers.ts +365 -0
  257. package/src/tools/add-dashboard-widget.ts +63 -0
  258. package/src/tools/archive-project.ts +2 -4
  259. package/src/tools/archive-run-plan.ts +2 -4
  260. package/src/tools/archive-scenario.ts +2 -4
  261. package/src/tools/archive-test-suite.ts +2 -4
  262. package/src/tools/assign-prompt-tag.ts +6 -2
  263. package/src/tools/create-agent.ts +1 -1
  264. package/src/tools/create-annotation.ts +7 -2
  265. package/src/tools/create-api-key.ts +4 -6
  266. package/src/tools/create-dashboard.ts +1 -1
  267. package/src/tools/create-dataset-records.ts +4 -8
  268. package/src/tools/create-dataset.ts +5 -7
  269. package/src/tools/create-evaluator.ts +3 -5
  270. package/src/tools/create-project.ts +2 -2
  271. package/src/tools/create-prompt-tag.ts +2 -4
  272. package/src/tools/create-prompt.ts +9 -18
  273. package/src/tools/create-scenario.ts +5 -7
  274. package/src/tools/create-test-suite.ts +4 -9
  275. package/src/tools/create-trigger.ts +55 -0
  276. package/src/tools/dashboard-exists.ts +25 -0
  277. package/src/tools/dashboard-widget-queries.ts +32 -0
  278. package/src/tools/delete-agent.ts +1 -1
  279. package/src/tools/delete-annotation.ts +1 -1
  280. package/src/tools/delete-dashboard.ts +1 -1
  281. package/src/tools/delete-dataset-records.ts +4 -8
  282. package/src/tools/delete-dataset.ts +3 -7
  283. package/src/tools/delete-evaluator.ts +4 -6
  284. package/src/tools/delete-prompt-tag.ts +2 -4
  285. package/src/tools/delete-workflow.ts +1 -1
  286. package/src/tools/discover-evaluator-schema.ts +34 -25
  287. package/src/tools/discover-scenario-schema.ts +41 -21
  288. package/src/tools/discover-schema.ts +149 -27
  289. package/src/tools/experiment-run-status.ts +2 -8
  290. package/src/tools/format-dataset-mutation.ts +5 -10
  291. package/src/tools/format-run-plan.ts +7 -21
  292. package/src/tools/format-scenario.ts +2 -4
  293. package/src/tools/format-suite-details.ts +6 -12
  294. package/src/tools/get-agent.ts +15 -6
  295. package/src/tools/get-analytics.ts +52 -46
  296. package/src/tools/get-dashboard.ts +1 -1
  297. package/src/tools/get-dataset.ts +34 -16
  298. package/src/tools/get-evaluator.ts +4 -11
  299. package/src/tools/get-experiment-results.ts +219 -186
  300. package/src/tools/get-project.ts +2 -4
  301. package/src/tools/get-prompt.ts +63 -84
  302. package/src/tools/get-run-plan.ts +4 -6
  303. package/src/tools/get-scenario.ts +4 -6
  304. package/src/tools/get-simulation-run.ts +27 -24
  305. package/src/tools/get-test-suite.ts +2 -5
  306. package/src/tools/get-trace.ts +16 -17
  307. package/src/tools/get-workflow.ts +1 -1
  308. package/src/tools/list-agents.ts +1 -1
  309. package/src/tools/list-annotations.ts +8 -5
  310. package/src/tools/list-api-keys.ts +7 -2
  311. package/src/tools/list-dashboard-boards.ts +28 -0
  312. package/src/tools/list-dashboards.ts +1 -1
  313. package/src/tools/list-dataset-records.ts +8 -6
  314. package/src/tools/list-datasets.ts +12 -23
  315. package/src/tools/list-evaluators.ts +4 -8
  316. package/src/tools/list-experiment-runs.ts +5 -9
  317. package/src/tools/list-experiments.ts +5 -11
  318. package/src/tools/list-model-providers.ts +3 -5
  319. package/src/tools/list-projects.ts +2 -4
  320. package/src/tools/list-prompt-tags.ts +3 -3
  321. package/src/tools/list-prompts.ts +4 -8
  322. package/src/tools/list-run-plans.ts +2 -2
  323. package/src/tools/list-scenarios.ts +14 -15
  324. package/src/tools/list-simulation-runs.ts +8 -4
  325. package/src/tools/list-test-suites.ts +1 -1
  326. package/src/tools/list-trigger-fires.ts +17 -0
  327. package/src/tools/list-triggers.ts +39 -0
  328. package/src/tools/list-workflows.ts +2 -4
  329. package/src/tools/rename-prompt-tag.ts +1 -1
  330. package/src/tools/rename-test-suite.ts +2 -5
  331. package/src/tools/report-issue.ts +5 -9
  332. package/src/tools/rerun-run-plan.ts +2 -5
  333. package/src/tools/revoke-api-key.ts +2 -4
  334. package/src/tools/run-agent.ts +29 -26
  335. package/src/tools/run-experiment.ts +36 -37
  336. package/src/tools/run-plan.ts +4 -7
  337. package/src/tools/run-query.ts +47 -0
  338. package/src/tools/run-test-suite.ts +4 -7
  339. package/src/tools/run-workflow.ts +2 -5
  340. package/src/tools/search-traces.ts +161 -47
  341. package/src/tools/set-model-provider.ts +4 -6
  342. package/src/tools/test-agent.ts +2 -2
  343. package/src/tools/update-agent.ts +1 -1
  344. package/src/tools/update-dashboard-widget.ts +97 -0
  345. package/src/tools/update-dataset-record.ts +1 -1
  346. package/src/tools/update-dataset.ts +5 -7
  347. package/src/tools/update-evaluator.ts +3 -5
  348. package/src/tools/update-project.ts +1 -1
  349. package/src/tools/update-prompt.ts +44 -59
  350. package/src/tools/update-scenario.ts +5 -7
  351. package/src/tools/update-test-suite.ts +6 -11
  352. package/src/utils/date-parsing.ts +1 -1
  353. package/src/utils/escape-markdown.ts +3 -8
  354. package/src/utils/format-evaluations.ts +6 -6
  355. package/src/utils/markdown-table.ts +58 -0
  356. package/src/utils/trace-id-shape.ts +20 -0
  357. package/tsconfig.app.json +24 -0
  358. package/tsconfig.json +14 -12
  359. package/vitest.integration.config.js +10 -0
  360. package/vitest.scenario.config.js +9 -0
  361. package/.eslintrc.cjs +0 -36
  362. package/dist/chunk-AN4OUA4D.js +0 -86
  363. package/dist/chunk-GELJ2MQR.js +0 -226
  364. package/dist/chunk-K37ZNPXK.js +0 -24
  365. package/dist/config.d.ts +0 -17
  366. package/dist/create-mcp-server.d.ts +0 -10
  367. package/dist/delete-evaluator-RKYC4TNB.js +0 -16
  368. package/dist/discover-evaluator-schema-ESSHQGPY.js +0 -1912
  369. package/dist/get-analytics-R6AZD3AW.js +0 -73
  370. package/dist/get-dataset-AKTYSQDI.js +0 -49
  371. package/dist/index.d.ts +0 -2
  372. package/dist/langwatch-api-secrets-OEBD6GBU.js +0 -41
  373. package/dist/langwatch-api-triggers-5E6DDGX6.js +0 -31
  374. package/dist/run-agent-CAGWGTYT.js +0 -72
  375. package/dist/search-traces-4XTJYXIK.js +0 -79
  376. package/src/__tests__/agent-tools.unit.test.ts +0 -257
  377. package/src/__tests__/all-tools.integration.test.ts +0 -1872
  378. package/src/__tests__/config.unit.test.ts +0 -202
  379. package/src/__tests__/datasets.integration.test.ts +0 -620
  380. package/src/__tests__/datasets.unit.test.ts +0 -244
  381. package/src/__tests__/date-parsing.unit.test.ts +0 -78
  382. package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
  383. package/src/__tests__/discover-schema.unit.test.ts +0 -118
  384. package/src/__tests__/docker.integration.test.ts +0 -318
  385. package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
  386. package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
  387. package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
  388. package/src/__tests__/experiment-status.unit.test.ts +0 -194
  389. package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
  390. package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
  391. package/src/__tests__/http-security-origin.unit.test.ts +0 -97
  392. package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
  393. package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
  394. package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
  395. package/src/__tests__/http-server-origin.integration.test.ts +0 -169
  396. package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
  397. package/src/__tests__/http-transport.integration.test.ts +0 -395
  398. package/src/__tests__/integration.integration.test.ts +0 -284
  399. package/src/__tests__/langwatch-api.unit.test.ts +0 -661
  400. package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
  401. package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
  402. package/src/__tests__/prompt-response-types.unit.test.ts +0 -51
  403. package/src/__tests__/prompts.integration.test.ts +0 -736
  404. package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
  405. package/src/__tests__/report-issue.integration.test.ts +0 -147
  406. package/src/__tests__/run-plan-tools.unit.test.ts +0 -565
  407. package/src/__tests__/scenario-tools.integration.test.ts +0 -286
  408. package/src/__tests__/scenario-tools.unit.test.ts +0 -207
  409. package/src/__tests__/schemas.unit.test.ts +0 -85
  410. package/src/__tests__/simulation-run-tools.unit.test.ts +0 -116
  411. package/src/__tests__/support/http-server-harness.ts +0 -138
  412. package/src/__tests__/test-suite-tools.unit.test.ts +0 -615
  413. package/src/__tests__/tools.integration.test.ts +0 -896
  414. package/src/schemas/filter-fields.ts +0 -119
  415. package/src/schemas/index.ts +0 -9
@@ -1,73 +0,0 @@
1
- import {
2
- parseRelativeDate
3
- } from "./chunk-ZXKLPC2E.js";
4
- import {
5
- getAnalyticsTimeseries
6
- } from "./chunk-GELJ2MQR.js";
7
- import "./chunk-WT4PO4A3.js";
8
- import "./chunk-SAS5OB7F.js";
9
-
10
- // src/tools/get-analytics.ts
11
- function getGroupedData(bucket, groupBy) {
12
- const data = bucket[groupBy];
13
- if (typeof data === "object" && data !== null && !Array.isArray(data)) {
14
- return data;
15
- }
16
- return void 0;
17
- }
18
- async function handleGetAnalytics(params) {
19
- const now = Date.now();
20
- const startDate = params.startDate ? parseRelativeDate(params.startDate) : now - 7 * 864e5;
21
- const endDate = params.endDate ? parseRelativeDate(params.endDate) : now;
22
- const [category, name] = params.metric.includes(".") ? params.metric.split(".", 2) : ["metadata", params.metric];
23
- const metricKey = `${category}.${name}`;
24
- const aggregation = params.aggregation ?? "avg";
25
- const result = await getAnalyticsTimeseries({
26
- series: [{ metric: metricKey, aggregation }],
27
- startDate,
28
- endDate,
29
- timeZone: params.timeZone ?? "UTC",
30
- groupBy: params.groupBy,
31
- filters: params.filters
32
- });
33
- const lines = [];
34
- lines.push(`# Analytics: ${metricKey} (${aggregation})
35
- `);
36
- lines.push(
37
- `Period: ${new Date(startDate).toISOString().split("T")[0]} to ${new Date(endDate).toISOString().split("T")[0]}`
38
- );
39
- if (params.groupBy) lines.push(`Grouped by: ${params.groupBy}`);
40
- lines.push("");
41
- const currentPeriod = result.currentPeriod ?? [];
42
- if (currentPeriod.length === 0) {
43
- lines.push("No data available for this period.");
44
- } else if (params.groupBy && currentPeriod.some((b) => getGroupedData(b, params.groupBy) !== void 0)) {
45
- lines.push("| Date | Group | Value |");
46
- lines.push("|------|-------|-------|");
47
- for (const bucket of currentPeriod) {
48
- const groups = getGroupedData(bucket, params.groupBy);
49
- if (!groups) continue;
50
- for (const [groupKey, metrics] of Object.entries(groups)) {
51
- const value = Object.values(metrics).find((v) => typeof v === "number") ?? "N/A";
52
- lines.push(`| ${bucket.date} | ${groupKey} | ${value} |`);
53
- }
54
- }
55
- } else {
56
- lines.push("| Date | Value |");
57
- lines.push("|------|-------|");
58
- for (const bucket of currentPeriod) {
59
- const value = Object.entries(bucket).find(
60
- ([k]) => k !== "date" && typeof bucket[k] === "number"
61
- )?.[1] ?? "N/A";
62
- lines.push(`| ${bucket.date} | ${value} |`);
63
- }
64
- }
65
- lines.push(
66
- "\n> Tip: Use `discover_schema` to see all available metrics and aggregation types."
67
- );
68
- return lines.join("\n");
69
- }
70
- export {
71
- handleGetAnalytics
72
- };
73
- //# sourceMappingURL=get-analytics-R6AZD3AW.js.map
@@ -1,49 +0,0 @@
1
- import {
2
- escapeMarkdown
3
- } from "./chunk-NUFPTHKU.js";
4
- import {
5
- getDataset
6
- } from "./chunk-AN4OUA4D.js";
7
- import "./chunk-GELJ2MQR.js";
8
- import "./chunk-WT4PO4A3.js";
9
- import "./chunk-SAS5OB7F.js";
10
-
11
- // src/tools/get-dataset.ts
12
- function formatDatasetResponse(dataset) {
13
- const lines = [];
14
- lines.push(`# Dataset: ${escapeMarkdown(dataset.name)}
15
- `);
16
- lines.push(`**Slug**: ${escapeMarkdown(dataset.slug)}`);
17
- lines.push(`**ID**: ${escapeMarkdown(dataset.id)}`);
18
- if (Array.isArray(dataset.columnTypes) && dataset.columnTypes.length > 0) {
19
- lines.push("\n## Columns\n");
20
- lines.push("| Name | Type |");
21
- lines.push("|------|------|");
22
- for (const col of dataset.columnTypes) {
23
- lines.push(`| ${escapeMarkdown(col.name)} | ${escapeMarkdown(col.type)} |`);
24
- }
25
- }
26
- if (Array.isArray(dataset.data) && dataset.data.length > 0) {
27
- lines.push(`
28
- ## Records (${dataset.data.length} shown)
29
- `);
30
- for (const record of dataset.data) {
31
- lines.push(`**${escapeMarkdown(record.id)}**: ${escapeMarkdown(JSON.stringify(record.entry))}`);
32
- }
33
- } else {
34
- lines.push("\nNo records in this dataset.");
35
- }
36
- return lines.join("\n");
37
- }
38
- async function handleGetDataset(params) {
39
- const dataset = await getDataset(params.slugOrId);
40
- if (params.format === "json") {
41
- return JSON.stringify(dataset, null, 2);
42
- }
43
- return formatDatasetResponse(dataset);
44
- }
45
- export {
46
- formatDatasetResponse,
47
- handleGetDataset
48
- };
49
- //# sourceMappingURL=get-dataset-AKTYSQDI.js.map
package/dist/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
-
2
- export { }
@@ -1,41 +0,0 @@
1
- import {
2
- makeRequest
3
- } from "./chunk-GELJ2MQR.js";
4
- import "./chunk-WT4PO4A3.js";
5
- import "./chunk-SAS5OB7F.js";
6
-
7
- // src/langwatch-api-secrets.ts
8
- async function listSecrets() {
9
- return makeRequest("GET", "/api/secrets");
10
- }
11
- async function getSecret(id) {
12
- return makeRequest(
13
- "GET",
14
- `/api/secrets/${encodeURIComponent(id)}`
15
- );
16
- }
17
- async function createSecret(data) {
18
- return makeRequest("POST", "/api/secrets", data);
19
- }
20
- async function updateSecret(params) {
21
- const { id, value } = params;
22
- return makeRequest(
23
- "PUT",
24
- `/api/secrets/${encodeURIComponent(id)}`,
25
- { value }
26
- );
27
- }
28
- async function deleteSecret(id) {
29
- return makeRequest(
30
- "DELETE",
31
- `/api/secrets/${encodeURIComponent(id)}`
32
- );
33
- }
34
- export {
35
- createSecret,
36
- deleteSecret,
37
- getSecret,
38
- listSecrets,
39
- updateSecret
40
- };
41
- //# sourceMappingURL=langwatch-api-secrets-OEBD6GBU.js.map
@@ -1,31 +0,0 @@
1
- import {
2
- makeRequest
3
- } from "./chunk-GELJ2MQR.js";
4
- import "./chunk-WT4PO4A3.js";
5
- import "./chunk-SAS5OB7F.js";
6
-
7
- // src/langwatch-api-triggers.ts
8
- async function listTriggers() {
9
- return makeRequest("GET", "/api/triggers");
10
- }
11
- async function getTrigger(id) {
12
- return makeRequest("GET", `/api/triggers/${encodeURIComponent(id)}`);
13
- }
14
- async function createTrigger(data) {
15
- return makeRequest("POST", "/api/triggers", data);
16
- }
17
- async function updateTrigger(params) {
18
- const { id, ...data } = params;
19
- return makeRequest("PATCH", `/api/triggers/${encodeURIComponent(id)}`, data);
20
- }
21
- async function deleteTrigger(id) {
22
- return makeRequest("DELETE", `/api/triggers/${encodeURIComponent(id)}`);
23
- }
24
- export {
25
- createTrigger,
26
- deleteTrigger,
27
- getTrigger,
28
- listTriggers,
29
- updateTrigger
30
- };
31
- //# sourceMappingURL=langwatch-api-triggers-5E6DDGX6.js.map
@@ -1,72 +0,0 @@
1
- import {
2
- runAgent
3
- } from "./chunk-EYXMLE5X.js";
4
- import "./chunk-GELJ2MQR.js";
5
- import "./chunk-WT4PO4A3.js";
6
- import "./chunk-SAS5OB7F.js";
7
-
8
- // src/tools/run-agent.ts
9
- import { z } from "zod";
10
- var jsonObjectSchema = z.looseObject({});
11
- async function handleRunAgent({
12
- id,
13
- input,
14
- message,
15
- parameters,
16
- threadId
17
- }) {
18
- let parsedInput = {};
19
- if (input) {
20
- let decoded;
21
- try {
22
- decoded = JSON.parse(input);
23
- } catch {
24
- return "Error: `input` must be a valid JSON object.";
25
- }
26
- const result2 = jsonObjectSchema.safeParse(decoded);
27
- if (!result2.success) {
28
- return "Error: `input` must be a valid JSON object.";
29
- }
30
- parsedInput = result2.data;
31
- }
32
- const { agentType, result } = await runAgent({
33
- id,
34
- input: parsedInput,
35
- message,
36
- parameters,
37
- threadId
38
- });
39
- const lines = [];
40
- lines.push(`Agent executed successfully (type: ${agentType}).
41
- `);
42
- if (typeof result === "object" && result !== null) {
43
- const output = result.output;
44
- if (output !== void 0) {
45
- lines.push("**Output:**");
46
- lines.push(typeof output === "string" ? output : JSON.stringify(output, null, 2));
47
- } else {
48
- lines.push("**Result:**");
49
- lines.push(JSON.stringify(result, null, 2));
50
- }
51
- if (agentType === "connected") {
52
- const instance = result.instance;
53
- const durationMs = result.durationMs;
54
- if (instance?.hostname) {
55
- const label = instance.label ? ` (${instance.label})` : "";
56
- lines.push(`
57
- **Instance:** ${instance.hostname}${label}`);
58
- }
59
- if (typeof durationMs === "number") lines.push(`**Duration:** ${durationMs} ms`);
60
- const session = result.session;
61
- if (session !== void 0 && session !== null) {
62
- lines.push("**Session:**");
63
- lines.push(JSON.stringify(session, null, 2));
64
- }
65
- }
66
- }
67
- return lines.join("\n");
68
- }
69
- export {
70
- handleRunAgent
71
- };
72
- //# sourceMappingURL=run-agent-CAGWGTYT.js.map
@@ -1,79 +0,0 @@
1
- import {
2
- formatEvaluationLines
3
- } from "./chunk-37SMPMQS.js";
4
- import {
5
- parseRelativeDate
6
- } from "./chunk-ZXKLPC2E.js";
7
- import {
8
- searchTraces
9
- } from "./chunk-GELJ2MQR.js";
10
- import "./chunk-WT4PO4A3.js";
11
- import "./chunk-SAS5OB7F.js";
12
-
13
- // src/tools/search-traces.ts
14
- async function handleSearchTraces(params) {
15
- const now = Date.now();
16
- const startDate = params.startDate ? parseRelativeDate(params.startDate) : now - 864e5;
17
- const endDate = params.endDate ? parseRelativeDate(params.endDate) : now;
18
- const format = params.format ?? "digest";
19
- const result = await searchTraces({
20
- query: params.query,
21
- filters: params.filters,
22
- startDate,
23
- endDate,
24
- pageSize: params.pageSize ?? 25,
25
- scrollId: params.scrollId,
26
- format
27
- });
28
- const traces = result.traces ?? [];
29
- if (traces.length === 0) {
30
- return "No traces found matching your query.";
31
- }
32
- if (format === "json") {
33
- return JSON.stringify(result, null, 2);
34
- }
35
- const lines = [];
36
- lines.push(
37
- `Found ${result.pagination?.totalHits ?? traces.length} traces:
38
- `
39
- );
40
- for (const trace of traces) {
41
- lines.push(`### Trace: ${trace.trace_id}`);
42
- if (trace.formatted_trace) {
43
- lines.push(trace.formatted_trace);
44
- } else {
45
- const inputStr = trace.input?.value ? String(trace.input.value) : "N/A";
46
- const outputStr = trace.output?.value ? String(trace.output.value) : "N/A";
47
- lines.push(
48
- `- **Input**: ${inputStr.slice(0, 100)}${inputStr.length > 100 ? "..." : ""}`
49
- );
50
- lines.push(
51
- `- **Output**: ${outputStr.slice(0, 100)}${outputStr.length > 100 ? "..." : ""}`
52
- );
53
- }
54
- if (trace.timestamps) {
55
- lines.push(`- **Time**: ${trace.timestamps.started_at || "N/A"}`);
56
- }
57
- if (trace.error) {
58
- lines.push(`- **Error**: ${JSON.stringify(trace.error)}`);
59
- }
60
- if (trace.evaluations && trace.evaluations.length > 0) {
61
- lines.push(...formatEvaluationLines(trace.evaluations));
62
- }
63
- lines.push("");
64
- }
65
- if (result.pagination?.scrollId) {
66
- lines.push(
67
- `
68
- **More results available.** Use scrollId: "${result.pagination.scrollId}" to get next page.`
69
- );
70
- }
71
- lines.push(
72
- '\n> Tip: Use `get_trace` with a trace_id for full details. Use `search_traces` with `format: "json"` for raw data. Use `discover_schema` to see available filter fields.'
73
- );
74
- return lines.join("\n");
75
- }
76
- export {
77
- handleSearchTraces
78
- };
79
- //# sourceMappingURL=search-traces-4XTJYXIK.js.map
@@ -1,257 +0,0 @@
1
- /**
2
- * The agent tools with a connected agent: the fields the listing and the
3
- * detail expose, and the relay a run goes through.
4
- *
5
- * @see specs/mcp-server/agent-tools.feature
6
- */
7
- import { beforeEach, describe, expect, it, vi } from "vitest";
8
-
9
- vi.mock("../langwatch-api.js", async (importOriginal) => {
10
- const actual = (await importOriginal()) as Record<string, unknown>;
11
- return { ...actual, makeRequest: vi.fn() };
12
- });
13
- vi.mock("../public-http-request.js", () => ({ requestPublicJson: vi.fn() }));
14
-
15
- import { makeRequest } from "../langwatch-api.js";
16
- import { runAgent, type AgentSummary } from "../langwatch-api-agents.js";
17
- import { requestPublicJson } from "../public-http-request.js";
18
- import { runPlanTargetSchema, toWireTargets } from "../schemas/run-plan.js";
19
- import { handleGetAgent } from "../tools/get-agent.js";
20
- import { handleListAgents } from "../tools/list-agents.js";
21
- import { handleRunAgent } from "../tools/run-agent.js";
22
- import { handleTestAgent } from "../tools/test-agent.js";
23
-
24
- const mockRequest = vi.mocked(makeRequest);
25
- const mockPublic = vi.mocked(requestPublicJson);
26
-
27
- const connectedAgent = (overrides: Partial<AgentSummary> = {}): AgentSummary => ({
28
- id: "agent_conn",
29
- name: "support-agent",
30
- type: "connected",
31
- config: null,
32
- createdAt: "2026-01-01T00:00:00Z",
33
- updatedAt: "2026-01-02T00:00:00Z",
34
- environment: "production",
35
- status: "online",
36
- instances: [
37
- { id: "inst_1", hostname: "pod-a", label: "blue", connectedAt: "2026-01-02T00:00:00Z" },
38
- { id: "inst_2", hostname: "pod-b", label: null, connectedAt: "2026-01-02T00:01:00Z" },
39
- ],
40
- owner: { userId: "u1", name: "Ada" },
41
- parameters: [
42
- { name: "model", type: "string", options: ["gpt-5", "gpt-5-mini"], default: "gpt-5-mini", required: false },
43
- { name: "plan", type: "string", required: true, description: "Customer plan" },
44
- ],
45
- ...overrides,
46
- });
47
-
48
- const httpAgent = (): AgentSummary => ({
49
- id: "agent_http",
50
- name: "Legacy",
51
- type: "http",
52
- config: { url: "https://api.example.com/agent" },
53
- createdAt: "2026-01-01T00:00:00Z",
54
- updatedAt: "2026-01-02T00:00:00Z",
55
- });
56
-
57
- beforeEach(() => {
58
- vi.clearAllMocks();
59
- });
60
-
61
- describe("handleListAgents()", () => {
62
- describe("when a connected agent and an HTTP agent are listed", () => {
63
- /** @scenario "The listing shows environment, status, instances and owner" */
64
- /** @scenario "The listing keeps the HTTP agent entry unchanged" */
65
- it("shows the connected fields on the connected entry only", async () => {
66
- mockRequest.mockResolvedValueOnce({
67
- data: [connectedAgent(), httpAgent()],
68
- pagination: { page: 1, limit: 100, total: 2, totalPages: 1 },
69
- });
70
-
71
- const output = await handleListAgents();
72
-
73
- const [, connected, http] = output.split("## ");
74
- expect(connected).toContain("**Environment**: production");
75
- expect(connected).toContain("**Status**: online");
76
- expect(connected).toContain("**Instances**: 2");
77
- expect(connected).toContain("**Owner**: Ada");
78
- expect(http).toContain("**Type**: http");
79
- expect(http).not.toContain("Environment");
80
- expect(http).not.toContain("Status");
81
- });
82
- });
83
-
84
- describe("when a listed agent belongs to another person", () => {
85
- /** @scenario "A listed agent the key cannot choose says so" */
86
- it("lists it with its owner and says only its owner can run it", async () => {
87
- mockRequest.mockResolvedValueOnce({
88
- data: [connectedAgent({ selectable: false, notSelectableReason: "owned_by_another_person" })],
89
- pagination: { page: 1, limit: 100, total: 1, totalPages: 1 },
90
- });
91
-
92
- const output = await handleListAgents();
93
-
94
- expect(output).toContain("**Owner**: Ada");
95
- expect(output).toContain("**Run**: only its owner can run this agent");
96
- });
97
- });
98
- });
99
-
100
- describe("handleGetAgent()", () => {
101
- describe("when the agent declares parameters and has instances", () => {
102
- /** @scenario "The detail shows the parameters and the instances" */
103
- it("lists each parameter with its type, options, default and required, and each instance", async () => {
104
- mockRequest.mockResolvedValueOnce(connectedAgent());
105
-
106
- const output = await handleGetAgent({ id: "agent_conn" });
107
-
108
- expect(output).toContain("## Parameters");
109
- expect(output).toContain('- **model** (string, one of gpt-5, gpt-5-mini, default "gpt-5-mini")');
110
- expect(output).toContain("- **plan** (string, required): Customer plan");
111
- expect(output).toContain("## Instances (2)");
112
- expect(output).toContain("- pod-a (blue), connected 2026-01-02T00:00:00Z");
113
- expect(output).toContain("- pod-b, connected 2026-01-02T00:01:00Z");
114
- expect(output).toContain("**Owner**: Ada");
115
- });
116
- });
117
-
118
- });
119
-
120
- describe("handleTestAgent()", () => {
121
- describe("when an agent is tested", () => {
122
- /** @scenario "The REST route schedules the same run" */
123
- it("posts to the test route and reports the run ids to follow", async () => {
124
- mockRequest.mockResolvedValueOnce({
125
- scenarioRunId: "run_1",
126
- batchRunId: "batch_1",
127
- setId: "__internal__proj_1__agent-test",
128
- });
129
-
130
- const output = await handleTestAgent({ id: "agent_http" });
131
-
132
- expect(mockRequest).toHaveBeenCalledWith("POST", "/api/v1/agents/agent_http/test", {});
133
- expect(output).toContain("**Scenario run ID:** run_1");
134
- expect(output).toContain("**Batch run ID:** batch_1");
135
- expect(output).toContain("platform_get_simulation_run");
136
- });
137
- });
138
- });
139
-
140
- describe("handleRunAgent()", () => {
141
- describe("when the agent is connected and online", () => {
142
- /** @scenario "A message runs one turn on a live instance" */
143
- it("calls the relay with one user message and the parameters, and reports the instance", async () => {
144
- mockRequest.mockResolvedValueOnce(connectedAgent());
145
- mockRequest.mockResolvedValueOnce({
146
- output: "Sure, I can help.",
147
- session: { id: "s1" },
148
- instance: { hostname: "pod-a", label: "blue" },
149
- durationMs: 321,
150
- });
151
-
152
- const output = await handleRunAgent({ id: "agent_conn", message: "hi", parameters: { model: "gpt-5" } });
153
-
154
- expect(mockRequest).toHaveBeenNthCalledWith(2, "POST", "/api/v1/agents/agent_conn/call", {
155
- messages: [{ role: "user", content: "hi" }],
156
- params: { model: "gpt-5" },
157
- });
158
- expect(output).toContain("type: connected");
159
- expect(output).toContain("Sure, I can help.");
160
- expect(output).toContain("**Instance:** pod-a (blue)");
161
- expect(output).toContain("**Duration:** 321 ms");
162
- });
163
-
164
- /** @scenario "An input with messages is sent as the relay body" */
165
- it("sends an input with messages, thread id and session as the body", async () => {
166
- mockRequest.mockResolvedValueOnce(connectedAgent());
167
- mockRequest.mockResolvedValueOnce({ output: "ok", instance: { hostname: "pod-a" }, durationMs: 1 });
168
- const input = JSON.stringify({
169
- messages: [{ role: "user", content: "again" }],
170
- threadId: "t1",
171
- session: { id: "s1" },
172
- });
173
-
174
- await handleRunAgent({ id: "agent_conn", input, threadId: "t2" });
175
-
176
- expect(mockRequest).toHaveBeenNthCalledWith(2, "POST", "/api/v1/agents/agent_conn/call", {
177
- messages: [{ role: "user", content: "again" }],
178
- threadId: "t2",
179
- session: { id: "s1" },
180
- });
181
- });
182
-
183
- /** @scenario "A connected agent needs a conversation" */
184
- it("refuses an input with no messages and no message", async () => {
185
- mockRequest.mockResolvedValueOnce(connectedAgent());
186
-
187
- await expect(runAgent({ id: "agent_conn", input: { question: "hi" } })).rejects.toThrow(/give `message`, or `input` with a `messages` list/);
188
- expect(mockRequest).toHaveBeenCalledTimes(1);
189
- });
190
-
191
- it("refuses an offline agent before the relay is called", async () => {
192
- mockRequest.mockResolvedValueOnce(connectedAgent({ status: "offline", instances: [] }));
193
-
194
- await expect(runAgent({ id: "agent_conn", message: "hi" })).rejects.toThrow(/is offline/);
195
- expect(mockRequest).toHaveBeenCalledTimes(1);
196
- });
197
-
198
- /** @scenario "A nested params object is refused before the relay" */
199
- it("refuses an input whose params carry a nested object", async () => {
200
- mockRequest.mockResolvedValueOnce(connectedAgent());
201
-
202
- await expect(
203
- runAgent({
204
- id: "agent_conn",
205
- input: { messages: [{ role: "user", content: "hi" }], params: { model: { name: "gpt-5" } } },
206
- }),
207
- ).rejects.toThrow(/flat object of string, number or boolean values/);
208
- expect(mockRequest).toHaveBeenCalledTimes(1);
209
- });
210
- });
211
-
212
- describe("when the input is JSON that is not an object", () => {
213
- /** @scenario "An input that is not a JSON object is refused" */
214
- it("refuses a scalar, an array and null before the agent is read", async () => {
215
- for (const input of ["5", '"hi"', "[1,2]", "null"]) {
216
- expect(await handleRunAgent({ id: "agent_conn", input })).toBe(
217
- "Error: `input` must be a valid JSON object.",
218
- );
219
- }
220
- expect(mockRequest).not.toHaveBeenCalled();
221
- });
222
- });
223
-
224
- describe("when the agent is an HTTP agent", () => {
225
- /** @scenario "An HTTP agent is still called at its URL" */
226
- it("calls the URL directly and not the relay", async () => {
227
- mockRequest.mockResolvedValueOnce(httpAgent());
228
- mockPublic.mockResolvedValueOnce({ answer: "hi" });
229
-
230
- const output = await handleRunAgent({ id: "agent_http", input: '{"question":"hi"}' });
231
-
232
- expect(mockPublic).toHaveBeenCalledWith("https://api.example.com/agent", expect.objectContaining({ method: "POST" }));
233
- expect(mockRequest).toHaveBeenCalledTimes(1);
234
- expect(output).toContain("type: http");
235
- });
236
- });
237
- });
238
-
239
- describe("runPlanTargetSchema", () => {
240
- /** @scenario "A connected target names an agent by id" */
241
- it("accepts a connected target with an agent id", () => {
242
- expect(runPlanTargetSchema.parse({ type: "connected", referenceId: "agent_conn" })).toEqual({
243
- type: "connected",
244
- referenceId: "agent_conn",
245
- });
246
- });
247
-
248
- /** @scenario "A connected target names an agent by name and environment" */
249
- it("passes name@environment through as the reference id", () => {
250
- const targets = toWireTargets([
251
- runPlanTargetSchema.parse({ type: "connected", referenceId: "support-agent@production", parameters: { model: "gpt-5" } }),
252
- ]);
253
- expect(targets).toEqual([
254
- { type: "connected", referenceId: "support-agent@production", runParameters: { model: "gpt-5" } },
255
- ]);
256
- });
257
- });