@langwatch/mcp-server 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitignore +7 -0
- package/.npmignore +41 -0
- package/CHANGELOG.md +280 -200
- package/CONTRIBUTING.md +10 -0
- package/README.md +82 -52
- package/dist/add-dashboard-widget-4ZC5UN73.js +50 -0
- package/dist/add-dashboard-widget-ACC6QYBG.js +49 -0
- package/dist/archive-project-KWFM3I5Z.js +19 -0
- package/dist/{archive-project-4EQGLBJJ.js → archive-project-SPVHXK6A.js} +4 -4
- package/dist/archive-run-plan-65QN3XRX.js +16 -0
- package/dist/archive-run-plan-Z4SYE6BP.js +15 -0
- package/dist/{archive-scenario-W6BXYDZ3.js → archive-scenario-A6QV5LOW.js} +4 -4
- package/dist/archive-scenario-FXEYQNEH.js +19 -0
- package/dist/archive-test-suite-5ADQ3KPQ.js +15 -0
- package/dist/archive-test-suite-NKZDZY3D.js +16 -0
- package/dist/assign-prompt-tag-5IUZXJ2T.js +23 -0
- package/dist/{assign-prompt-tag-VLXUWEKU.js → assign-prompt-tag-HBZLBIFD.js} +8 -4
- package/dist/{chunk-CDYQOY5U.js → chunk-3OCG3QPU.js} +7 -10
- package/dist/chunk-3YLN3ATJ.js +241 -0
- package/dist/chunk-5FNCQRCX.js +91 -0
- package/dist/chunk-6YZUOD34.js +55 -0
- package/dist/{chunk-WVI5CJ6S.js → chunk-7AQLPVFL.js} +2 -2
- package/dist/chunk-7VNSRCXO.js +129 -0
- package/dist/{chunk-7RHG56OH.js → chunk-B4J3PJLX.js} +11 -10
- package/dist/{chunk-ZXKLPC2E.js → chunk-BIIKE3EI.js} +1 -1
- package/dist/{chunk-37SMPMQS.js → chunk-DMM3JQ42.js} +7 -2
- package/dist/{chunk-NUFPTHKU.js → chunk-FOKVY3BK.js} +1 -1
- package/dist/{chunk-WT4PO4A3.js → chunk-H6WGMG2T.js} +10 -7
- package/dist/{chunk-TOXJQDIZ.js → chunk-HGELNIVY.js} +135 -51
- package/dist/{chunk-UJPXFA26.js → chunk-HHMNZAPD.js} +101 -74
- package/dist/{chunk-J42FWRJ2.js → chunk-I7ATIZED.js} +7 -7
- package/dist/{chunk-AQJO2EI5.js → chunk-ILZDO25L.js} +7 -10
- package/dist/{chunk-4QC7SA2L.js → chunk-J7PQKBLD.js} +884 -559
- package/dist/{chunk-YX3A3CFM.js → chunk-JRJPH75H.js} +7 -13
- package/dist/chunk-K2I7Z3LZ.js +28 -0
- package/dist/{chunk-5CCZFUXS.js → chunk-NKMTIHIJ.js} +6 -9
- package/dist/chunk-O7EMWEVJ.js +44 -0
- package/dist/chunk-PTDR56Z3.js +37 -0
- package/dist/chunk-RABYBFX5.js +43 -0
- package/dist/chunk-SUPUUC4W.js +64 -0
- package/dist/{chunk-SFB4MU6H.js → chunk-SXFC3FNH.js} +4 -4
- package/dist/chunk-U24EACC4.js +67 -0
- package/dist/chunk-UNJM3BIL.js +21 -0
- package/dist/{chunk-ZWIL4EFL.js → chunk-UTJCWXPZ.js} +4 -4
- package/dist/chunk-UWLE5T2F.js +312 -0
- package/dist/chunk-VMWJD732.js +57 -0
- package/dist/chunk-XUIJYNRJ.js +15 -0
- package/dist/chunk-Y34DHR5K.js +67 -0
- package/dist/chunk-YCARO42Z.js +516 -0
- package/dist/config-EAKW6F26.js +16 -0
- package/dist/config.cjs +109 -0
- package/dist/config.js +5 -4
- package/dist/{create-agent-7XHO6UIS.js → create-agent-AYZ3LB3V.js} +4 -4
- package/dist/create-agent-S5ZBCEFT.js +23 -0
- package/dist/create-annotation-LHNCLHYP.js +29 -0
- package/dist/{create-annotation-YQXRQC6A.js → create-annotation-VUSXULQK.js} +10 -5
- package/dist/{create-api-key-YUS36KBU.js → create-api-key-NNYKARMG.js} +5 -7
- package/dist/create-api-key-T4KSNPKB.js +24 -0
- package/dist/create-dashboard-DHVFMEU4.js +18 -0
- package/dist/{create-dashboard-4Z5JO5LB.js → create-dashboard-WTKKS5Z6.js} +4 -4
- package/dist/{create-dataset-E6NMSVX7.js → create-dataset-2MC4SD4O.js} +6 -6
- package/dist/create-dataset-LUP5PVDM.js +22 -0
- package/dist/create-dataset-records-NSKBZP3G.js +20 -0
- package/dist/{create-dataset-records-SKHPRD2K.js → create-dataset-records-W4GLN2FV.js} +5 -7
- package/dist/{create-evaluator-JXF5PF33.js → create-evaluator-643G6LXL.js} +4 -4
- package/dist/create-evaluator-HMTYO5SS.js +27 -0
- package/dist/create-mcp-server.cjs +9513 -0
- package/dist/create-mcp-server.js +2647 -5
- package/dist/create-project-6N7PIYRY.js +44 -0
- package/dist/{create-project-CS2CB57Y.js → create-project-KAIC46UY.js} +4 -4
- package/dist/{create-prompt-F5RMX3L3.js → create-prompt-E67LXIYT.js} +5 -7
- package/dist/create-prompt-PKJ7EDRR.js +37 -0
- package/dist/create-prompt-tag-4YO3FSJ3.js +17 -0
- package/dist/{create-prompt-tag-GMRWTEFR.js → create-prompt-tag-OPQUEXWB.js} +3 -3
- package/dist/create-scenario-5PJBMAXO.js +33 -0
- package/dist/{create-scenario-JDR2VB2H.js → create-scenario-UEM77OE7.js} +11 -4
- package/dist/create-test-suite-4IPXVSFQ.js +37 -0
- package/dist/create-test-suite-SZEPVXSE.js +36 -0
- package/dist/create-trigger-5HZSCRAN.js +49 -0
- package/dist/create-trigger-PRELMT6J.js +48 -0
- package/dist/delete-agent-JUIZWAXG.js +18 -0
- package/dist/{delete-agent-O3EEH4S5.js → delete-agent-QMEK3XHK.js} +4 -4
- package/dist/delete-annotation-HY3O2OGR.js +17 -0
- package/dist/{delete-annotation-XP6FQM7A.js → delete-annotation-VKIQWUYW.js} +4 -4
- package/dist/delete-dashboard-76N66XXL.js +18 -0
- package/dist/{delete-dashboard-RFUNYCNP.js → delete-dashboard-JVIVHNJM.js} +4 -4
- package/dist/delete-dataset-HQCR66MG.js +18 -0
- package/dist/{delete-dataset-3MJFRDLP.js → delete-dataset-WKRUW4FP.js} +5 -7
- package/dist/{delete-dataset-records-WPMU5GL5.js → delete-dataset-records-C2IQFFVQ.js} +5 -7
- package/dist/delete-dataset-records-SDUHQLLM.js +19 -0
- package/dist/delete-evaluator-4SNSCLEE.js +16 -0
- package/dist/delete-evaluator-QP3QHTLN.js +15 -0
- package/dist/delete-prompt-tag-NZ4JQMYG.js +17 -0
- package/dist/{delete-prompt-tag-KNMZVSPB.js → delete-prompt-tag-YYQ4VMAD.js} +3 -3
- package/dist/{delete-workflow-3NUXO46U.js → delete-workflow-5J46T73T.js} +4 -4
- package/dist/delete-workflow-JSWABL5F.js +17 -0
- package/dist/discover-evaluator-schema-UHWA5HVL.js +120 -0
- package/dist/discover-evaluator-schema-XKCLLCB3.js +118 -0
- package/dist/discover-scenario-schema-NOJY6S7E.js +137 -0
- package/dist/discover-scenario-schema-OOFIQKOG.js +139 -0
- package/dist/{discover-schema-L6QDPON3.js → discover-schema-55YJBFGQ.js} +181 -186
- package/dist/discover-schema-A33SLMXW.js +442 -0
- package/dist/get-agent-LJQX7OF4.js +69 -0
- package/dist/get-agent-OTIYUFZA.js +70 -0
- package/dist/get-analytics-DCS72353.js +80 -0
- package/dist/get-analytics-IQZKJHLW.js +79 -0
- package/dist/get-dashboard-5NYJEIX2.js +29 -0
- package/dist/{get-dashboard-KHBEGZGL.js → get-dashboard-QMTYDQAZ.js} +4 -4
- package/dist/get-dataset-ALSP7RTX.js +64 -0
- package/dist/get-dataset-X4B5JDG2.js +63 -0
- package/dist/{get-evaluator-ADMKVWYZ.js → get-evaluator-ISMC4LLI.js} +4 -4
- package/dist/get-evaluator-XEUZGZCH.js +47 -0
- package/dist/{get-project-RAK7URQJ.js → get-project-5VKROSDH.js} +4 -4
- package/dist/get-project-RM6FRCBK.js +26 -0
- package/dist/get-prompt-OWXJZHQQ.js +95 -0
- package/dist/get-prompt-W52DY36E.js +94 -0
- package/dist/get-run-plan-BE3M2AUX.js +59 -0
- package/dist/get-run-plan-RUXQ6PAX.js +58 -0
- package/dist/get-scenario-RNM7BAX2.js +37 -0
- package/dist/{get-scenario-ZTAJJL5T.js → get-scenario-YM4ODWW6.js} +8 -4
- package/dist/get-simulation-run-6GIATQE5.js +69 -0
- package/dist/{get-simulation-run-T2ZQWYH2.js → get-simulation-run-LCFSMPGQ.js} +33 -20
- package/dist/get-test-suite-GC2O7YH6.js +49 -0
- package/dist/get-test-suite-P5LJ6VLF.js +48 -0
- package/dist/get-trace-KBRVV4NN.js +45 -0
- package/dist/{get-trace-K7U234Q4.js → get-trace-SEF3FMR5.js} +11 -13
- package/dist/get-workflow-7PVED7JE.js +25 -0
- package/dist/{get-workflow-L5L2PSK3.js → get-workflow-YXULW4GC.js} +4 -4
- package/dist/{http-security-EU3CHTY7.js → http-security-DNLBNQZL.js} +2 -2
- package/dist/{http-server-YXHFPPGA.js → http-server-IR4QOS43.js} +4071 -342
- package/dist/index.js +60221 -38077
- package/dist/langwatch-api-annotations-6SA4OB4C.js +17 -0
- package/dist/{langwatch-api-annotations-FDAS6NQ7.js → langwatch-api-annotations-TBHLCQ5R.js} +4 -4
- package/dist/langwatch-api-dashboards-6EO2VVZW.js +17 -0
- package/dist/{langwatch-api-dashboards-JTVCS7ZJ.js → langwatch-api-dashboards-NHU5BZD7.js} +4 -4
- package/dist/langwatch-api-monitors-CBF3FGIM.js +47 -0
- package/dist/{langwatch-api-monitors-3J7UIQME.js → langwatch-api-monitors-YNWA2M5Y.js} +11 -16
- package/dist/langwatch-api-secrets-ADTOJELP.js +56 -0
- package/dist/langwatch-api-secrets-RNFO4LF2.js +55 -0
- package/dist/langwatch-api-triggers-KQDQC6L5.js +22 -0
- package/dist/langwatch-api-triggers-QS7HDIVW.js +23 -0
- package/dist/{langwatch-api-workflows-NBJX5KOG.js → langwatch-api-workflows-OKC4FXIF.js} +4 -4
- package/dist/langwatch-api-workflows-XGJE6SR5.js +15 -0
- package/dist/list-agents-HVYWEQMI.js +43 -0
- package/dist/list-agents-RBAOCF53.js +42 -0
- package/dist/list-annotations-HJH4NBLD.js +38 -0
- package/dist/{list-annotations-ZTVP4EEL.js → list-annotations-J4UAHSUN.js} +10 -5
- package/dist/{list-api-keys-CWD4UQT5.js → list-api-keys-7UTJRZDG.js} +10 -5
- package/dist/list-api-keys-A2PMV435.js +42 -0
- package/dist/list-dashboard-boards-OPWROHMG.js +33 -0
- package/dist/list-dashboard-boards-U2GJ7GC5.js +34 -0
- package/dist/{list-dashboards-PWG6P6KR.js → list-dashboards-ROSYFLDQ.js} +4 -4
- package/dist/list-dashboards-RQ635ZU7.js +32 -0
- package/dist/{list-dataset-records-IOE7LQXS.js → list-dataset-records-M5TKA6LK.js} +14 -10
- package/dist/list-dataset-records-WFM7F33C.js +43 -0
- package/dist/{list-datasets-ZT4JYUDT.js → list-datasets-B5X4P7BQ.js} +9 -13
- package/dist/list-datasets-THUKQHPX.js +56 -0
- package/dist/{list-evaluators-SJHC7VBH.js → list-evaluators-MYH2OVCI.js} +5 -7
- package/dist/list-evaluators-NLVWF6K7.js +32 -0
- package/dist/{list-model-providers-PPD2WPD2.js → list-model-providers-3JUGP4YI.js} +4 -4
- package/dist/list-model-providers-H3XKORFO.js +35 -0
- package/dist/{list-projects-K7QAIX2I.js → list-projects-6EJ5YYEW.js} +5 -7
- package/dist/list-projects-YNNSRMLC.js +40 -0
- package/dist/{list-prompt-tags-FOO6TNHB.js → list-prompt-tags-NVFQO6WX.js} +3 -3
- package/dist/list-prompt-tags-XUQTTAH4.js +23 -0
- package/dist/{list-prompts-SC2HAUFG.js → list-prompts-HSIMMHTF.js} +4 -6
- package/dist/list-prompts-IRI6AIXO.js +30 -0
- package/dist/list-run-plans-PX2XI6EK.js +46 -0
- package/dist/list-run-plans-QALLCN2K.js +45 -0
- package/dist/list-scenarios-QZRPVHS4.js +46 -0
- package/dist/list-scenarios-SSJQEMJP.js +45 -0
- package/dist/list-simulation-runs-KNOLGMDV.js +53 -0
- package/dist/{list-simulation-runs-KF5THG5H.js → list-simulation-runs-OEADLLQR.js} +19 -9
- package/dist/list-test-suites-ANAQBLDG.js +34 -0
- package/dist/list-test-suites-N4WVLBKK.js +35 -0
- package/dist/list-trigger-fires-JV3WFYYG.js +19 -0
- package/dist/list-trigger-fires-WTW4DVIW.js +20 -0
- package/dist/list-triggers-SQNIG35Q.js +45 -0
- package/dist/list-triggers-V4Y356AK.js +46 -0
- package/dist/{list-workflows-QSJWURCK.js → list-workflows-IMSX7SXU.js} +5 -7
- package/dist/list-workflows-ZHTX5LCL.js +33 -0
- package/dist/{rename-prompt-tag-EKWU5QF3.js → rename-prompt-tag-IQI7MHOI.js} +3 -3
- package/dist/rename-prompt-tag-PA2BRIE6.js +18 -0
- package/dist/rename-test-suite-4J7UX5S2.js +21 -0
- package/dist/rename-test-suite-NNVLMLKY.js +20 -0
- package/dist/report-issue-AS34ZMJF.js +898 -0
- package/dist/report-issue-DCZFLGDO.js +899 -0
- package/dist/rerun-run-plan-TG2V4WM4.js +22 -0
- package/dist/rerun-run-plan-ZI5OY3VA.js +21 -0
- package/dist/revoke-api-key-3J3ZA4UB.js +15 -0
- package/dist/{revoke-api-key-FTRTZMOF.js → revoke-api-key-SFMEFWJC.js} +4 -4
- package/dist/run-agent-W4VJP72Z.js +75 -0
- package/dist/run-agent-YNV6ZHW4.js +74 -0
- package/dist/run-plan-6C77GWG4.js +38 -0
- package/dist/run-plan-PAARQSI4.js +39 -0
- package/dist/run-query-KJDH544C.js +47 -0
- package/dist/run-query-T4QW2Z5O.js +46 -0
- package/dist/run-test-suite-SQJELEZX.js +26 -0
- package/dist/run-test-suite-STB6NUJM.js +25 -0
- package/dist/{run-workflow-QPXC627O.js → run-workflow-D6PQNBI6.js} +4 -4
- package/dist/{run-agent-6SM4XNA7.js → run-workflow-SP32SO5M.js} +10 -11
- package/dist/search-traces-HCBGOG6R.js +170 -0
- package/dist/search-traces-HSTQ6WTQ.js +171 -0
- package/dist/{set-model-provider-3WKT63ZN.js → set-model-provider-GF7NXUJA.js} +4 -4
- package/dist/set-model-provider-KDQ7C4EZ.js +33 -0
- package/dist/{update-agent-SMAEHLXH.js → update-agent-DWG43T2P.js} +4 -4
- package/dist/update-agent-MXNOBS4H.js +20 -0
- package/dist/update-dashboard-widget-CJKJLCDY.js +71 -0
- package/dist/update-dashboard-widget-CYQDS2NR.js +70 -0
- package/dist/update-dataset-DQH3OHOU.js +22 -0
- package/dist/{update-dataset-BDUK7TUO.js → update-dataset-SQZ6T4WX.js} +6 -6
- package/dist/{update-dataset-record-4ZSDRBSW.js → update-dataset-record-3AT4IPBC.js} +4 -4
- package/dist/update-dataset-record-7PLDGTMR.js +19 -0
- package/dist/update-evaluator-4LFTKFPT.js +24 -0
- package/dist/{update-evaluator-LS6TIBY7.js → update-evaluator-IGTX6PX4.js} +4 -4
- package/dist/{update-project-LKVYXENH.js → update-project-PLJIOZS6.js} +4 -4
- package/dist/update-project-QVHSJRUP.js +24 -0
- package/dist/update-prompt-GDKRYJI3.js +140 -0
- package/dist/update-prompt-MY263DYF.js +141 -0
- package/dist/update-scenario-7KA3JDXA.js +34 -0
- package/dist/{update-scenario-NEXCAQI7.js → update-scenario-MOHRQKAQ.js} +11 -4
- package/package.json +39 -44
- package/pyproject.toml +8 -8
- package/src/config.d.ts +4 -0
- package/src/config.ts +20 -29
- package/src/create-mcp-server.ts +1021 -596
- package/src/documentation-fetch.ts +21 -20
- package/src/http-security.ts +166 -135
- package/src/http-server.ts +189 -224
- package/src/index.ts +14 -16
- package/src/langwatch-api-agents.ts +202 -21
- package/src/langwatch-api-annotations.ts +11 -12
- package/src/langwatch-api-api-keys.ts +8 -9
- package/src/langwatch-api-boards.ts +46 -0
- package/src/langwatch-api-dashboard-widgets.ts +112 -0
- package/src/langwatch-api-dashboards.ts +13 -10
- package/src/langwatch-api-datasets.ts +98 -32
- package/src/langwatch-api-evaluators.ts +13 -19
- package/src/langwatch-api-model-providers.ts +4 -4
- package/src/langwatch-api-monitors.ts +14 -18
- package/src/langwatch-api-projects.ts +27 -9
- package/src/langwatch-api-query.ts +114 -0
- package/src/langwatch-api-run-plans.ts +140 -0
- package/src/langwatch-api-scenarios.ts +17 -10
- package/src/langwatch-api-secrets.ts +31 -24
- package/src/langwatch-api-simulation-runs.ts +10 -7
- package/src/langwatch-api-test-suites.ts +116 -0
- package/src/langwatch-api-triggers.ts +96 -34
- package/src/langwatch-api-workflows.ts +9 -9
- package/src/langwatch-api.ts +143 -109
- package/src/public-http-request.ts +21 -12
- package/src/schemas/analytics-metrics.ts +3 -15
- package/src/schemas/create-dataset.ts +3 -4
- package/src/schemas/run-plan.ts +76 -0
- package/src/schemas/suite-fields.ts +132 -0
- package/src/schemas/triggers.ts +365 -0
- package/src/tools/add-dashboard-widget.ts +63 -0
- package/src/tools/archive-project.ts +2 -4
- package/src/tools/archive-run-plan.ts +10 -0
- package/src/tools/archive-scenario.ts +2 -4
- package/src/tools/archive-test-suite.ts +10 -0
- package/src/tools/assign-prompt-tag.ts +6 -2
- package/src/tools/create-agent.ts +1 -1
- package/src/tools/create-annotation.ts +7 -2
- package/src/tools/create-api-key.ts +4 -6
- package/src/tools/create-dashboard.ts +1 -1
- package/src/tools/create-dataset-records.ts +4 -8
- package/src/tools/create-dataset.ts +5 -7
- package/src/tools/create-evaluator.ts +3 -5
- package/src/tools/create-project.ts +2 -2
- package/src/tools/create-prompt-tag.ts +2 -4
- package/src/tools/create-prompt.ts +9 -18
- package/src/tools/create-scenario.ts +11 -5
- package/src/tools/create-test-suite.ts +38 -0
- package/src/tools/create-trigger.ts +55 -0
- package/src/tools/dashboard-exists.ts +25 -0
- package/src/tools/dashboard-widget-queries.ts +32 -0
- package/src/tools/delete-agent.ts +1 -1
- package/src/tools/delete-annotation.ts +1 -1
- package/src/tools/delete-dashboard.ts +1 -1
- package/src/tools/delete-dataset-records.ts +4 -8
- package/src/tools/delete-dataset.ts +3 -7
- package/src/tools/delete-evaluator.ts +4 -6
- package/src/tools/delete-prompt-tag.ts +2 -4
- package/src/tools/delete-workflow.ts +1 -1
- package/src/tools/discover-evaluator-schema.ts +34 -25
- package/src/tools/discover-scenario-schema.ts +86 -12
- package/src/tools/discover-schema.ts +149 -27
- package/src/tools/experiment-run-status.ts +2 -8
- package/src/tools/format-dataset-mutation.ts +5 -10
- package/src/tools/format-run-plan.ts +54 -0
- package/src/tools/format-scenario.ts +12 -0
- package/src/tools/format-suite-details.ts +90 -0
- package/src/tools/get-agent.ts +54 -3
- package/src/tools/get-analytics.ts +52 -46
- package/src/tools/get-dashboard.ts +1 -1
- package/src/tools/get-dataset.ts +34 -16
- package/src/tools/get-evaluator.ts +4 -11
- package/src/tools/get-experiment-results.ts +219 -186
- package/src/tools/get-project.ts +2 -4
- package/src/tools/get-prompt.ts +100 -37
- package/src/tools/get-run-plan.ts +60 -0
- package/src/tools/get-scenario.ts +6 -5
- package/src/tools/get-simulation-run.ts +32 -20
- package/src/tools/get-test-suite.ts +46 -0
- package/src/tools/get-trace.ts +16 -17
- package/src/tools/get-workflow.ts +1 -1
- package/src/tools/list-agents.ts +20 -3
- package/src/tools/list-annotations.ts +8 -5
- package/src/tools/list-api-keys.ts +7 -2
- package/src/tools/list-dashboard-boards.ts +28 -0
- package/src/tools/list-dashboards.ts +1 -1
- package/src/tools/list-dataset-records.ts +8 -6
- package/src/tools/list-datasets.ts +12 -23
- package/src/tools/list-evaluators.ts +4 -8
- package/src/tools/list-experiment-runs.ts +5 -9
- package/src/tools/list-experiments.ts +5 -11
- package/src/tools/list-model-providers.ts +3 -5
- package/src/tools/list-projects.ts +2 -4
- package/src/tools/list-prompt-tags.ts +3 -3
- package/src/tools/list-prompts.ts +4 -8
- package/src/tools/list-run-plans.ts +47 -0
- package/src/tools/list-scenarios.ts +26 -17
- package/src/tools/list-simulation-runs.ts +13 -5
- package/src/tools/list-test-suites.ts +35 -0
- package/src/tools/list-trigger-fires.ts +17 -0
- package/src/tools/list-triggers.ts +39 -0
- package/src/tools/list-workflows.ts +2 -4
- package/src/tools/rename-prompt-tag.ts +1 -1
- package/src/tools/rename-test-suite.ts +15 -0
- package/src/tools/report-issue.ts +5 -9
- package/src/tools/rerun-run-plan.ts +18 -0
- package/src/tools/revoke-api-key.ts +2 -4
- package/src/tools/run-agent.ts +65 -14
- package/src/tools/run-experiment.ts +36 -37
- package/src/tools/run-plan.ts +46 -0
- package/src/tools/run-query.ts +47 -0
- package/src/tools/run-test-suite.ts +27 -0
- package/src/tools/run-workflow.ts +2 -5
- package/src/tools/search-traces.ts +161 -47
- package/src/tools/set-model-provider.ts +4 -6
- package/src/tools/test-agent.ts +18 -0
- package/src/tools/update-agent.ts +1 -1
- package/src/tools/update-dashboard-widget.ts +97 -0
- package/src/tools/update-dataset-record.ts +1 -1
- package/src/tools/update-dataset.ts +5 -7
- package/src/tools/update-evaluator.ts +3 -5
- package/src/tools/update-project.ts +1 -1
- package/src/tools/update-prompt.ts +185 -15
- package/src/tools/update-scenario.ts +11 -5
- package/src/tools/update-test-suite.ts +40 -0
- package/src/utils/date-parsing.ts +1 -1
- package/src/utils/escape-markdown.ts +3 -8
- package/src/utils/format-evaluations.ts +6 -6
- package/src/utils/markdown-table.ts +58 -0
- package/src/utils/trace-id-shape.ts +20 -0
- package/tsconfig.app.json +24 -0
- package/tsconfig.json +19 -12
- package/uv.lock +416 -296
- package/vitest.integration.config.js +10 -0
- package/vitest.scenario.config.js +9 -0
- package/.eslintrc.cjs +0 -36
- package/dist/archive-suite-4T6BSRS7.js +0 -16
- package/dist/chunk-77BNWQ3U.js +0 -86
- package/dist/chunk-A2LEVYQ5.js +0 -217
- package/dist/chunk-TJCXFNDT.js +0 -24
- package/dist/chunk-YZLYHLLI.js +0 -48
- package/dist/config.d.ts +0 -17
- package/dist/create-mcp-server.d.ts +0 -10
- package/dist/create-suite-LZS6QIAF.js +0 -39
- package/dist/delete-evaluator-33SP2JFX.js +0 -16
- package/dist/discover-evaluator-schema-XTAD4X7D.js +0 -2191
- package/dist/discover-scenario-schema-FE64QK2D.js +0 -67
- package/dist/get-agent-Y7MWZ65F.js +0 -29
- package/dist/get-analytics-TETCSOK6.js +0 -73
- package/dist/get-dataset-RCMU5VAH.js +0 -49
- package/dist/get-prompt-OY5B7TRI.js +0 -46
- package/dist/get-suite-J7JVWO6O.js +0 -45
- package/dist/index.d.ts +0 -2
- package/dist/langwatch-api-secrets-BUBSNCNO.js +0 -41
- package/dist/langwatch-api-triggers-EDFUCJN6.js +0 -31
- package/dist/list-agents-KFHKGPXV.js +0 -33
- package/dist/list-scenarios-F2WYNRIE.js +0 -41
- package/dist/list-suites-CRY4VWW6.js +0 -43
- package/dist/report-issue-XYVAPAYJ.js +0 -412
- package/dist/run-suite-NKZCJ2IN.js +0 -30
- package/dist/search-traces-A6HFKPLJ.js +0 -79
- package/dist/update-prompt-ODCRQRN6.js +0 -25
- package/dist/update-suite-SNO3GS7T.js +0 -40
- package/src/__tests__/all-tools.integration.test.ts +0 -1626
- package/src/__tests__/config.unit.test.ts +0 -202
- package/src/__tests__/datasets.integration.test.ts +0 -620
- package/src/__tests__/datasets.unit.test.ts +0 -244
- package/src/__tests__/date-parsing.unit.test.ts +0 -78
- package/src/__tests__/discover-evaluator-schema.unit.test.ts +0 -89
- package/src/__tests__/discover-schema.unit.test.ts +0 -118
- package/src/__tests__/docker.integration.test.ts +0 -318
- package/src/__tests__/documentation-fetch-security.integration.test.ts +0 -182
- package/src/__tests__/evaluator-tools.unit.test.ts +0 -262
- package/src/__tests__/experiment-list-tools.unit.test.ts +0 -157
- package/src/__tests__/experiment-status.unit.test.ts +0 -194
- package/src/__tests__/feature-map-tool-drift.unit.test.ts +0 -93
- package/src/__tests__/get-experiment-results.unit.test.ts +0 -313
- package/src/__tests__/http-security-origin.unit.test.ts +0 -97
- package/src/__tests__/http-security-sessions.unit.test.ts +0 -209
- package/src/__tests__/http-security-verifier.unit.test.ts +0 -248
- package/src/__tests__/http-server-allocation.integration.test.ts +0 -279
- package/src/__tests__/http-server-origin.integration.test.ts +0 -169
- package/src/__tests__/http-server-session-auth.integration.test.ts +0 -341
- package/src/__tests__/http-transport.integration.test.ts +0 -395
- package/src/__tests__/integration.integration.test.ts +0 -288
- package/src/__tests__/langwatch-api.unit.test.ts +0 -661
- package/src/__tests__/model-provider-tools.unit.test.ts +0 -190
- package/src/__tests__/project-api-key-tools.unit.test.ts +0 -451
- package/src/__tests__/public-http-request-security.integration.test.ts +0 -118
- package/src/__tests__/report-issue.integration.test.ts +0 -147
- package/src/__tests__/scenario-tools.integration.test.ts +0 -286
- package/src/__tests__/scenario-tools.unit.test.ts +0 -188
- package/src/__tests__/schemas.unit.test.ts +0 -85
- package/src/__tests__/support/http-server-harness.ts +0 -138
- package/src/__tests__/tools.unit.test.ts +0 -924
- package/src/langwatch-api-suites.ts +0 -118
- package/src/schemas/filter-fields.ts +0 -119
- package/src/schemas/index.ts +0 -4
- package/src/tools/archive-suite.ts +0 -12
- package/src/tools/create-suite.ts +0 -42
- package/src/tools/get-suite.ts +0 -47
- package/src/tools/list-suites.ts +0 -43
- package/src/tools/run-suite.ts +0 -28
- package/src/tools/update-suite.ts +0 -44
|
@@ -1,412 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getConfig
|
|
3
|
-
} from "./chunk-WT4PO4A3.js";
|
|
4
|
-
import "./chunk-SAS5OB7F.js";
|
|
5
|
-
|
|
6
|
-
// ../../packages/redaction/src/markers.ts
|
|
7
|
-
var SECRET_MARKER = "[SECRET]";
|
|
8
|
-
function formatPiiMarker(entity) {
|
|
9
|
-
return `[${entity}]`;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
// ../../packages/redaction/src/secrets.ts
|
|
13
|
-
var SECRETS_REDACTION_MARKER = SECRET_MARKER;
|
|
14
|
-
var REPLACEMENT = SECRETS_REDACTION_MARKER;
|
|
15
|
-
var MAX_SCAN_LENGTH = 25e4;
|
|
16
|
-
var VALUE_RULES = [
|
|
17
|
-
{
|
|
18
|
-
id: "pem_private_key",
|
|
19
|
-
description: "PEM private key block",
|
|
20
|
-
regex: /-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY-----/g
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
id: "aws_access_key_id",
|
|
24
|
-
description: "AWS access key id",
|
|
25
|
-
regex: /\b(?:AKIA|ASIA|AGPA|AIDA|AROA|ANPA|ANVA)[0-9A-Z]{16}\b/g
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
id: "github_token",
|
|
29
|
-
description: "GitHub token",
|
|
30
|
-
regex: /\b(?:gh[posru]_[A-Za-z0-9]{36,}|github_pat_[A-Za-z0-9_]{60,})\b/g
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
// Provider secret keys share the `sk-` namespace: OpenAI (`sk-proj-...`,
|
|
34
|
-
// legacy `sk-...`), Anthropic (`sk-ant-...`), LangWatch (`sk-lw-...`), and
|
|
35
|
-
// others. The body is base64url, so it includes `_` and `-` and has no inner
|
|
36
|
-
// word boundary; matching the whole token and stopping at the next non-key
|
|
37
|
-
// char catches modern keys a `[A-Za-z0-9]+\b` rule misses.
|
|
38
|
-
id: "provider_api_key",
|
|
39
|
-
description: "Provider API key (sk-...)",
|
|
40
|
-
regex: /\bsk-[A-Za-z0-9_-]{20,}(?![A-Za-z0-9_-])/g
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
id: "stripe_secret_key",
|
|
44
|
-
description: "Stripe secret key",
|
|
45
|
-
regex: /\b[rs]k_(?:live|test)_[A-Za-z0-9]{16,}\b/g
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
id: "slack_token",
|
|
49
|
-
description: "Slack token",
|
|
50
|
-
regex: /\bxox[abposr]-[A-Za-z0-9-]{10,}\b/g
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
id: "google_api_key",
|
|
54
|
-
description: "Google API key",
|
|
55
|
-
regex: /\bAIza[0-9A-Za-z_-]{35}\b/g
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
id: "jwt",
|
|
59
|
-
description: "JSON Web Token",
|
|
60
|
-
regex: /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
id: "url_credentials",
|
|
64
|
-
description: "Password embedded in a connection URL",
|
|
65
|
-
// scheme://user:password@host -> keep everything but the password. The
|
|
66
|
-
// scheme length is bounded (real schemes are short) so a long run of
|
|
67
|
-
// name-like characters costs constant backtracking per position instead
|
|
68
|
-
// of a quadratic scan on huge inputs.
|
|
69
|
-
regex: /([a-z][a-z0-9+.-]{0,30}:\/\/[^\s:@/]+:)([^\s:@/]+)(@)/gi,
|
|
70
|
-
render: (_m, prefix, _password, at) => `${prefix}${REPLACEMENT}${at}`
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
id: "bearer_token",
|
|
74
|
-
description: "Bearer authorization token",
|
|
75
|
-
regex: /\b(Bearer\s+)[A-Za-z0-9._~+/-]{10,}=*/gi,
|
|
76
|
-
render: (_m, prefix) => `${prefix}${REPLACEMENT}`
|
|
77
|
-
}
|
|
78
|
-
];
|
|
79
|
-
var BUILTIN_SECRET_RULES = VALUE_RULES.map(({ id, description }) => ({ id, description }));
|
|
80
|
-
var SENSITIVE_KEY_REGEX = /(?:^|[._-])(?:password|passwd|pwd|secret|api[_-]?key|apikey|access[_-]?token|auth[_-]?token|authorization|auth|bearer|credentials?|private[_-]?key|client[_-]?secret|db[_-]?password|connection[_-]?string|session[_-]?token|refresh[_-]?token|set[_-]?cookie|cookie|x-api-key)(?:$|[._-])/i;
|
|
81
|
-
function isSensitiveAttributeKey(key) {
|
|
82
|
-
return SENSITIVE_KEY_REGEX.test(key);
|
|
83
|
-
}
|
|
84
|
-
var VALUE_BOUNDARY = /["'`]/;
|
|
85
|
-
function keptLengthAtBoundary(match) {
|
|
86
|
-
const index = match.search(VALUE_BOUNDARY);
|
|
87
|
-
return index === -1 ? match.length : index;
|
|
88
|
-
}
|
|
89
|
-
function redactSecretsInText({
|
|
90
|
-
text,
|
|
91
|
-
customPatterns = []
|
|
92
|
-
}) {
|
|
93
|
-
if (typeof text !== "string" || text.length === 0 || text.length > MAX_SCAN_LENGTH) {
|
|
94
|
-
return { text, redactedCount: 0 };
|
|
95
|
-
}
|
|
96
|
-
let redactedCount = 0;
|
|
97
|
-
let result = text;
|
|
98
|
-
for (const rule of VALUE_RULES) {
|
|
99
|
-
result = result.replace(rule.regex, (...args) => {
|
|
100
|
-
if (rule.render) {
|
|
101
|
-
redactedCount++;
|
|
102
|
-
return rule.render(...args);
|
|
103
|
-
}
|
|
104
|
-
const full = args[0] ?? "";
|
|
105
|
-
const kept = keptLengthAtBoundary(full);
|
|
106
|
-
if (kept === 0) return full;
|
|
107
|
-
redactedCount++;
|
|
108
|
-
return REPLACEMENT + full.slice(kept);
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
for (const pattern of customPatterns) {
|
|
112
|
-
result = result.replace(pattern, (...args) => {
|
|
113
|
-
const full = args[0] ?? "";
|
|
114
|
-
const kept = keptLengthAtBoundary(full);
|
|
115
|
-
if (kept === 0) return full;
|
|
116
|
-
redactedCount++;
|
|
117
|
-
return REPLACEMENT + full.slice(kept);
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
return { text: result, redactedCount };
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// ../../packages/redaction/src/sessionReport.ts
|
|
124
|
-
var EMAIL_MARKER = formatPiiMarker("EMAIL_ADDRESS");
|
|
125
|
-
var PHONE_MARKER = formatPiiMarker("PHONE_NUMBER");
|
|
126
|
-
var CARD_MARKER = formatPiiMarker("CREDIT_CARD");
|
|
127
|
-
var IP_MARKER = formatPiiMarker("IP_ADDRESS");
|
|
128
|
-
var ENV_SECRET_NAME_REGEX = /(?:^|[._-])(?:key|token|secret|password|passwd|pwd|credentials?|auth)(?:$|[._-])/i;
|
|
129
|
-
var MIN_ENV_SECRET_LENGTH = 8;
|
|
130
|
-
function collectSensitiveEnvValues(env) {
|
|
131
|
-
const values = /* @__PURE__ */ new Set();
|
|
132
|
-
for (const [name, value] of Object.entries(env)) {
|
|
133
|
-
if (!value) continue;
|
|
134
|
-
const trimmed = value.trim();
|
|
135
|
-
if (trimmed.length < MIN_ENV_SECRET_LENGTH) continue;
|
|
136
|
-
if (!ENV_SECRET_NAME_REGEX.test(name)) continue;
|
|
137
|
-
values.add(trimmed);
|
|
138
|
-
}
|
|
139
|
-
return [...values].sort((a, b) => b.length - a.length);
|
|
140
|
-
}
|
|
141
|
-
var EMAIL_REGEX = /[A-Za-z0-9._%+-]{1,64}@[A-Za-z0-9.-]{1,253}\.[A-Za-z]{2,24}/g;
|
|
142
|
-
var INTL_PHONE_REGEX = /(?<![\w.+-])\+[1-9]\d{0,2}(?:[\s.-]?(?:\(\d{1,4}\)[\s.-]?)?\d{1,4}){1,5}(?!\d)/g;
|
|
143
|
-
var NATIONAL_PHONE_REGEX = /(?<!\d)(?:\(\d{3}\)[\s.-]?|\d{3}[.-])\d{3}[.-]\d{4}(?!\d)/g;
|
|
144
|
-
var CARD_REGEX = /(?<![\d.-])\d(?:[ -]?\d){12,18}(?![\d.-])/g;
|
|
145
|
-
var IPV4_REGEX = /\b(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\b/g;
|
|
146
|
-
var countDigits = (value) => value.replace(/\D/g, "").length;
|
|
147
|
-
function passesLuhn(digits) {
|
|
148
|
-
let sum = 0;
|
|
149
|
-
let double = false;
|
|
150
|
-
for (let i = digits.length - 1; i >= 0; i--) {
|
|
151
|
-
let d = digits.charCodeAt(i) - 48;
|
|
152
|
-
if (double) {
|
|
153
|
-
d *= 2;
|
|
154
|
-
if (d > 9) d -= 9;
|
|
155
|
-
}
|
|
156
|
-
sum += d;
|
|
157
|
-
double = !double;
|
|
158
|
-
}
|
|
159
|
-
return sum % 10 === 0;
|
|
160
|
-
}
|
|
161
|
-
function isCardNumber(candidate) {
|
|
162
|
-
const digits = candidate.replace(/[ -]/g, "");
|
|
163
|
-
if (!/^\d+$/.test(digits)) return false;
|
|
164
|
-
const separated = /[ -]/.test(candidate);
|
|
165
|
-
if (!separated && (digits.length < 14 || digits.length > 16)) return false;
|
|
166
|
-
if (digits.length < 13 || digits.length > 19) return false;
|
|
167
|
-
return passesLuhn(digits);
|
|
168
|
-
}
|
|
169
|
-
function isPrivateOrLocalIp(ip) {
|
|
170
|
-
const parts = ip.split(".").map(Number);
|
|
171
|
-
const [a = 0, b = 0] = parts;
|
|
172
|
-
if (a === 0 || a === 10 || a === 127) return true;
|
|
173
|
-
if (a === 192 && b === 168) return true;
|
|
174
|
-
if (a === 172 && b >= 16 && b <= 31) return true;
|
|
175
|
-
if (a === 169 && b === 254) return true;
|
|
176
|
-
if (a === 100 && b >= 64 && b <= 127) return true;
|
|
177
|
-
if (a >= 224) return true;
|
|
178
|
-
return false;
|
|
179
|
-
}
|
|
180
|
-
var SLICE_TARGET = 2e5;
|
|
181
|
-
function sliceLongText(text) {
|
|
182
|
-
if (text.length <= SLICE_TARGET) return [text];
|
|
183
|
-
const slices = [];
|
|
184
|
-
let start = 0;
|
|
185
|
-
while (start < text.length) {
|
|
186
|
-
let end = Math.min(start + SLICE_TARGET, text.length);
|
|
187
|
-
if (end < text.length) {
|
|
188
|
-
const newline = text.lastIndexOf("\n", end);
|
|
189
|
-
if (newline > start + SLICE_TARGET / 2) end = newline;
|
|
190
|
-
}
|
|
191
|
-
slices.push(text.slice(start, end));
|
|
192
|
-
start = end;
|
|
193
|
-
}
|
|
194
|
-
return slices;
|
|
195
|
-
}
|
|
196
|
-
function redactPiiPatterns(text) {
|
|
197
|
-
let redactedCount = 0;
|
|
198
|
-
let result = text.replace(EMAIL_REGEX, () => {
|
|
199
|
-
redactedCount++;
|
|
200
|
-
return EMAIL_MARKER;
|
|
201
|
-
});
|
|
202
|
-
result = result.replace(CARD_REGEX, (match) => {
|
|
203
|
-
if (!isCardNumber(match)) return match;
|
|
204
|
-
redactedCount++;
|
|
205
|
-
return CARD_MARKER;
|
|
206
|
-
});
|
|
207
|
-
result = result.replace(INTL_PHONE_REGEX, (match) => {
|
|
208
|
-
const digits = countDigits(match);
|
|
209
|
-
if (digits < 7 || digits > 15) return match;
|
|
210
|
-
redactedCount++;
|
|
211
|
-
return PHONE_MARKER;
|
|
212
|
-
});
|
|
213
|
-
result = result.replace(NATIONAL_PHONE_REGEX, () => {
|
|
214
|
-
redactedCount++;
|
|
215
|
-
return PHONE_MARKER;
|
|
216
|
-
});
|
|
217
|
-
result = result.replace(IPV4_REGEX, (match) => {
|
|
218
|
-
if (isPrivateOrLocalIp(match)) return match;
|
|
219
|
-
redactedCount++;
|
|
220
|
-
return IP_MARKER;
|
|
221
|
-
});
|
|
222
|
-
return { text: result, redactedCount };
|
|
223
|
-
}
|
|
224
|
-
function scrubEnvLiterals(text, envValues) {
|
|
225
|
-
let result = text;
|
|
226
|
-
let redactedCount = 0;
|
|
227
|
-
for (const value of envValues) {
|
|
228
|
-
if (!result.includes(value)) continue;
|
|
229
|
-
const parts = result.split(value);
|
|
230
|
-
redactedCount += parts.length - 1;
|
|
231
|
-
result = parts.join(SECRET_MARKER);
|
|
232
|
-
}
|
|
233
|
-
return { text: result, redactedCount };
|
|
234
|
-
}
|
|
235
|
-
function redactReportText({
|
|
236
|
-
text,
|
|
237
|
-
envValues = []
|
|
238
|
-
}) {
|
|
239
|
-
if (typeof text !== "string" || text.length === 0) {
|
|
240
|
-
return { text, redactedCount: 0 };
|
|
241
|
-
}
|
|
242
|
-
const envPass = scrubEnvLiterals(text, envValues);
|
|
243
|
-
let redactedCount = envPass.redactedCount;
|
|
244
|
-
const pieces = sliceLongText(envPass.text).map((slice) => {
|
|
245
|
-
const secrets = redactSecretsInText({ text: slice });
|
|
246
|
-
redactedCount += secrets.redactedCount;
|
|
247
|
-
const pii = redactPiiPatterns(secrets.text);
|
|
248
|
-
redactedCount += pii.redactedCount;
|
|
249
|
-
return pii.text;
|
|
250
|
-
});
|
|
251
|
-
return { text: pieces.join(""), redactedCount };
|
|
252
|
-
}
|
|
253
|
-
function redactJsonValue(value, envValues, count) {
|
|
254
|
-
if (typeof value === "string") {
|
|
255
|
-
const result = redactReportText({ text: value, envValues });
|
|
256
|
-
count.redacted += result.redactedCount;
|
|
257
|
-
return result.text;
|
|
258
|
-
}
|
|
259
|
-
if (Array.isArray(value)) {
|
|
260
|
-
return value.map((item) => redactJsonValue(item, envValues, count));
|
|
261
|
-
}
|
|
262
|
-
if (value && typeof value === "object") {
|
|
263
|
-
const out = {};
|
|
264
|
-
for (const [key, entry] of Object.entries(value)) {
|
|
265
|
-
if (isSensitiveAttributeKey(key) && entry !== null && entry !== void 0) {
|
|
266
|
-
out[key] = SECRET_MARKER;
|
|
267
|
-
count.redacted++;
|
|
268
|
-
continue;
|
|
269
|
-
}
|
|
270
|
-
out[key] = redactJsonValue(entry, envValues, count);
|
|
271
|
-
}
|
|
272
|
-
return out;
|
|
273
|
-
}
|
|
274
|
-
return value;
|
|
275
|
-
}
|
|
276
|
-
function redactSessionJsonl({
|
|
277
|
-
jsonl,
|
|
278
|
-
envValues = []
|
|
279
|
-
}) {
|
|
280
|
-
let redactedCount = 0;
|
|
281
|
-
const lines = jsonl.split("\n").map((line) => {
|
|
282
|
-
if (line.trim().length === 0) return line;
|
|
283
|
-
try {
|
|
284
|
-
const parsed = JSON.parse(line);
|
|
285
|
-
const count = { redacted: 0 };
|
|
286
|
-
const redacted = redactJsonValue(parsed, envValues, count);
|
|
287
|
-
redactedCount += count.redacted;
|
|
288
|
-
return JSON.stringify(redacted);
|
|
289
|
-
} catch {
|
|
290
|
-
const result = redactReportText({ text: line, envValues });
|
|
291
|
-
redactedCount += result.redactedCount;
|
|
292
|
-
return result.text;
|
|
293
|
-
}
|
|
294
|
-
});
|
|
295
|
-
return { text: lines.join("\n"), redactedCount };
|
|
296
|
-
}
|
|
297
|
-
function truncateJsonlToByteBudget({
|
|
298
|
-
jsonl,
|
|
299
|
-
maxBytes
|
|
300
|
-
}) {
|
|
301
|
-
const encoder = new TextEncoder();
|
|
302
|
-
if (encoder.encode(jsonl).length <= maxBytes) {
|
|
303
|
-
return { text: jsonl, truncated: false };
|
|
304
|
-
}
|
|
305
|
-
const lines = jsonl.split("\n");
|
|
306
|
-
const kept = [];
|
|
307
|
-
let used = 0;
|
|
308
|
-
for (let i = lines.length - 1; i >= 0; i--) {
|
|
309
|
-
const line = lines[i] ?? "";
|
|
310
|
-
const size = encoder.encode(line).length + 1;
|
|
311
|
-
if (used + size > maxBytes) break;
|
|
312
|
-
kept.unshift(line);
|
|
313
|
-
used += size;
|
|
314
|
-
}
|
|
315
|
-
return { text: kept.join("\n"), truncated: true };
|
|
316
|
-
}
|
|
317
|
-
var REDACTION_AUDIT_URL = "https://github.com/langwatch/langwatch/blob/main/packages/redaction/src/sessionReport.ts";
|
|
318
|
-
|
|
319
|
-
// src/tools/report-issue.ts
|
|
320
|
-
var MAX_SESSION_BYTES = 8 * 1024 * 1024;
|
|
321
|
-
var REQUEST_TIMEOUT_MS = 6e4;
|
|
322
|
-
function redactReport(params) {
|
|
323
|
-
const envValues = collectSensitiveEnvValues(process.env);
|
|
324
|
-
let redactedCount = 0;
|
|
325
|
-
const titleResult = redactReportText({ text: params.title, envValues });
|
|
326
|
-
redactedCount += titleResult.redactedCount;
|
|
327
|
-
let summary;
|
|
328
|
-
if (params.summary) {
|
|
329
|
-
const result = redactReportText({ text: params.summary, envValues });
|
|
330
|
-
summary = result.text;
|
|
331
|
-
redactedCount += result.redactedCount;
|
|
332
|
-
}
|
|
333
|
-
let sessionData;
|
|
334
|
-
let sessionTruncated = false;
|
|
335
|
-
if (params.session_content) {
|
|
336
|
-
const redacted = redactSessionJsonl({
|
|
337
|
-
jsonl: params.session_content,
|
|
338
|
-
envValues
|
|
339
|
-
});
|
|
340
|
-
redactedCount += redacted.redactedCount;
|
|
341
|
-
const truncated = truncateJsonlToByteBudget({
|
|
342
|
-
jsonl: redacted.text,
|
|
343
|
-
maxBytes: MAX_SESSION_BYTES
|
|
344
|
-
});
|
|
345
|
-
sessionData = truncated.text;
|
|
346
|
-
sessionTruncated = truncated.truncated;
|
|
347
|
-
}
|
|
348
|
-
return {
|
|
349
|
-
title: titleResult.text,
|
|
350
|
-
summary,
|
|
351
|
-
sessionData,
|
|
352
|
-
sessionTruncated,
|
|
353
|
-
redactedCount
|
|
354
|
-
};
|
|
355
|
-
}
|
|
356
|
-
async function deliverReport(report, params) {
|
|
357
|
-
const config = getConfig();
|
|
358
|
-
const endpoint = config.endpoint.replace(/\/+$/, "");
|
|
359
|
-
const response = await fetch(`${endpoint}/api/bug-reports`, {
|
|
360
|
-
method: "POST",
|
|
361
|
-
headers: {
|
|
362
|
-
"content-type": "application/json",
|
|
363
|
-
...config.apiKey ? { authorization: `Bearer ${config.apiKey}` } : {}
|
|
364
|
-
},
|
|
365
|
-
body: JSON.stringify({
|
|
366
|
-
source: "mcp",
|
|
367
|
-
kind: report.sessionData ? "full_session" : "summary",
|
|
368
|
-
title: report.title,
|
|
369
|
-
...report.summary ? { summary: report.summary } : {},
|
|
370
|
-
...report.sessionData ? { sessionData: report.sessionData, sessionTruncated: report.sessionTruncated } : {},
|
|
371
|
-
...params.agent ? { agent: params.agent } : {},
|
|
372
|
-
...params.contact_email ? { contactEmail: params.contact_email } : {}
|
|
373
|
-
}),
|
|
374
|
-
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
|
|
375
|
-
}).catch(() => {
|
|
376
|
-
throw new Error(
|
|
377
|
-
`Could not reach ${endpoint} to deliver the report. Retry in a moment; if it keeps failing, email support@langwatch.ai with the same content.`
|
|
378
|
-
);
|
|
379
|
-
});
|
|
380
|
-
if (!response.ok) {
|
|
381
|
-
const body = (await response.text().catch(() => "")).slice(0, 300);
|
|
382
|
-
throw new Error(
|
|
383
|
-
`The reports endpoint answered HTTP ${response.status}: ${body}. Retry in a moment; if it keeps failing, email support@langwatch.ai.`
|
|
384
|
-
);
|
|
385
|
-
}
|
|
386
|
-
const { id } = await response.json();
|
|
387
|
-
return id;
|
|
388
|
-
}
|
|
389
|
-
async function handleReportIssue(params) {
|
|
390
|
-
if (!params.user_approved) {
|
|
391
|
-
throw new Error(
|
|
392
|
-
`This sends a report to the LangWatch team, so the user must approve it first. Ask the user: "Can I send this issue report to LangWatch to help them fix it?" If they agree, call again with user_approved=true. Secrets and personal data are redacted locally before sending; audit the rules at ${REDACTION_AUDIT_URL}`
|
|
393
|
-
);
|
|
394
|
-
}
|
|
395
|
-
if (!params.summary?.trim() && !params.session_content?.trim()) {
|
|
396
|
-
throw new Error(
|
|
397
|
-
"Nothing to report: pass a summary (what you tried, verbatim errors, what you had to figure out), session_content, or both."
|
|
398
|
-
);
|
|
399
|
-
}
|
|
400
|
-
const report = redactReport(params);
|
|
401
|
-
const id = await deliverReport(report, params);
|
|
402
|
-
return [
|
|
403
|
-
`Report sent to the LangWatch team (${id}). Thank you!`,
|
|
404
|
-
`Redacted ${report.redactedCount} sensitive value${report.redactedCount === 1 ? "" : "s"} locally before sending.`,
|
|
405
|
-
...report.sessionTruncated ? ["The session content was truncated to the most recent activity to fit the upload limit."] : [],
|
|
406
|
-
"Reports like this directly shape what gets fixed next."
|
|
407
|
-
].join(" ");
|
|
408
|
-
}
|
|
409
|
-
export {
|
|
410
|
-
handleReportIssue
|
|
411
|
-
};
|
|
412
|
-
//# sourceMappingURL=report-issue-XYVAPAYJ.js.map
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
runSuite
|
|
3
|
-
} from "./chunk-YZLYHLLI.js";
|
|
4
|
-
import "./chunk-A2LEVYQ5.js";
|
|
5
|
-
import "./chunk-WT4PO4A3.js";
|
|
6
|
-
import "./chunk-SAS5OB7F.js";
|
|
7
|
-
|
|
8
|
-
// src/tools/run-suite.ts
|
|
9
|
-
async function handleRunSuite(params) {
|
|
10
|
-
const result = await runSuite(params.id);
|
|
11
|
-
const lines = [];
|
|
12
|
-
lines.push(`Suite run scheduled successfully.`);
|
|
13
|
-
lines.push("");
|
|
14
|
-
lines.push(`**Batch Run ID**: ${result.batchRunId}`);
|
|
15
|
-
lines.push(`**Jobs**: ${result.jobCount}`);
|
|
16
|
-
lines.push(`**Set ID**: ${result.setId}`);
|
|
17
|
-
if (result.skippedArchived.scenarios.length > 0) {
|
|
18
|
-
lines.push(`
|
|
19
|
-
\u26A0\uFE0F Skipped archived scenarios: ${result.skippedArchived.scenarios.join(", ")}`);
|
|
20
|
-
}
|
|
21
|
-
if (result.skippedArchived.targets.length > 0) {
|
|
22
|
-
lines.push(`\u26A0\uFE0F Skipped archived targets: ${result.skippedArchived.targets.join(", ")}`);
|
|
23
|
-
}
|
|
24
|
-
lines.push("\nView results in the LangWatch dashboard under Simulations.");
|
|
25
|
-
return lines.join("\n");
|
|
26
|
-
}
|
|
27
|
-
export {
|
|
28
|
-
handleRunSuite
|
|
29
|
-
};
|
|
30
|
-
//# sourceMappingURL=run-suite-NKZCJ2IN.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-A2LEVYQ5.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-A6HFKPLJ.js.map
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
updatePrompt
|
|
3
|
-
} from "./chunk-A2LEVYQ5.js";
|
|
4
|
-
import "./chunk-WT4PO4A3.js";
|
|
5
|
-
import "./chunk-SAS5OB7F.js";
|
|
6
|
-
|
|
7
|
-
// src/tools/update-prompt.ts
|
|
8
|
-
async function handleUpdatePrompt(params) {
|
|
9
|
-
const { idOrHandle, ...data } = params;
|
|
10
|
-
const result = await updatePrompt(idOrHandle, data);
|
|
11
|
-
const lines = [];
|
|
12
|
-
lines.push("Prompt updated successfully!\n");
|
|
13
|
-
if (result.id) lines.push(`**ID**: ${result.id}`);
|
|
14
|
-
if (result.handle) lines.push(`**Handle**: ${result.handle}`);
|
|
15
|
-
if (result.latestVersionNumber != null)
|
|
16
|
-
lines.push(`**Version**: v${result.latestVersionNumber}`);
|
|
17
|
-
lines.push(`**Commit**: ${params.commitMessage}`);
|
|
18
|
-
if (params.tags && params.tags.length > 0)
|
|
19
|
-
lines.push(`**Tags**: ${params.tags.join(", ")}`);
|
|
20
|
-
return lines.join("\n");
|
|
21
|
-
}
|
|
22
|
-
export {
|
|
23
|
-
handleUpdatePrompt
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=update-prompt-ODCRQRN6.js.map
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
updateSuite
|
|
3
|
-
} from "./chunk-YZLYHLLI.js";
|
|
4
|
-
import "./chunk-A2LEVYQ5.js";
|
|
5
|
-
import "./chunk-WT4PO4A3.js";
|
|
6
|
-
import "./chunk-SAS5OB7F.js";
|
|
7
|
-
|
|
8
|
-
// src/tools/update-suite.ts
|
|
9
|
-
async function handleUpdateSuite(params) {
|
|
10
|
-
let parsedTargets;
|
|
11
|
-
if (params.targets) {
|
|
12
|
-
try {
|
|
13
|
-
parsedTargets = JSON.parse(params.targets);
|
|
14
|
-
} catch {
|
|
15
|
-
return "Error: `targets` must be a valid JSON array.";
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
const suite = await updateSuite({
|
|
19
|
-
id: params.id,
|
|
20
|
-
name: params.name,
|
|
21
|
-
description: params.description,
|
|
22
|
-
scenarioIds: params.scenarioIds,
|
|
23
|
-
targets: parsedTargets,
|
|
24
|
-
repeatCount: params.repeatCount,
|
|
25
|
-
labels: params.labels
|
|
26
|
-
});
|
|
27
|
-
return [
|
|
28
|
-
`Suite "${suite.name}" updated successfully.`,
|
|
29
|
-
"",
|
|
30
|
-
`**ID**: ${suite.id}`,
|
|
31
|
-
`**Slug**: ${suite.slug}`,
|
|
32
|
-
`**Scenarios**: ${suite.scenarioIds.length}`,
|
|
33
|
-
`**Targets**: ${suite.targets.length}`,
|
|
34
|
-
`**Repeat**: ${suite.repeatCount}x`
|
|
35
|
-
].join("\n");
|
|
36
|
-
}
|
|
37
|
-
export {
|
|
38
|
-
handleUpdateSuite
|
|
39
|
-
};
|
|
40
|
-
//# sourceMappingURL=update-suite-SNO3GS7T.js.map
|