@waniwani/sdk 0.1.20-beta.8 → 0.2.1
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/README.md +101 -52
- package/dist/abap-KGVIZMDC.js +3 -0
- package/dist/abap-KGVIZMDC.js.map +1 -0
- package/dist/actionscript-3-2UHK5QYP.js +3 -0
- package/dist/actionscript-3-2UHK5QYP.js.map +1 -0
- package/dist/ada-JKTWR5BV.js +3 -0
- package/dist/ada-JKTWR5BV.js.map +1 -0
- package/dist/andromeeda-HAPOYWX3.js +3 -0
- package/dist/andromeeda-HAPOYWX3.js.map +1 -0
- package/dist/angular-html-EOIKHM3D.js +3 -0
- package/dist/angular-html-EOIKHM3D.js.map +1 -0
- package/dist/angular-ts-A7ZNTSV6.js +3 -0
- package/dist/angular-ts-A7ZNTSV6.js.map +1 -0
- package/dist/apache-MPGFGQFB.js +3 -0
- package/dist/apache-MPGFGQFB.js.map +1 -0
- package/dist/apex-BOAZL66Z.js +3 -0
- package/dist/apex-BOAZL66Z.js.map +1 -0
- package/dist/apl-QBN4KIYA.js +3 -0
- package/dist/apl-QBN4KIYA.js.map +1 -0
- package/dist/applescript-C4CJ3STL.js +3 -0
- package/dist/applescript-C4CJ3STL.js.map +1 -0
- package/dist/ara-FSFFBRSD.js +3 -0
- package/dist/ara-FSFFBRSD.js.map +1 -0
- package/dist/asciidoc-QQK2LANG.js +3 -0
- package/dist/asciidoc-QQK2LANG.js.map +1 -0
- package/dist/asm-X43A2VYW.js +3 -0
- package/dist/asm-X43A2VYW.js.map +1 -0
- package/dist/astro-OQUOYMBE.js +3 -0
- package/dist/astro-OQUOYMBE.js.map +1 -0
- package/dist/aurora-x-R6WAWEBC.js +3 -0
- package/dist/aurora-x-R6WAWEBC.js.map +1 -0
- package/dist/awk-4Z3PRTF7.js +3 -0
- package/dist/awk-4Z3PRTF7.js.map +1 -0
- package/dist/ayu-dark-KMD4YO7F.js +3 -0
- package/dist/ayu-dark-KMD4YO7F.js.map +1 -0
- package/dist/ayu-light-2ATPDILG.js +3 -0
- package/dist/ayu-light-2ATPDILG.js.map +1 -0
- package/dist/ayu-mirage-LJ7PG5AM.js +3 -0
- package/dist/ayu-mirage-LJ7PG5AM.js.map +1 -0
- package/dist/ballerina-JCXSJ2QD.js +3 -0
- package/dist/ballerina-JCXSJ2QD.js.map +1 -0
- package/dist/bat-XFWR7RMZ.js +3 -0
- package/dist/bat-XFWR7RMZ.js.map +1 -0
- package/dist/beancount-7BBDB4BH.js +3 -0
- package/dist/beancount-7BBDB4BH.js.map +1 -0
- package/dist/berry-PQ2BEJIZ.js +3 -0
- package/dist/berry-PQ2BEJIZ.js.map +1 -0
- package/dist/bibtex-J2PAB23I.js +3 -0
- package/dist/bibtex-J2PAB23I.js.map +1 -0
- package/dist/bicep-TNKT6R3W.js +3 -0
- package/dist/bicep-TNKT6R3W.js.map +1 -0
- package/dist/blade-QBDEYXMB.js +3 -0
- package/dist/blade-QBDEYXMB.js.map +1 -0
- package/dist/bsl-PQW6E45S.js +3 -0
- package/dist/bsl-PQW6E45S.js.map +1 -0
- package/dist/c-PZBJFNXE.js +3 -0
- package/dist/c-PZBJFNXE.js.map +1 -0
- package/dist/c3-GP7XYHE6.js +3 -0
- package/dist/c3-GP7XYHE6.js.map +1 -0
- package/dist/cadence-NABGDHKY.js +3 -0
- package/dist/cadence-NABGDHKY.js.map +1 -0
- package/dist/cairo-WQSC2GLN.js +3 -0
- package/dist/cairo-WQSC2GLN.js.map +1 -0
- package/dist/catppuccin-frappe-Z4Y2POK6.js +3 -0
- package/dist/catppuccin-frappe-Z4Y2POK6.js.map +1 -0
- package/dist/catppuccin-latte-4TQUIKX4.js +3 -0
- package/dist/catppuccin-latte-4TQUIKX4.js.map +1 -0
- package/dist/catppuccin-macchiato-B7YYPERT.js +3 -0
- package/dist/catppuccin-macchiato-B7YYPERT.js.map +1 -0
- package/dist/catppuccin-mocha-KX33VXKA.js +3 -0
- package/dist/catppuccin-mocha-KX33VXKA.js.map +1 -0
- package/dist/chat/index.d.ts +14 -3
- package/dist/chat/index.js +49 -1
- package/dist/chat/index.js.map +1 -1
- package/dist/chat/next-js/index.d.ts +148 -40
- package/dist/chat/next-js/index.js +1 -1
- package/dist/chat/next-js/index.js.map +1 -1
- package/dist/chat/server/index.d.ts +5 -0
- package/dist/chat/styles.css +1 -1
- package/dist/chunk-2RR26LLP.js +3 -0
- package/dist/chunk-2RR26LLP.js.map +1 -0
- package/dist/chunk-3MXGGSWX.js +3 -0
- package/dist/chunk-3MXGGSWX.js.map +1 -0
- package/dist/chunk-4LBJUPWV.js +3 -0
- package/dist/chunk-4LBJUPWV.js.map +1 -0
- package/dist/chunk-4VTSQZWF.js +3 -0
- package/dist/chunk-4VTSQZWF.js.map +1 -0
- package/dist/chunk-7JLJRE2N.js +3 -0
- package/dist/chunk-7JLJRE2N.js.map +1 -0
- package/dist/chunk-7PHUBJVC.js +3 -0
- package/dist/chunk-7PHUBJVC.js.map +1 -0
- package/dist/chunk-AGWJ4LUC.js +3 -0
- package/dist/chunk-AGWJ4LUC.js.map +1 -0
- package/dist/chunk-ASVQBXNX.js +3 -0
- package/dist/chunk-ASVQBXNX.js.map +1 -0
- package/dist/chunk-ATLIFHJQ.js +3 -0
- package/dist/chunk-ATLIFHJQ.js.map +1 -0
- package/dist/chunk-BWAU264B.js +3 -0
- package/dist/chunk-BWAU264B.js.map +1 -0
- package/dist/chunk-C2XW4T23.js +3 -0
- package/dist/chunk-C2XW4T23.js.map +1 -0
- package/dist/chunk-C3DWQQH3.js +3 -0
- package/dist/chunk-C3DWQQH3.js.map +1 -0
- package/dist/chunk-CIEDXAJY.js +3 -0
- package/dist/chunk-CIEDXAJY.js.map +1 -0
- package/dist/chunk-CNY3RWNZ.js +3 -0
- package/dist/chunk-CNY3RWNZ.js.map +1 -0
- package/dist/chunk-ED2SBPIQ.js +3 -0
- package/dist/chunk-ED2SBPIQ.js.map +1 -0
- package/dist/chunk-F3QSOBPN.js +3 -0
- package/dist/chunk-F3QSOBPN.js.map +1 -0
- package/dist/chunk-FHRHXPXN.js +3 -0
- package/dist/chunk-FHRHXPXN.js.map +1 -0
- package/dist/chunk-FWHINPYE.js +3 -0
- package/dist/chunk-FWHINPYE.js.map +1 -0
- package/dist/chunk-HMEGK7JX.js +3 -0
- package/dist/chunk-HMEGK7JX.js.map +1 -0
- package/dist/chunk-HU77EH3T.js +3 -0
- package/dist/chunk-HU77EH3T.js.map +1 -0
- package/dist/chunk-HVAT4SNH.js +116 -0
- package/dist/chunk-HVAT4SNH.js.map +1 -0
- package/dist/chunk-IXROC4D6.js +3 -0
- package/dist/chunk-IXROC4D6.js.map +1 -0
- package/dist/chunk-JVRIR5KA.js +3 -0
- package/dist/chunk-JVRIR5KA.js.map +1 -0
- package/dist/chunk-JXSURY23.js +3 -0
- package/dist/chunk-JXSURY23.js.map +1 -0
- package/dist/chunk-JZBW5KEX.js +3 -0
- package/dist/chunk-JZBW5KEX.js.map +1 -0
- package/dist/chunk-M4CKEROZ.js +3 -0
- package/dist/chunk-M4CKEROZ.js.map +1 -0
- package/dist/chunk-NWMKWKIF.js +3 -0
- package/dist/chunk-NWMKWKIF.js.map +1 -0
- package/dist/chunk-OZU5OBWU.js +3 -0
- package/dist/chunk-OZU5OBWU.js.map +1 -0
- package/dist/chunk-Q7Y54EZU.js +3 -0
- package/dist/chunk-Q7Y54EZU.js.map +1 -0
- package/dist/chunk-QLNWMFSL.js +3 -0
- package/dist/chunk-QLNWMFSL.js.map +1 -0
- package/dist/chunk-R5U25TSM.js +3 -0
- package/dist/chunk-R5U25TSM.js.map +1 -0
- package/dist/chunk-RH56J7QY.js +3 -0
- package/dist/chunk-RH56J7QY.js.map +1 -0
- package/dist/chunk-RLHBVYHM.js +3 -0
- package/dist/chunk-RLHBVYHM.js.map +1 -0
- package/dist/chunk-RYVXTIMY.js +3 -0
- package/dist/chunk-RYVXTIMY.js.map +1 -0
- package/dist/chunk-U4R5XKLD.js +3 -0
- package/dist/chunk-U4R5XKLD.js.map +1 -0
- package/dist/chunk-V3ZDECK5.js +3 -0
- package/dist/chunk-V3ZDECK5.js.map +1 -0
- package/dist/chunk-VBWVDIIW.js +3 -0
- package/dist/chunk-VBWVDIIW.js.map +1 -0
- package/dist/chunk-VME4UB43.js +3 -0
- package/dist/chunk-VME4UB43.js.map +1 -0
- package/dist/chunk-VNX5AK2O.js +3 -0
- package/dist/chunk-VNX5AK2O.js.map +1 -0
- package/dist/chunk-WKR2RWJ6.js +3 -0
- package/dist/chunk-WKR2RWJ6.js.map +1 -0
- package/dist/chunk-XD5VGPVP.js +3 -0
- package/dist/chunk-XD5VGPVP.js.map +1 -0
- package/dist/chunk-Z3IKGRKN.js +3 -0
- package/dist/chunk-Z3IKGRKN.js.map +1 -0
- package/dist/chunk-Z7QCZ4DQ.js +3 -0
- package/dist/chunk-Z7QCZ4DQ.js.map +1 -0
- package/dist/chunk-ZHMHS6LG.js +3 -0
- package/dist/chunk-ZHMHS6LG.js.map +1 -0
- package/dist/chunk-ZU32Z5HV.js +3 -0
- package/dist/chunk-ZU32Z5HV.js.map +1 -0
- package/dist/clarity-NXNSINKX.js +3 -0
- package/dist/clarity-NXNSINKX.js.map +1 -0
- package/dist/clojure-Y57BKRMA.js +3 -0
- package/dist/clojure-Y57BKRMA.js.map +1 -0
- package/dist/cmake-LVMEA3JZ.js +3 -0
- package/dist/cmake-LVMEA3JZ.js.map +1 -0
- package/dist/cobol-6DNJTKH3.js +3 -0
- package/dist/cobol-6DNJTKH3.js.map +1 -0
- package/dist/code-block-37QAKDTI-M2QCKVTI.js +4 -0
- package/dist/code-block-37QAKDTI-M2QCKVTI.js.map +1 -0
- package/dist/codeowners-JYHOTXQS.js +3 -0
- package/dist/codeowners-JYHOTXQS.js.map +1 -0
- package/dist/codeql-IWWSYR3L.js +3 -0
- package/dist/codeql-IWWSYR3L.js.map +1 -0
- package/dist/coffee-NNDQ5QXC.js +3 -0
- package/dist/coffee-NNDQ5QXC.js.map +1 -0
- package/dist/common-lisp-JKXCDYH3.js +3 -0
- package/dist/common-lisp-JKXCDYH3.js.map +1 -0
- package/dist/coq-BEHPNP64.js +3 -0
- package/dist/coq-BEHPNP64.js.map +1 -0
- package/dist/cpp-IALOHSZA.js +3 -0
- package/dist/cpp-IALOHSZA.js.map +1 -0
- package/dist/crystal-ZDP3FIUI.js +3 -0
- package/dist/crystal-ZDP3FIUI.js.map +1 -0
- package/dist/csharp-ODFBXRGA.js +3 -0
- package/dist/csharp-ODFBXRGA.js.map +1 -0
- package/dist/css-CJGL5AVH.js +3 -0
- package/dist/css-CJGL5AVH.js.map +1 -0
- package/dist/csv-LIK4TU3Z.js +3 -0
- package/dist/csv-LIK4TU3Z.js.map +1 -0
- package/dist/cue-UAAEAKHI.js +3 -0
- package/dist/cue-UAAEAKHI.js.map +1 -0
- package/dist/cypher-SZPVUQZJ.js +3 -0
- package/dist/cypher-SZPVUQZJ.js.map +1 -0
- package/dist/d-VSCA3XHG.js +3 -0
- package/dist/d-VSCA3XHG.js.map +1 -0
- package/dist/dark-plus-LNHXUR7U.js +3 -0
- package/dist/dark-plus-LNHXUR7U.js.map +1 -0
- package/dist/dart-A4PE6FIS.js +3 -0
- package/dist/dart-A4PE6FIS.js.map +1 -0
- package/dist/dax-TILIKSFB.js +3 -0
- package/dist/dax-TILIKSFB.js.map +1 -0
- package/dist/desktop-75KK3D55.js +3 -0
- package/dist/desktop-75KK3D55.js.map +1 -0
- package/dist/diff-HOT6P45M.js +3 -0
- package/dist/diff-HOT6P45M.js.map +1 -0
- package/dist/docker-FF35TY6T.js +3 -0
- package/dist/docker-FF35TY6T.js.map +1 -0
- package/dist/dotenv-FVPPHJI3.js +3 -0
- package/dist/dotenv-FVPPHJI3.js.map +1 -0
- package/dist/dracula-T2CMBBQ5.js +3 -0
- package/dist/dracula-T2CMBBQ5.js.map +1 -0
- package/dist/dracula-soft-SMFRNKX2.js +3 -0
- package/dist/dracula-soft-SMFRNKX2.js.map +1 -0
- package/dist/dream-maker-SYE3ZPSJ.js +3 -0
- package/dist/dream-maker-SYE3ZPSJ.js.map +1 -0
- package/dist/edge-CCLQ2CKA.js +3 -0
- package/dist/edge-CCLQ2CKA.js.map +1 -0
- package/dist/elixir-F6DQGRKA.js +3 -0
- package/dist/elixir-F6DQGRKA.js.map +1 -0
- package/dist/elm-5QRQXDZ6.js +3 -0
- package/dist/elm-5QRQXDZ6.js.map +1 -0
- package/dist/emacs-lisp-NJ4S4OHV.js +3 -0
- package/dist/emacs-lisp-NJ4S4OHV.js.map +1 -0
- package/dist/erb-HGSLHT5Y.js +3 -0
- package/dist/erb-HGSLHT5Y.js.map +1 -0
- package/dist/erlang-APEONNZ6.js +3 -0
- package/dist/erlang-APEONNZ6.js.map +1 -0
- package/dist/everforest-dark-DBZHIUAO.js +3 -0
- package/dist/everforest-dark-DBZHIUAO.js.map +1 -0
- package/dist/everforest-light-TDAGYJUK.js +3 -0
- package/dist/everforest-light-TDAGYJUK.js.map +1 -0
- package/dist/fennel-7OCMFVPS.js +3 -0
- package/dist/fennel-7OCMFVPS.js.map +1 -0
- package/dist/fish-BC46ME2N.js +3 -0
- package/dist/fish-BC46ME2N.js.map +1 -0
- package/dist/fluent-MXZS6EX3.js +3 -0
- package/dist/fluent-MXZS6EX3.js.map +1 -0
- package/dist/fortran-fixed-form-35BC2KX6.js +3 -0
- package/dist/fortran-fixed-form-35BC2KX6.js.map +1 -0
- package/dist/fortran-free-form-AXRAI2HH.js +3 -0
- package/dist/fortran-free-form-AXRAI2HH.js.map +1 -0
- package/dist/fsharp-JKNSQXHD.js +3 -0
- package/dist/fsharp-JKNSQXHD.js.map +1 -0
- package/dist/gdresource-ZMKZGPZV.js +3 -0
- package/dist/gdresource-ZMKZGPZV.js.map +1 -0
- package/dist/gdscript-HNCVXEYB.js +3 -0
- package/dist/gdscript-HNCVXEYB.js.map +1 -0
- package/dist/gdshader-XAJ4QRYP.js +3 -0
- package/dist/gdshader-XAJ4QRYP.js.map +1 -0
- package/dist/genie-HEFVQZAP.js +3 -0
- package/dist/genie-HEFVQZAP.js.map +1 -0
- package/dist/gherkin-OFBRDPXX.js +3 -0
- package/dist/gherkin-OFBRDPXX.js.map +1 -0
- package/dist/git-commit-ZE2M3Q5H.js +3 -0
- package/dist/git-commit-ZE2M3Q5H.js.map +1 -0
- package/dist/git-rebase-3N3INGLU.js +3 -0
- package/dist/git-rebase-3N3INGLU.js.map +1 -0
- package/dist/github-dark-3E25TTAN.js +3 -0
- package/dist/github-dark-3E25TTAN.js.map +1 -0
- package/dist/github-dark-default-KCBFVSS5.js +3 -0
- package/dist/github-dark-default-KCBFVSS5.js.map +1 -0
- package/dist/github-dark-dimmed-WRCBXEVS.js +3 -0
- package/dist/github-dark-dimmed-WRCBXEVS.js.map +1 -0
- package/dist/github-dark-high-contrast-ET7SAHAV.js +3 -0
- package/dist/github-dark-high-contrast-ET7SAHAV.js.map +1 -0
- package/dist/github-light-6FNTZH5H.js +3 -0
- package/dist/github-light-6FNTZH5H.js.map +1 -0
- package/dist/github-light-default-GGTAKNM7.js +3 -0
- package/dist/github-light-default-GGTAKNM7.js.map +1 -0
- package/dist/github-light-high-contrast-LHYKPR5E.js +3 -0
- package/dist/github-light-high-contrast-LHYKPR5E.js.map +1 -0
- package/dist/gleam-NFFQFQLP.js +3 -0
- package/dist/gleam-NFFQFQLP.js.map +1 -0
- package/dist/glimmer-js-RSUW6JYN.js +3 -0
- package/dist/glimmer-js-RSUW6JYN.js.map +1 -0
- package/dist/glimmer-ts-EZGWLX5T.js +3 -0
- package/dist/glimmer-ts-EZGWLX5T.js.map +1 -0
- package/dist/glsl-VJLRYEVJ.js +3 -0
- package/dist/glsl-VJLRYEVJ.js.map +1 -0
- package/dist/gn-UH2XQWLG.js +3 -0
- package/dist/gn-UH2XQWLG.js.map +1 -0
- package/dist/gnuplot-K6IV6NNR.js +3 -0
- package/dist/gnuplot-K6IV6NNR.js.map +1 -0
- package/dist/go-BDV7RR5G.js +3 -0
- package/dist/go-BDV7RR5G.js.map +1 -0
- package/dist/graphql-YEJQLMOO.js +3 -0
- package/dist/graphql-YEJQLMOO.js.map +1 -0
- package/dist/groovy-SX7K3XGL.js +3 -0
- package/dist/groovy-SX7K3XGL.js.map +1 -0
- package/dist/gruvbox-dark-hard-IQWZCHF7.js +3 -0
- package/dist/gruvbox-dark-hard-IQWZCHF7.js.map +1 -0
- package/dist/gruvbox-dark-medium-ARPWF4FS.js +3 -0
- package/dist/gruvbox-dark-medium-ARPWF4FS.js.map +1 -0
- package/dist/gruvbox-dark-soft-ODS6FPID.js +3 -0
- package/dist/gruvbox-dark-soft-ODS6FPID.js.map +1 -0
- package/dist/gruvbox-light-hard-KFA5YFDW.js +3 -0
- package/dist/gruvbox-light-hard-KFA5YFDW.js.map +1 -0
- package/dist/gruvbox-light-medium-MMET4L3Y.js +3 -0
- package/dist/gruvbox-light-medium-MMET4L3Y.js.map +1 -0
- package/dist/gruvbox-light-soft-DBZDERMK.js +3 -0
- package/dist/gruvbox-light-soft-DBZDERMK.js.map +1 -0
- package/dist/hack-3TGPQNR2.js +3 -0
- package/dist/hack-3TGPQNR2.js.map +1 -0
- package/dist/haml-335RVEQR.js +3 -0
- package/dist/haml-335RVEQR.js.map +1 -0
- package/dist/handlebars-73IS6B2J.js +3 -0
- package/dist/handlebars-73IS6B2J.js.map +1 -0
- package/dist/haskell-P5PTJARU.js +3 -0
- package/dist/haskell-P5PTJARU.js.map +1 -0
- package/dist/haxe-RCPSSA3N.js +3 -0
- package/dist/haxe-RCPSSA3N.js.map +1 -0
- package/dist/hcl-AKKZAVC2.js +3 -0
- package/dist/hcl-AKKZAVC2.js.map +1 -0
- package/dist/hjson-REXV6F6N.js +3 -0
- package/dist/hjson-REXV6F6N.js.map +1 -0
- package/dist/hlsl-AJ7VWOVL.js +3 -0
- package/dist/hlsl-AJ7VWOVL.js.map +1 -0
- package/dist/horizon-FSOMPXNP.js +3 -0
- package/dist/horizon-FSOMPXNP.js.map +1 -0
- package/dist/houston-FAQBCORN.js +3 -0
- package/dist/houston-FAQBCORN.js.map +1 -0
- package/dist/html-654LNGWF.js +3 -0
- package/dist/html-654LNGWF.js.map +1 -0
- package/dist/html-derivative-CMQ7BFDQ.js +3 -0
- package/dist/html-derivative-CMQ7BFDQ.js.map +1 -0
- package/dist/http-NEPTRAQZ.js +3 -0
- package/dist/http-NEPTRAQZ.js.map +1 -0
- package/dist/hurl-V6ZX2Q3F.js +3 -0
- package/dist/hurl-V6ZX2Q3F.js.map +1 -0
- package/dist/hxml-5BXJCAAU.js +3 -0
- package/dist/hxml-5BXJCAAU.js.map +1 -0
- package/dist/hy-SB4TMFE7.js +3 -0
- package/dist/hy-SB4TMFE7.js.map +1 -0
- package/dist/imba-Y64MHYWP.js +3 -0
- package/dist/imba-Y64MHYWP.js.map +1 -0
- package/dist/index.d.ts +187 -41
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ini-J2OP4CNW.js +3 -0
- package/dist/ini-J2OP4CNW.js.map +1 -0
- package/dist/java-MJKJ5GPP.js +3 -0
- package/dist/java-MJKJ5GPP.js.map +1 -0
- package/dist/javascript-IYAGHPR6.js +3 -0
- package/dist/javascript-IYAGHPR6.js.map +1 -0
- package/dist/jinja-WPD26JJ6.js +3 -0
- package/dist/jinja-WPD26JJ6.js.map +1 -0
- package/dist/jison-UYDZQBN5.js +3 -0
- package/dist/jison-UYDZQBN5.js.map +1 -0
- package/dist/json-5V4JESJO.js +3 -0
- package/dist/json-5V4JESJO.js.map +1 -0
- package/dist/json5-7SHUZD3R.js +3 -0
- package/dist/json5-7SHUZD3R.js.map +1 -0
- package/dist/jsonc-X3Z34FN3.js +3 -0
- package/dist/jsonc-X3Z34FN3.js.map +1 -0
- package/dist/jsonl-6I3D2HM6.js +3 -0
- package/dist/jsonl-6I3D2HM6.js.map +1 -0
- package/dist/jsonnet-PZEQIBYV.js +3 -0
- package/dist/jsonnet-PZEQIBYV.js.map +1 -0
- package/dist/jssm-GJJ25IKR.js +3 -0
- package/dist/jssm-GJJ25IKR.js.map +1 -0
- package/dist/jsx-NI2J427C.js +3 -0
- package/dist/jsx-NI2J427C.js.map +1 -0
- package/dist/julia-QPZ7EOS6.js +3 -0
- package/dist/julia-QPZ7EOS6.js.map +1 -0
- package/dist/kanagawa-dragon-JNDVF5RJ.js +3 -0
- package/dist/kanagawa-dragon-JNDVF5RJ.js.map +1 -0
- package/dist/kanagawa-lotus-S7JK6TQ6.js +3 -0
- package/dist/kanagawa-lotus-S7JK6TQ6.js.map +1 -0
- package/dist/kanagawa-wave-QJJIMVEV.js +3 -0
- package/dist/kanagawa-wave-QJJIMVEV.js.map +1 -0
- package/dist/kb/index.d.ts +79 -0
- package/dist/kb/index.js +2 -0
- package/dist/kb/index.js.map +1 -0
- package/dist/kdl-IA7HA2TL.js +3 -0
- package/dist/kdl-IA7HA2TL.js.map +1 -0
- package/dist/kotlin-CCRMGYMI.js +3 -0
- package/dist/kotlin-CCRMGYMI.js.map +1 -0
- package/dist/kusto-7DW25GYH.js +3 -0
- package/dist/kusto-7DW25GYH.js.map +1 -0
- package/dist/laserwave-YFP3EJVX.js +3 -0
- package/dist/laserwave-YFP3EJVX.js.map +1 -0
- package/dist/latex-F2CTDTFG.js +3 -0
- package/dist/latex-F2CTDTFG.js.map +1 -0
- package/dist/lean-MGJJWBTR.js +3 -0
- package/dist/lean-MGJJWBTR.js.map +1 -0
- package/dist/less-WFSIMX5G.js +3 -0
- package/dist/less-WFSIMX5G.js.map +1 -0
- package/dist/light-plus-NGDHCPUZ.js +3 -0
- package/dist/light-plus-NGDHCPUZ.js.map +1 -0
- package/dist/liquid-7CFNUD3V.js +3 -0
- package/dist/liquid-7CFNUD3V.js.map +1 -0
- package/dist/llvm-CFQSEDXB.js +3 -0
- package/dist/llvm-CFQSEDXB.js.map +1 -0
- package/dist/log-YQNML6LA.js +3 -0
- package/dist/log-YQNML6LA.js.map +1 -0
- package/dist/logo-2PPKBL2M.js +3 -0
- package/dist/logo-2PPKBL2M.js.map +1 -0
- package/dist/lua-RPAMRKNG.js +3 -0
- package/dist/lua-RPAMRKNG.js.map +1 -0
- package/dist/luau-GR2DOH6N.js +3 -0
- package/dist/luau-GR2DOH6N.js.map +1 -0
- package/dist/make-DQQEEPI4.js +3 -0
- package/dist/make-DQQEEPI4.js.map +1 -0
- package/dist/markdown-OC5ILZSY.js +3 -0
- package/dist/markdown-OC5ILZSY.js.map +1 -0
- package/dist/marko-XSB3CTWQ.js +3 -0
- package/dist/marko-XSB3CTWQ.js.map +1 -0
- package/dist/material-theme-H2BHKUKX.js +3 -0
- package/dist/material-theme-H2BHKUKX.js.map +1 -0
- package/dist/material-theme-darker-VENCGWTB.js +3 -0
- package/dist/material-theme-darker-VENCGWTB.js.map +1 -0
- package/dist/material-theme-lighter-SDMLS22W.js +3 -0
- package/dist/material-theme-lighter-SDMLS22W.js.map +1 -0
- package/dist/material-theme-ocean-UHDBRLVF.js +3 -0
- package/dist/material-theme-ocean-UHDBRLVF.js.map +1 -0
- package/dist/material-theme-palenight-3TB2BEET.js +3 -0
- package/dist/material-theme-palenight-3TB2BEET.js.map +1 -0
- package/dist/matlab-YQY6FS4U.js +3 -0
- package/dist/matlab-YQY6FS4U.js.map +1 -0
- package/dist/mcp/index.d.ts +381 -31
- package/dist/mcp/index.js +3 -3
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/react.d.ts +80 -25
- package/dist/mcp/react.js +7 -7
- package/dist/mcp/react.js.map +1 -1
- package/dist/mcp-apps-client-6WEBHSGH.js +3 -0
- package/dist/mcp-apps-client-6WEBHSGH.js.map +1 -0
- package/dist/mdc-TEVTGSC7.js +3 -0
- package/dist/mdc-TEVTGSC7.js.map +1 -0
- package/dist/mdx-ZIH2JLVR.js +3 -0
- package/dist/mdx-ZIH2JLVR.js.map +1 -0
- package/dist/mermaid-4DMBBIKO-NR6M3PLG.js +3 -0
- package/dist/mermaid-4DMBBIKO-NR6M3PLG.js.map +1 -0
- package/dist/mermaid-WPX56SBB.js +3 -0
- package/dist/mermaid-WPX56SBB.js.map +1 -0
- package/dist/min-dark-CQ5WKNT7.js +3 -0
- package/dist/min-dark-CQ5WKNT7.js.map +1 -0
- package/dist/min-light-LZRD4NPR.js +3 -0
- package/dist/min-light-LZRD4NPR.js.map +1 -0
- package/dist/mipsasm-IDXQRZ2B.js +3 -0
- package/dist/mipsasm-IDXQRZ2B.js.map +1 -0
- package/dist/mojo-MH7EQVOK.js +3 -0
- package/dist/mojo-MH7EQVOK.js.map +1 -0
- package/dist/monokai-WHRY6275.js +3 -0
- package/dist/monokai-WHRY6275.js.map +1 -0
- package/dist/moonbit-5JDFTWKE.js +3 -0
- package/dist/moonbit-5JDFTWKE.js.map +1 -0
- package/dist/move-RWSXKYDY.js +3 -0
- package/dist/move-RWSXKYDY.js.map +1 -0
- package/dist/narrat-QJUEXMVV.js +3 -0
- package/dist/narrat-QJUEXMVV.js.map +1 -0
- package/dist/nextflow-2EICNZA3.js +3 -0
- package/dist/nextflow-2EICNZA3.js.map +1 -0
- package/dist/nginx-RIWAEC5Z.js +3 -0
- package/dist/nginx-RIWAEC5Z.js.map +1 -0
- package/dist/night-owl-7PNEW2JB.js +3 -0
- package/dist/night-owl-7PNEW2JB.js.map +1 -0
- package/dist/night-owl-light-GJUYOOJR.js +3 -0
- package/dist/night-owl-light-GJUYOOJR.js.map +1 -0
- package/dist/nim-JPSYX5KC.js +3 -0
- package/dist/nim-JPSYX5KC.js.map +1 -0
- package/dist/nix-XCKQVWCN.js +3 -0
- package/dist/nix-XCKQVWCN.js.map +1 -0
- package/dist/nord-EVGUMUX2.js +3 -0
- package/dist/nord-EVGUMUX2.js.map +1 -0
- package/dist/nushell-QGW7HANA.js +3 -0
- package/dist/nushell-QGW7HANA.js.map +1 -0
- package/dist/objective-c-V7KYXFHL.js +3 -0
- package/dist/objective-c-V7KYXFHL.js.map +1 -0
- package/dist/objective-cpp-NKUEWVGU.js +3 -0
- package/dist/objective-cpp-NKUEWVGU.js.map +1 -0
- package/dist/ocaml-QT2CZJZN.js +3 -0
- package/dist/ocaml-QT2CZJZN.js.map +1 -0
- package/dist/odin-MVMIXBHP.js +3 -0
- package/dist/odin-MVMIXBHP.js.map +1 -0
- package/dist/one-dark-pro-PMTR3SA7.js +3 -0
- package/dist/one-dark-pro-PMTR3SA7.js.map +1 -0
- package/dist/one-light-O7WH4N5X.js +3 -0
- package/dist/one-light-O7WH4N5X.js.map +1 -0
- package/dist/openai-client-HLQSYZJC.js +3 -0
- package/dist/openai-client-HLQSYZJC.js.map +1 -0
- package/dist/openscad-BJDUXUUZ.js +3 -0
- package/dist/openscad-BJDUXUUZ.js.map +1 -0
- package/dist/pascal-HGWEFD6L.js +3 -0
- package/dist/pascal-HGWEFD6L.js.map +1 -0
- package/dist/perl-X4IFZB22.js +3 -0
- package/dist/perl-X4IFZB22.js.map +1 -0
- package/dist/php-3V7EPUAN.js +3 -0
- package/dist/php-3V7EPUAN.js.map +1 -0
- package/dist/pkl-VA5ZK5DW.js +3 -0
- package/dist/pkl-VA5ZK5DW.js.map +1 -0
- package/dist/plastic-FBVUW6NJ.js +3 -0
- package/dist/plastic-FBVUW6NJ.js.map +1 -0
- package/dist/plsql-J7A7YWFH.js +3 -0
- package/dist/plsql-J7A7YWFH.js.map +1 -0
- package/dist/po-5RDI65JX.js +3 -0
- package/dist/po-5RDI65JX.js.map +1 -0
- package/dist/poimandres-WBB7GZAD.js +3 -0
- package/dist/poimandres-WBB7GZAD.js.map +1 -0
- package/dist/polar-VUJL2E7F.js +3 -0
- package/dist/polar-VUJL2E7F.js.map +1 -0
- package/dist/postcss-ESTB5G7N.js +3 -0
- package/dist/postcss-ESTB5G7N.js.map +1 -0
- package/dist/powerquery-ODTEKQCW.js +3 -0
- package/dist/powerquery-ODTEKQCW.js.map +1 -0
- package/dist/powershell-ZOYRAWBJ.js +3 -0
- package/dist/powershell-ZOYRAWBJ.js.map +1 -0
- package/dist/prisma-QHG2W5GE.js +3 -0
- package/dist/prisma-QHG2W5GE.js.map +1 -0
- package/dist/prolog-CSAPG5PH.js +3 -0
- package/dist/prolog-CSAPG5PH.js.map +1 -0
- package/dist/proto-WDNJBTSW.js +3 -0
- package/dist/proto-WDNJBTSW.js.map +1 -0
- package/dist/pug-P7LS6DER.js +3 -0
- package/dist/pug-P7LS6DER.js.map +1 -0
- package/dist/puppet-LHFWHTY3.js +3 -0
- package/dist/puppet-LHFWHTY3.js.map +1 -0
- package/dist/purescript-DUFJP4FY.js +3 -0
- package/dist/purescript-DUFJP4FY.js.map +1 -0
- package/dist/python-5ZNZSNQ2.js +3 -0
- package/dist/python-5ZNZSNQ2.js.map +1 -0
- package/dist/qml-LTAXB6W5.js +3 -0
- package/dist/qml-LTAXB6W5.js.map +1 -0
- package/dist/qmldir-7Z2ODQLM.js +3 -0
- package/dist/qmldir-7Z2ODQLM.js.map +1 -0
- package/dist/qss-FDFD3HQD.js +3 -0
- package/dist/qss-FDFD3HQD.js.map +1 -0
- package/dist/r-6ZOS53WN.js +3 -0
- package/dist/r-6ZOS53WN.js.map +1 -0
- package/dist/racket-7AYZPEUI.js +3 -0
- package/dist/racket-7AYZPEUI.js.map +1 -0
- package/dist/raku-A4F6VHVG.js +3 -0
- package/dist/raku-A4F6VHVG.js.map +1 -0
- package/dist/razor-4QOCK4UD.js +3 -0
- package/dist/razor-4QOCK4UD.js.map +1 -0
- package/dist/red-7KAMONOP.js +3 -0
- package/dist/red-7KAMONOP.js.map +1 -0
- package/dist/reg-FAPHGG66.js +3 -0
- package/dist/reg-FAPHGG66.js.map +1 -0
- package/dist/regexp-5BYLYA2R.js +3 -0
- package/dist/regexp-5BYLYA2R.js.map +1 -0
- package/dist/rel-7DJ7HHU4.js +3 -0
- package/dist/rel-7DJ7HHU4.js.map +1 -0
- package/dist/riscv-YIYJATFG.js +3 -0
- package/dist/riscv-YIYJATFG.js.map +1 -0
- package/dist/ron-HYYMCHTX.js +3 -0
- package/dist/ron-HYYMCHTX.js.map +1 -0
- package/dist/rose-pine-F2G5IHZD.js +3 -0
- package/dist/rose-pine-F2G5IHZD.js.map +1 -0
- package/dist/rose-pine-dawn-ALZ7XGH2.js +3 -0
- package/dist/rose-pine-dawn-ALZ7XGH2.js.map +1 -0
- package/dist/rose-pine-moon-D3K4SWUL.js +3 -0
- package/dist/rose-pine-moon-D3K4SWUL.js.map +1 -0
- package/dist/rosmsg-FDNH6QF7.js +3 -0
- package/dist/rosmsg-FDNH6QF7.js.map +1 -0
- package/dist/rst-WIWCR2KQ.js +3 -0
- package/dist/rst-WIWCR2KQ.js.map +1 -0
- package/dist/ruby-LXZJUMFB.js +3 -0
- package/dist/ruby-LXZJUMFB.js.map +1 -0
- package/dist/rust-V3GMJA2K.js +3 -0
- package/dist/rust-V3GMJA2K.js.map +1 -0
- package/dist/sas-D3G4GB3X.js +3 -0
- package/dist/sas-D3G4GB3X.js.map +1 -0
- package/dist/sass-JTO65AGR.js +3 -0
- package/dist/sass-JTO65AGR.js.map +1 -0
- package/dist/scala-4XQGFSVM.js +3 -0
- package/dist/scala-4XQGFSVM.js.map +1 -0
- package/dist/scheme-CB7AC7IL.js +3 -0
- package/dist/scheme-CB7AC7IL.js.map +1 -0
- package/dist/scss-6SKV4OGI.js +3 -0
- package/dist/scss-6SKV4OGI.js.map +1 -0
- package/dist/sdbl-LKGZFJ46.js +3 -0
- package/dist/sdbl-LKGZFJ46.js.map +1 -0
- package/dist/shaderlab-K536DHEB.js +3 -0
- package/dist/shaderlab-K536DHEB.js.map +1 -0
- package/dist/shellscript-LRNUKUSZ.js +3 -0
- package/dist/shellscript-LRNUKUSZ.js.map +1 -0
- package/dist/shellsession-IBQK7VWQ.js +3 -0
- package/dist/shellsession-IBQK7VWQ.js.map +1 -0
- package/dist/slack-dark-YFPJODWS.js +3 -0
- package/dist/slack-dark-YFPJODWS.js.map +1 -0
- package/dist/slack-ochin-H67AWZOI.js +3 -0
- package/dist/slack-ochin-H67AWZOI.js.map +1 -0
- package/dist/smalltalk-DQOSWAW7.js +3 -0
- package/dist/smalltalk-DQOSWAW7.js.map +1 -0
- package/dist/snazzy-light-OUVS63VK.js +3 -0
- package/dist/snazzy-light-OUVS63VK.js.map +1 -0
- package/dist/solarized-dark-2RCAVEXJ.js +3 -0
- package/dist/solarized-dark-2RCAVEXJ.js.map +1 -0
- package/dist/solarized-light-XFSENHTC.js +3 -0
- package/dist/solarized-light-XFSENHTC.js.map +1 -0
- package/dist/solidity-V2FMZEG4.js +3 -0
- package/dist/solidity-V2FMZEG4.js.map +1 -0
- package/dist/soy-VW3CKXWF.js +3 -0
- package/dist/soy-VW3CKXWF.js.map +1 -0
- package/dist/sparql-L2VKP7YP.js +3 -0
- package/dist/sparql-L2VKP7YP.js.map +1 -0
- package/dist/splunk-KDKHP7GC.js +3 -0
- package/dist/splunk-KDKHP7GC.js.map +1 -0
- package/dist/sql-UF27CALT.js +3 -0
- package/dist/sql-UF27CALT.js.map +1 -0
- package/dist/ssh-config-JC2DQ6ED.js +3 -0
- package/dist/ssh-config-JC2DQ6ED.js.map +1 -0
- package/dist/stata-7PXCUY24.js +3 -0
- package/dist/stata-7PXCUY24.js.map +1 -0
- package/dist/stylus-2L7N3EZD.js +3 -0
- package/dist/stylus-2L7N3EZD.js.map +1 -0
- package/dist/surrealql-ZY3E6XEL.js +3 -0
- package/dist/surrealql-ZY3E6XEL.js.map +1 -0
- package/dist/svelte-Q45XIK2A.js +3 -0
- package/dist/svelte-Q45XIK2A.js.map +1 -0
- package/dist/swift-XBH5HZSC.js +3 -0
- package/dist/swift-XBH5HZSC.js.map +1 -0
- package/dist/synthwave-84-5XXB3K6S.js +3 -0
- package/dist/synthwave-84-5XXB3K6S.js.map +1 -0
- package/dist/system-verilog-VRAUSZY3.js +3 -0
- package/dist/system-verilog-VRAUSZY3.js.map +1 -0
- package/dist/systemd-JOTSGJD4.js +3 -0
- package/dist/systemd-JOTSGJD4.js.map +1 -0
- package/dist/talonscript-NNZRZKOU.js +3 -0
- package/dist/talonscript-NNZRZKOU.js.map +1 -0
- package/dist/tasl-MBFZ4QNC.js +3 -0
- package/dist/tasl-MBFZ4QNC.js.map +1 -0
- package/dist/tcl-4GEDCBVE.js +3 -0
- package/dist/tcl-4GEDCBVE.js.map +1 -0
- package/dist/templ-3XM7DLQ3.js +3 -0
- package/dist/templ-3XM7DLQ3.js.map +1 -0
- package/dist/terraform-XTHOS4UK.js +3 -0
- package/dist/terraform-XTHOS4UK.js.map +1 -0
- package/dist/tex-UXMN2CV7.js +3 -0
- package/dist/tex-UXMN2CV7.js.map +1 -0
- package/dist/tokyo-night-CHJCCBJH.js +3 -0
- package/dist/tokyo-night-CHJCCBJH.js.map +1 -0
- package/dist/toml-J6K55ZSV.js +3 -0
- package/dist/toml-J6K55ZSV.js.map +1 -0
- package/dist/ts-tags-7WGDLEKX.js +3 -0
- package/dist/ts-tags-7WGDLEKX.js.map +1 -0
- package/dist/tsv-DOUJHQDQ.js +3 -0
- package/dist/tsv-DOUJHQDQ.js.map +1 -0
- package/dist/tsx-G5BMVRHK.js +3 -0
- package/dist/tsx-G5BMVRHK.js.map +1 -0
- package/dist/turtle-JHJ7W6U5.js +3 -0
- package/dist/turtle-JHJ7W6U5.js.map +1 -0
- package/dist/twig-C6YWFFZU.js +3 -0
- package/dist/twig-C6YWFFZU.js.map +1 -0
- package/dist/typescript-LMKEAHFC.js +3 -0
- package/dist/typescript-LMKEAHFC.js.map +1 -0
- package/dist/typespec-5CLTIJYY.js +3 -0
- package/dist/typespec-5CLTIJYY.js.map +1 -0
- package/dist/typst-4W4Z436Z.js +3 -0
- package/dist/typst-4W4Z436Z.js.map +1 -0
- package/dist/v-Y4SBDBN7.js +3 -0
- package/dist/v-Y4SBDBN7.js.map +1 -0
- package/dist/vala-UMKT2MFA.js +3 -0
- package/dist/vala-UMKT2MFA.js.map +1 -0
- package/dist/vb-DQ7A5WJU.js +3 -0
- package/dist/vb-DQ7A5WJU.js.map +1 -0
- package/dist/verilog-N6ZF7GQD.js +3 -0
- package/dist/verilog-N6ZF7GQD.js.map +1 -0
- package/dist/vesper-Y5GIEAN4.js +3 -0
- package/dist/vesper-Y5GIEAN4.js.map +1 -0
- package/dist/vhdl-BNYDT37G.js +3 -0
- package/dist/vhdl-BNYDT37G.js.map +1 -0
- package/dist/viml-37RMDCBC.js +3 -0
- package/dist/viml-37RMDCBC.js.map +1 -0
- package/dist/vitesse-black-7TI33KHX.js +3 -0
- package/dist/vitesse-black-7TI33KHX.js.map +1 -0
- package/dist/vitesse-dark-FOB25MRB.js +3 -0
- package/dist/vitesse-dark-FOB25MRB.js.map +1 -0
- package/dist/vitesse-light-4WCNCTCO.js +3 -0
- package/dist/vitesse-light-4WCNCTCO.js.map +1 -0
- package/dist/vue-O6SLORWU.js +3 -0
- package/dist/vue-O6SLORWU.js.map +1 -0
- package/dist/vue-html-ZLTZN573.js +3 -0
- package/dist/vue-html-ZLTZN573.js.map +1 -0
- package/dist/vue-vine-6JKAZ54I.js +3 -0
- package/dist/vue-vine-6JKAZ54I.js.map +1 -0
- package/dist/vyper-GVXF46KD.js +3 -0
- package/dist/vyper-GVXF46KD.js.map +1 -0
- package/dist/wasm-EOPKAILK.js +3 -0
- package/dist/wasm-EOPKAILK.js.map +1 -0
- package/dist/wasm-NTB4O7GL.js +3 -0
- package/dist/wasm-NTB4O7GL.js.map +1 -0
- package/dist/wenyan-W7WB3BC7.js +3 -0
- package/dist/wenyan-W7WB3BC7.js.map +1 -0
- package/dist/wgsl-7GTDVXHG.js +3 -0
- package/dist/wgsl-7GTDVXHG.js.map +1 -0
- package/dist/wikitext-ASAFPAIL.js +3 -0
- package/dist/wikitext-ASAFPAIL.js.map +1 -0
- package/dist/wit-ZBCR6544.js +3 -0
- package/dist/wit-ZBCR6544.js.map +1 -0
- package/dist/wolfram-SZRZOETJ.js +3 -0
- package/dist/wolfram-SZRZOETJ.js.map +1 -0
- package/dist/xml-EBTJCOTU.js +3 -0
- package/dist/xml-EBTJCOTU.js.map +1 -0
- package/dist/xsl-IBYEXWDX.js +3 -0
- package/dist/xsl-IBYEXWDX.js.map +1 -0
- package/dist/yaml-GMVQNECR.js +3 -0
- package/dist/yaml-GMVQNECR.js.map +1 -0
- package/dist/zenscript-O2TZFP4A.js +3 -0
- package/dist/zenscript-O2TZFP4A.js.map +1 -0
- package/dist/zig-ZLGM7IMN.js +3 -0
- package/dist/zig-ZLGM7IMN.js.map +1 -0
- package/package.json +20 -39
- package/dist/mcp-apps-client-Z62VBB36.js +0 -3
- package/dist/mcp-apps-client-Z62VBB36.js.map +0 -1
- package/dist/openai-client-MVV4KJUO.js +0 -3
- package/dist/openai-client-MVV4KJUO.js.map +0 -1
package/dist/mcp/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
|
|
1
2
|
import { z } from 'zod';
|
|
2
3
|
import { McpServer, ToolCallback } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
4
|
export { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
@@ -112,23 +113,11 @@ declare global {
|
|
|
112
113
|
/**
|
|
113
114
|
* Result from calling a tool
|
|
114
115
|
*/
|
|
115
|
-
type ToolCallResult =
|
|
116
|
-
content?: Array<{
|
|
117
|
-
type: string;
|
|
118
|
-
text?: string;
|
|
119
|
-
}>;
|
|
120
|
-
structuredContent?: Record<string, unknown>;
|
|
121
|
-
};
|
|
116
|
+
type ToolCallResult = CallToolResult;
|
|
122
117
|
/**
|
|
123
118
|
* Tool result notification (what the host pushes to the widget)
|
|
124
119
|
*/
|
|
125
|
-
type ToolResult =
|
|
126
|
-
content?: Array<{
|
|
127
|
-
type: string;
|
|
128
|
-
text?: string;
|
|
129
|
-
}>;
|
|
130
|
-
structuredContent?: Record<string, unknown>;
|
|
131
|
-
};
|
|
120
|
+
type ToolResult = CallToolResult;
|
|
132
121
|
/**
|
|
133
122
|
* Host context - all values available from the host.
|
|
134
123
|
*/
|
|
@@ -245,14 +234,14 @@ interface UnifiedWidgetClient {
|
|
|
245
234
|
onMaxHeightChange(callback: (maxHeight: number | null) => void): () => void;
|
|
246
235
|
/**
|
|
247
236
|
* Get the tool response metadata.
|
|
248
|
-
* OpenAI
|
|
249
|
-
* MCP Apps: returns
|
|
237
|
+
* OpenAI: returns metadata from window.openai.toolResponseMetadata.
|
|
238
|
+
* MCP Apps: returns `_meta` from the latest `ui/notifications/tool-result`, if provided by host.
|
|
250
239
|
*/
|
|
251
240
|
getToolResponseMetadata(): UnknownObject | null;
|
|
252
241
|
/**
|
|
253
242
|
* Subscribe to tool response metadata changes.
|
|
254
|
-
* OpenAI
|
|
255
|
-
* MCP Apps:
|
|
243
|
+
* OpenAI: subscribes to toolResponseMetadata changes.
|
|
244
|
+
* MCP Apps: fires when tool result `_meta` changes.
|
|
256
245
|
*/
|
|
257
246
|
onToolResponseMetadataChange(callback: (metadata: UnknownObject | null) => void): () => void;
|
|
258
247
|
/**
|
|
@@ -316,15 +305,26 @@ declare const START: "__start__";
|
|
|
316
305
|
declare const END: "__end__";
|
|
317
306
|
declare const INTERRUPT: unique symbol;
|
|
318
307
|
declare const WIDGET: unique symbol;
|
|
319
|
-
|
|
320
|
-
|
|
308
|
+
/** A single question within an interrupt step */
|
|
309
|
+
type InterruptQuestion = {
|
|
321
310
|
/** Question to ask the user */
|
|
322
311
|
question: string;
|
|
323
312
|
/** State key where the answer will be stored */
|
|
324
313
|
field: string;
|
|
325
314
|
/** Optional suggestions to present as options */
|
|
326
315
|
suggestions?: string[];
|
|
327
|
-
/** Hidden context/instructions for
|
|
316
|
+
/** Hidden context/instructions for this specific question (not shown to user directly) */
|
|
317
|
+
context?: string;
|
|
318
|
+
};
|
|
319
|
+
/**
|
|
320
|
+
* Interrupt signal — pauses the flow and asks the user one or more questions.
|
|
321
|
+
* Single-question and multi-question interrupts use the same type.
|
|
322
|
+
*/
|
|
323
|
+
type InterruptSignal = {
|
|
324
|
+
readonly __type: typeof INTERRUPT;
|
|
325
|
+
/** Questions to ask — ask all in one conversational message */
|
|
326
|
+
questions: InterruptQuestion[];
|
|
327
|
+
/** Overall hidden context/instructions for the assistant (not shown to user directly) */
|
|
328
328
|
context?: string;
|
|
329
329
|
};
|
|
330
330
|
type WidgetSignal = {
|
|
@@ -335,36 +335,79 @@ type WidgetSignal = {
|
|
|
335
335
|
data: Record<string, unknown>;
|
|
336
336
|
/** Description of what the widget does (for the AI's context) */
|
|
337
337
|
description?: string;
|
|
338
|
+
/**
|
|
339
|
+
* State key this widget fills — enables auto-skip when the field is already in state.
|
|
340
|
+
* Pass this so the engine can skip the widget step when the answer is already known.
|
|
341
|
+
*/
|
|
342
|
+
field?: string;
|
|
338
343
|
};
|
|
339
344
|
/**
|
|
340
|
-
* Create an interrupt signal — pauses the flow and asks the user a
|
|
345
|
+
* Create an interrupt signal — pauses the flow and asks the user a question.
|
|
346
|
+
*
|
|
347
|
+
* Accepts a single question (shorthand) or multiple questions (array form).
|
|
348
|
+
* Both produce the same signal type.
|
|
349
|
+
*
|
|
350
|
+
* @example Single question
|
|
351
|
+
* ```ts
|
|
352
|
+
* return interrupt({ question: "Your email?", field: "email" })
|
|
353
|
+
* ```
|
|
354
|
+
*
|
|
355
|
+
* @example Multiple questions (asked together in one message)
|
|
356
|
+
* ```ts
|
|
357
|
+
* return interrupt({ questions: [
|
|
358
|
+
* { question: "How many employees?", field: "headcount" },
|
|
359
|
+
* { question: "Average age?", field: "averageAge" },
|
|
360
|
+
* ]})
|
|
361
|
+
* ```
|
|
341
362
|
*/
|
|
342
363
|
declare function interrupt(config: {
|
|
343
364
|
question: string;
|
|
344
365
|
field: string;
|
|
345
366
|
suggestions?: string[];
|
|
346
367
|
context?: string;
|
|
368
|
+
} | {
|
|
369
|
+
questions: InterruptQuestion[];
|
|
370
|
+
context?: string;
|
|
347
371
|
}): InterruptSignal;
|
|
348
372
|
/**
|
|
349
373
|
* Create a widget signal — pauses the flow and renders a widget UI.
|
|
374
|
+
*
|
|
375
|
+
* Pass `field` to enable auto-skip: if the field is already in state, the widget
|
|
376
|
+
* step will be skipped automatically.
|
|
350
377
|
*/
|
|
351
378
|
declare function showWidget(resource: RegisteredResource, config: {
|
|
352
379
|
data: Record<string, unknown>;
|
|
353
380
|
description?: string;
|
|
381
|
+
field?: string;
|
|
354
382
|
}): WidgetSignal;
|
|
355
383
|
type MaybePromise<T> = T | Promise<T>;
|
|
356
|
-
/**
|
|
384
|
+
/**
|
|
385
|
+
* Optional config for handler-based nodes.
|
|
386
|
+
* Provides metadata used by the engine (e.g., auto-skip on widget steps).
|
|
387
|
+
*
|
|
388
|
+
* For declarative nodes, config is inferred automatically — no need to pass this.
|
|
389
|
+
*/
|
|
357
390
|
type NodeConfig<TState extends Record<string, unknown> = Record<string, unknown>> = {
|
|
358
|
-
/**
|
|
359
|
-
|
|
360
|
-
|
|
391
|
+
/**
|
|
392
|
+
* State key this node fills.
|
|
393
|
+
* When set on a handler-based widget node and the field is already in state,
|
|
394
|
+
* the node is auto-skipped. (Alternatively, pass `field` to `showWidget()`.)
|
|
395
|
+
*/
|
|
361
396
|
field?: Extract<keyof TState, string>;
|
|
397
|
+
/**
|
|
398
|
+
* Mark this node as conversational — the AI will engage in back-and-forth
|
|
399
|
+
* conversation before advancing to the next node.
|
|
400
|
+
*
|
|
401
|
+
* - `true` — generic conversational behavior
|
|
402
|
+
* - `string` — specific guidance for the AI (e.g., "Help the user compare plans")
|
|
403
|
+
*/
|
|
404
|
+
conversational?: boolean | string;
|
|
362
405
|
};
|
|
363
406
|
/**
|
|
364
407
|
* Node handler — a single function type for all node kinds.
|
|
365
408
|
* The return value determines behavior:
|
|
366
409
|
* - `Partial<TState>` → action node (state merged, auto-advance)
|
|
367
|
-
* - `InterruptSignal` → interrupt (pause, ask user)
|
|
410
|
+
* - `InterruptSignal` → interrupt (pause, ask user one or more questions)
|
|
368
411
|
* - `WidgetSignal` → widget step (pause, show widget)
|
|
369
412
|
*/
|
|
370
413
|
type NodeHandler<TState> = (state: Partial<TState>, meta?: Record<string, unknown>) => MaybePromise<Partial<TState> | InterruptSignal | WidgetSignal>;
|
|
@@ -388,7 +431,7 @@ type FlowConfig = {
|
|
|
388
431
|
* The state definition serves two purposes:
|
|
389
432
|
* 1. Type inference — `TState` is automatically derived, no explicit generic needed
|
|
390
433
|
* 2. AI protocol — field names, types, and descriptions are included in the tool
|
|
391
|
-
* description so the AI can pre-fill answers via `
|
|
434
|
+
* description so the AI can pre-fill answers via `_meta.flow.state`
|
|
392
435
|
*
|
|
393
436
|
* @example
|
|
394
437
|
* ```ts
|
|
@@ -445,7 +488,7 @@ type RegisteredFlow = {
|
|
|
445
488
|
* title: "User Onboarding",
|
|
446
489
|
* description: "Guides users through onboarding",
|
|
447
490
|
* })
|
|
448
|
-
* .addNode("ask_name", () => interrupt({ question: "What's your name?", field: "name" }))
|
|
491
|
+
* .addNode("ask_name", (state) => interrupt({ question: "What's your name?", field: "name" }))
|
|
449
492
|
* .addNode("greet", (state) => ({ greeting: `Hello ${state.name}!` }))
|
|
450
493
|
* .addEdge(START, "ask_name")
|
|
451
494
|
* .addEdge("ask_name", "greet")
|
|
@@ -464,7 +507,8 @@ declare class StateGraph<TState extends Record<string, unknown>> {
|
|
|
464
507
|
*/
|
|
465
508
|
addNode(name: string, handler: NodeHandler<TState>): this;
|
|
466
509
|
/**
|
|
467
|
-
* Add a node with config
|
|
510
|
+
* Add a node with config and a handler.
|
|
511
|
+
* Pass `field` to enable auto-skip on widget nodes.
|
|
468
512
|
*/
|
|
469
513
|
addNode(name: string, config: NodeConfig<TState>, handler: NodeHandler<TState>): this;
|
|
470
514
|
/**
|
|
@@ -621,4 +665,310 @@ declare function createTool<TInput extends z.ZodRawShape>(config: ToolConfig<TIn
|
|
|
621
665
|
*/
|
|
622
666
|
declare function registerTools(server: McpServer, tools: RegisteredTool[]): Promise<void>;
|
|
623
667
|
|
|
624
|
-
|
|
668
|
+
/**
|
|
669
|
+
* Server-side API route handler for widget tracking events.
|
|
670
|
+
*
|
|
671
|
+
* Receives batched events from the `useWaniwani` React hook and forwards them
|
|
672
|
+
* to the WaniWani backend using the server-side SDK.
|
|
673
|
+
*
|
|
674
|
+
* @example Next.js App Router
|
|
675
|
+
* ```typescript
|
|
676
|
+
* // app/api/waniwani/track/route.ts
|
|
677
|
+
* import { createTrackingRoute } from "@waniwani/sdk/mcp";
|
|
678
|
+
*
|
|
679
|
+
* const handler = createTrackingRoute({
|
|
680
|
+
* apiKey: process.env.WANIWANI_API_KEY,
|
|
681
|
+
* baseUrl: process.env.WANIWANI_BASE_URL,
|
|
682
|
+
* });
|
|
683
|
+
*
|
|
684
|
+
* export { handler as POST };
|
|
685
|
+
* ```
|
|
686
|
+
*/
|
|
687
|
+
interface TrackingRouteOptions {
|
|
688
|
+
/** API key for the WaniWani backend. Defaults to WANIWANI_API_KEY env var. */
|
|
689
|
+
apiKey?: string;
|
|
690
|
+
/** Base URL for the WaniWani backend. Defaults to https://app.waniwani.ai. */
|
|
691
|
+
baseUrl?: string;
|
|
692
|
+
}
|
|
693
|
+
/**
|
|
694
|
+
* Creates a POST handler that receives tracking events from `useWaniwani`
|
|
695
|
+
* and forwards them to the WaniWani backend.
|
|
696
|
+
*/
|
|
697
|
+
declare function createTrackingRoute(options?: TrackingRouteOptions): (request: Request) => Promise<Response>;
|
|
698
|
+
|
|
699
|
+
interface SearchResult {
|
|
700
|
+
source: string;
|
|
701
|
+
heading: string;
|
|
702
|
+
content: string;
|
|
703
|
+
score: number;
|
|
704
|
+
}
|
|
705
|
+
/** A file to ingest into the knowledge base */
|
|
706
|
+
interface KbIngestFile {
|
|
707
|
+
/** Filename (used as chunk source identifier) */
|
|
708
|
+
filename: string;
|
|
709
|
+
/** Markdown content of the file */
|
|
710
|
+
content: string;
|
|
711
|
+
}
|
|
712
|
+
/** Response from the ingest endpoint */
|
|
713
|
+
interface KbIngestResult {
|
|
714
|
+
/** Number of chunks created from the ingested files */
|
|
715
|
+
chunksIngested: number;
|
|
716
|
+
/** Number of files successfully processed */
|
|
717
|
+
filesProcessed: number;
|
|
718
|
+
}
|
|
719
|
+
/** Options for the search method */
|
|
720
|
+
interface KbSearchOptions {
|
|
721
|
+
/** Number of results to return (1-20, default 5) */
|
|
722
|
+
topK?: number;
|
|
723
|
+
/** Minimum similarity score threshold (0-1, default 0.3) */
|
|
724
|
+
minScore?: number;
|
|
725
|
+
}
|
|
726
|
+
/** A source entry in the knowledge base */
|
|
727
|
+
interface KbSource {
|
|
728
|
+
/** Source filename */
|
|
729
|
+
source: string;
|
|
730
|
+
/** Number of chunks from this source */
|
|
731
|
+
chunkCount: number;
|
|
732
|
+
/** ISO timestamp of when the source was first ingested */
|
|
733
|
+
createdAt: string;
|
|
734
|
+
}
|
|
735
|
+
/** KB client for server-side knowledge base operations */
|
|
736
|
+
interface KbClient {
|
|
737
|
+
/**
|
|
738
|
+
* Ingest files into the knowledge base.
|
|
739
|
+
*
|
|
740
|
+
* **Warning**: This is destructive — it deletes ALL existing chunks
|
|
741
|
+
* for the environment before ingesting the new files.
|
|
742
|
+
*/
|
|
743
|
+
ingest(files: KbIngestFile[]): Promise<KbIngestResult>;
|
|
744
|
+
/** Search the knowledge base for relevant chunks */
|
|
745
|
+
search(query: string, options?: KbSearchOptions): Promise<SearchResult[]>;
|
|
746
|
+
/** List all sources in the knowledge base */
|
|
747
|
+
sources(): Promise<KbSource[]>;
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
type EventType = "session.started" | "tool.called" | "quote.requested" | "quote.succeeded" | "quote.failed" | "link.clicked" | "purchase.completed" | "widget_render" | "widget_click" | "widget_link_click" | "widget_error" | "widget_scroll" | "widget_form_field" | "widget_form_submit";
|
|
751
|
+
interface ToolCalledProperties {
|
|
752
|
+
name?: string;
|
|
753
|
+
type?: "pricing" | "product_info" | "availability" | "support" | "other";
|
|
754
|
+
}
|
|
755
|
+
interface QuoteSucceededProperties {
|
|
756
|
+
amount?: number;
|
|
757
|
+
currency?: string;
|
|
758
|
+
}
|
|
759
|
+
interface LinkClickedProperties {
|
|
760
|
+
url?: string;
|
|
761
|
+
}
|
|
762
|
+
interface PurchaseCompletedProperties {
|
|
763
|
+
amount?: number;
|
|
764
|
+
currency?: string;
|
|
765
|
+
}
|
|
766
|
+
interface TrackingContext {
|
|
767
|
+
/**
|
|
768
|
+
* MCP request metadata passed through to the API.
|
|
769
|
+
*
|
|
770
|
+
* Location varies by MCP library:
|
|
771
|
+
* - `@vercel/mcp-handler`: `extra._meta`
|
|
772
|
+
* - `@modelcontextprotocol/sdk`: `request.params._meta`
|
|
773
|
+
*/
|
|
774
|
+
meta?: Record<string, unknown>;
|
|
775
|
+
/** Legacy metadata field supported for backward compatibility. */
|
|
776
|
+
metadata?: Record<string, unknown>;
|
|
777
|
+
/** Optional explicit correlation fields. */
|
|
778
|
+
sessionId?: string;
|
|
779
|
+
traceId?: string;
|
|
780
|
+
requestId?: string;
|
|
781
|
+
correlationId?: string;
|
|
782
|
+
externalUserId?: string;
|
|
783
|
+
/** Optional explicit envelope fields. */
|
|
784
|
+
eventId?: string;
|
|
785
|
+
timestamp?: string | Date;
|
|
786
|
+
source?: string;
|
|
787
|
+
}
|
|
788
|
+
/**
|
|
789
|
+
* Modern tracking shape (preferred).
|
|
790
|
+
*/
|
|
791
|
+
interface BaseTrackEvent extends TrackingContext {
|
|
792
|
+
event: EventType;
|
|
793
|
+
properties?: Record<string, unknown>;
|
|
794
|
+
}
|
|
795
|
+
type TrackEvent = ({
|
|
796
|
+
event: "session.started";
|
|
797
|
+
} & BaseTrackEvent) | ({
|
|
798
|
+
event: "tool.called";
|
|
799
|
+
properties?: ToolCalledProperties;
|
|
800
|
+
} & BaseTrackEvent) | ({
|
|
801
|
+
event: "quote.requested";
|
|
802
|
+
} & BaseTrackEvent) | ({
|
|
803
|
+
event: "quote.succeeded";
|
|
804
|
+
properties?: QuoteSucceededProperties;
|
|
805
|
+
} & BaseTrackEvent) | ({
|
|
806
|
+
event: "quote.failed";
|
|
807
|
+
} & BaseTrackEvent) | ({
|
|
808
|
+
event: "link.clicked";
|
|
809
|
+
properties?: LinkClickedProperties;
|
|
810
|
+
} & BaseTrackEvent) | ({
|
|
811
|
+
event: "purchase.completed";
|
|
812
|
+
properties?: PurchaseCompletedProperties;
|
|
813
|
+
} & BaseTrackEvent);
|
|
814
|
+
/**
|
|
815
|
+
* Legacy tracking shape supported for existing integrations.
|
|
816
|
+
*/
|
|
817
|
+
interface LegacyTrackEvent extends TrackingContext {
|
|
818
|
+
eventType: EventType;
|
|
819
|
+
properties?: Record<string, unknown>;
|
|
820
|
+
toolName?: string;
|
|
821
|
+
toolType?: ToolCalledProperties["type"];
|
|
822
|
+
quoteAmount?: number;
|
|
823
|
+
quoteCurrency?: string;
|
|
824
|
+
linkUrl?: string;
|
|
825
|
+
purchaseAmount?: number;
|
|
826
|
+
purchaseCurrency?: string;
|
|
827
|
+
}
|
|
828
|
+
/**
|
|
829
|
+
* Public track input accepted by `client.track()`.
|
|
830
|
+
*/
|
|
831
|
+
type TrackInput = TrackEvent | LegacyTrackEvent;
|
|
832
|
+
interface TrackingConfig {
|
|
833
|
+
/** Events API V2 endpoint path. */
|
|
834
|
+
endpointPath?: string;
|
|
835
|
+
/** Periodic flush interval for buffered events. */
|
|
836
|
+
flushIntervalMs?: number;
|
|
837
|
+
/** Max events per HTTP batch send. */
|
|
838
|
+
maxBatchSize?: number;
|
|
839
|
+
/** Max in-memory buffer size before oldest items are dropped. */
|
|
840
|
+
maxBufferSize?: number;
|
|
841
|
+
/** Number of retries for retryable failures. */
|
|
842
|
+
maxRetries?: number;
|
|
843
|
+
/** Retry backoff base delay. */
|
|
844
|
+
retryBaseDelayMs?: number;
|
|
845
|
+
/** Retry backoff max delay. */
|
|
846
|
+
retryMaxDelayMs?: number;
|
|
847
|
+
/** Default shutdown timeout when none is provided. */
|
|
848
|
+
shutdownTimeoutMs?: number;
|
|
849
|
+
}
|
|
850
|
+
interface TrackingShutdownOptions {
|
|
851
|
+
timeoutMs?: number;
|
|
852
|
+
}
|
|
853
|
+
interface TrackingShutdownResult {
|
|
854
|
+
timedOut: boolean;
|
|
855
|
+
pendingEvents: number;
|
|
856
|
+
}
|
|
857
|
+
/**
|
|
858
|
+
* Tracking module methods for WaniWaniClient.
|
|
859
|
+
*/
|
|
860
|
+
interface TrackingClient {
|
|
861
|
+
/**
|
|
862
|
+
* Track an event using modern or legacy input shape.
|
|
863
|
+
* Returns a deterministic event id immediately after enqueue.
|
|
864
|
+
*/
|
|
865
|
+
track: (event: TrackInput) => Promise<{
|
|
866
|
+
eventId: string;
|
|
867
|
+
}>;
|
|
868
|
+
/**
|
|
869
|
+
* Flush all currently buffered events.
|
|
870
|
+
*/
|
|
871
|
+
flush: () => Promise<void>;
|
|
872
|
+
/**
|
|
873
|
+
* Flush and stop the transport.
|
|
874
|
+
*/
|
|
875
|
+
shutdown: (options?: TrackingShutdownOptions) => Promise<TrackingShutdownResult>;
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
interface WaniWaniConfig {
|
|
879
|
+
/**
|
|
880
|
+
* Your MCP environment API key
|
|
881
|
+
*
|
|
882
|
+
* Defaults to process.env.WANIWANI_API_KEY if not provided
|
|
883
|
+
*
|
|
884
|
+
* To create one, visit:
|
|
885
|
+
* https://app.waniwani.com/mcp/environments
|
|
886
|
+
*/
|
|
887
|
+
apiKey?: string;
|
|
888
|
+
/**
|
|
889
|
+
* The base URL of the WaniWani API
|
|
890
|
+
*
|
|
891
|
+
* Defaults to https://app.waniwani.ai
|
|
892
|
+
*/
|
|
893
|
+
baseUrl?: string;
|
|
894
|
+
/**
|
|
895
|
+
* Tracking transport behavior.
|
|
896
|
+
*/
|
|
897
|
+
tracking?: TrackingConfig;
|
|
898
|
+
}
|
|
899
|
+
/**
|
|
900
|
+
* WaniWani SDK Client
|
|
901
|
+
*
|
|
902
|
+
* Extends with each module:
|
|
903
|
+
* - TrackingClient: track(), flush(), shutdown()
|
|
904
|
+
*
|
|
905
|
+
* Pass this client to framework adapters:
|
|
906
|
+
* - `toNextJsHandler(wani, { ... })` for Next.js route handlers
|
|
907
|
+
*/
|
|
908
|
+
interface WaniWaniClient extends TrackingClient {
|
|
909
|
+
/** @internal Resolved config — used by framework adapters */
|
|
910
|
+
readonly _config: InternalConfig;
|
|
911
|
+
/** Knowledge base client for ingestion, search, and source listing */
|
|
912
|
+
readonly kb: KbClient;
|
|
913
|
+
}
|
|
914
|
+
interface InternalConfig {
|
|
915
|
+
baseUrl: string;
|
|
916
|
+
apiKey: string | undefined;
|
|
917
|
+
tracking: Required<TrackingConfig>;
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
type WaniwaniTracker = Pick<WaniWaniClient, "flush" | "track" | "_config">;
|
|
921
|
+
type UnknownRecord = Record<string, unknown>;
|
|
922
|
+
/**
|
|
923
|
+
* Options for withWaniwani().
|
|
924
|
+
*/
|
|
925
|
+
type WithWaniwaniOptions = {
|
|
926
|
+
/**
|
|
927
|
+
* Optional pre-built WaniWani client.
|
|
928
|
+
* When omitted, a new client is created from `config`.
|
|
929
|
+
*/
|
|
930
|
+
client?: WaniwaniTracker;
|
|
931
|
+
/**
|
|
932
|
+
* WaniWani client config used when `client` is omitted.
|
|
933
|
+
*/
|
|
934
|
+
config?: WaniWaniConfig;
|
|
935
|
+
/**
|
|
936
|
+
* Optional explicit tool type. Defaults to `"other"`.
|
|
937
|
+
*/
|
|
938
|
+
toolType?: ToolCalledProperties["type"] | ((toolName: string) => ToolCalledProperties["type"] | undefined);
|
|
939
|
+
/**
|
|
940
|
+
* Optional metadata merged into every tracked event.
|
|
941
|
+
*/
|
|
942
|
+
metadata?: UnknownRecord;
|
|
943
|
+
/**
|
|
944
|
+
* Flush tracking transport after each tool call.
|
|
945
|
+
*/
|
|
946
|
+
flushAfterToolCall?: boolean;
|
|
947
|
+
/**
|
|
948
|
+
* Optional error callback for non-fatal tracking errors.
|
|
949
|
+
*/
|
|
950
|
+
onError?: (error: Error) => void;
|
|
951
|
+
/**
|
|
952
|
+
* Inject widget tracking config into tool response `_meta.waniwani` so browser
|
|
953
|
+
* widgets can send events directly to the WaniWani backend.
|
|
954
|
+
*
|
|
955
|
+
* Always injects `endpoint`. Injects `token` when an API key is configured
|
|
956
|
+
* and token minting succeeds.
|
|
957
|
+
*
|
|
958
|
+
* @default true
|
|
959
|
+
*/
|
|
960
|
+
injectWidgetToken?: boolean;
|
|
961
|
+
};
|
|
962
|
+
/**
|
|
963
|
+
* Wrap an MCP server so tool handlers automatically emit `tool.called` events.
|
|
964
|
+
*
|
|
965
|
+
* The wrapper intercepts `server.registerTool(...)`, tracks each invocation,
|
|
966
|
+
* then forwards execution to the original tool handler.
|
|
967
|
+
*
|
|
968
|
+
* When `injectWidgetToken` is enabled (default), tracking config is injected
|
|
969
|
+
* into tool response `_meta.waniwani` so browser widgets can post events
|
|
970
|
+
* directly to the WaniWani backend without a server-side proxy.
|
|
971
|
+
*/
|
|
972
|
+
declare function withWaniwani(server: McpServer, options?: WithWaniwaniOptions): McpServer;
|
|
973
|
+
|
|
974
|
+
export { type ConditionFn, END, type FlowConfig, type HostContext, type InferFlowState, type InterruptSignal, type NodeConfig, type NodeHandler, type RegisteredFlow, type RegisteredResource, type RegisteredTool, type ResourceConfig, START, StateGraph, type ToolCallResult, type ToolConfig, type ToolHandler, type ToolHandlerContext, type ToolResult, type ToolToolCallback, type TrackingRouteOptions, type UnifiedWidgetClient, type WidgetCSP, type WidgetPlatform, type WidgetSignal, type WithWaniwaniOptions, createFlow, createResource, createTool, createTrackingRoute, detectPlatform, interrupt, isMCPApps, isOpenAI, registerTools, showWidget, withWaniwani };
|
package/dist/mcp/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function
|
|
2
|
-
`)}async function
|
|
3
|
-
${f}`,r;for(let n of s.values())if(n.resource){r=n.resource;break}let p=r?C({openaiTemplateUri:r.openaiUri,mcpTemplateUri:r.mcpUri,invoking:"Loading...",invoked:"Loaded",autoHeight:r.autoHeight}):void 0;async function m(n,g){let a=n.state??{};if(n.action==="start"){let c=d.get(x);if(!c)return{text:JSON.stringify({status:"error",error:"No start edge"}),data:{status:"error"}};let i=n.initialState?{...a,...n.initialState}:a,l=await N(c,i);return b(l,i,o,s,d,t.id,g)}if(n.action==="continue"){if(!n.step)return{text:JSON.stringify({status:"error",error:'Missing "step" for continue action'}),data:{status:"error"}};let c={...a};if(n.answer){let u=o.get(n.step);if(u)try{let w=await u(c,g);M(w)&&w.field&&(c={...c,[w.field]:n.answer})}catch{}}let i=d.get(n.step);if(!i)return{text:JSON.stringify({status:"error",error:`No edge from step "${n.step}"`}),data:{status:"error"}};let l=await N(i,c);return b(l,c,o,s,d,t.id,g)}if(n.action==="widget_result"){if(!n.step)return{text:JSON.stringify({status:"error",error:'Missing "step" for widget_result action'}),data:{status:"error"}};let c=n.widgetResult??{};if(n.answer!==void 0&&Object.keys(c).length===0){let w=s.get(n.step)?.field;w&&(c={[w]:n.answer})}let i={...a,...c},l=d.get(n.step);if(!l)return{text:JSON.stringify({status:"error",error:`No edge from step "${n.step}"`}),data:{status:"error"}};let u=await N(l,i);return b(u,i,o,s,d,t.id,g)}return{text:JSON.stringify({status:"error",error:`Unknown action: "${n.action}"`}),data:{status:"error"}}}return{id:t.id,title:t.title,description:S,async register(n){n.registerTool(t.id,{title:t.title,description:S,inputSchema:Y,annotations:t.annotations,...p&&{_meta:p}},(async(g,a)=>{let i=a._meta??{},l=await m(g,i);return l.widgetMeta?{content:[{type:"text",text:l.text}],structuredContent:l.data,_meta:{...l.widgetMeta,...i}}:{content:[{type:"text",text:l.text}]}}))}}}var k=class{nodes=new Map;nodeConfigs=new Map;edges=new Map;config;constructor(t){this.config=t}addNode(t,o,s){if(t===x||t===R)throw new Error(`"${t}" is a reserved name and cannot be used as a node name`);if(this.nodes.has(t))throw new Error(`Node "${t}" already exists`);let d,f={};if(typeof o=="function")d=o;else{if(!s)throw new Error(`addNode("${t}", config, handler) requires a handler as the third argument`);d=s,f=o}return this.nodes.set(t,d),this.nodeConfigs.set(t,f),this}addEdge(t,o){if(this.edges.has(t))throw new Error(`Node "${t}" already has an outgoing edge. Use addConditionalEdge for branching.`);return this.edges.set(t,{type:"direct",to:o}),this}addConditionalEdge(t,o){if(this.edges.has(t))throw new Error(`Node "${t}" already has an outgoing edge.`);return this.edges.set(t,{type:"conditional",condition:o}),this}compile(){return this.validate(),U({config:this.config,nodes:new Map(this.nodes),nodeConfigs:new Map(this.nodeConfigs),edges:new Map(this.edges)})}validate(){if(!this.edges.has(x))throw new Error('Flow must have an entry point. Add an edge from START: .addEdge(START, "first_node")');let t=this.edges.get(x);if(t?.type==="direct"&&t.to!==R&&!this.nodes.has(t.to))throw new Error(`START edge references non-existent node: "${t.to}"`);for(let[o,s]of this.edges){if(o!==x&&!this.nodes.has(o))throw new Error(`Edge from non-existent node: "${o}"`);if(s.type==="direct"&&s.to!==R&&!this.nodes.has(s.to))throw new Error(`Edge from "${o}" references non-existent node: "${s.to}"`)}for(let[o]of this.nodes)if(!this.edges.has(o))throw new Error(`Node "${o}" has no outgoing edge. Add one with .addEdge("${o}", ...) or .addConditionalEdge("${o}", ...)`)}};function q(e){return new k(e)}function z(e){let{id:t,title:o,description:s,baseUrl:d,htmlPath:f,widgetDomain:S,prefersBorder:r=!0,autoHeight:p=!0}=e,m=e.widgetCSP??{connect_domains:[d],resource_domains:[d]};if(process.env.NODE_ENV==="development")try{let{hostname:u}=new URL(d);(u==="localhost"||u==="127.0.0.1")&&(m={...m,connect_domains:[...m.connect_domains||[],`ws://${u}:*`,`wss://${u}:*`],resource_domains:[...m.resource_domains||[],`http://${u}:*`]})}catch{}let n=`ui://widgets/apps-sdk/${t}.html`,g=`ui://widgets/ext-apps/${t}.html`,a=null,c=()=>(a||(a=A(d,f)),a),i=s;async function l(u){let w=await c();u.registerResource(`${t}-openai-widget`,n,{title:o,description:i,mimeType:v,_meta:{"openai/widgetDescription":i,"openai/widgetPrefersBorder":r}},async _=>({contents:[{uri:_.href,mimeType:v,text:w,_meta:D({description:i,prefersBorder:r,widgetDomain:S,widgetCSP:m})}]})),u.registerResource(`${t}-mcp-widget`,g,{title:o,description:i,mimeType:E,_meta:{ui:{prefersBorder:r}}},async _=>({contents:[{uri:_.href,mimeType:E,text:w,_meta:W({description:i,prefersBorder:r,widgetCSP:m})}]}))}return{id:t,title:o,description:s,openaiUri:n,mcpUri:g,autoHeight:p,register:l}}function Z(e,t){let{resource:o,description:s,inputSchema:d,annotations:f}=e,S=e.id??o?.id,r=e.title??o?.title;if(!S)throw new Error("createTool: `id` is required when no resource is provided");if(!r)throw new Error("createTool: `title` is required when no resource is provided");let p=o?C({openaiTemplateUri:o.openaiUri,mcpTemplateUri:o.mcpUri,invoking:e.invoking??"Loading...",invoked:e.invoked??"Loaded",autoHeight:o.autoHeight}):void 0;return{id:S,title:r,description:s,async register(m){m.registerTool(S,{title:r,description:s,inputSchema:d,annotations:f,...p&&{_meta:p}},(async(n,g)=>{let c=g._meta??{},i=await t(n,{extra:{_meta:c}});return o&&i.data?{content:[{type:"text",text:i.text}],structuredContent:i.data,_meta:{...p,...c}}:{content:[{type:"text",text:i.text}]}}))}}}async function G(e,t){await Promise.all(t.map(o=>o.register(e)))}export{R as END,x as START,k as StateGraph,q as createFlow,z as createResource,Z as createTool,P as detectPlatform,O as interrupt,J as isMCPApps,j as isOpenAI,G as registerTools,$ as showWidget};
|
|
1
|
+
function U(){return typeof window<"u"&&"openai"in window?"openai":"mcp-apps"}function ge(){return U()==="openai"}function he(){return U()==="mcp-apps"}var v="__start__",E="__end__",B=Symbol.for("waniwani.flow.interrupt"),H=Symbol.for("waniwani.flow.widget");function z(e){if("questions"in e)return{__type:B,questions:e.questions,context:e.context};let{question:t,field:n,context:r,suggestions:o}=e;return{__type:B,questions:[{question:t,field:n,context:r,suggestions:o}]}}function K(e,t){return{__type:H,resource:e,...t}}function Y(e){return typeof e=="object"&&e!==null&&"__type"in e&&e.__type===B}function X(e){return typeof e=="object"&&e!==null&&"__type"in e&&e.__type===H}import{z as I}from"zod";var C="text/html+skybridge",_="text/html;profile=mcp-app",J=async(e,t)=>{let n=e.endsWith("/")?e.slice(0,-1):e;return await(await fetch(`${n}${t}`)).text()};function Z(e){return{"openai/widgetDescription":e.description,"openai/widgetPrefersBorder":e.prefersBorder,"openai/widgetDomain":e.widgetDomain,...e.widgetCSP&&{"openai/widgetCSP":e.widgetCSP}}}function G(e){let t=e.widgetCSP?{connectDomains:e.widgetCSP.connect_domains,resourceDomains:e.widgetCSP.resource_domains,frameDomains:e.widgetCSP.frame_domains,redirectDomains:e.widgetCSP.redirect_domains}:void 0;return{ui:{...t&&{csp:t},...e.widgetDomain&&{domain:e.widgetDomain},...e.prefersBorder!==void 0&&{prefersBorder:e.prefersBorder}}}}function R(e){return{...e.openaiTemplateUri&&{"openai/outputTemplate":e.openaiTemplateUri},"openai/toolInvocation/invoking":e.invoking,"openai/toolInvocation/invoked":e.invoked,"openai/widgetAccessible":!0,"openai/resultCanProduceWidget":!0,...e.mcpTemplateUri&&{ui:{resourceUri:e.mcpTemplateUri,...e.autoHeight&&{autoHeight:!0}}}}}function Q(e){let t=JSON.stringify(e);return typeof Buffer<"u"?Buffer.from(t,"utf-8").toString("base64"):btoa(t)}function ee(e){try{let t;return typeof Buffer<"u"?t=Buffer.from(e,"base64").toString("utf-8"):t=atob(e),JSON.parse(t)}catch{return null}}function me(e){let t=e.description??"",n=e._zod?.def;if(n?.type==="enum"&&n.entries){let r=Object.keys(n.entries).map(o=>`"${o}"`).join(" | ");return t?`${r} \u2014 ${t}`:r}return t}function we(e){let t=["","## FLOW EXECUTION PROTOCOL","","This tool implements a multi-step conversational flow. Follow this protocol exactly:","",'1. Call with `action: "start"` to begin. If the user\'s message already'," contains answers to likely questions, extract them into `stateUpdates`"," as `{ field: value }` pairs. The engine will auto-skip steps whose"," fields are already filled."," Only extract values the user explicitly stated \u2014 do NOT guess or invent values."];if(e.state){let n=Object.entries(e.state).map(([r,o])=>{let a=me(o);return a?`\`${r}\` (${a})`:`\`${r}\``}).join(", ");t.push(` Known fields: ${n}.`)}return t.push("2. The response JSON `status` field tells you what to do next:",' - `"interrupt"`: Pause and ask the user. Two forms:'," a. Single question: `{ question, field, context? }` \u2014 ask `question`, store answer in `field`."," b. Multi-question: `{ questions: [{question, field}, ...], context? }` \u2014 ask ALL questions"," in one conversational message, collect all answers."," `context` (if present) is hidden AI instructions \u2014 use to shape your response, do NOT show verbatim."," Then call again with:",' `action: "continue"`, `flowToken` = the `flowToken` from the response (pass back exactly as received),'," `stateUpdates` = answers keyed by their `field` names, plus any other fields the user mentioned.",' - `"widget"`: A widget UI is being shown. The user will interact with the widget.'," When the user makes a choice, call again with:",' `action: "continue"`, `flowToken` = the `flowToken` from the response,'," `stateUpdates` = `{ [field]: <user's selection> }` plus any other fields the user mentioned.",' - `"complete"`: The flow is done. Present the result to the user.',' - `"error"`: Something went wrong. Show the `error` message.',"","3. ALWAYS pass back the `flowToken` string exactly as received \u2014 it is an opaque token, do not modify it.","4. Do NOT invent state values. Only use `stateUpdates` for information the user explicitly provided.","5. Include only the fields the user actually answered in `stateUpdates` \u2014 do NOT guess missing ones."," If the user did not answer all pending questions, the engine will re-prompt for the remaining ones."," If the user mentioned values for other known fields, include those too \u2014"," they will be applied immediately and those steps will be auto-skipped.",'6. CONVERSATIONAL STEPS: When a response includes a `"conversational"` field:'," - Do NOT immediately call `continue`. Instead, engage in back-and-forth conversation."," - The user may ask follow-up questions, explore options, or request changes.",' - Only call `action: "continue"` when the user explicitly wants to move on',` (e.g., "looks good", "let's continue", "I'll go with X", or selects an option).`," - If `conversational` is a string, use it as guidance for what topics to discuss."," - While conversing, do NOT call the tool \u2014 just respond naturally to the user."),t.join(`
|
|
2
|
+
`)}function ye(e){if(e.flowToken){let t=ee(e.flowToken);if(t)return t}return{step:void 0,state:{}}}async function M(e,t){return e.type==="direct"?e.to:e.condition(t)}function q(e){return e!=null&&e!==""}function te(e,t,n,r,o){if(e.every(f=>q(r[f.field])))return null;let a=e.filter(f=>!q(r[f.field])),i=a.length===1,s=a[0],d=o?typeof o=="string"?o:!0:void 0;return{payload:i&&s?{status:"interrupt",question:s.question,field:s.field,...s.suggestions?{suggestions:s.suggestions}:{},...s.context||t?{context:s.context??t}:{},...d?{conversational:d}:{}}:{status:"interrupt",questions:a,...t?{context:t}:{},...d?{conversational:d}:{}},flowMeta:{step:n,state:r,...i&&s?{field:s.field}:{},questions:e,...t?{interruptContext:t}:{}}}}async function O(e,t,n,r,o,a){let i=e,s={...t},d=50,g=0;for(;g++<d;){if(i===E)return{payload:{status:"complete"},flowMeta:{state:s}};let f=n.get(i);if(!f)return{payload:{status:"error",error:`Unknown node: "${i}"`}};try{let c=await f(s,a);if(Y(c)){let l=te(c.questions,c.context,i,s,r.get(i)?.conversational);if(l)return l;let p=o.get(i);if(!p)return{payload:{status:"error",error:`No outgoing edge from node "${i}"`}};i=await M(p,s);continue}if(X(c)){let l=c.field??r.get(i)?.field;if(l&&q(s[l])){let w=o.get(i);if(!w)return{payload:{status:"error",error:`No outgoing edge from node "${i}"`}};i=await M(w,s);continue}let p=c.resource,T=r.get(i)?.conversational;return{payload:{status:"widget",description:c.description,...T?{conversational:typeof T=="string"?T:!0}:{}},data:c.data,widgetMeta:R({openaiTemplateUri:p.openaiUri,mcpTemplateUri:p.mcpUri,invoking:"Loading...",invoked:"Loaded",autoHeight:p.autoHeight}),flowMeta:{step:i,state:s,field:l,widgetId:p.id}}}s={...s,...c};let u=o.get(i);if(!u)return{payload:{status:"error",error:`No outgoing edge from node "${i}"`}};i=await M(u,s)}catch(c){return{payload:{status:"error",error:c instanceof Error?c.message:String(c)},flowMeta:{step:i,state:s}}}}return{payload:{status:"error",error:"Flow exceeded maximum iterations (possible infinite loop)"}}}var Te={action:I.enum(["start","continue"]).describe('"start" to begin the flow, "continue" to resume after a pause (interrupt or widget)'),stateUpdates:I.record(I.string(),I.unknown()).optional().describe("State field values to set before processing the next node. Use this to pass the user's answer (keyed by the field name from the response) and any other values the user mentioned."),flowToken:I.string().optional().describe("Opaque flow token from the previous response. Pass back exactly as received.")};function ne(e){let{config:t,nodes:n,nodeConfigs:r,edges:o}=e,a=we(t),i=`${t.description}
|
|
3
|
+
${a}`;async function s(d,g){let f=ye(d),c=f.state;if(d.action==="start"){let u=o.get(v);if(!u)return{payload:{status:"error",error:"No start edge"}};let l={...c,...d.stateUpdates??{}},p=await M(u,l);return O(p,l,n,r,o,g)}if(d.action==="continue"){let u=f.step;if(!u)return{payload:{status:"error",error:'Missing "_meta.flow.step" for continue action'}};let l={...c,...d.stateUpdates??{}};if(f.questions){let p=te(f.questions,f.interruptContext,u,l,r.get(u)?.conversational);if(p)return p}if(f.questions||f.widgetId){let p=o.get(u);if(!p)return{payload:{status:"error",error:`No edge from step "${u}"`}};let T=await M(p,l);return O(T,l,n,r,o,g)}return O(u,l,n,r,o,g)}return{payload:{status:"error",error:`Unknown action: "${d.action}"`}}}return{id:t.id,title:t.title,description:i,async register(d){d.registerTool(t.id,{title:t.title,description:i,inputSchema:Te,annotations:t.annotations},(async(g,f)=>{let u=f._meta??{},l=await s(g,u),p=l.flowMeta?Q({step:l.flowMeta.step??"",state:l.flowMeta.state,field:l.flowMeta.field,widgetId:l.flowMeta.widgetId,questions:l.flowMeta.questions,interruptContext:l.flowMeta.interruptContext}):void 0,T={...l.payload,...p?{flowToken:p,flowId:t.id}:{}},w=[{type:"text",text:JSON.stringify(T,null,2)}],S={...l.widgetMeta??{},...u};return l.widgetMeta?{content:w,structuredContent:l.data,_meta:S}:{content:w,...Object.keys(S).length>0?{_meta:S}:{}}}))}}}var x=class{nodes=new Map;nodeConfigs=new Map;edges=new Map;config;constructor(t){this.config=t}addNode(t,n,r){if(t===v||t===E)throw new Error(`"${t}" is a reserved name and cannot be used as a node name`);if(this.nodes.has(t))throw new Error(`Node "${t}" already exists`);let o,a={};if(typeof n=="function")o=n;else if(r)o=r,a=n;else throw new Error(`Node "${t}" requires a handler function.`);return this.nodes.set(t,o),this.nodeConfigs.set(t,a),this}addEdge(t,n){if(this.edges.has(t))throw new Error(`Node "${t}" already has an outgoing edge. Use addConditionalEdge for branching.`);return this.edges.set(t,{type:"direct",to:n}),this}addConditionalEdge(t,n){if(this.edges.has(t))throw new Error(`Node "${t}" already has an outgoing edge.`);return this.edges.set(t,{type:"conditional",condition:n}),this}compile(){return this.validate(),ne({config:this.config,nodes:new Map(this.nodes),nodeConfigs:new Map(this.nodeConfigs),edges:new Map(this.edges)})}validate(){if(!this.edges.has(v))throw new Error('Flow must have an entry point. Add an edge from START: .addEdge(START, "first_node")');let t=this.edges.get(v);if(t?.type==="direct"&&t.to!==E&&!this.nodes.has(t.to))throw new Error(`START edge references non-existent node: "${t.to}"`);for(let[n,r]of this.edges){if(n!==v&&!this.nodes.has(n))throw new Error(`Edge from non-existent node: "${n}"`);if(r.type==="direct"&&r.to!==E&&!this.nodes.has(r.to))throw new Error(`Edge from "${n}" references non-existent node: "${r.to}"`)}for(let[n]of this.nodes)if(!this.edges.has(n))throw new Error(`Node "${n}" has no outgoing edge. Add one with .addEdge("${n}", ...) or .addConditionalEdge("${n}", ...)`)}};function re(e){return new x(e)}function oe(e){let{id:t,title:n,description:r,baseUrl:o,htmlPath:a,widgetDomain:i,prefersBorder:s=!0,autoHeight:d=!0}=e,g=e.widgetCSP??{connect_domains:[o],resource_domains:[o]};if(process.env.NODE_ENV==="development")try{let{hostname:w}=new URL(o);(w==="localhost"||w==="127.0.0.1")&&(g={...g,connect_domains:[...g.connect_domains||[],`ws://${w}:*`,`wss://${w}:*`],resource_domains:[...g.resource_domains||[],`http://${w}:*`]})}catch{}let f=`ui://widgets/apps-sdk/${t}.html`,c=`ui://widgets/ext-apps/${t}.html`,u=null,l=()=>(u||(u=J(o,a)),u),p=r;async function T(w){let S=await l();w.registerResource(`${t}-openai-widget`,f,{title:n,description:p,mimeType:C,_meta:{"openai/widgetDescription":p,"openai/widgetPrefersBorder":s}},async k=>({contents:[{uri:k.href,mimeType:C,text:S,_meta:Z({description:p,prefersBorder:s,widgetDomain:i,widgetCSP:g})}]})),w.registerResource(`${t}-mcp-widget`,c,{title:n,description:p,mimeType:_,_meta:{ui:{prefersBorder:s}}},async k=>({contents:[{uri:k.href,mimeType:_,text:S,_meta:G({description:p,prefersBorder:s,widgetCSP:g})}]}))}return{id:t,title:n,description:r,openaiUri:f,mcpUri:c,autoHeight:d,register:T}}function ke(e,t){let{resource:n,description:r,inputSchema:o,annotations:a}=e,i=e.id??n?.id,s=e.title??n?.title;if(!i)throw new Error("createTool: `id` is required when no resource is provided");if(!s)throw new Error("createTool: `title` is required when no resource is provided");let d=n?R({openaiTemplateUri:n.openaiUri,mcpTemplateUri:n.mcpUri,invoking:e.invoking??"Loading...",invoked:e.invoked??"Loaded",autoHeight:n.autoHeight}):void 0;return{id:i,title:s,description:r,async register(g){g.registerTool(i,{title:s,description:r,inputSchema:o,annotations:a,...d&&{_meta:d}},(async(f,c)=>{let l=c._meta??{},p=await t(f,{extra:{_meta:l}});return n&&p.data?{content:[{type:"text",text:p.text}],structuredContent:p.data,_meta:{...d,...l}}:{content:[{type:"text",text:p.text}]}}))}}}async function Se(e,t){await Promise.all(t.map(n=>n.register(e)))}var P=class extends Error{constructor(n,r){super(n);this.status=r;this.name="WaniWaniError"}};var ve="@waniwani/sdk";function ie(e){let{baseUrl:t,apiKey:n}=e;function r(){if(!n)throw new Error("WANIWANI_API_KEY is not set");return n}async function o(a,i,s){let d=r(),g=`${t.replace(/\/$/,"")}${i}`,f={Authorization:`Bearer ${d}`,"X-WaniWani-SDK":ve},c={method:a,headers:f};s!==void 0&&(f["Content-Type"]="application/json",c.body=JSON.stringify(s));let u=await fetch(g,c);if(!u.ok){let p=await u.text().catch(()=>"");throw new P(p||`KB API error: HTTP ${u.status}`,u.status)}return(await u.json()).data}return{async ingest(a){return o("POST","/api/mcp/kb/ingest",{files:a})},async search(a,i){return o("POST","/api/mcp/kb/search",{query:a,...i})},async sources(){return o("GET","/api/mcp/kb/sources")}}}var Ee="@waniwani/sdk";function j(e,t={}){let n=t.now??(()=>new Date),r=t.generateId??se,o=Ie(e),a=W(e.meta),i=W(e.metadata),s=Me(e,a),d=y(e.eventId)??r(),g=be(e.timestamp,n),f=y(e.source)??t.source??Ee,c=$(e)?{...e}:void 0,u={...i};return Object.keys(a).length>0&&(u.meta=a),c&&(u.rawLegacy=c),{id:d,type:"mcp.event",name:o,source:f,timestamp:g,correlation:s,properties:xe(e,o),metadata:u,rawLegacy:c}}function se(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?`evt_${crypto.randomUUID()}`:`evt_${Math.random().toString(36).slice(2,10)}_${Date.now().toString(36)}`}function xe(e,t){if(!$(e))return W(e.properties);let n=Re(e,t),r=W(e.properties);return{...n,...r}}function Re(e,t){switch(t){case"tool.called":{let n={};return y(e.toolName)&&(n.name=e.toolName),y(e.toolType)&&(n.type=e.toolType),n}case"quote.succeeded":{let n={};return typeof e.quoteAmount=="number"&&(n.amount=e.quoteAmount),y(e.quoteCurrency)&&(n.currency=e.quoteCurrency),n}case"link.clicked":{let n={};return y(e.linkUrl)&&(n.url=e.linkUrl),n}case"purchase.completed":{let n={};return typeof e.purchaseAmount=="number"&&(n.amount=e.purchaseAmount),y(e.purchaseCurrency)&&(n.currency=e.purchaseCurrency),n}default:return{}}}function Ie(e){return $(e)?e.eventType:e.event}function Me(e,t){let n=y(e.requestId)??b(t,["openai/requestId","requestId","mcp/requestId"]),r=y(e.sessionId)??b(t,["openai/sessionId","sessionId","conversationId","anthropic/sessionId"]),o=y(e.traceId)??b(t,["openai/traceId","traceId","mcp/traceId","openai/requestId","requestId"]),a=y(e.externalUserId)??b(t,["openai/userId","externalUserId","userId","actorId"]),i=y(e.correlationId)??b(t,["correlationId","openai/requestId"])??n,s={};return r&&(s.sessionId=r),o&&(s.traceId=o),n&&(s.requestId=n),i&&(s.correlationId=i),a&&(s.externalUserId=a),s}function be(e,t){if(e instanceof Date)return e.toISOString();if(typeof e=="string"){let n=new Date(e);if(!Number.isNaN(n.getTime()))return n.toISOString()}return t().toISOString()}function b(e,t){for(let n of t){let r=e[n];if(typeof r=="string"&&r.trim().length>0)return r}}function W(e){return!e||typeof e!="object"||Array.isArray(e)?{}:e}function y(e){if(typeof e=="string"&&e.trim().length!==0)return e}function $(e){return"eventType"in e}var Ce="/api/mcp/events/v2/batch";var ae="@waniwani/sdk",_e=new Set([401,403]),Pe=new Set([408,425,429,500,502,503,504]);function de(e){return new L(e)}var L=class{endpointUrl;flushIntervalMs;maxBatchSize;maxBufferSize;maxRetries;retryBaseDelayMs;retryMaxDelayMs;shutdownTimeoutMs;sdkVersion;fetchFn;logger;now;sleep;apiKey;buffer=[];flushTimer;flushScheduled=!1;flushScheduledTimer;flushInFlight;inFlightCount=0;isStopped=!1;isShuttingDown=!1;constructor(t){this.endpointUrl=Fe(t.baseUrl,t.endpointPath??Ce),this.flushIntervalMs=t.flushIntervalMs??1e3,this.maxBatchSize=t.maxBatchSize??20,this.maxBufferSize=t.maxBufferSize??1e3,this.maxRetries=t.maxRetries??3,this.retryBaseDelayMs=t.retryBaseDelayMs??200,this.retryMaxDelayMs=t.retryMaxDelayMs??2e3,this.shutdownTimeoutMs=t.shutdownTimeoutMs??2e3,this.fetchFn=t.fetchFn??fetch,this.logger=t.logger??console,this.now=t.now??(()=>new Date),this.sleep=t.sleep??(n=>new Promise(r=>setTimeout(r,n))),this.apiKey=t.apiKey,this.sdkVersion=t.sdkVersion,this.flushIntervalMs>0&&(this.flushTimer=setInterval(()=>{this.flush()},this.flushIntervalMs))}enqueue(t){if(this.isStopped||this.isShuttingDown){this.logger.warn("[WaniWani] Tracking transport is stopped, dropping event %s",t.id);return}if(this.buffer.length>=this.maxBufferSize){let n=this.buffer.length-this.maxBufferSize+1;this.buffer.splice(0,n),this.logger.warn("[WaniWani] Tracking buffer overflow, dropped %d oldest event(s)",n)}if(this.buffer.push(t),this.buffer.length>=this.maxBatchSize){this.flush();return}this.scheduleMicroFlush()}pendingEvents(){return this.buffer.length+this.inFlightCount}async flush(){return this.flushInFlight?this.flushInFlight:(this.flushInFlight=this.flushLoop().finally(()=>{this.flushInFlight=void 0}),this.flushInFlight)}async shutdown(t){this.isShuttingDown=!0,this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=void 0),this.flushScheduledTimer&&(clearTimeout(this.flushScheduledTimer),this.flushScheduledTimer=void 0,this.flushScheduled=!1);let n=t?.timeoutMs??this.shutdownTimeoutMs,r=this.flush();if(!Number.isFinite(n)||n<=0)return await r,this.isStopped=!0,{timedOut:!1,pendingEvents:this.pendingEvents()};let o=Symbol("shutdown-timeout");return await Promise.race([r.then(()=>"flushed"),this.sleep(n).then(()=>o)])===o?(this.isStopped=!0,{timedOut:!0,pendingEvents:this.pendingEvents()}):(this.isStopped=!0,{timedOut:!1,pendingEvents:this.pendingEvents()})}scheduleMicroFlush(){this.flushScheduled||(this.flushScheduled=!0,this.flushScheduledTimer=setTimeout(()=>{this.flushScheduledTimer=void 0,this.flushScheduled=!1,this.flush()},0))}async flushLoop(){for(;this.buffer.length>0&&!this.isStopped;){let t=this.buffer.splice(0,this.maxBatchSize);await this.sendBatchWithRetry(t)}}async sendBatchWithRetry(t){let n=0,r=t;for(;r.length>0&&!this.isStopped;){this.inFlightCount=r.length;let o=await this.sendBatchOnce(r);switch(this.inFlightCount=0,o.kind){case"success":return;case"auth":this.stopTransportForAuthFailure(o.status,r.length);return;case"permanent":this.logger.error("[WaniWani] Dropping %d event(s) after permanent failure: %s",r.length,o.reason);return;case"retryable":if(n>=this.maxRetries){this.logger.error("[WaniWani] Dropping %d event(s) after retry exhaustion: %s",r.length,o.reason);return}await this.sleep(this.backoffDelayMs(n)),n+=1;continue;case"partial":if(o.permanent.length>0&&this.logger.error("[WaniWani] Dropping %d event(s) rejected as permanent",o.permanent.length),o.retryable.length===0)return;if(n>=this.maxRetries){this.logger.error("[WaniWani] Dropping %d retryable event(s) after retry exhaustion",o.retryable.length);return}r=o.retryable,await this.sleep(this.backoffDelayMs(n)),n+=1;continue}}}async sendBatchOnce(t){let n;try{n=await this.fetchFn(this.endpointUrl,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,"X-WaniWani-SDK":ae},body:JSON.stringify(this.makeBatchRequest(t))})}catch(a){return{kind:"retryable",reason:Ne(a)}}if(_e.has(n.status))return{kind:"auth",status:n.status};if(Pe.has(n.status))return{kind:"retryable",reason:`HTTP ${n.status}`};if(!n.ok)return{kind:"permanent",reason:`HTTP ${n.status}`};let r=await Ae(n);if(!r?.rejected||r.rejected.length===0)return{kind:"success"};let o=this.classifyRejectedEvents(t,r.rejected);return o.retryable.length===0&&o.permanent.length===0?{kind:"success"}:{kind:"partial",retryable:o.retryable,permanent:o.permanent}}makeBatchRequest(t){return{sentAt:this.now().toISOString(),source:{sdk:ae,version:this.sdkVersion??"0.0.0"},events:t}}classifyRejectedEvents(t,n){let r=new Map(t.map(i=>[i.id,i])),o=[],a=[];for(let i of n){let s=r.get(i.eventId);if(s){if(We(i)){o.push(s);continue}a.push(s)}}return{retryable:o,permanent:a}}backoffDelayMs(t){let n=this.retryBaseDelayMs*2**t;return Math.min(n,this.retryMaxDelayMs)}stopTransportForAuthFailure(t,n){this.isStopped=!0;let r=this.buffer.length;this.buffer.splice(0,r),this.logger.error("[WaniWani] Auth failure (HTTP %d). Stopping tracking transport and dropping %d queued event(s)",t,n+r)}};function We(e){if(e.retryable===!0)return!0;let t=e.code.toLowerCase();return t.includes("timeout")||t.includes("temporary")||t.includes("unavailable")||t.includes("rate_limit")||t.includes("transient")||t.includes("server")}async function Ae(e){let t=await e.text();if(t)try{return JSON.parse(t)}catch{return}}function Fe(e,t){let n=e.endsWith("/")?e:`${e}/`,r=t.startsWith("/")?t.slice(1):t;return`${n}${r}`}function Ne(e){return e instanceof Error?e.message:String(e)}function ce(e){let{baseUrl:t,apiKey:n,tracking:r}=e;function o(){if(!n)throw new Error("WANIWANI_API_KEY is not set");return n}let a=n?de({baseUrl:t,apiKey:n,endpointPath:r.endpointPath,flushIntervalMs:r.flushIntervalMs,maxBatchSize:r.maxBatchSize,maxBufferSize:r.maxBufferSize,maxRetries:r.maxRetries,retryBaseDelayMs:r.retryBaseDelayMs,retryMaxDelayMs:r.retryMaxDelayMs,shutdownTimeoutMs:r.shutdownTimeoutMs}):void 0,i={async track(s){o();let d=j(s);return a?.enqueue(d),{eventId:d.id}},async flush(){o(),await a?.flush()},async shutdown(s){return o(),await a?.shutdown({timeoutMs:s?.timeoutMs??r.shutdownTimeoutMs})??{timedOut:!1,pendingEvents:0}}};return a&&De(i,r.shutdownTimeoutMs),i}function De(e,t){if(typeof process>"u"||typeof process.once!="function"||typeof process.on!="function")return;let n=()=>{e.shutdown({timeoutMs:t})};process.once("beforeExit",n),process.once("SIGINT",n),process.once("SIGTERM",n)}function A(e){let t=e?.baseUrl??"https://app.waniwani.ai",n=e?.apiKey??process.env.WANIWANI_API_KEY,r={endpointPath:e?.tracking?.endpointPath??"/api/mcp/events/v2/batch",flushIntervalMs:e?.tracking?.flushIntervalMs??1e3,maxBatchSize:e?.tracking?.maxBatchSize??20,maxBufferSize:e?.tracking?.maxBufferSize??1e3,maxRetries:e?.tracking?.maxRetries??3,retryBaseDelayMs:e?.tracking?.retryBaseDelayMs??200,retryMaxDelayMs:e?.tracking?.retryMaxDelayMs??2e3,shutdownTimeoutMs:e?.tracking?.shutdownTimeoutMs??2e3},o={baseUrl:t,apiKey:n,tracking:r},a=ce(o),i=ie(o);return{...a,kb:i,_config:o}}function Ue(e){let t=e.event_type??"widget_click",r=t.startsWith("widget_")?t:`widget_${t}`,o={...e.metadata??{}};return e.event_name&&(o.event_name=e.event_name),{event:r,properties:o,sessionId:e.session_id,traceId:e.trace_id,externalUserId:e.user_id,eventId:e.event_id,timestamp:e.timestamp,source:e.source??"widget"}}function Be(e){let t={apiKey:e?.apiKey,baseUrl:e?.baseUrl},n;function r(){return n||(n=A(t)),n}return async function(a){let i;try{i=await a.json()}catch{return new Response(JSON.stringify({error:"Invalid JSON"}),{status:400,headers:{"Content-Type":"application/json"}})}if(!Array.isArray(i.events)||i.events.length===0)return new Response(JSON.stringify({error:"Missing or empty events array"}),{status:400,headers:{"Content-Type":"application/json"}});try{let s=r(),d=[];for(let g of i.events){let f=Ue(g),c=await s.track(f);d.push(c.eventId)}return await s.flush(),new Response(JSON.stringify({ok:!0,accepted:d.length}),{status:200,headers:{"Content-Type":"application/json"}})}catch(s){let d=s instanceof Error?s.message:"Unknown error";return new Response(JSON.stringify({error:d}),{status:500,headers:{"Content-Type":"application/json"}})}}}var F=class{cached=null;pending=null;config;constructor(t){this.config=t}async getToken(t,n){return this.cached&&Date.now()<this.cached.expiresAt-12e4?this.cached.token:this.pending?this.pending:(this.pending=this.mint(t,n).finally(()=>{this.pending=null}),this.pending)}async mint(t,n){let r=Oe(this.config.baseUrl,"/api/mcp/widget-tokens"),o={};t&&(o.sessionId=t),n&&(o.traceId=n);try{let a=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify(o)});if(!a.ok)return null;let i=await a.json(),s=i.data&&typeof i.data=="object"?i.data:i,d=new Date(s.expiresAt).getTime();return!s.token||Number.isNaN(d)?null:(this.cached={token:s.token,expiresAt:d},s.token)}catch{return null}}};function Oe(e,t){return`${e.endsWith("/")?e.slice(0,-1):e}${t}`}var ue="https://app.waniwani.ai";function qe(e,t={}){let n=e;if(n.__waniwaniWrapped)return n;n.__waniwaniWrapped=!0;let r=t.client??A(t.config),o=t.injectWidgetToken!==!1,a=null;function i(){if(a)return a;let d=r._config.apiKey;return d?(a=new F({baseUrl:r._config.baseUrl??ue,apiKey:d}),a):null}let s=e.registerTool.bind(e);return n.registerTool=((...d)=>{let[g,f,c]=d,u=typeof g=="string"&&g.trim().length>0?g:"unknown";if(typeof c!="function")return s(...d);let l=c;return s(g,f,async(T,w)=>{let S=performance.now();try{let k=await l(T,w),D=Math.round(performance.now()-S);return await pe(r,le(u,w,t,{durationMs:D,status:"ok"}),t.onError),t.flushAfterToolCall&&await fe(r,t.onError),o&&await je(k,i(),r._config.baseUrl??ue,t.onError),k}catch(k){let D=Math.round(performance.now()-S);throw await pe(r,le(u,w,t,{durationMs:D,status:"error",errorMessage:k instanceof Error?k.message:String(k)}),t.onError),t.flushAfterToolCall&&await fe(r,t.onError),k}})}),n}async function je(e,t,n,r){if(!N(e))return;N(e._meta)||(e._meta={});let o=e._meta,a={endpoint:`${n.replace(/\/$/,"")}/api/mcp/events/v2/batch`};if(t)try{let i=await t.getToken();i&&(a.token=i)}catch(i){r?.(V(i))}o.waniwani=a}function le(e,t,n,r){let o=$e(e,n.toolType),a=Le(t);return{event:"tool.called",properties:{name:e,type:o,...r??{}},meta:a,metadata:{source:"withWaniwani",...n.metadata??{}}}}function $e(e,t){return typeof t=="function"?t(e)??"other":t??"other"}function Le(e){if(!N(e))return;let t=e._meta;if(N(t))return t}function N(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}async function pe(e,t,n){try{await e.track(t)}catch(r){n?.(V(r))}}async function fe(e,t){try{await e.flush()}catch(n){t?.(V(n))}}function V(e){return e instanceof Error?e:new Error(String(e))}export{E as END,v as START,x as StateGraph,re as createFlow,oe as createResource,ke as createTool,Be as createTrackingRoute,U as detectPlatform,z as interrupt,he as isMCPApps,ge as isOpenAI,Se as registerTools,K as showWidget,qe as withWaniwani};
|
|
4
4
|
//# sourceMappingURL=index.js.map
|