@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,6 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
makeRequest
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UWLE5T2F.js";
|
|
4
|
+
|
|
5
|
+
// src/langwatch-api-agents.ts
|
|
6
|
+
import { z } from "zod";
|
|
4
7
|
|
|
5
8
|
// src/public-http-request.ts
|
|
6
9
|
import { lookup as dnsLookup } from "dns/promises";
|
|
@@ -8,7 +11,7 @@ import { request as httpRequest } from "http";
|
|
|
8
11
|
import { request as httpsRequest } from "https";
|
|
9
12
|
import { isIP } from "net";
|
|
10
13
|
|
|
11
|
-
// ../../packages/
|
|
14
|
+
// ../../packages/egress/src/ssrf/address.ts
|
|
12
15
|
function ipv4ToBytes(input) {
|
|
13
16
|
const parts = input.split(".");
|
|
14
17
|
if (parts.length !== 4) return null;
|
|
@@ -21,6 +24,25 @@ function ipv4ToBytes(input) {
|
|
|
21
24
|
}
|
|
22
25
|
return bytes;
|
|
23
26
|
}
|
|
27
|
+
function parseIpv6Groups(part) {
|
|
28
|
+
if (part === "") return [];
|
|
29
|
+
const out = [];
|
|
30
|
+
for (const group of part.split(":")) {
|
|
31
|
+
if (!/^[0-9a-fA-F]{1,4}$/.test(group)) return null;
|
|
32
|
+
out.push(parseInt(group, 16));
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
function expandIpv6Groups(halves) {
|
|
37
|
+
const head = parseIpv6Groups(halves[0]);
|
|
38
|
+
if (head === null) return null;
|
|
39
|
+
if (halves.length !== 2) return head;
|
|
40
|
+
const tail = parseIpv6Groups(halves[1]);
|
|
41
|
+
if (tail === null) return null;
|
|
42
|
+
const missing = 8 - head.length - tail.length;
|
|
43
|
+
if (missing < 0) return null;
|
|
44
|
+
return [...head, ...Array.from({ length: missing }, () => 0), ...tail];
|
|
45
|
+
}
|
|
24
46
|
function ipv6ToBytes(input) {
|
|
25
47
|
let s = input;
|
|
26
48
|
const zone = s.indexOf("%");
|
|
@@ -36,27 +58,8 @@ function ipv6ToBytes(input) {
|
|
|
36
58
|
}
|
|
37
59
|
const halves = s.split("::");
|
|
38
60
|
if (halves.length > 2) return null;
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
const out = [];
|
|
42
|
-
for (const g of part.split(":")) {
|
|
43
|
-
if (!/^[0-9a-fA-F]{1,4}$/.test(g)) return null;
|
|
44
|
-
out.push(parseInt(g, 16));
|
|
45
|
-
}
|
|
46
|
-
return out;
|
|
47
|
-
};
|
|
48
|
-
const head = parseGroups(halves[0]);
|
|
49
|
-
if (head === null) return null;
|
|
50
|
-
let groups;
|
|
51
|
-
if (halves.length === 2) {
|
|
52
|
-
const tail = parseGroups(halves[1]);
|
|
53
|
-
if (tail === null) return null;
|
|
54
|
-
const missing = 8 - head.length - tail.length;
|
|
55
|
-
if (missing < 0) return null;
|
|
56
|
-
groups = [...head, ...new Array(missing).fill(0), ...tail];
|
|
57
|
-
} else {
|
|
58
|
-
groups = head;
|
|
59
|
-
}
|
|
61
|
+
const groups = expandIpv6Groups(halves);
|
|
62
|
+
if (groups === null) return null;
|
|
60
63
|
if (groups.length !== 8) return null;
|
|
61
64
|
const bytes = new Uint8Array(16);
|
|
62
65
|
for (let i = 0; i < 8; i++) {
|
|
@@ -68,24 +71,31 @@ function ipv6ToBytes(input) {
|
|
|
68
71
|
function ipToBytes(ip) {
|
|
69
72
|
return ip.includes(":") ? ipv6ToBytes(ip) : ipv4ToBytes(ip);
|
|
70
73
|
}
|
|
74
|
+
function zeroBetween({
|
|
75
|
+
bytes,
|
|
76
|
+
from,
|
|
77
|
+
to
|
|
78
|
+
}) {
|
|
79
|
+
for (let i = from; i < to; i++) {
|
|
80
|
+
if (bytes[i] !== 0) return false;
|
|
81
|
+
}
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
71
84
|
function unmap(bytes) {
|
|
72
85
|
if (bytes.length !== 16) return bytes;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return bytes;
|
|
86
|
+
if (!zeroBetween({ bytes, from: 0, to: 8 })) return bytes;
|
|
87
|
+
const mapped = zeroBetween({ bytes, from: 8, to: 10 }) && bytes[10] === 255 && bytes[11] === 255;
|
|
88
|
+
const compatible = zeroBetween({ bytes, from: 8, to: 12 });
|
|
89
|
+
const translated = bytes[8] === 255 && bytes[9] === 255 && zeroBetween({ bytes, from: 10, to: 12 });
|
|
90
|
+
return mapped || compatible || translated ? bytes.slice(12, 16) : bytes;
|
|
78
91
|
}
|
|
79
92
|
function parsePrefix({ cidr, rfc }) {
|
|
80
93
|
const slash = cidr.lastIndexOf("/");
|
|
81
94
|
const bytes = ipToBytes(cidr.slice(0, slash));
|
|
82
|
-
if (!bytes) throw new Error(
|
|
95
|
+
if (!bytes) throw new Error(`ssrf: bad prefix ${cidr}`);
|
|
83
96
|
return { bytes, bits: Number(cidr.slice(slash + 1)), rfc };
|
|
84
97
|
}
|
|
85
|
-
function prefixContains({
|
|
86
|
-
prefix,
|
|
87
|
-
addr
|
|
88
|
-
}) {
|
|
98
|
+
function prefixContains({ prefix, addr }) {
|
|
89
99
|
if (prefix.bytes.length !== addr.length) return false;
|
|
90
100
|
let bits = prefix.bits;
|
|
91
101
|
let i = 0;
|
|
@@ -107,6 +117,10 @@ var METADATA_ADDRESSES = [
|
|
|
107
117
|
// AWS ECS/Fargate task metadata
|
|
108
118
|
"168.63.129.16",
|
|
109
119
|
// Azure WireServer / host DNS
|
|
120
|
+
"100.100.100.200",
|
|
121
|
+
// Alibaba Cloud ECS metadata
|
|
122
|
+
"192.0.0.192",
|
|
123
|
+
// Oracle Cloud metadata
|
|
110
124
|
"fd00:ec2::254"
|
|
111
125
|
// AWS EC2 IMDS over IPv6
|
|
112
126
|
].map((ip) => {
|
|
@@ -172,12 +186,14 @@ function bytesEqual({ a, b }) {
|
|
|
172
186
|
}
|
|
173
187
|
return true;
|
|
174
188
|
}
|
|
189
|
+
function isMetadataAddress(addr) {
|
|
190
|
+
return METADATA_ADDRESSES.some((m) => bytesEqual({ a: m, b: addr }));
|
|
191
|
+
}
|
|
175
192
|
function classify(ip) {
|
|
176
193
|
const raw = ipToBytes(ip);
|
|
177
194
|
if (!raw) return "special";
|
|
178
195
|
const addr = unmap(raw);
|
|
179
|
-
if (
|
|
180
|
-
return "metadata";
|
|
196
|
+
if (isMetadataAddress(addr)) return "metadata";
|
|
181
197
|
for (const prefix of SPECIAL_PREFIXES) {
|
|
182
198
|
if (prefixContains({ prefix, addr })) return "special";
|
|
183
199
|
}
|
|
@@ -200,7 +216,9 @@ var SENSITIVE_REDIRECT_HEADERS = /* @__PURE__ */ new Set([
|
|
|
200
216
|
"x-access-token"
|
|
201
217
|
]);
|
|
202
218
|
function unsafeDestinationError() {
|
|
203
|
-
return new Error(
|
|
219
|
+
return new Error(
|
|
220
|
+
"HTTP agent destinations must resolve only to globally routable public addresses"
|
|
221
|
+
);
|
|
204
222
|
}
|
|
205
223
|
function hostnameWithoutBrackets(hostname) {
|
|
206
224
|
return hostname.startsWith("[") && hostname.endsWith("]") ? hostname.slice(1, -1) : hostname;
|
|
@@ -365,33 +383,101 @@ async function requestPublicJson(input, options = {}, redirectCount = 0) {
|
|
|
365
383
|
}
|
|
366
384
|
|
|
367
385
|
// src/langwatch-api-agents.ts
|
|
386
|
+
var agentCallParamsSchema = z.record(
|
|
387
|
+
z.string(),
|
|
388
|
+
z.union([z.string(), z.number(), z.boolean()])
|
|
389
|
+
);
|
|
368
390
|
async function listAgents(params) {
|
|
369
391
|
const query = new URLSearchParams();
|
|
370
392
|
if (params?.page) query.set("page", String(params.page));
|
|
371
393
|
if (params?.limit) query.set("limit", String(params.limit));
|
|
372
394
|
const qs = query.toString() ? `?${query}` : "";
|
|
373
|
-
return makeRequest("GET", `/api/agents${qs}`);
|
|
395
|
+
return makeRequest("GET", `/api/v1/agents${qs}`);
|
|
374
396
|
}
|
|
375
397
|
async function getAgent(id) {
|
|
376
|
-
return makeRequest(
|
|
377
|
-
"GET",
|
|
378
|
-
`/api/agents/${encodeURIComponent(id)}`
|
|
379
|
-
);
|
|
398
|
+
return makeRequest("GET", `/api/v1/agents/${encodeURIComponent(id)}`);
|
|
380
399
|
}
|
|
381
400
|
async function createAgent(data) {
|
|
382
|
-
return makeRequest("POST", "/api/agents", data);
|
|
401
|
+
return makeRequest("POST", "/api/v1/agents", data);
|
|
383
402
|
}
|
|
384
403
|
async function updateAgent(params) {
|
|
385
404
|
const { id, ...data } = params;
|
|
386
405
|
return makeRequest(
|
|
387
406
|
"PATCH",
|
|
388
|
-
`/api/agents/${encodeURIComponent(id)}`,
|
|
407
|
+
`/api/v1/agents/${encodeURIComponent(id)}`,
|
|
389
408
|
data
|
|
390
409
|
);
|
|
391
410
|
}
|
|
392
|
-
async function
|
|
411
|
+
async function callAgent({
|
|
412
|
+
id,
|
|
413
|
+
body
|
|
414
|
+
}) {
|
|
415
|
+
return makeRequest(
|
|
416
|
+
"POST",
|
|
417
|
+
`/api/v1/agents/${encodeURIComponent(id)}/call`,
|
|
418
|
+
body
|
|
419
|
+
);
|
|
420
|
+
}
|
|
421
|
+
async function testAgent(id) {
|
|
422
|
+
return makeRequest(
|
|
423
|
+
"POST",
|
|
424
|
+
`/api/v1/agents/${encodeURIComponent(id)}/test`,
|
|
425
|
+
{}
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
var isMessageList = (value) => Array.isArray(value) && value.every(
|
|
429
|
+
(item) => typeof item === "object" && item !== null && typeof item.role === "string"
|
|
430
|
+
);
|
|
431
|
+
function buildRelayBody({
|
|
432
|
+
input,
|
|
433
|
+
message,
|
|
434
|
+
parameters,
|
|
435
|
+
threadId
|
|
436
|
+
}) {
|
|
437
|
+
let messages;
|
|
438
|
+
if (message !== void 0) {
|
|
439
|
+
messages = [{ role: "user", content: message }];
|
|
440
|
+
} else if (isMessageList(input.messages)) {
|
|
441
|
+
messages = input.messages;
|
|
442
|
+
} else {
|
|
443
|
+
return "a connected agent takes a conversation: give `message`, or `input` with a `messages` list.";
|
|
444
|
+
}
|
|
445
|
+
const body = { messages };
|
|
446
|
+
const thread = threadId ?? (typeof input.threadId === "string" ? input.threadId : void 0);
|
|
447
|
+
if (thread) body.threadId = thread;
|
|
448
|
+
if (isMessageList(input.newMessages)) body.newMessages = input.newMessages;
|
|
449
|
+
if (input.session !== void 0) body.session = input.session;
|
|
450
|
+
let inputParams;
|
|
451
|
+
if (input.params !== void 0) {
|
|
452
|
+
const parsed = agentCallParamsSchema.safeParse(input.params);
|
|
453
|
+
if (!parsed.success) {
|
|
454
|
+
return "`params` takes one flat object of string, number or boolean values. Nested objects and arrays are not run parameters.";
|
|
455
|
+
}
|
|
456
|
+
inputParams = parsed.data;
|
|
457
|
+
}
|
|
458
|
+
if (inputParams || parameters) body.params = { ...inputParams, ...parameters };
|
|
459
|
+
return body;
|
|
460
|
+
}
|
|
461
|
+
async function runAgent({
|
|
462
|
+
id,
|
|
463
|
+
input,
|
|
464
|
+
message,
|
|
465
|
+
parameters,
|
|
466
|
+
threadId
|
|
467
|
+
}) {
|
|
393
468
|
const agent = await getAgent(id);
|
|
394
469
|
const config = agent.config ?? {};
|
|
470
|
+
if (agent.type === "connected") {
|
|
471
|
+
const body = buildRelayBody({ input: input ?? {}, message, parameters, threadId });
|
|
472
|
+
if (typeof body === "string") throw new Error(body);
|
|
473
|
+
if (agent.status === "offline") {
|
|
474
|
+
throw new Error(
|
|
475
|
+
`Agent "${agent.name}" is offline. Start the process that calls connectAgent (or connect_agent) and try again.`
|
|
476
|
+
);
|
|
477
|
+
}
|
|
478
|
+
const result2 = await callAgent({ id: agent.id, body });
|
|
479
|
+
return { agentType: "connected", result: result2 };
|
|
480
|
+
}
|
|
395
481
|
if (agent.type === "http") {
|
|
396
482
|
const url = config.url;
|
|
397
483
|
if (!url) {
|
|
@@ -407,18 +493,15 @@ async function runAgent(id, input) {
|
|
|
407
493
|
const workflowId = config.workflowId;
|
|
408
494
|
if (!workflowId) {
|
|
409
495
|
throw new Error(
|
|
410
|
-
`Agent "${agent.name}" (type: ${agent.type}) cannot be executed directly. Only HTTP agents and workflow-linked agents can be run.`
|
|
496
|
+
`Agent "${agent.name}" (type: ${agent.type}) cannot be executed directly. Only connected agents, HTTP agents and workflow-linked agents can be run.`
|
|
411
497
|
);
|
|
412
498
|
}
|
|
413
|
-
const { runWorkflow } = await import("./langwatch-api-workflows-
|
|
499
|
+
const { runWorkflow } = await import("./langwatch-api-workflows-OKC4FXIF.js");
|
|
414
500
|
const result = await runWorkflow(workflowId, input);
|
|
415
501
|
return { agentType: agent.type, result };
|
|
416
502
|
}
|
|
417
503
|
async function deleteAgent(id) {
|
|
418
|
-
return makeRequest(
|
|
419
|
-
"DELETE",
|
|
420
|
-
`/api/agents/${encodeURIComponent(id)}`
|
|
421
|
-
);
|
|
504
|
+
return makeRequest("DELETE", `/api/v1/agents/${encodeURIComponent(id)}`);
|
|
422
505
|
}
|
|
423
506
|
|
|
424
507
|
export {
|
|
@@ -426,7 +509,8 @@ export {
|
|
|
426
509
|
getAgent,
|
|
427
510
|
createAgent,
|
|
428
511
|
updateAgent,
|
|
512
|
+
testAgent,
|
|
429
513
|
runAgent,
|
|
430
514
|
deleteAgent
|
|
431
515
|
};
|
|
432
|
-
//# sourceMappingURL=chunk-
|
|
516
|
+
//# sourceMappingURL=chunk-HGELNIVY.js.map
|
|
@@ -79,7 +79,54 @@ function createRateLimiter({
|
|
|
79
79
|
}
|
|
80
80
|
};
|
|
81
81
|
}
|
|
82
|
-
var VERIFY_PATH = "/api/me/project";
|
|
82
|
+
var VERIFY_PATH = "/api/v1/me/project";
|
|
83
|
+
function sweepVerdicts(cache) {
|
|
84
|
+
const now = Date.now();
|
|
85
|
+
for (const [key, entry] of cache) {
|
|
86
|
+
if (now >= entry.expiresAt) cache.delete(key);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function rememberVerdict({
|
|
90
|
+
cache,
|
|
91
|
+
hashed,
|
|
92
|
+
valid,
|
|
93
|
+
maxEntries,
|
|
94
|
+
ttlMs
|
|
95
|
+
}) {
|
|
96
|
+
if (cache.size >= maxEntries) {
|
|
97
|
+
sweepVerdicts(cache);
|
|
98
|
+
while (cache.size >= maxEntries) {
|
|
99
|
+
const oldest = cache.keys().next();
|
|
100
|
+
if (oldest.done) break;
|
|
101
|
+
cache.delete(oldest.value);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
cache.set(hashed, { valid, expiresAt: Date.now() + ttlMs });
|
|
105
|
+
}
|
|
106
|
+
async function askVerifyEndpoint({
|
|
107
|
+
endpoint,
|
|
108
|
+
apiKey,
|
|
109
|
+
fetchImpl,
|
|
110
|
+
requestTimeoutMs
|
|
111
|
+
}) {
|
|
112
|
+
let response;
|
|
113
|
+
try {
|
|
114
|
+
response = await fetchImpl(`${endpoint}${VERIFY_PATH}`, {
|
|
115
|
+
method: "GET",
|
|
116
|
+
headers: { "X-Auth-Token": apiKey },
|
|
117
|
+
// An upstream that accepts the connection and never answers would
|
|
118
|
+
// otherwise leave the in-flight promise unsettled, parking every
|
|
119
|
+
// request for this key behind it until the socket dies.
|
|
120
|
+
signal: AbortSignal.timeout(requestTimeoutMs)
|
|
121
|
+
});
|
|
122
|
+
} catch {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
await response.body?.cancel().catch(() => void 0);
|
|
126
|
+
if (response.ok) return true;
|
|
127
|
+
if (response.status === 401 || response.status === 403) return false;
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
83
130
|
function createApiKeyVerifier({
|
|
84
131
|
endpoint,
|
|
85
132
|
positiveTtlMs = 6e4,
|
|
@@ -90,45 +137,15 @@ function createApiKeyVerifier({
|
|
|
90
137
|
}) {
|
|
91
138
|
const cache = /* @__PURE__ */ new Map();
|
|
92
139
|
const inFlight = /* @__PURE__ */ new Map();
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
while (cache.size >= maxEntries) {
|
|
103
|
-
const oldest = cache.keys().next();
|
|
104
|
-
if (oldest.done) break;
|
|
105
|
-
cache.delete(oldest.value);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
cache.set(hashed, {
|
|
109
|
-
valid,
|
|
110
|
-
expiresAt: Date.now() + (valid ? positiveTtlMs : negativeTtlMs)
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
async function askApi(apiKey) {
|
|
114
|
-
let response;
|
|
115
|
-
try {
|
|
116
|
-
response = await fetchImpl(`${endpoint}${VERIFY_PATH}`, {
|
|
117
|
-
method: "GET",
|
|
118
|
-
headers: { "X-Auth-Token": apiKey },
|
|
119
|
-
// An upstream that accepts the connection and never answers would
|
|
120
|
-
// otherwise leave the in-flight promise unsettled, parking every
|
|
121
|
-
// request for this key behind it until the socket dies.
|
|
122
|
-
signal: AbortSignal.timeout(requestTimeoutMs)
|
|
123
|
-
});
|
|
124
|
-
} catch {
|
|
125
|
-
return null;
|
|
126
|
-
}
|
|
127
|
-
await response.body?.cancel().catch(() => void 0);
|
|
128
|
-
if (response.ok) return true;
|
|
129
|
-
if (response.status === 401 || response.status === 403) return false;
|
|
130
|
-
return null;
|
|
131
|
-
}
|
|
140
|
+
const sweep = () => sweepVerdicts(cache);
|
|
141
|
+
const remember = (hashed, valid) => rememberVerdict({
|
|
142
|
+
cache,
|
|
143
|
+
hashed,
|
|
144
|
+
valid,
|
|
145
|
+
maxEntries,
|
|
146
|
+
ttlMs: valid ? positiveTtlMs : negativeTtlMs
|
|
147
|
+
});
|
|
148
|
+
const askApi = (apiKey) => askVerifyEndpoint({ endpoint, apiKey, fetchImpl, requestTimeoutMs });
|
|
132
149
|
return {
|
|
133
150
|
async verify(apiKey) {
|
|
134
151
|
const hashed = hashApiKey(apiKey);
|
|
@@ -152,45 +169,55 @@ function createApiKeyVerifier({
|
|
|
152
169
|
}
|
|
153
170
|
};
|
|
154
171
|
}
|
|
172
|
+
function releaseSlot({ countByKey }, apiKey) {
|
|
173
|
+
const hashed = hashApiKey(apiKey);
|
|
174
|
+
const next = (countByKey.get(hashed) ?? 1) - 1;
|
|
175
|
+
if (next <= 0) countByKey.delete(hashed);
|
|
176
|
+
else countByKey.set(hashed, next);
|
|
177
|
+
}
|
|
178
|
+
function dropSession({
|
|
179
|
+
table,
|
|
180
|
+
sessionId,
|
|
181
|
+
record
|
|
182
|
+
}) {
|
|
183
|
+
table.sessions.delete(sessionId);
|
|
184
|
+
releaseSlot(table, record.apiKey);
|
|
185
|
+
}
|
|
186
|
+
function reserveSlot({
|
|
187
|
+
table,
|
|
188
|
+
apiKey
|
|
189
|
+
}) {
|
|
190
|
+
const hashed = hashApiKey(apiKey);
|
|
191
|
+
table.countByKey.set(hashed, (table.countByKey.get(hashed) ?? 0) + 1);
|
|
192
|
+
let settled = false;
|
|
193
|
+
return {
|
|
194
|
+
commit({ sessionId, transport }) {
|
|
195
|
+
if (settled) return;
|
|
196
|
+
settled = true;
|
|
197
|
+
const existing = table.sessions.get(sessionId);
|
|
198
|
+
if (existing) dropSession({ table, sessionId, record: existing });
|
|
199
|
+
table.sessions.set(sessionId, {
|
|
200
|
+
transport,
|
|
201
|
+
apiKey,
|
|
202
|
+
lastActivityAt: Date.now()
|
|
203
|
+
});
|
|
204
|
+
},
|
|
205
|
+
release() {
|
|
206
|
+
if (settled) return;
|
|
207
|
+
settled = true;
|
|
208
|
+
releaseSlot(table, apiKey);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
}
|
|
155
212
|
function createSessionStore({
|
|
156
213
|
maxAgeMs,
|
|
157
214
|
closeTransport
|
|
158
215
|
}) {
|
|
159
216
|
const sessions = /* @__PURE__ */ new Map();
|
|
160
217
|
const countByKey = /* @__PURE__ */ new Map();
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
if (next <= 0) countByKey.delete(hashed);
|
|
165
|
-
else countByKey.set(hashed, next);
|
|
166
|
-
}
|
|
167
|
-
function drop(sessionId, record) {
|
|
168
|
-
sessions.delete(sessionId);
|
|
169
|
-
decrement(record.apiKey);
|
|
170
|
-
}
|
|
171
|
-
function reserve(apiKey) {
|
|
172
|
-
const hashed = hashApiKey(apiKey);
|
|
173
|
-
countByKey.set(hashed, (countByKey.get(hashed) ?? 0) + 1);
|
|
174
|
-
let settled = false;
|
|
175
|
-
return {
|
|
176
|
-
commit({ sessionId, transport }) {
|
|
177
|
-
if (settled) return;
|
|
178
|
-
settled = true;
|
|
179
|
-
const existing = sessions.get(sessionId);
|
|
180
|
-
if (existing) drop(sessionId, existing);
|
|
181
|
-
sessions.set(sessionId, {
|
|
182
|
-
transport,
|
|
183
|
-
apiKey,
|
|
184
|
-
lastActivityAt: Date.now()
|
|
185
|
-
});
|
|
186
|
-
},
|
|
187
|
-
release() {
|
|
188
|
-
if (settled) return;
|
|
189
|
-
settled = true;
|
|
190
|
-
decrement(apiKey);
|
|
191
|
-
}
|
|
192
|
-
};
|
|
193
|
-
}
|
|
218
|
+
const table = { sessions, countByKey };
|
|
219
|
+
const reserve = (apiKey) => reserveSlot({ table, apiKey });
|
|
220
|
+
const drop = (sessionId, record) => dropSession({ table, sessionId, record });
|
|
194
221
|
return {
|
|
195
222
|
get(sessionId) {
|
|
196
223
|
return sessions.get(sessionId);
|
|
@@ -264,4 +291,4 @@ export {
|
|
|
264
291
|
createSessionStore,
|
|
265
292
|
admitOAuthToken
|
|
266
293
|
};
|
|
267
|
-
//# sourceMappingURL=chunk-
|
|
294
|
+
//# sourceMappingURL=chunk-HHMNZAPD.js.map
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import {
|
|
2
2
|
makeRequest
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UWLE5T2F.js";
|
|
4
4
|
|
|
5
5
|
// src/langwatch-api-scenarios.ts
|
|
6
6
|
async function listScenarios() {
|
|
7
|
-
return makeRequest("GET", "/api/scenarios");
|
|
7
|
+
return makeRequest("GET", "/api/v1/scenarios");
|
|
8
8
|
}
|
|
9
9
|
async function getScenario(id) {
|
|
10
10
|
return makeRequest(
|
|
11
11
|
"GET",
|
|
12
|
-
`/api/scenarios/${encodeURIComponent(id)}`
|
|
12
|
+
`/api/v1/scenarios/${encodeURIComponent(id)}`
|
|
13
13
|
);
|
|
14
14
|
}
|
|
15
15
|
async function createScenario(data) {
|
|
16
|
-
return makeRequest("POST", "/api/scenarios", data);
|
|
16
|
+
return makeRequest("POST", "/api/v1/scenarios", data);
|
|
17
17
|
}
|
|
18
18
|
async function updateScenario(params) {
|
|
19
19
|
const { id, ...data } = params;
|
|
20
20
|
return makeRequest(
|
|
21
21
|
"PUT",
|
|
22
|
-
`/api/scenarios/${encodeURIComponent(id)}`,
|
|
22
|
+
`/api/v1/scenarios/${encodeURIComponent(id)}`,
|
|
23
23
|
data
|
|
24
24
|
);
|
|
25
25
|
}
|
|
26
26
|
async function archiveScenario(id) {
|
|
27
27
|
return makeRequest(
|
|
28
28
|
"DELETE",
|
|
29
|
-
`/api/scenarios/${encodeURIComponent(id)}`
|
|
29
|
+
`/api/v1/scenarios/${encodeURIComponent(id)}`
|
|
30
30
|
);
|
|
31
31
|
}
|
|
32
32
|
|
|
@@ -37,4 +37,4 @@ export {
|
|
|
37
37
|
updateScenario,
|
|
38
38
|
archiveScenario
|
|
39
39
|
};
|
|
40
|
-
//# sourceMappingURL=chunk-
|
|
40
|
+
//# sourceMappingURL=chunk-I7ATIZED.js.map
|
|
@@ -1,32 +1,29 @@
|
|
|
1
1
|
import {
|
|
2
2
|
makeRequest
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UWLE5T2F.js";
|
|
4
4
|
|
|
5
5
|
// src/langwatch-api-dashboards.ts
|
|
6
6
|
async function listDashboards() {
|
|
7
|
-
return makeRequest("GET", "/api/dashboards");
|
|
7
|
+
return makeRequest("GET", "/api/v1/dashboards");
|
|
8
8
|
}
|
|
9
9
|
async function getDashboard(id) {
|
|
10
10
|
return makeRequest(
|
|
11
11
|
"GET",
|
|
12
|
-
`/api/dashboards/${encodeURIComponent(id)}`
|
|
12
|
+
`/api/v1/dashboards/${encodeURIComponent(id)}`
|
|
13
13
|
);
|
|
14
14
|
}
|
|
15
15
|
async function createDashboard(data) {
|
|
16
|
-
return makeRequest("POST", "/api/dashboards", data);
|
|
16
|
+
return makeRequest("POST", "/api/v1/dashboards", data);
|
|
17
17
|
}
|
|
18
18
|
async function renameDashboard(id, data) {
|
|
19
19
|
return makeRequest(
|
|
20
20
|
"PATCH",
|
|
21
|
-
`/api/dashboards/${encodeURIComponent(id)}`,
|
|
21
|
+
`/api/v1/dashboards/${encodeURIComponent(id)}`,
|
|
22
22
|
data
|
|
23
23
|
);
|
|
24
24
|
}
|
|
25
25
|
async function deleteDashboard(id) {
|
|
26
|
-
return makeRequest(
|
|
27
|
-
"DELETE",
|
|
28
|
-
`/api/dashboards/${encodeURIComponent(id)}`
|
|
29
|
-
);
|
|
26
|
+
return makeRequest("DELETE", `/api/v1/dashboards/${encodeURIComponent(id)}`);
|
|
30
27
|
}
|
|
31
28
|
|
|
32
29
|
export {
|
|
@@ -36,4 +33,4 @@ export {
|
|
|
36
33
|
renameDashboard,
|
|
37
34
|
deleteDashboard
|
|
38
35
|
};
|
|
39
|
-
//# sourceMappingURL=chunk-
|
|
36
|
+
//# sourceMappingURL=chunk-ILZDO25L.js.map
|