@yourgpt/copilot-sdk 2.0.1 → 2.0.2-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. package/README.md +42 -0
  2. package/dist/{ThreadManager-JT0sqSSD.d.ts → ThreadManager-Dkp_eLty.d.ts} +1 -1
  3. package/dist/{ThreadManager-CUq5Ocu2.d.cts → ThreadManager-LfFRhr4e.d.cts} +1 -1
  4. package/dist/anthropic-6F5GRE3B.js +4 -0
  5. package/dist/anthropic-6F5GRE3B.js.map +1 -0
  6. package/dist/anthropic-DGalr_Fw.d.cts +17 -0
  7. package/dist/anthropic-DkCEDYOt.d.ts +17 -0
  8. package/dist/anthropic-NMTRABEH.cjs +21 -0
  9. package/dist/anthropic-NMTRABEH.cjs.map +1 -0
  10. package/dist/brave-DdnWb7Gb.d.cts +17 -0
  11. package/dist/brave-DsI9n7Wr.d.ts +17 -0
  12. package/dist/brave-OYKCOZEM.cjs +21 -0
  13. package/dist/brave-OYKCOZEM.cjs.map +1 -0
  14. package/dist/brave-XSASGGH2.js +4 -0
  15. package/dist/brave-XSASGGH2.js.map +1 -0
  16. package/dist/chunk-2FAWEBZS.cjs +88 -0
  17. package/dist/chunk-2FAWEBZS.cjs.map +1 -0
  18. package/dist/chunk-53UGJNHN.js +92 -0
  19. package/dist/chunk-53UGJNHN.js.map +1 -0
  20. package/dist/chunk-6T5XXJEP.cjs +80 -0
  21. package/dist/chunk-6T5XXJEP.cjs.map +1 -0
  22. package/dist/chunk-7K7HZMP4.cjs +1170 -0
  23. package/dist/chunk-7K7HZMP4.cjs.map +1 -0
  24. package/dist/chunk-7W7QLZNC.js +72 -0
  25. package/dist/chunk-7W7QLZNC.js.map +1 -0
  26. package/dist/{chunk-JM7PB2LP.js → chunk-7XFFRV7D.js} +10 -66
  27. package/dist/chunk-7XFFRV7D.js.map +1 -0
  28. package/dist/chunk-ASV6JLYG.cjs +99 -0
  29. package/dist/chunk-ASV6JLYG.cjs.map +1 -0
  30. package/dist/chunk-BH7MNDWW.js +1152 -0
  31. package/dist/chunk-BH7MNDWW.js.map +1 -0
  32. package/dist/chunk-BKO7DSPU.js +67 -0
  33. package/dist/chunk-BKO7DSPU.js.map +1 -0
  34. package/dist/chunk-CBAHCI4R.cjs +76 -0
  35. package/dist/chunk-CBAHCI4R.cjs.map +1 -0
  36. package/dist/chunk-CEKAYA2Q.cjs +74 -0
  37. package/dist/chunk-CEKAYA2Q.cjs.map +1 -0
  38. package/dist/chunk-CEOMTQTP.js +85 -0
  39. package/dist/chunk-CEOMTQTP.js.map +1 -0
  40. package/dist/chunk-DABZYCVX.js +84 -0
  41. package/dist/chunk-DABZYCVX.js.map +1 -0
  42. package/dist/chunk-DGUM43GV.js +10 -0
  43. package/dist/chunk-DGUM43GV.js.map +1 -0
  44. package/dist/chunk-G4SF2PNQ.js +33 -0
  45. package/dist/chunk-G4SF2PNQ.js.map +1 -0
  46. package/dist/chunk-GANCV72Z.cjs +110 -0
  47. package/dist/chunk-GANCV72Z.cjs.map +1 -0
  48. package/dist/{chunk-BLSI67J6.cjs → chunk-H5XMKBBA.cjs} +425 -30
  49. package/dist/chunk-H5XMKBBA.cjs.map +1 -0
  50. package/dist/{chunk-CJ7UWN2Y.js → chunk-IXFV6AW6.js} +397 -7
  51. package/dist/chunk-IXFV6AW6.js.map +1 -0
  52. package/dist/chunk-JEQ2X3Z6.cjs +12 -0
  53. package/dist/chunk-JEQ2X3Z6.cjs.map +1 -0
  54. package/dist/chunk-JO4BHPAD.cjs +40 -0
  55. package/dist/chunk-JO4BHPAD.cjs.map +1 -0
  56. package/dist/chunk-MEBXW75C.cjs +89 -0
  57. package/dist/chunk-MEBXW75C.cjs.map +1 -0
  58. package/dist/chunk-MNDGIW47.js +76 -0
  59. package/dist/chunk-MNDGIW47.js.map +1 -0
  60. package/dist/chunk-PPFHA6IL.js +83 -0
  61. package/dist/chunk-PPFHA6IL.js.map +1 -0
  62. package/dist/chunk-RQ74USYU.js +128 -0
  63. package/dist/chunk-RQ74USYU.js.map +1 -0
  64. package/dist/chunk-TXLIY7GF.cjs +132 -0
  65. package/dist/chunk-TXLIY7GF.cjs.map +1 -0
  66. package/dist/chunk-UIWFYMAO.cjs +82 -0
  67. package/dist/chunk-UIWFYMAO.cjs.map +1 -0
  68. package/dist/{chunk-4PRWNAXQ.cjs → chunk-UOWLKFXK.cjs} +27 -89
  69. package/dist/chunk-UOWLKFXK.cjs.map +1 -0
  70. package/dist/chunk-VD74IPKB.js +106 -0
  71. package/dist/chunk-VD74IPKB.js.map +1 -0
  72. package/dist/chunk-W73FBYIH.cjs +87 -0
  73. package/dist/chunk-W73FBYIH.cjs.map +1 -0
  74. package/dist/chunk-XGITAEXU.js +93 -0
  75. package/dist/chunk-XGITAEXU.js.map +1 -0
  76. package/dist/chunk-XWOHNY3F.cjs +96 -0
  77. package/dist/chunk-XWOHNY3F.cjs.map +1 -0
  78. package/dist/chunk-ZPYQDMUX.js +79 -0
  79. package/dist/chunk-ZPYQDMUX.js.map +1 -0
  80. package/dist/core/index.cjs +156 -84
  81. package/dist/core/index.d.cts +16 -4
  82. package/dist/core/index.d.ts +16 -4
  83. package/dist/core/index.js +13 -1
  84. package/dist/exa-72KFY5A7.cjs +21 -0
  85. package/dist/exa-72KFY5A7.cjs.map +1 -0
  86. package/dist/exa-Dp9U-WTc.d.ts +17 -0
  87. package/dist/exa-NNVPBC2M.js +4 -0
  88. package/dist/exa-NNVPBC2M.js.map +1 -0
  89. package/dist/exa-jJSPhyUW.d.cts +17 -0
  90. package/dist/google-CHU2yycE.d.cts +17 -0
  91. package/dist/google-CTEK6SV2.js +4 -0
  92. package/dist/google-CTEK6SV2.js.map +1 -0
  93. package/dist/google-Da8IQxaI.d.ts +17 -0
  94. package/dist/google-IIUXFFVF.cjs +21 -0
  95. package/dist/google-IIUXFFVF.cjs.map +1 -0
  96. package/dist/index-2VtgKM8S.d.cts +206 -0
  97. package/dist/index-pWEH7pUE.d.ts +206 -0
  98. package/dist/mcp/index.cjs +670 -0
  99. package/dist/mcp/index.cjs.map +1 -0
  100. package/dist/mcp/index.d.cts +779 -0
  101. package/dist/mcp/index.d.ts +779 -0
  102. package/dist/mcp/index.js +574 -0
  103. package/dist/mcp/index.js.map +1 -0
  104. package/dist/openai-6KTCQ7PZ.cjs +21 -0
  105. package/dist/openai-6KTCQ7PZ.cjs.map +1 -0
  106. package/dist/openai-7W2PCNW5.js +4 -0
  107. package/dist/openai-7W2PCNW5.js.map +1 -0
  108. package/dist/openai-Cam8hF4f.d.ts +17 -0
  109. package/dist/openai-HVSCuXgO.d.cts +17 -0
  110. package/dist/react/index.cjs +75 -42
  111. package/dist/react/index.d.cts +270 -45
  112. package/dist/react/index.d.ts +270 -45
  113. package/dist/react/index.js +15 -2
  114. package/dist/searxng-AXLVGY7Z.js +4 -0
  115. package/dist/searxng-AXLVGY7Z.js.map +1 -0
  116. package/dist/searxng-EJKNY236.cjs +21 -0
  117. package/dist/searxng-EJKNY236.cjs.map +1 -0
  118. package/dist/searxng-K0qtY9vp.d.ts +17 -0
  119. package/dist/searxng-QGOte_Gq.d.cts +17 -0
  120. package/dist/serper-3JYJHJX6.js +4 -0
  121. package/dist/serper-3JYJHJX6.js.map +1 -0
  122. package/dist/serper-63FT4AOL.cjs +21 -0
  123. package/dist/serper-63FT4AOL.cjs.map +1 -0
  124. package/dist/serper-7Czya3PW.d.ts +17 -0
  125. package/dist/serper-JzdaSnS9.d.cts +17 -0
  126. package/dist/styles.css +38 -0
  127. package/dist/tavily-AWFP4RM7.cjs +21 -0
  128. package/dist/tavily-AWFP4RM7.cjs.map +1 -0
  129. package/dist/tavily-C8cXXojE.d.cts +17 -0
  130. package/dist/tavily-CIWAAZPH.js +4 -0
  131. package/dist/tavily-CIWAAZPH.js.map +1 -0
  132. package/dist/tavily-DdSGVgkE.d.ts +17 -0
  133. package/dist/themes/catppuccin.css +2 -0
  134. package/dist/themes/claude.css +2 -0
  135. package/dist/themes/linear.css +2 -0
  136. package/dist/themes/modern-minimal.css +2 -0
  137. package/dist/themes/posthog.css +2 -0
  138. package/dist/themes/supabase.css +2 -0
  139. package/dist/themes/twitter.css +2 -0
  140. package/dist/themes/vercel.css +2 -0
  141. package/dist/tools/anthropic/index.cjs +61 -0
  142. package/dist/tools/anthropic/index.cjs.map +1 -0
  143. package/dist/tools/anthropic/index.d.cts +67 -0
  144. package/dist/tools/anthropic/index.d.ts +67 -0
  145. package/dist/tools/anthropic/index.js +56 -0
  146. package/dist/tools/anthropic/index.js.map +1 -0
  147. package/dist/tools/brave/index.cjs +85 -0
  148. package/dist/tools/brave/index.cjs.map +1 -0
  149. package/dist/tools/brave/index.d.cts +91 -0
  150. package/dist/tools/brave/index.d.ts +91 -0
  151. package/dist/tools/brave/index.js +80 -0
  152. package/dist/tools/brave/index.js.map +1 -0
  153. package/dist/tools/exa/index.cjs +90 -0
  154. package/dist/tools/exa/index.cjs.map +1 -0
  155. package/dist/tools/exa/index.d.cts +92 -0
  156. package/dist/tools/exa/index.d.ts +92 -0
  157. package/dist/tools/exa/index.js +85 -0
  158. package/dist/tools/exa/index.js.map +1 -0
  159. package/dist/tools/google/index.cjs +81 -0
  160. package/dist/tools/google/index.cjs.map +1 -0
  161. package/dist/tools/google/index.d.cts +81 -0
  162. package/dist/tools/google/index.d.ts +81 -0
  163. package/dist/tools/google/index.js +76 -0
  164. package/dist/tools/google/index.js.map +1 -0
  165. package/dist/tools/openai/index.cjs +83 -0
  166. package/dist/tools/openai/index.cjs.map +1 -0
  167. package/dist/tools/openai/index.d.cts +84 -0
  168. package/dist/tools/openai/index.d.ts +84 -0
  169. package/dist/tools/openai/index.js +78 -0
  170. package/dist/tools/openai/index.js.map +1 -0
  171. package/dist/tools/searxng/index.cjs +85 -0
  172. package/dist/tools/searxng/index.cjs.map +1 -0
  173. package/dist/tools/searxng/index.d.cts +91 -0
  174. package/dist/tools/searxng/index.d.ts +91 -0
  175. package/dist/tools/searxng/index.js +80 -0
  176. package/dist/tools/searxng/index.js.map +1 -0
  177. package/dist/tools/serper/index.cjs +85 -0
  178. package/dist/tools/serper/index.cjs.map +1 -0
  179. package/dist/tools/serper/index.d.cts +91 -0
  180. package/dist/tools/serper/index.d.ts +91 -0
  181. package/dist/tools/serper/index.js +80 -0
  182. package/dist/tools/serper/index.js.map +1 -0
  183. package/dist/tools/tavily/index.cjs +91 -0
  184. package/dist/tools/tavily/index.cjs.map +1 -0
  185. package/dist/tools/tavily/index.d.cts +95 -0
  186. package/dist/tools/tavily/index.d.ts +95 -0
  187. package/dist/tools/tavily/index.js +86 -0
  188. package/dist/tools/tavily/index.js.map +1 -0
  189. package/dist/tools/web-search/index.cjs +31 -0
  190. package/dist/tools/web-search/index.cjs.map +1 -0
  191. package/dist/tools/web-search/index.d.cts +3 -0
  192. package/dist/tools/web-search/index.d.ts +3 -0
  193. package/dist/tools/web-search/index.js +14 -0
  194. package/dist/tools/web-search/index.js.map +1 -0
  195. package/dist/{types-BtAaOV07.d.cts → tools-DDWrco4h.d.cts} +43 -367
  196. package/dist/{types-BtAaOV07.d.ts → tools-DDWrco4h.d.ts} +43 -367
  197. package/dist/types-B20VCJXL.d.cts +347 -0
  198. package/dist/types-B20VCJXL.d.ts +347 -0
  199. package/dist/types-Cizh9K_f.d.ts +441 -0
  200. package/dist/types-DG2ya08y.d.cts +367 -0
  201. package/dist/types-DG2ya08y.d.ts +367 -0
  202. package/dist/types-DjSfYNKj.d.cts +441 -0
  203. package/dist/types-ZguuKEs_.d.cts +127 -0
  204. package/dist/types-ZguuKEs_.d.ts +127 -0
  205. package/dist/ui/index.cjs +1075 -148
  206. package/dist/ui/index.cjs.map +1 -1
  207. package/dist/ui/index.d.cts +410 -4
  208. package/dist/ui/index.d.ts +410 -4
  209. package/dist/ui/index.js +1007 -96
  210. package/dist/ui/index.js.map +1 -1
  211. package/package.json +52 -2
  212. package/dist/chunk-4PRWNAXQ.cjs.map +0 -1
  213. package/dist/chunk-BLSI67J6.cjs.map +0 -1
  214. package/dist/chunk-CJ7UWN2Y.js.map +0 -1
  215. package/dist/chunk-JM7PB2LP.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/types.ts","../src/mcp/protocol/JsonRpcHandler.ts","../src/mcp/protocol/messages.ts","../src/mcp/transports/types.ts","../src/mcp/transports/HttpTransport.ts","../src/mcp/tools/MCPToolAdapter.ts","../src/mcp/client/MCPClient.ts"],"names":[],"mappings":";AAuIO,IAAM,oBAAA,GAAuB;AAAA,EAClC,WAAA,EAAa,MAAA;AAAA,EACb,eAAA,EAAiB,MAAA;AAAA,EACjB,gBAAA,EAAkB,MAAA;AAAA,EAClB,cAAA,EAAgB,MAAA;AAAA,EAChB,cAAA,EAAgB;AAClB;AAcO,IAAM,oBAAA,GAAuB;AAwc7B,IAAM,QAAA,GAAN,MAAM,SAAA,SAAiB,KAAA,CAAM;AAAA,EAClC,WAAA,CACE,OAAA,EACO,IAAA,EACA,IAAA,EACP;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHN,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAA,EACd;AAAA,EAEA,OAAO,iBAAiB,KAAA,EAA+B;AACrD,IAAA,OAAO,IAAI,SAAA,CAAS,KAAA,CAAM,SAAS,KAAA,CAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAAA,EAC3D;AACF;;;ACzlBO,IAAM,iBAAN,MAAqB;AAAA,EAK1B,YAAY,OAAA,EAAgC;AAJ5C,IAAA,IAAA,CAAQ,SAAA,GAAY,CAAA;AACpB,IAAA,IAAA,CAAQ,eAAA,uBAAsB,GAAA,EAAqC;AAIjE,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAS,OAAA,IAAW,GAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAqB;AACnB,IAAA,OAAO,OAAO,EAAE,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CACE,QACA,MAAA,EACgB;AAChB,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,KAAK,UAAA,EAAW;AAAA,MACpB;AAAA,KACF;AAEA,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,OAAA,CAAQ,MAAA,GAAS,MAAA;AAAA,IACnB;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,CACE,QACA,MAAA,EACqB;AACrB,IAAA,MAAM,YAAA,GAAoC;AAAA,MACxC,OAAA,EAAS,KAAA;AAAA,MACT;AAAA,KACF;AAEA,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,YAAA,CAAa,MAAA,GAAS,MAAA;AAAA,IACxB;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,SAAyB,OAAA,EAAoC;AAC3E,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,SAAA,GAAY,WAAW,IAAA,CAAK,cAAA;AAElC,MAAA,MAAM,aAAA,GAAgB,WAAW,MAAM;AACrC,QAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AACtC,QAAA,MAAA;AAAA,UACE,IAAI,QAAA;AAAA,YACF,CAAA,wBAAA,EAA2B,SAAS,CAAA,IAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,CAAA;AAAA,YACzD,oBAAA,CAAqB;AAAA;AACvB,SACF;AAAA,MACF,GAAG,SAAS,CAAA;AAEZ,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI;AAAA,QACnC,OAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,QAAA,EAAoC;AAEjD,IAAA,IAAI,QAAA,CAAS,OAAO,IAAA,EAAM;AACxB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAS,EAAE,CAAA;AACpD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AACvC,IAAA,YAAA,CAAa,QAAQ,OAAO,CAAA;AAE5B,IAAA,IAAI,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC7B,MAAA,OAAA,CAAQ,MAAA,CAAO,QAAA,CAAS,gBAAA,CAAiB,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,OAAA,CAAQ,SAAS,MAAM,CAAA;AAAA,IACjC;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,EAA8B;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE9B,MAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA,EAAG;AAChC,QAAA,MAAM,IAAI,QAAA;AAAA,UACR,0BAAA;AAAA,UACA,oBAAA,CAAqB;AAAA,SACvB;AAAA,MACF;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,kCAAA;AAAA,QACA,oBAAA,CAAqB,WAAA;AAAA,QACrB;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAA,EAAiC;AACzC,IAAA,OAAO,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAA,EAA6C;AAC1D,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,OAAA;AAGZ,IAAA,IAAI,GAAA,CAAI,YAAY,KAAA,EAAO;AACzB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,QAAA,IAAY,GAAA,IAAO,OAAO,GAAA,CAAI,WAAW,QAAA,EAAU;AAErD,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,OAAO,QAAA,IAAY,OAAO,OAAA,IAAW,GAAA;AAAA,IACvC;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAA,EAAoD;AAC5D,IAAA,OAAO,QAAA,IAAY,WAAW,IAAA,IAAQ,OAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAA,EAAyD;AACtE,IAAA,OAAO,QAAA,IAAY,OAAA,IAAW,EAAE,IAAA,IAAQ,OAAA,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAA,EAAqD;AAC9D,IAAA,OAAO,IAAA,IAAQ,OAAA,KAAY,QAAA,IAAY,OAAA,IAAW,OAAA,IAAW,OAAA,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,MAAA,EAAuB;AACtC,IAAA,MAAM,QAAQ,IAAI,QAAA;AAAA,MAChB,MAAA,IAAU,gCAAA;AAAA,MACV,oBAAA,CAAqB;AAAA,KACvB;AAEA,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,CAAA,IAAK,KAAK,eAAA,EAAiB;AAChD,MAAA,YAAA,CAAa,QAAQ,OAAO,CAAA;AAC5B,MAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,IACtB;AAEA,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA0B;AACxB,IAAA,OAAO,KAAK,eAAA,CAAgB,IAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,EAAA,EAA8B;AACtC,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,EAAE,CAAA;AAAA,EACpC;AACF;AAKO,SAAS,gBACd,QAAA,EACkC;AAClC,EAAA,OAAO,OAAA,IAAW,QAAA;AACpB;;;AC1OO,IAAM,WAAA,GAAc;AAAA;AAAA,EAEzB,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,2BAAA;AAAA,EACb,IAAA,EAAM,MAAA;AAAA;AAAA,EAGN,UAAA,EAAY,YAAA;AAAA,EACZ,UAAA,EAAY,YAAA;AAAA;AAAA,EAGZ,cAAA,EAAgB,gBAAA;AAAA,EAChB,cAAA,EAAgB,gBAAA;AAAA,EAChB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,qBAAA,EAAuB,uBAAA;AAAA;AAAA,EAGvB,YAAA,EAAc,cAAA;AAAA,EACd,WAAA,EAAa,aAAA;AAAA;AAAA,EAGb,kBAAA,EAAoB,kCAAA;AAAA,EACpB,sBAAA,EAAwB,sCAAA;AAAA,EACxB,iBAAA,EAAmB,iCAAA;AAAA,EACnB,oBAAA,EAAsB,oCAAA;AAAA;AAAA,EAGtB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,oBAAA,EAAsB,sBAAA;AAAA;AAAA,EAGtB,iBAAA,EAAmB,kBAAA;AAAA,EACnB,eAAA,EAAiB,uBAAA;AAAA;AAAA,EAGjB,MAAA,EAAQ;AACV;AASO,IAAM,mBAAA,GAAqC;AAAA,EAChD,IAAA,EAAM,qBAAA;AAAA,EACN,OAAA,EAAS;AACX;AAKO,IAAM,2BAAA,GAAqD;AAAA,EAChE,KAAA,EAAO;AAAA,IACL,WAAA,EAAa;AAAA,GACf;AAAA,EACA,UAAU;AACZ;AAKO,SAAS,sBAAA,CACd,YACA,YAAA,EACqB;AACrB,EAAA,OAAO;AAAA,IACL,eAAA,EAAiB,oBAAA;AAAA,IACjB,UAAA,EAAY;AAAA,MACV,GAAG,mBAAA;AAAA,MACH,GAAG;AAAA,KACL;AAAA,IACA,cAAc,YAAA,IAAgB;AAAA,GAChC;AACF;AAKO,SAAS,sBAAsB,MAAA,EAAsC;AAC1E,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,EAAE,MAAA,EAAO;AAAA,EAClB;AACA,EAAA,OAAO,EAAC;AACV;AAKO,SAAS,oBAAA,CACd,MACA,IAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;AAKO,SAAS,gBAAA,GAA0C;AACxD,EAAA,OAAO,EAAC;AACV;AAuCO,SAAS,mBACd,KAAA,EACiD;AACjD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,OACE,OAAO,CAAA,CAAE,eAAA,KAAoB,QAAA,IAC7B,CAAA,CAAE,iBAAiB,IAAA,IACnB,OAAO,CAAA,CAAE,YAAA,KAAiB,YAC1B,CAAA,CAAE,UAAA,KAAe,IAAA,IACjB,OAAO,EAAE,UAAA,KAAe,QAAA;AAE5B;AAKO,SAAS,kBACd,KAAA,EACgD;AAChD,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA;AAC9B;AAKO,SAAS,iBACd,KAAA,EAC+C;AAC/C,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA;AAChC;;;AC9EO,IAAe,gBAAf,MAAqD;AAAA,EAArD,WAAA,GAAA;AAIL,IAAA,IAAA,CAAU,SAAA,GAAY,KAAA;AAAA,EAAA;AAAA,EAMtB,UAAU,OAAA,EAA+B;AACvC,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AAAA,EACxB;AAAA,EAEA,QAAQ,OAAA,EAA6B;AACnC,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AAAA,EACtB;AAAA,EAEA,QAAQ,OAAA,EAA6B;AACnC,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA;AAAA,EACtB;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKU,YAAY,OAAA,EAA+B;AACnD,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,UAAU,KAAA,EAAoB;AACtC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,aAAa,KAAK,CAAA;AAAA,IACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,SAAA,GAAkB;AAC1B,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB;AAAA,EACF;AACF;;;ACpJO,IAAM,aAAA,GAAN,cAA4B,aAAA,CAAc;AAAA,EAQ/C,YAAY,OAAA,EAA+B;AACzC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAM,OAAA,CAAQ,GAAA;AACnB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,EAAC;AACnC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,GAAA;AAClC,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC3C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,MAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AAAA,IACrB;AAGA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,MAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,IACzB;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,OAAA,EAA8D;AACvE,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,yBAAA;AAAA,QACA,oBAAA,CAAqB;AAAA,OACvB;AAAA,IACF;AAIA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAG/C,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAG5D,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,gBAAgB,CAAA;AAC1D,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,IAAA,CAAK,SAAA,GAAY,YAAA;AAAA,MACnB;AAEA,MAAA,IAAI,WAAA,CAAY,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAE7C,QAAA,MAAM,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAAA,MACvC,CAAA,MAAA,IAAW,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAEnD,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,IAAI,IAAA,CAAK,MAAK,EAAG;AAEf,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AAC5C,UAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,YAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,UACtB;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,CAAC,QAAA,CAAS,EAAA,EAAI;AACvB,QAAA,MAAM,IAAI,QAAA;AAAA,UACR,CAAA,YAAA,EAAe,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA,CAAA;AAAA,UACrD,oBAAA,CAAqB;AAAA,SACvB;AAAA,MACF;AAAA,IAEF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,UAAA,MAAM,IAAI,QAAA;AAAA,YACR,iBAAA;AAAA,YACA,oBAAA,CAAqB;AAAA,WACvB;AAAA,QACF;AACA,QAAA,MAAM,IAAI,QAAA;AAAA,UACR,CAAA,iBAAA,EAAoB,MAAM,OAAO,CAAA,CAAA;AAAA,UACjC,oBAAA,CAAqB,cAAA;AAAA,UACrB;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,yBAAA;AAAA,QACA,oBAAA,CAAqB;AAAA,OACvB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YACZ,OAAA,EACmB;AACnB,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,MAAA,EAAQ,qCAAA;AAAA,MACR,GAAG,IAAA,CAAK;AAAA,KACV;AAGA,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,OAAA,CAAQ,gBAAgB,IAAI,IAAA,CAAK,SAAA;AAAA,IACnC;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AAEnE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK;AAAA,QACrC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,QAC5B,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAkB,QAAA,EAAmC;AACjE,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,iCAAA;AAAA,QACA,oBAAA,CAAqB;AAAA,OACvB;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAE1C,QAAA,IAAI,IAAA,EAAM;AACR,UAAA;AAAA,QACF;AAEA,QAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAGhD,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAClC,QAAA,MAAA,GAAS,MAAA,CAAO,KAAI,IAAK,EAAA;AAEzB,QAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,UAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAK,EAAG;AAEnB,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAC9B,UAAA,IAAI,IAAA,GAAO,EAAA;AAEX,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,cAAA,IAAA,IAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,YACtB;AAAA,UACF;AAEA,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,IAAI;AACF,cAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA;AAC5C,cAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,gBAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,cACtB;AAAA,YACF,CAAA,CAAA,MAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,IAAA,EAAgC;AACxD,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAGjC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,QAAA,OAAO,MAAA,CAAO,MAAA;AAAA,UAAO,CAAC,GAAA,KACpB,IAAA,CAAK,qBAAA,CAAsB,GAAG;AAAA,SAChC;AAAA,MACF;AAGA,MAAA,IAAI,IAAA,CAAK,qBAAA,CAAsB,MAAM,CAAA,EAAG;AACtC,QAAA,OAAO,CAAC,MAAM,CAAA;AAAA,MAChB;AAEA,MAAA,OAAO,EAAC;AAAA,IACV,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,mCAAA;AAAA,QACA,oBAAA,CAAqB;AAAA,OACvB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,GAAA,EAAqC;AACjE,IAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,CAAA,GAAI,GAAA;AACV,IAAA,IAAI,CAAA,CAAE,YAAY,KAAA,EAAO;AACvB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,QAAA,IAAY,CAAA,IAAK,OAAO,CAAA,CAAE,WAAW,QAAA,EAAU;AACjD,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,IAAQ,CAAA,KAAM,QAAA,IAAY,CAAA,IAAK,WAAW,CAAA,CAAA,EAAI;AAChD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAA,GAAyB;AACvB,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,OAAO,WAAA,KAAgB,WAAA,EAAa;AAC1D,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,IAAA,CAAK,SAAS,CAAA;AAAA,IAClD;AAIA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AAEjD,IAAA,IAAA,CAAK,WAAA,CAAY,SAAA,GAAY,CAAC,KAAA,KAAU;AACtC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,IAAI,CAAA;AAClD,QAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,UAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,QACtB;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,UAAU,MAAM;AAE/B,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,QAAA,CAAS,sBAAsB,CAAC,CAAA;AAAA,IACrD,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAwB;AACtB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,MAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAmC;AACjC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AACF;;;AC5TO,IAAM,iBAAN,MAAqB;AAAA,EAG1B,YAAY,UAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CACE,SACA,OAAA,EACgB;AAChB,IAAA,MAAM,EAAE,MAAA,GAAS,IAAA,EAAM,YAAA,GAAe,IAAA,EAAM,UAAS,GAAI,OAAA;AAEzD,IAAA,MAAM,QAAA,GAAW,SACb,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAI,CAAA,CAAA,GAClC,OAAA,CAAQ,IAAA;AAGZ,IAAA,MAAM,eAAe,OAAA,CAAQ,IAAA;AAE7B,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EAAa,OAAA,CAAQ,WAAA,IAAe,CAAA,UAAA,EAAa,QAAQ,IAAI,CAAA,CAAA;AAAA,MAC7D,QAAA,EAAU,eAAe,QAAA,GAAW,QAAA;AAAA,MACpC,WAAA,EAAa,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,WAAW,CAAA;AAAA,MACxD,OAAA,EAAS,OACP,MAAA,EACA,OAAA,KAC0B;AAC1B,QAAA,IAAI;AAEF,UAAA,IAAI,OAAA,EAAS,QAAQ,OAAA,EAAS;AAC5B,YAAA,OAAO;AAAA,cACL,OAAA,EAAS,KAAA;AAAA,cACT,KAAA,EAAO;AAAA,aACT;AAAA,UACF;AAGA,UAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,YAAA,EAAc,MAAM,CAAA;AAGlD,UAAA,OAAO,IAAA,CAAK,cAAc,MAAM,CAAA;AAAA,QAClC,SAAS,KAAA,EAAO;AACd,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EACE,KAAA,YAAiB,KAAA,GACb,KAAA,CAAM,OAAA,GACN;AAAA,WACR;AAAA,QACF;AAAA,MACF,CAAA;AAAA;AAAA,MAEA,KAAA,EAAO,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA;AAAA,MACxC,gBAAgB,CAAA,QAAA,EAAW,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAC,CAAA,GAAA,CAAA;AAAA,MAC7D,gBAAgB,CAAA,EAAG,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAC,CAAA,UAAA;AAAA,KACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CACE,UACA,OAAA,EACkB;AAClB,IAAA,OAAO,QAAA,CAAS,IAAI,CAAC,IAAA,KAAS,KAAK,gBAAA,CAAiB,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,SAAA,EAAgD;AACzE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY,UAAU,UAAA,GAClB,IAAA,CAAK,kBAAkB,SAAA,CAAU,UAAU,IAC3C,EAAC;AAAA,MACL,UAAU,SAAA,CAAU,QAAA;AAAA,MACpB,sBAAsB,SAAA,CAAU;AAAA,KAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBACN,UAAA,EACoC;AACpC,IAAA,MAAM,YAAgD,EAAC;AAEvD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACpD,MAAA,SAAA,CAAU,GAAG,CAAA,GAAI,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,IAAA,EAAiD;AAEvE,IAAA,IAAI,IAAA,GAAmC,QAAA;AACvC,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAE5B,QAAA,MAAM,UAAU,IAAA,CAAK,IAAA,CAAK,KAAK,CAAC,CAAA,KAAM,MAAM,MAAM,CAAA;AAClD,QAAA,IAAA,GAAQ,OAAA,IAA0C,QAAA;AAAA,MACpD,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,IAAA,CAAK,IAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAgC;AAAA,MACpC,IAAA;AAAA,MACA,aAAa,IAAA,CAAK;AAAA,KACpB;AAGA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,SAAA,CAAU,OAAO,IAAA,CAAK,IAAA;AAAA,IACxB;AACA,IAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAW;AAC9B,MAAA,SAAA,CAAU,UAAU,IAAA,CAAK,OAAA;AAAA,IAC3B;AACA,IAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,MAAA,SAAA,CAAU,YAAY,IAAA,CAAK,SAAA;AAAA,IAC7B;AACA,IAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAW;AAChC,MAAA,SAAA,CAAU,YAAY,IAAA,CAAK,SAAA;AAAA,IAC7B;AACA,IAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAW;AAC9B,MAAA,SAAA,CAAU,UAAU,IAAA,CAAK,OAAA;AAAA,IAC3B;AACA,IAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAW;AAC9B,MAAA,SAAA,CAAU,UAAU,IAAA,CAAK,OAAA;AAAA,IAC3B;AACA,IAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAW;AAC9B,MAAA,SAAA,CAAU,UAAU,IAAA,CAAK,OAAA;AAAA,IAC3B;AAGA,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,SAAA,CAAU,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,UAAU,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,SAAA,CAAU,WAAW,IAAA,CAAK,QAAA;AAAA,IAC5B;AAGA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AAAA,IACnD;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,MAAA,EAAyC;AAC7D,IAAA,MAAM,QAAA,GAAyB;AAAA,MAC7B,OAAA,EAAS,CAAC,MAAA,CAAO;AAAA,KACnB;AAGA,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,MAAM,YAAyB,EAAC;AAChC,IAAA,MAAM,cAA+B,EAAC;AAEtC,IAAA,KAAA,MAAW,OAAA,IAAW,OAAO,OAAA,EAAS;AACpC,MAAA,QAAQ,QAAQ,IAAA;AAAM,QACpB,KAAK,MAAA;AACH,UAAA,SAAA,CAAU,IAAA,CAAM,QAA2B,IAAI,CAAA;AAC/C,UAAA;AAAA,QAEF,KAAK,OAAA,EAAS;AACZ,UAAA,MAAM,GAAA,GAAM,OAAA;AACZ,UAAA,SAAA,CAAU,IAAA,CAAK;AAAA,YACb,IAAA,EAAM,OAAA;AAAA,YACN,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,WAAW,GAAA,CAAI;AAAA,WAChB,CAAA;AACD,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,UAAA,EAAY;AAIf,UAAA,MAAM,MAAO,OAAA,CAA+B,QAAA;AAC5C,UAAA,IAAI,GAAA,CAAI,GAAA,EAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AAEhC,YAAA,WAAA,CAAY,IAAA,CAAK;AAAA,cACf,KAAK,GAAA,CAAI,GAAA;AAAA,cACT,QAAA,EACG,IAAI,QAAA,IACL,WAAA;AAAA,cACF,SAAS,GAAA,CAAI,IAAA;AAAA;AAAA,cACb,MAAM,GAAA,CAAI;AAAA,aACX,CAAA;AAAA,UACH,CAAA,MAAA,IAAW,IAAI,IAAA,EAAM;AAEnB,YAAA,SAAA,CAAU,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,UACzB;AACA,UAAA;AAAA,QACF;AAAA,QAEA,KAAK,IAAA,EAAM;AAET,UAAA,MAAM,SAAA,GAAY,OAAA;AAClB,UAAA,WAAA,CAAY,IAAA,CAAK;AAAA,YACf,GAAA,EAAK,UAAU,QAAA,CAAS,GAAA;AAAA,YACxB,QAAA,EAAU,UAAU,QAAA,CAAS,QAAA;AAAA,YAC7B,OAAA,EAAS,UAAU,QAAA,CAAS,OAAA;AAAA,YAC5B,IAAA,EAAM,UAAU,QAAA,CAAS,IAAA;AAAA,YACzB,QAAA,EAAU,UAAU,QAAA,CAAS;AAAA,WAC9B,CAAA;AACD,UAAA;AAAA,QACF;AAAA;AACF,IACF;AAGA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,QAAA,CAAS,OAAA,GAAU,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAGtC,MAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,QAAA,IAAI;AACF,UAAA,QAAA,CAAS,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,QACzC,CAAA,CAAA,MAAQ;AAEN,UAAA,QAAA,CAAS,IAAA,GAAO,UAAU,CAAC,CAAA;AAAA,QAC7B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,IAAA,GAAO,SAAA;AAAA,MAClB;AAAA,IACF;AAGA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,QAAA,CAAS,UAAA,GAAa,SAAA;AAAA,IACxB;AAGA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,QAAA,CAAS,YAAA,GAAe,WAAA;AAAA,IAC1B;AAGA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,QAAA,CAAS,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,IAAK,uBAAA;AAAA,IAC3C;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,IAAA,EAAsB;AAE5C,IAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CACpB,OAAA,CAAQ,OAAA,EAAS,CAAC,IAAA,KAAS,IAAA,CAAK,WAAA,EAAa,CAAA;AAAA,EAClD;AACF;AAKO,SAAS,mBAAA,CACd,UAAA,EACA,OAAA,EACA,OAAA,EACgB;AAChB,EAAA,MAAM,OAAA,GAAU,IAAI,cAAA,CAAe,UAAU,CAAA;AAC7C,EAAA,OAAO,OAAA,CAAQ,gBAAA,CAAiB,OAAA,EAAS,OAAO,CAAA;AAClD;AAKO,SAAS,qBAAA,CACd,UAAA,EACA,QAAA,EACA,OAAA,EACkB;AAClB,EAAA,MAAM,OAAA,GAAU,IAAI,cAAA,CAAe,UAAU,CAAA;AAC7C,EAAA,OAAO,OAAA,CAAQ,iBAAA,CAAkB,QAAA,EAAU,OAAO,CAAA;AACpD;;;AC5RO,IAAM,YAAN,MAAgB;AAAA,EAQrB,WAAA,CAAY,QAAyB,MAAA,EAA0B;AAC7D,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,UAAU,EAAC;AACzB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,cAAA,CAAe,EAAE,SAAS,MAAA,CAAO,OAAA,IAAW,KAAO,CAAA;AACzE,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA;AACjD,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,eAAA,EAAiB,cAAA;AAAA,MACjB,OAAO;AAAC,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAqC;AACnC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAkB;AAChB,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,MAAM,eAAA,KAAoB,WAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,eAAA,KAAoB,WAAA,EAAa;AAC9C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,eAAA,KAAoB,YAAA,EAAc;AAC/C,MAAA,MAAM,IAAI,SAAS,gCAAgC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAA,CAAK,mBAAmB,YAAY,CAAA;AAEpC,IAAA,IAAI;AAEF,MAAA,IAAA,CAAK,SAAA,GAAY,KAAK,eAAA,EAAgB;AAGtC,MAAA,IAAA,CAAK,UAAU,SAAA,CAAU,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA;AACtD,MAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA;AAClD,MAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA;AAGlD,MAAA,MAAM,IAAA,CAAK,UAAU,OAAA,EAAQ;AAG7B,MAAA,MAAM,KAAK,UAAA,EAAW;AAGtB,MAAA,IAAA,CAAK,mBAAmB,WAAW,CAAA;AAGnC,MAAA,MAAM,KAAK,YAAA,EAAa;AAAA,IAC1B,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,kBAAA;AAAA,QACH,OAAA;AAAA,QACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OAC3C;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,eAAA,KAAoB,cAAA,EAAgB;AACjD,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,UAAA,CAAW,iBAAiB,sBAAsB,CAAA;AAGvD,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,IAAA,CAAK,UAAU,UAAA,EAAW;AAChC,MAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAAA,IACnB;AAGA,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,eAAA,EAAiB,cAAA;AAAA,MACjB,OAAO;AAAC,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CACJ,IAAA,EACA,IAAA,EAC4B;AAC5B,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA;AAAA,MACxB,WAAA,CAAY,UAAA;AAAA,MACZ,oBAAA,CAAqB,MAAM,IAAI;AAAA,KACjC;AAEA,IAAA,IAAI,CAAC,gBAAA,CAAiB,MAAM,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,sCAAA;AAAA,QACA,oBAAA,CAAqB;AAAA,OACvB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAA6C;AACjD,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,MAAM,WAAgC,EAAC;AACvC,IAAA,IAAI,MAAA;AAGJ,IAAA,GAAG;AACD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA;AAAA,QACxB,WAAA,CAAY,UAAA;AAAA,QACZ,sBAAsB,MAAM;AAAA,OAC9B;AAEA,MAAA,IAAI,CAAC,iBAAA,CAAkB,MAAM,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,QAAA;AAAA,UACR,uCAAA;AAAA,UACA,oBAAA,CAAqB;AAAA,SACvB;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,KAAK,CAAA;AAC7B,MAAA,MAAA,GAAS,MAAA,CAAO,UAAA;AAAA,IAClB,CAAA,QAAS,MAAA;AAET,IAAA,IAAA,CAAK,MAAM,KAAA,GAAQ,QAAA;AACnB,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,IAAA,CAAK,GAAA,EAAI;AACnC,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAgB,QAAQ,CAAA;AAEpC,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAAA,EAGG;AACnB,IAAA,MAAM,MAAA,GAAS,SAAS,eAAA,KAAoB,KAAA;AAC5C,IAAA,MAAM,QAAA,GAAW,SAAS,cAAA,IAAkB,KAAA;AAE5C,IAAA,OAAO,IAAA,CAAK,MAAM,KAAA,CAAM,GAAA;AAAA,MAAI,CAAC,IAAA,KAC3B,IAAA,CAAK,WAAA,CAAY,iBAAiB,IAAA,EAAM;AAAA,QACtC,MAAA;AAAA,QACA,YAAA,EAAc,QAAA;AAAA,QACd,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI;AAAA,OAClC;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAgC;AAC9B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAA2C;AACzC,IAAA,OAAO,KAAK,KAAA,CAAM,UAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAA2D;AACzD,IAAA,OAAO,KAAK,KAAA,CAAM,kBAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAyB;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,IAAA,EAAM,kBAAkB,CAAA;AACvD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,eAAA,GAAgC;AACtC,IAAA,QAAQ,IAAA,CAAK,OAAO,SAAA;AAAW,MAC7B,KAAK,MAAA;AACH,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK;AACpB,UAAA,MAAM,IAAI,QAAA;AAAA,YACR,oCAAA;AAAA,YACA,oBAAA,CAAqB;AAAA,WACvB;AAAA,QACF;AACA,QAAA,OAAO,IAAI,aAAA,CAAc;AAAA,UACvB,GAAA,EAAK,KAAK,MAAA,CAAO,GAAA;AAAA,UACjB,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,UACrB,OAAA,EAAS,KAAK,MAAA,CAAO;AAAA,SACtB,CAAA;AAAA,MAEH,KAAK,KAAA;AAEH,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK;AACpB,UAAA,MAAM,IAAI,QAAA;AAAA,YACR,mCAAA;AAAA,YACA,oBAAA,CAAqB;AAAA,WACvB;AAAA,QACF;AACA,QAAA,OAAO,IAAI,aAAA,CAAc;AAAA,UACvB,GAAA,EAAK,KAAK,MAAA,CAAO,GAAA;AAAA,UACjB,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,UACrB,OAAA,EAAS,KAAK,MAAA,CAAO;AAAA,SACtB,CAAA;AAAA,MAEH,KAAK,OAAA;AAEH,QAAA,MAAM,IAAI,QAAA;AAAA,UACR,iEAAA;AAAA,UACA,oBAAA,CAAqB;AAAA,SACvB;AAAA,MAEF;AACE,QAAA,MAAM,IAAI,QAAA;AAAA,UACR,CAAA,wBAAA,EAA2B,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,CAAA;AAAA,UAChD,oBAAA,CAAqB;AAAA,SACvB;AAAA;AACJ,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAA,GAA4B;AACxC,IAAA,MAAM,MAAA,GAAS,sBAAA;AAAA,MACb,KAAK,MAAA,CAAO,UAAA;AAAA,MACZ,KAAK,MAAA,CAAO;AAAA,KACd;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA;AAAA,MACxB,WAAA,CAAY,UAAA;AAAA,MACZ;AAAA,KACF;AAEA,IAAA,IAAI,CAAC,kBAAA,CAAmB,MAAM,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,2CAAA;AAAA,QACA,oBAAA,CAAqB;AAAA,OACvB;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,KAAA,CAAM,aAAa,MAAA,CAAO,UAAA;AAC/B,IAAA,IAAA,CAAK,KAAA,CAAM,qBAAqB,MAAA,CAAO,YAAA;AAGvC,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,WAAW,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CACZ,MAAA,EACA,MAAA,EACkB;AAClB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,2BAAA;AAAA,QACA,oBAAA,CAAqB;AAAA,OACvB;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,aAAA,CAAc,QAAQ,MAAM,CAAA;AAC5D,IAAA,MAAM,eAAA,GAAkB,KAAK,UAAA,CAAW,eAAA;AAAA,MACtC,OAAA;AAAA,MACA,KAAK,MAAA,CAAO;AAAA,KACd;AAEA,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AAEjC,IAAA,OAAO,eAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,MAAA,CACZ,MAAA,EACA,MAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,2BAAA;AAAA,QACA,oBAAA,CAAqB;AAAA,OACvB;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,UAAA,CAAW,kBAAA,CAAmB,QAAQ,MAAM,CAAA;AACtE,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,YAAY,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,OAAA,EAA+B;AAEnD,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,UAAA,CAAW,eAAe,OAA0B,CAAA;AACzD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,cAAA,CAAe,OAAO,CAAA,EAAG;AAC3C,MAAA,MAAM,YAAA,GAAe,OAAA;AACrB,MAAA,IAAA,CAAK,kBAAA,CAAmB,YAAA,CAAa,MAAA,EAAQ,YAAA,CAAa,MAAM,CAAA;AAChE,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,OAAO,CAAA,EAAG;AACtC,MAAA,MAAM,OAAA,GAAU,OAAA;AAChB,MAAA,IAAA,CAAK,oBAAoB,OAAA,CAAQ,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,IACrE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,CACN,QACA,MAAA,EACM;AACN,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,WAAA,CAAY,kBAAA;AAEf,QAAA,IAAA,CAAK,YAAA,EAAa,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AACnC,UAAA,IAAA,CAAK,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,QAC7B,CAAC,CAAA;AACD,QAAA;AAAA,MAEF;AAEE,QAAA,IAAA,CAAK,MAAA,CAAO,cAAA,GAAiB,MAAA,EAAQ,MAAM,CAAA;AAAA;AAC/C,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAA,CACZ,GAAA,EACA,MAAA,EACA,MAAA,EACe;AAEf,IAAA,IACE,MAAA,KAAW,WAAA,CAAY,mBAAA,IACvB,IAAA,CAAK,OAAO,oBAAA,EACZ;AACA,MAAA,IAAI;AACF,QAAA,MAAM,kBAAA,GACJ,MAAA;AACF,QAAA,MAAM,QAAA,GACJ,MAAM,IAAA,CAAK,MAAA,CAAO,qBAAqB,kBAAkB,CAAA;AAG3D,QAAA,MAAM,IAAA,CAAK,MAAA;AAAA,UACT,WAAA,CAAY,oBAAA;AAAA,UACZ;AAAA,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AAEd,QAAA,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,oBAAA,EAAsB;AAAA,UAClD,WAAW,MAAA,EAAQ,SAAA;AAAA,UACnB,QAAA,EAAU,KAAA;AAAA,UACV,MAAA,EAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SAClD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAA,EAAoB;AACtC,IAAA,IAAA,CAAK,kBAAA,CAAmB,OAAA,EAAS,KAAA,CAAM,OAAO,CAAA;AAC9C,IAAA,IAAA,CAAK,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,eAAA,KAAoB,WAAA,EAAa;AAC9C,MAAA,IAAA,CAAK,mBAAmB,cAAc,CAAA;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,CAAmB,OAA2B,KAAA,EAAsB;AAC1E,IAAA,IAAA,CAAK,MAAM,eAAA,GAAkB,KAAA;AAC7B,IAAA,IAAA,CAAK,MAAM,KAAA,GAAQ,KAAA;AACnB,IAAA,IAAA,CAAK,MAAA,CAAO,0BAA0B,KAAK,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,MAAM,IAAI,QAAA;AAAA,QACR,6CAAA;AAAA,QACA,oBAAA,CAAqB;AAAA,OACvB;AAAA,IACF;AAAA,EACF;AACF;AAmBO,SAAS,eAAA,CACd,QACA,MAAA,EACW;AACX,EAAA,OAAO,IAAI,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAA;AACrC","file":"chunk-BH7MNDWW.js","sourcesContent":["/**\n * MCP (Model Context Protocol) Type Definitions\n *\n * This module defines all types for MCP client integration,\n * following the MCP specification for JSON-RPC 2.0 communication.\n */\n\n// ============================================\n// Transport Types\n// ============================================\n\n/**\n * Supported MCP transport types\n */\nexport type MCPTransportType = \"http\" | \"sse\" | \"stdio\";\n\n/**\n * Base transport configuration\n */\nexport interface MCPTransportConfigBase {\n /** Transport type */\n type: MCPTransportType;\n}\n\n/**\n * HTTP Streamable transport configuration (recommended)\n */\nexport interface MCPHttpTransportConfig extends MCPTransportConfigBase {\n type: \"http\";\n /** Server URL endpoint */\n url: string;\n /** Custom headers for authentication */\n headers?: Record<string, string>;\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * SSE (Server-Sent Events) transport configuration\n */\nexport interface MCPSSETransportConfig extends MCPTransportConfigBase {\n type: \"sse\";\n /** Server URL endpoint */\n url: string;\n /** Custom headers for authentication */\n headers?: Record<string, string>;\n}\n\n/**\n * Stdio transport configuration (for local MCP servers)\n */\nexport interface MCPStdioTransportConfig extends MCPTransportConfigBase {\n type: \"stdio\";\n /** Command to execute */\n command: string;\n /** Command arguments */\n args?: string[];\n /** Environment variables */\n env?: Record<string, string>;\n /** Working directory */\n cwd?: string;\n}\n\n/**\n * Union of all transport configurations\n */\nexport type MCPTransportConfig =\n | MCPHttpTransportConfig\n | MCPSSETransportConfig\n | MCPStdioTransportConfig;\n\n// ============================================\n// JSON-RPC 2.0 Types\n// ============================================\n\n/**\n * JSON-RPC request\n */\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: string | number;\n method: string;\n params?: Record<string, unknown>;\n}\n\n/**\n * JSON-RPC notification (no response expected)\n */\nexport interface JsonRpcNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: Record<string, unknown>;\n}\n\n/**\n * JSON-RPC success response\n */\nexport interface JsonRpcSuccessResponse {\n jsonrpc: \"2.0\";\n id: string | number;\n result: unknown;\n}\n\n/**\n * JSON-RPC error response\n */\nexport interface JsonRpcErrorResponse {\n jsonrpc: \"2.0\";\n id: string | number | null;\n error: JsonRpcError;\n}\n\n/**\n * JSON-RPC error object\n */\nexport interface JsonRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\n/**\n * JSON-RPC response (success or error)\n */\nexport type JsonRpcResponse = JsonRpcSuccessResponse | JsonRpcErrorResponse;\n\n/**\n * JSON-RPC message (request, notification, or response)\n */\nexport type JsonRpcMessage =\n | JsonRpcRequest\n | JsonRpcNotification\n | JsonRpcResponse;\n\n// Standard JSON-RPC error codes\nexport const JSON_RPC_ERROR_CODES = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n\n// ============================================\n// MCP Protocol Types\n// ============================================\n\n/**\n * MCP Protocol Version\n *\n * The SDK supports multiple protocol versions:\n * - 2025-06-18: Latest protocol with full features\n * - 2025-03-26: Streamable HTTP transport\n * - 2024-11-05: Legacy HTTP+SSE transport (deprecated)\n */\nexport const MCP_PROTOCOL_VERSION = \"2025-06-18\";\n\n/**\n * Supported protocol versions for negotiation\n */\nexport const SUPPORTED_PROTOCOL_VERSIONS = [\n \"2025-06-18\",\n \"2025-03-26\",\n \"2024-11-05\",\n] as const;\n\n/**\n * MCP client capabilities\n */\nexport interface MCPClientCapabilities {\n /** Roots capability (file system access) */\n roots?: {\n listChanged?: boolean;\n };\n /** Sampling capability */\n sampling?: Record<string, never>;\n /** Experimental capabilities */\n experimental?: Record<string, unknown>;\n}\n\n/**\n * MCP server capabilities\n */\nexport interface MCPServerCapabilities {\n /** Tools capability */\n tools?: {\n listChanged?: boolean;\n };\n /** Resources capability */\n resources?: {\n subscribe?: boolean;\n listChanged?: boolean;\n };\n /** Prompts capability */\n prompts?: {\n listChanged?: boolean;\n };\n /** Logging capability */\n logging?: Record<string, never>;\n /** Experimental capabilities */\n experimental?: Record<string, unknown>;\n}\n\n/**\n * MCP client info\n */\nexport interface MCPClientInfo {\n name: string;\n version: string;\n}\n\n/**\n * MCP server info\n */\nexport interface MCPServerInfo {\n name: string;\n version: string;\n}\n\n/**\n * MCP initialization params\n */\nexport interface MCPInitializeParams {\n protocolVersion: string;\n capabilities: MCPClientCapabilities;\n clientInfo: MCPClientInfo;\n}\n\n/**\n * MCP initialization result\n */\nexport interface MCPInitializeResult {\n protocolVersion: string;\n capabilities: MCPServerCapabilities;\n serverInfo: MCPServerInfo;\n instructions?: string;\n}\n\n// ============================================\n// MCP Tool Types\n// ============================================\n\n/**\n * MCP tool definition (from server)\n */\nexport interface MCPToolDefinition {\n /** Tool name */\n name: string;\n /** Tool description */\n description?: string;\n /** JSON Schema for input parameters */\n inputSchema: MCPToolInputSchema;\n}\n\n/**\n * MCP tool input schema (JSON Schema format)\n */\nexport interface MCPToolInputSchema {\n type: \"object\";\n properties?: Record<string, MCPJsonSchemaProperty>;\n required?: string[];\n additionalProperties?: boolean;\n}\n\n/**\n * MCP JSON Schema property\n */\nexport interface MCPJsonSchemaProperty {\n type?: string | string[];\n description?: string;\n enum?: unknown[];\n items?: MCPJsonSchemaProperty;\n properties?: Record<string, MCPJsonSchemaProperty>;\n required?: string[];\n default?: unknown;\n // Additional JSON Schema validations\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n pattern?: string;\n format?: string;\n oneOf?: MCPJsonSchemaProperty[];\n anyOf?: MCPJsonSchemaProperty[];\n allOf?: MCPJsonSchemaProperty[];\n}\n\n/**\n * MCP tool call request params\n */\nexport interface MCPToolCallParams {\n name: string;\n arguments?: Record<string, unknown>;\n}\n\n/**\n * MCP UI content (for MCP-UI support)\n * @see https://github.com/idosal/mcp-ui\n */\nexport interface MCPUIContent {\n type: \"ui\";\n resource: {\n uri: string;\n mimeType:\n | \"text/html\"\n | \"text/uri-list\"\n | \"application/vnd.mcp-ui.remote-dom\";\n content?: string;\n blob?: string;\n metadata?: {\n title?: string;\n width?: string;\n height?: string;\n sandbox?: string[];\n className?: string;\n };\n };\n}\n\n/**\n * MCP tool call result content types\n */\nexport type MCPToolResultContent =\n | MCPTextContent\n | MCPImageContent\n | MCPResourceContent\n | MCPUIContent;\n\n/**\n * MCP text content\n */\nexport interface MCPTextContent {\n type: \"text\";\n text: string;\n}\n\n/**\n * MCP image content\n */\nexport interface MCPImageContent {\n type: \"image\";\n data: string;\n mimeType: string;\n}\n\n/**\n * MCP embedded resource content\n */\nexport interface MCPResourceContent {\n type: \"resource\";\n resource: {\n uri: string;\n mimeType?: string;\n text?: string;\n blob?: string;\n };\n}\n\n/**\n * MCP tool call result\n */\nexport interface MCPToolCallResult {\n content: MCPToolResultContent[];\n isError?: boolean;\n}\n\n/**\n * MCP tools list result\n */\nexport interface MCPToolsListResult {\n tools: MCPToolDefinition[];\n nextCursor?: string;\n}\n\n// ============================================\n// MCP Elicitation Types (Human-in-the-Loop)\n// ============================================\n\n/**\n * Elicitation request from MCP server\n */\nexport interface MCPElicitationRequest {\n /** Unique request ID */\n requestId: string;\n /** Elicitation mode */\n mode: \"form\" | \"confirm\" | \"select\";\n /** Message to display to user */\n message?: string;\n /** JSON Schema for form mode */\n schema?: MCPToolInputSchema;\n /** Options for select mode */\n options?: MCPElicitationOption[];\n /** Default values */\n defaults?: Record<string, unknown>;\n}\n\n/**\n * Elicitation option (for select mode)\n */\nexport interface MCPElicitationOption {\n value: string;\n label?: string;\n description?: string;\n}\n\n/**\n * Elicitation response to MCP server\n */\nexport interface MCPElicitationResponse {\n /** Request ID being responded to */\n requestId: string;\n /** Whether user accepted */\n accepted: boolean;\n /** User's form data (for form/select modes) */\n data?: Record<string, unknown>;\n /** Rejection reason (if not accepted) */\n reason?: string;\n}\n\n// ============================================\n// MCP Resource Types (for future use)\n// ============================================\n\n/**\n * MCP resource definition\n */\nexport interface MCPResource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n}\n\n/**\n * MCP resources list result\n */\nexport interface MCPResourcesListResult {\n resources: MCPResource[];\n nextCursor?: string;\n}\n\n// ============================================\n// MCP Client Types\n// ============================================\n\n/**\n * MCP client connection state\n */\nexport type MCPConnectionState =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\n/**\n * MCP client configuration\n */\nexport interface MCPClientConfig {\n /** Unique name for this client/server connection */\n name: string;\n /** Transport type shorthand */\n transport: MCPTransportType;\n /** Server URL (for http/sse transports) */\n url?: string;\n /** Custom headers (for http/sse transports) */\n headers?: Record<string, string>;\n /** Request timeout in milliseconds (default: 30000) */\n timeout?: number;\n /** Command to execute (for stdio transport) */\n command?: string;\n /** Command arguments (for stdio transport) */\n args?: string[];\n /** Environment variables (for stdio transport) */\n env?: Record<string, string>;\n /** Working directory (for stdio transport) */\n cwd?: string;\n /** Client info */\n clientInfo?: MCPClientInfo;\n /** Client capabilities */\n capabilities?: MCPClientCapabilities;\n}\n\n/**\n * MCP client state\n */\nexport interface MCPClientState {\n /** Connection state */\n connectionState: MCPConnectionState;\n /** Server info (after connection) */\n serverInfo?: MCPServerInfo;\n /** Server capabilities (after connection) */\n serverCapabilities?: MCPServerCapabilities;\n /** Available tools */\n tools: MCPToolDefinition[];\n /** Error message (if in error state) */\n error?: string;\n /** Last activity timestamp */\n lastActivity?: number;\n}\n\n/**\n * MCP client events\n */\nexport interface MCPClientEvents {\n /** Connection state changed */\n onConnectionStateChange?: (state: MCPConnectionState) => void;\n /** Tools list updated */\n onToolsChange?: (tools: MCPToolDefinition[]) => void;\n /** Elicitation request received */\n onElicitationRequest?: (\n request: MCPElicitationRequest,\n ) => Promise<MCPElicitationResponse>;\n /** Error occurred */\n onError?: (error: Error) => void;\n /** Notification received */\n onNotification?: (method: string, params?: Record<string, unknown>) => void;\n}\n\n// ============================================\n// React Hook Types\n// ============================================\n\n/**\n * Configuration for useMCPClient hook\n */\nexport interface UseMCPClientConfig extends MCPClientConfig, MCPClientEvents {\n /** Auto-connect on mount (default: true) */\n autoConnect?: boolean;\n}\n\n/**\n * Configuration for useMCPTools hook\n */\nexport interface UseMCPToolsConfig extends UseMCPClientConfig {\n /** Prefix tool names with client name (default: true) */\n prefixToolNames?: boolean;\n /** Auto-register tools with CopilotProvider (default: true) */\n autoRegister?: boolean;\n}\n\n/**\n * Return type for useMCPClient hook\n */\nexport interface UseMCPClientReturn {\n /** Current client state */\n state: MCPClientState;\n /** Connect to server */\n connect: () => Promise<void>;\n /** Disconnect from server */\n disconnect: () => Promise<void>;\n /** Call a tool */\n callTool: (\n name: string,\n args?: Record<string, unknown>,\n ) => Promise<MCPToolCallResult>;\n /** Refresh tools list */\n refreshTools: () => Promise<MCPToolDefinition[]>;\n /** Whether client is connected */\n isConnected: boolean;\n /** Whether client is loading */\n isLoading: boolean;\n}\n\n/**\n * Return type for useMCPTools hook\n */\nexport interface UseMCPToolsReturn extends UseMCPClientReturn {\n /** Tools converted to ToolDefinition format */\n toolDefinitions: import(\"../core/types/tools\").ToolDefinition[];\n}\n\n// ============================================\n// Transport Interface\n// ============================================\n\n/**\n * MCP transport interface\n */\nexport interface MCPTransport {\n /** Connect the transport */\n connect(): Promise<void>;\n /** Disconnect the transport */\n disconnect(): Promise<void>;\n /** Send a JSON-RPC message */\n send(message: JsonRpcRequest | JsonRpcNotification): Promise<void>;\n /** Set message handler */\n onMessage(handler: (message: JsonRpcMessage) => void): void;\n /** Set error handler */\n onError(handler: (error: Error) => void): void;\n /** Set close handler */\n onClose(handler: () => void): void;\n /** Check if connected */\n isConnected(): boolean;\n}\n\n// ============================================\n// Helper Types\n// ============================================\n\n/**\n * Pending request tracker\n */\nexport interface PendingRequest {\n resolve: (value: unknown) => void;\n reject: (reason: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n}\n\n/**\n * MCP error class\n */\nexport class MCPError extends Error {\n constructor(\n message: string,\n public code?: number,\n public data?: unknown,\n ) {\n super(message);\n this.name = \"MCPError\";\n }\n\n static fromJsonRpcError(error: JsonRpcError): MCPError {\n return new MCPError(error.message, error.code, error.data);\n }\n}\n","/**\n * JSON-RPC 2.0 Handler for MCP\n *\n * Handles creation, parsing, and validation of JSON-RPC messages.\n */\n\nimport type {\n JsonRpcRequest,\n JsonRpcNotification,\n JsonRpcResponse,\n JsonRpcMessage,\n JsonRpcError,\n JsonRpcSuccessResponse,\n JsonRpcErrorResponse,\n PendingRequest,\n} from \"../types\";\nimport { MCPError, JSON_RPC_ERROR_CODES } from \"../types\";\n\n/**\n * JSON-RPC 2.0 Handler\n *\n * Manages request/response lifecycle, message creation, and parsing.\n */\nexport class JsonRpcHandler {\n private requestId = 0;\n private pendingRequests = new Map<string | number, PendingRequest>();\n private defaultTimeout: number;\n\n constructor(options?: { timeout?: number }) {\n this.defaultTimeout = options?.timeout ?? 30000;\n }\n\n /**\n * Generate a unique request ID\n */\n generateId(): string {\n return `req_${++this.requestId}_${Date.now()}`;\n }\n\n /**\n * Create a JSON-RPC request\n */\n createRequest(\n method: string,\n params?: Record<string, unknown>,\n ): JsonRpcRequest {\n const request: JsonRpcRequest = {\n jsonrpc: \"2.0\",\n id: this.generateId(),\n method,\n };\n\n if (params !== undefined) {\n request.params = params;\n }\n\n return request;\n }\n\n /**\n * Create a JSON-RPC notification (no response expected)\n */\n createNotification(\n method: string,\n params?: Record<string, unknown>,\n ): JsonRpcNotification {\n const notification: JsonRpcNotification = {\n jsonrpc: \"2.0\",\n method,\n };\n\n if (params !== undefined) {\n notification.params = params;\n }\n\n return notification;\n }\n\n /**\n * Register a pending request and return a promise that resolves when response is received\n */\n registerRequest(request: JsonRpcRequest, timeout?: number): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const timeoutMs = timeout ?? this.defaultTimeout;\n\n const timeoutHandle = setTimeout(() => {\n this.pendingRequests.delete(request.id);\n reject(\n new MCPError(\n `Request timed out after ${timeoutMs}ms: ${request.method}`,\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n ),\n );\n }, timeoutMs);\n\n this.pendingRequests.set(request.id, {\n resolve,\n reject,\n timeout: timeoutHandle,\n });\n });\n }\n\n /**\n * Handle an incoming JSON-RPC response\n */\n handleResponse(response: JsonRpcResponse): boolean {\n // Error responses can have null id if request couldn't be parsed\n if (response.id === null) {\n return false;\n }\n\n const pending = this.pendingRequests.get(response.id);\n if (!pending) {\n return false;\n }\n\n this.pendingRequests.delete(response.id);\n clearTimeout(pending.timeout);\n\n if (isErrorResponse(response)) {\n pending.reject(MCPError.fromJsonRpcError(response.error));\n } else {\n pending.resolve(response.result);\n }\n\n return true;\n }\n\n /**\n * Parse a JSON-RPC message from string\n */\n parse(data: string): JsonRpcMessage {\n try {\n const parsed = JSON.parse(data);\n\n if (!this.isValidMessage(parsed)) {\n throw new MCPError(\n \"Invalid JSON-RPC message\",\n JSON_RPC_ERROR_CODES.INVALID_REQUEST,\n );\n }\n\n return parsed;\n } catch (error) {\n if (error instanceof MCPError) {\n throw error;\n }\n throw new MCPError(\n \"Failed to parse JSON-RPC message\",\n JSON_RPC_ERROR_CODES.PARSE_ERROR,\n error,\n );\n }\n }\n\n /**\n * Serialize a JSON-RPC message to string\n */\n serialize(message: JsonRpcMessage): string {\n return JSON.stringify(message);\n }\n\n /**\n * Validate a JSON-RPC message\n */\n isValidMessage(message: unknown): message is JsonRpcMessage {\n if (!message || typeof message !== \"object\") {\n return false;\n }\n\n const msg = message as Record<string, unknown>;\n\n // Must have jsonrpc: \"2.0\"\n if (msg.jsonrpc !== \"2.0\") {\n return false;\n }\n\n // Check if it's a request (has id and method)\n if (\"method\" in msg && typeof msg.method === \"string\") {\n // Requests have id, notifications don't\n return true;\n }\n\n // Check if it's a response (has id and result or error)\n if (\"id\" in msg) {\n return \"result\" in msg || \"error\" in msg;\n }\n\n return false;\n }\n\n /**\n * Check if message is a request\n */\n isRequest(message: JsonRpcMessage): message is JsonRpcRequest {\n return \"method\" in message && \"id\" in message;\n }\n\n /**\n * Check if message is a notification\n */\n isNotification(message: JsonRpcMessage): message is JsonRpcNotification {\n return \"method\" in message && !(\"id\" in message);\n }\n\n /**\n * Check if message is a response\n */\n isResponse(message: JsonRpcMessage): message is JsonRpcResponse {\n return \"id\" in message && (\"result\" in message || \"error\" in message);\n }\n\n /**\n * Cancel all pending requests\n */\n cancelAllPending(reason?: string): void {\n const error = new MCPError(\n reason ?? \"All pending requests cancelled\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n\n for (const [id, pending] of this.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(error);\n }\n\n this.pendingRequests.clear();\n }\n\n /**\n * Get number of pending requests\n */\n getPendingCount(): number {\n return this.pendingRequests.size;\n }\n\n /**\n * Check if a specific request is pending\n */\n isPending(id: string | number): boolean {\n return this.pendingRequests.has(id);\n }\n}\n\n/**\n * Type guard for error response\n */\nexport function isErrorResponse(\n response: JsonRpcResponse,\n): response is JsonRpcErrorResponse {\n return \"error\" in response;\n}\n\n/**\n * Type guard for success response\n */\nexport function isSuccessResponse(\n response: JsonRpcResponse,\n): response is JsonRpcSuccessResponse {\n return \"result\" in response;\n}\n\n/**\n * Create a JSON-RPC error response\n */\nexport function createErrorResponse(\n id: string | number | null,\n error: JsonRpcError,\n): JsonRpcErrorResponse {\n return {\n jsonrpc: \"2.0\",\n id,\n error,\n };\n}\n\n/**\n * Create a JSON-RPC success response\n */\nexport function createSuccessResponse(\n id: string | number,\n result: unknown,\n): JsonRpcSuccessResponse {\n return {\n jsonrpc: \"2.0\",\n id,\n result,\n };\n}\n","/**\n * MCP Protocol Messages\n *\n * Defines all MCP-specific JSON-RPC methods and message helpers.\n */\n\nimport type {\n MCPInitializeParams,\n MCPToolCallParams,\n MCPClientCapabilities,\n MCPClientInfo,\n} from \"../types\";\nimport { MCP_PROTOCOL_VERSION } from \"../types\";\n\n// ============================================\n// MCP Method Names\n// ============================================\n\nexport const MCP_METHODS = {\n // Lifecycle\n INITIALIZE: \"initialize\",\n INITIALIZED: \"notifications/initialized\",\n PING: \"ping\",\n\n // Tools\n TOOLS_LIST: \"tools/list\",\n TOOLS_CALL: \"tools/call\",\n\n // Resources (for future use)\n RESOURCES_LIST: \"resources/list\",\n RESOURCES_READ: \"resources/read\",\n RESOURCES_SUBSCRIBE: \"resources/subscribe\",\n RESOURCES_UNSUBSCRIBE: \"resources/unsubscribe\",\n\n // Prompts (for future use)\n PROMPTS_LIST: \"prompts/list\",\n PROMPTS_GET: \"prompts/get\",\n\n // Notifications\n TOOLS_LIST_CHANGED: \"notifications/tools/list_changed\",\n RESOURCES_LIST_CHANGED: \"notifications/resources/list_changed\",\n RESOURCES_UPDATED: \"notifications/resources/updated\",\n PROMPTS_LIST_CHANGED: \"notifications/prompts/list_changed\",\n\n // Elicitation\n ELICITATION_REQUEST: \"elicitation/request\",\n ELICITATION_RESPONSE: \"elicitation/response\",\n\n // Logging\n LOGGING_SET_LEVEL: \"logging/setLevel\",\n LOGGING_MESSAGE: \"notifications/message\",\n\n // Cancellation\n CANCEL: \"notifications/cancelled\",\n} as const;\n\n// ============================================\n// Message Parameter Builders\n// ============================================\n\n/**\n * Default client info for YourGPT Copilot SDK\n */\nexport const DEFAULT_CLIENT_INFO: MCPClientInfo = {\n name: \"yourgpt-copilot-sdk\",\n version: \"2.2.0\",\n};\n\n/**\n * Default client capabilities\n */\nexport const DEFAULT_CLIENT_CAPABILITIES: MCPClientCapabilities = {\n roots: {\n listChanged: true,\n },\n sampling: {},\n};\n\n/**\n * Create initialize params\n */\nexport function createInitializeParams(\n clientInfo?: Partial<MCPClientInfo>,\n capabilities?: MCPClientCapabilities,\n): MCPInitializeParams {\n return {\n protocolVersion: MCP_PROTOCOL_VERSION,\n clientInfo: {\n ...DEFAULT_CLIENT_INFO,\n ...clientInfo,\n },\n capabilities: capabilities ?? DEFAULT_CLIENT_CAPABILITIES,\n };\n}\n\n/**\n * Create tools/list params\n */\nexport function createToolsListParams(cursor?: string): { cursor?: string } {\n if (cursor) {\n return { cursor };\n }\n return {};\n}\n\n/**\n * Create tools/call params\n */\nexport function createToolCallParams(\n name: string,\n args?: Record<string, unknown>,\n): MCPToolCallParams {\n return {\n name,\n arguments: args,\n };\n}\n\n/**\n * Create ping params (empty object)\n */\nexport function createPingParams(): Record<string, never> {\n return {};\n}\n\n/**\n * Create cancellation notification params\n */\nexport function createCancelParams(\n requestId: string | number,\n reason?: string,\n): { requestId: string | number; reason?: string } {\n return {\n requestId,\n ...(reason && { reason }),\n };\n}\n\n/**\n * Create logging set level params\n */\nexport function createLoggingSetLevelParams(\n level:\n | \"debug\"\n | \"info\"\n | \"notice\"\n | \"warning\"\n | \"error\"\n | \"critical\"\n | \"alert\"\n | \"emergency\",\n): { level: string } {\n return { level };\n}\n\n// ============================================\n// Response Type Guards\n// ============================================\n\n/**\n * Check if value is a valid initialize result\n */\nexport function isInitializeResult(\n value: unknown,\n): value is import(\"../types\").MCPInitializeResult {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v.protocolVersion === \"string\" &&\n v.capabilities !== null &&\n typeof v.capabilities === \"object\" &&\n v.serverInfo !== null &&\n typeof v.serverInfo === \"object\"\n );\n}\n\n/**\n * Check if value is a valid tools list result\n */\nexport function isToolsListResult(\n value: unknown,\n): value is import(\"../types\").MCPToolsListResult {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return Array.isArray(v.tools);\n}\n\n/**\n * Check if value is a valid tool call result\n */\nexport function isToolCallResult(\n value: unknown,\n): value is import(\"../types\").MCPToolCallResult {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return Array.isArray(v.content);\n}\n\n/**\n * Check if value is a ping result (empty object or has no required fields)\n */\nexport function isPingResult(value: unknown): value is Record<string, never> {\n return value !== null && typeof value === \"object\";\n}\n","/**\n * MCP Transport Types\n *\n * Defines the base transport interface and common types.\n */\n\nimport type {\n JsonRpcRequest,\n JsonRpcNotification,\n JsonRpcMessage,\n} from \"../types\";\n\n/**\n * MCP transport interface\n *\n * All transports (HTTP, SSE, stdio) must implement this interface.\n */\nexport interface MCPTransport {\n /**\n * Connect the transport\n */\n connect(): Promise<void>;\n\n /**\n * Disconnect the transport\n */\n disconnect(): Promise<void>;\n\n /**\n * Send a JSON-RPC message\n */\n send(message: JsonRpcRequest | JsonRpcNotification): Promise<void>;\n\n /**\n * Set message handler for incoming messages\n */\n onMessage(handler: MessageHandler): void;\n\n /**\n * Set error handler\n */\n onError(handler: ErrorHandler): void;\n\n /**\n * Set close handler\n */\n onClose(handler: CloseHandler): void;\n\n /**\n * Check if transport is connected\n */\n isConnected(): boolean;\n}\n\n/**\n * Message handler callback\n */\nexport type MessageHandler = (message: JsonRpcMessage) => void;\n\n/**\n * Error handler callback\n */\nexport type ErrorHandler = (error: Error) => void;\n\n/**\n * Close handler callback\n */\nexport type CloseHandler = () => void;\n\n/**\n * Base transport options\n */\nexport interface TransportOptions {\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * HTTP transport options\n */\nexport interface HttpTransportOptions extends TransportOptions {\n /** Server URL */\n url: string;\n /** Custom headers */\n headers?: Record<string, string>;\n /** Session ID (managed internally) */\n sessionId?: string;\n}\n\n/**\n * SSE transport options\n */\nexport interface SSETransportOptions extends TransportOptions {\n /** Server URL */\n url: string;\n /** Custom headers */\n headers?: Record<string, string>;\n}\n\n/**\n * Stdio transport options\n */\nexport interface StdioTransportOptions extends TransportOptions {\n /** Command to execute */\n command: string;\n /** Command arguments */\n args?: string[];\n /** Environment variables */\n env?: Record<string, string>;\n /** Working directory */\n cwd?: string;\n}\n\n/**\n * Abstract base transport class\n *\n * Provides common functionality for all transports.\n */\nexport abstract class BaseTransport implements MCPTransport {\n protected messageHandler?: MessageHandler;\n protected errorHandler?: ErrorHandler;\n protected closeHandler?: CloseHandler;\n protected connected = false;\n\n abstract connect(): Promise<void>;\n abstract disconnect(): Promise<void>;\n abstract send(message: JsonRpcRequest | JsonRpcNotification): Promise<void>;\n\n onMessage(handler: MessageHandler): void {\n this.messageHandler = handler;\n }\n\n onError(handler: ErrorHandler): void {\n this.errorHandler = handler;\n }\n\n onClose(handler: CloseHandler): void {\n this.closeHandler = handler;\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Emit a message to the handler\n */\n protected emitMessage(message: JsonRpcMessage): void {\n if (this.messageHandler) {\n this.messageHandler(message);\n }\n }\n\n /**\n * Emit an error to the handler\n */\n protected emitError(error: Error): void {\n if (this.errorHandler) {\n this.errorHandler(error);\n }\n }\n\n /**\n * Emit close event\n */\n protected emitClose(): void {\n this.connected = false;\n if (this.closeHandler) {\n this.closeHandler();\n }\n }\n}\n","/**\n * HTTP Streamable Transport for MCP\n *\n * Implements the HTTP Streamable transport as recommended by the MCP specification.\n * This transport uses HTTP POST requests for sending messages and can handle\n * streaming responses via SSE when needed.\n */\n\nimport type {\n JsonRpcRequest,\n JsonRpcNotification,\n JsonRpcMessage,\n JsonRpcResponse,\n} from \"../types\";\nimport { MCPError, JSON_RPC_ERROR_CODES } from \"../types\";\nimport { BaseTransport, type HttpTransportOptions } from \"./types\";\n\n/**\n * HTTP Streamable Transport\n *\n * The recommended transport for MCP over HTTP. Supports both request/response\n * and server-initiated messages via SSE.\n */\nexport class HttpTransport extends BaseTransport {\n private url: string;\n private headers: Record<string, string>;\n private timeout: number;\n private sessionId?: string;\n private eventSource?: EventSource;\n private abortController?: AbortController;\n\n constructor(options: HttpTransportOptions) {\n super();\n this.url = options.url;\n this.headers = options.headers ?? {};\n this.timeout = options.timeout ?? 30000;\n this.sessionId = options.sessionId;\n }\n\n /**\n * Connect the HTTP transport\n *\n * For HTTP transport, \"connecting\" means verifying the endpoint is reachable.\n * The actual session is established during the initialize handshake.\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n this.abortController = new AbortController();\n this.connected = true;\n }\n\n /**\n * Disconnect the HTTP transport\n */\n async disconnect(): Promise<void> {\n if (!this.connected) {\n return;\n }\n\n // Close any SSE connection\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = undefined;\n }\n\n // Abort any pending requests\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = undefined;\n }\n\n this.sessionId = undefined;\n this.connected = false;\n this.emitClose();\n }\n\n /**\n * Send a JSON-RPC message and handle the response\n */\n async send(message: JsonRpcRequest | JsonRpcNotification): Promise<void> {\n if (!this.connected) {\n throw new MCPError(\n \"Transport not connected\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n\n const isRequest = \"id\" in message;\n\n try {\n const response = await this.sendRequest(message);\n\n // Handle response based on content type\n const contentType = response.headers.get(\"content-type\") || \"\";\n\n // Check for session ID in response headers\n const newSessionId = response.headers.get(\"mcp-session-id\");\n if (newSessionId) {\n this.sessionId = newSessionId;\n }\n\n if (contentType.includes(\"text/event-stream\")) {\n // Server wants to use SSE for this response\n await this.handleSSEResponse(response);\n } else if (contentType.includes(\"application/json\")) {\n // Standard JSON response\n const text = await response.text();\n if (text.trim()) {\n // Parse potentially multiple JSON-RPC messages (batch)\n const messages = this.parseResponseText(text);\n for (const msg of messages) {\n this.emitMessage(msg);\n }\n }\n } else if (!response.ok) {\n throw new MCPError(\n `HTTP error: ${response.status} ${response.statusText}`,\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n // 202 Accepted or 204 No Content - no response body expected\n } catch (error) {\n if (error instanceof MCPError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n throw new MCPError(\n \"Request aborted\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n throw new MCPError(\n `Transport error: ${error.message}`,\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n error,\n );\n }\n\n throw new MCPError(\n \"Unknown transport error\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n }\n\n /**\n * Send an HTTP request\n */\n private async sendRequest(\n message: JsonRpcRequest | JsonRpcNotification,\n ): Promise<Response> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n ...this.headers,\n };\n\n // Include session ID if we have one\n if (this.sessionId) {\n headers[\"Mcp-Session-Id\"] = this.sessionId;\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(this.url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(message),\n signal: controller.signal,\n });\n\n return response;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Handle an SSE response stream\n */\n private async handleSSEResponse(response: Response): Promise<void> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new MCPError(\n \"No response body for SSE stream\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete SSE events\n const events = buffer.split(\"\\n\\n\");\n buffer = events.pop() || \"\"; // Keep incomplete event in buffer\n\n for (const event of events) {\n if (!event.trim()) continue;\n\n const lines = event.split(\"\\n\");\n let data = \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n data += line.slice(6);\n }\n }\n\n if (data) {\n try {\n const messages = this.parseResponseText(data);\n for (const msg of messages) {\n this.emitMessage(msg);\n }\n } catch {\n // Skip invalid JSON in SSE\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Parse response text into JSON-RPC messages\n */\n private parseResponseText(text: string): JsonRpcMessage[] {\n const trimmed = text.trim();\n if (!trimmed) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(trimmed);\n\n // Check if it's a batch response (array)\n if (Array.isArray(parsed)) {\n return parsed.filter((msg): msg is JsonRpcMessage =>\n this.isValidJsonRpcMessage(msg),\n );\n }\n\n // Single message\n if (this.isValidJsonRpcMessage(parsed)) {\n return [parsed];\n }\n\n return [];\n } catch {\n throw new MCPError(\n \"Failed to parse JSON-RPC response\",\n JSON_RPC_ERROR_CODES.PARSE_ERROR,\n );\n }\n }\n\n /**\n * Validate a JSON-RPC message\n */\n private isValidJsonRpcMessage(msg: unknown): msg is JsonRpcMessage {\n if (!msg || typeof msg !== \"object\") {\n return false;\n }\n\n const m = msg as Record<string, unknown>;\n if (m.jsonrpc !== \"2.0\") {\n return false;\n }\n\n // Request or notification: has method\n if (\"method\" in m && typeof m.method === \"string\") {\n return true;\n }\n\n // Response: has id and (result or error)\n if (\"id\" in m && (\"result\" in m || \"error\" in m)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Start listening for server-initiated events via SSE\n *\n * This is optional and used when the server supports server-initiated\n * notifications (e.g., tools/list_changed).\n */\n startEventStream(): void {\n if (this.eventSource || typeof EventSource === \"undefined\") {\n return;\n }\n\n // Build URL with session ID if available\n const url = new URL(this.url);\n if (this.sessionId) {\n url.searchParams.set(\"sessionId\", this.sessionId);\n }\n\n // Note: EventSource doesn't support custom headers natively\n // For authenticated endpoints, the server should use query params or cookies\n this.eventSource = new EventSource(url.toString());\n\n this.eventSource.onmessage = (event) => {\n try {\n const messages = this.parseResponseText(event.data);\n for (const msg of messages) {\n this.emitMessage(msg);\n }\n } catch {\n // Ignore parse errors from event stream\n }\n };\n\n this.eventSource.onerror = () => {\n // EventSource will automatically reconnect\n this.emitError(new MCPError(\"SSE connection error\"));\n };\n }\n\n /**\n * Stop the event stream\n */\n stopEventStream(): void {\n if (this.eventSource) {\n this.eventSource.close();\n this.eventSource = undefined;\n }\n }\n\n /**\n * Get the current session ID\n */\n getSessionId(): string | undefined {\n return this.sessionId;\n }\n\n /**\n * Set the session ID (used after initialization)\n */\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n }\n}\n","/**\n * MCP Tool Adapter\n *\n * Converts MCP tool definitions to the SDK's ToolDefinition format.\n */\n\nimport type {\n MCPToolDefinition,\n MCPToolCallResult,\n MCPToolInputSchema,\n MCPJsonSchemaProperty,\n MCPTextContent,\n MCPImageContent,\n MCPUIContent,\n MCPResourceContent,\n} from \"../types\";\nimport type { MCPUIResource } from \"../ui/types\";\nimport type {\n ToolDefinition,\n ToolInputSchema,\n JSONSchemaProperty,\n ToolResponse,\n ToolContext,\n AIContent,\n} from \"../../core/types/tools\";\n\n/**\n * Options for converting MCP tools to ToolDefinitions\n */\nexport interface MCPToolAdapterOptions {\n /** Prefix tool names with client name */\n prefix?: boolean;\n /** Register as server-side tool (default: true for MCP tools) */\n asServerTool?: boolean;\n /** Function to call the MCP tool */\n callTool: (\n name: string,\n args?: Record<string, unknown>,\n ) => Promise<MCPToolCallResult>;\n}\n\n/**\n * MCP Tool Adapter\n *\n * Handles conversion between MCP tool format and SDK ToolDefinition format.\n */\nexport class MCPToolAdapter {\n private clientName: string;\n\n constructor(clientName: string) {\n this.clientName = clientName;\n }\n\n /**\n * Convert an MCP tool to a ToolDefinition\n */\n toToolDefinition(\n mcpTool: MCPToolDefinition,\n options: MCPToolAdapterOptions,\n ): ToolDefinition {\n const { prefix = true, asServerTool = true, callTool } = options;\n\n const toolName = prefix\n ? `${this.clientName}_${mcpTool.name}`\n : mcpTool.name;\n\n // Store original name for calling\n const originalName = mcpTool.name;\n\n return {\n name: toolName,\n description: mcpTool.description ?? `MCP tool: ${mcpTool.name}`,\n location: asServerTool ? \"server\" : \"client\",\n inputSchema: this.convertInputSchema(mcpTool.inputSchema),\n handler: async (\n params: Record<string, unknown>,\n context?: ToolContext,\n ): Promise<ToolResponse> => {\n try {\n // Check for cancellation\n if (context?.signal?.aborted) {\n return {\n success: false,\n error: \"Tool execution cancelled\",\n };\n }\n\n // Call the MCP tool\n const result = await callTool(originalName, params);\n\n // Convert MCP result to ToolResponse\n return this.convertResult(result);\n } catch (error) {\n return {\n success: false,\n error:\n error instanceof Error\n ? error.message\n : \"Unknown error calling MCP tool\",\n };\n }\n },\n // MCP tools display their name as title\n title: this.formatToolTitle(mcpTool.name),\n executingTitle: `Calling ${this.formatToolTitle(mcpTool.name)}...`,\n completedTitle: `${this.formatToolTitle(mcpTool.name)} completed`,\n };\n }\n\n /**\n * Convert multiple MCP tools to ToolDefinitions\n */\n toToolDefinitions(\n mcpTools: MCPToolDefinition[],\n options: MCPToolAdapterOptions,\n ): ToolDefinition[] {\n return mcpTools.map((tool) => this.toToolDefinition(tool, options));\n }\n\n /**\n * Convert MCP input schema to SDK ToolInputSchema\n */\n private convertInputSchema(mcpSchema: MCPToolInputSchema): ToolInputSchema {\n return {\n type: \"object\",\n properties: mcpSchema.properties\n ? this.convertProperties(mcpSchema.properties)\n : {},\n required: mcpSchema.required,\n additionalProperties: mcpSchema.additionalProperties,\n };\n }\n\n /**\n * Convert MCP schema properties to SDK JSONSchemaProperty format\n */\n private convertProperties(\n properties: Record<string, MCPJsonSchemaProperty>,\n ): Record<string, JSONSchemaProperty> {\n const converted: Record<string, JSONSchemaProperty> = {};\n\n for (const [key, prop] of Object.entries(properties)) {\n converted[key] = this.convertProperty(prop);\n }\n\n return converted;\n }\n\n /**\n * Convert a single MCP property to SDK format\n */\n private convertProperty(prop: MCPJsonSchemaProperty): JSONSchemaProperty {\n // Handle type which could be string or array\n let type: JSONSchemaProperty[\"type\"] = \"string\";\n if (prop.type) {\n if (Array.isArray(prop.type)) {\n // Take the first non-null type\n const nonNull = prop.type.find((t) => t !== \"null\");\n type = (nonNull as JSONSchemaProperty[\"type\"]) || \"string\";\n } else {\n type = prop.type as JSONSchemaProperty[\"type\"];\n }\n }\n\n const converted: JSONSchemaProperty = {\n type,\n description: prop.description,\n };\n\n // Copy over optional properties\n if (prop.enum) {\n converted.enum = prop.enum as (string | number | boolean)[];\n }\n if (prop.default !== undefined) {\n converted.default = prop.default;\n }\n if (prop.minLength !== undefined) {\n converted.minLength = prop.minLength;\n }\n if (prop.maxLength !== undefined) {\n converted.maxLength = prop.maxLength;\n }\n if (prop.minimum !== undefined) {\n converted.minimum = prop.minimum;\n }\n if (prop.maximum !== undefined) {\n converted.maximum = prop.maximum;\n }\n if (prop.pattern !== undefined) {\n converted.pattern = prop.pattern;\n }\n\n // Handle nested objects\n if (prop.properties) {\n converted.properties = this.convertProperties(prop.properties);\n }\n if (prop.required) {\n converted.required = prop.required;\n }\n\n // Handle arrays\n if (prop.items) {\n converted.items = this.convertProperty(prop.items);\n }\n\n return converted;\n }\n\n /**\n * Convert MCP tool result to SDK ToolResponse\n */\n private convertResult(result: MCPToolCallResult): ToolResponse {\n const response: ToolResponse = {\n success: !result.isError,\n };\n\n // Process content array\n const textParts: string[] = [];\n const aiContent: AIContent[] = [];\n const uiResources: MCPUIResource[] = [];\n\n for (const content of result.content) {\n switch (content.type) {\n case \"text\":\n textParts.push((content as MCPTextContent).text);\n break;\n\n case \"image\": {\n const img = content as MCPImageContent;\n aiContent.push({\n type: \"image\",\n data: img.data,\n mediaType: img.mimeType,\n });\n break;\n }\n\n case \"resource\": {\n // Handle embedded resource content\n // Check if this is a UI resource (uri starts with ui://)\n // MCP servers return type: \"resource\" with ui:// URIs per MCP spec\n const res = (content as MCPResourceContent).resource;\n if (res.uri?.startsWith(\"ui://\")) {\n // This is a UI resource - extract for rendering\n uiResources.push({\n uri: res.uri,\n mimeType:\n (res.mimeType as MCPUIContent[\"resource\"][\"mimeType\"]) ||\n \"text/html\",\n content: res.text, // MCP uses \"text\" field, normalize to \"content\"\n blob: res.blob,\n });\n } else if (res.text) {\n // Regular resource with text content\n textParts.push(res.text);\n }\n break;\n }\n\n case \"ui\": {\n // Handle MCP-UI content (non-standard but supported for compatibility)\n const uiContent = content as MCPUIContent;\n uiResources.push({\n uri: uiContent.resource.uri,\n mimeType: uiContent.resource.mimeType,\n content: uiContent.resource.content,\n blob: uiContent.resource.blob,\n metadata: uiContent.resource.metadata,\n });\n break;\n }\n }\n }\n\n // Set message from text content\n if (textParts.length > 0) {\n response.message = textParts.join(\"\\n\");\n\n // Try to parse as JSON for structured data\n if (textParts.length === 1) {\n try {\n response.data = JSON.parse(textParts[0]);\n } catch {\n // Keep as text if not valid JSON\n response.data = textParts[0];\n }\n } else {\n response.data = textParts;\n }\n }\n\n // Add AI content for multimodal responses\n if (aiContent.length > 0) {\n response._aiContent = aiContent;\n }\n\n // Add UI resources for rendering\n if (uiResources.length > 0) {\n response._uiResources = uiResources;\n }\n\n // Set error if this was an error result\n if (result.isError) {\n response.error = textParts.join(\"\\n\") || \"Tool execution failed\";\n }\n\n return response;\n }\n\n /**\n * Format tool name as a readable title\n */\n private formatToolTitle(name: string): string {\n // Convert snake_case or kebab-case to Title Case\n return name\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n }\n}\n\n/**\n * Convert an MCP tool to a ToolDefinition (standalone function)\n */\nexport function mcpToolToDefinition(\n clientName: string,\n mcpTool: MCPToolDefinition,\n options: MCPToolAdapterOptions,\n): ToolDefinition {\n const adapter = new MCPToolAdapter(clientName);\n return adapter.toToolDefinition(mcpTool, options);\n}\n\n/**\n * Convert multiple MCP tools to ToolDefinitions (standalone function)\n */\nexport function mcpToolsToDefinitions(\n clientName: string,\n mcpTools: MCPToolDefinition[],\n options: MCPToolAdapterOptions,\n): ToolDefinition[] {\n const adapter = new MCPToolAdapter(clientName);\n return adapter.toToolDefinitions(mcpTools, options);\n}\n","/**\n * MCP Client\n *\n * The core client class for connecting to MCP servers and managing\n * tools, resources, and the connection lifecycle.\n */\n\nimport type {\n MCPClientConfig,\n MCPClientState,\n MCPClientEvents,\n MCPConnectionState,\n MCPToolDefinition,\n MCPToolCallResult,\n MCPInitializeResult,\n MCPToolsListResult,\n JsonRpcMessage,\n JsonRpcResponse,\n MCPServerCapabilities,\n MCPServerInfo,\n} from \"../types\";\nimport { MCPError, JSON_RPC_ERROR_CODES } from \"../types\";\nimport { JsonRpcHandler } from \"../protocol/JsonRpcHandler\";\nimport {\n MCP_METHODS,\n createInitializeParams,\n createToolsListParams,\n createToolCallParams,\n createPingParams,\n isInitializeResult,\n isToolsListResult,\n isToolCallResult,\n} from \"../protocol/messages\";\nimport { HttpTransport } from \"../transports/HttpTransport\";\nimport type { MCPTransport } from \"../transports/types\";\nimport { MCPToolAdapter } from \"../tools/MCPToolAdapter\";\nimport type { ToolDefinition } from \"../../core/types/tools\";\n\n/**\n * MCP Client\n *\n * Provides a simple interface for connecting to MCP servers and using their tools.\n *\n * @example\n * ```typescript\n * const client = new MCPClient({\n * name: \"github\",\n * transport: \"http\",\n * url: \"https://mcp.github.com\",\n * headers: { Authorization: `Bearer ${token}` },\n * });\n *\n * await client.connect();\n * const tools = client.toToolDefinitions();\n * const result = await client.callTool(\"create_issue\", { title: \"Bug\" });\n * await client.disconnect();\n * ```\n */\nexport class MCPClient {\n private config: MCPClientConfig;\n private transport?: MCPTransport;\n private rpcHandler: JsonRpcHandler;\n private state: MCPClientState;\n private events: MCPClientEvents;\n private toolAdapter: MCPToolAdapter;\n\n constructor(config: MCPClientConfig, events?: MCPClientEvents) {\n this.config = config;\n this.events = events ?? {};\n this.rpcHandler = new JsonRpcHandler({ timeout: config.timeout ?? 30000 });\n this.toolAdapter = new MCPToolAdapter(config.name);\n this.state = {\n connectionState: \"disconnected\",\n tools: [],\n };\n }\n\n /**\n * Get the current client state\n */\n getState(): Readonly<MCPClientState> {\n return { ...this.state };\n }\n\n /**\n * Get the client name\n */\n getName(): string {\n return this.config.name;\n }\n\n /**\n * Check if client is connected\n */\n isConnected(): boolean {\n return this.state.connectionState === \"connected\";\n }\n\n /**\n * Connect to the MCP server\n */\n async connect(): Promise<void> {\n if (this.state.connectionState === \"connected\") {\n return;\n }\n\n if (this.state.connectionState === \"connecting\") {\n throw new MCPError(\"Connection already in progress\");\n }\n\n this.setConnectionState(\"connecting\");\n\n try {\n // Create transport based on config\n this.transport = this.createTransport();\n\n // Set up message handling\n this.transport.onMessage(this.handleMessage.bind(this));\n this.transport.onError(this.handleError.bind(this));\n this.transport.onClose(this.handleClose.bind(this));\n\n // Connect transport\n await this.transport.connect();\n\n // Perform MCP initialization handshake\n await this.initialize();\n\n // Mark as connected before fetching tools\n this.setConnectionState(\"connected\");\n\n // Fetch available tools\n await this.refreshTools();\n } catch (error) {\n this.setConnectionState(\n \"error\",\n error instanceof Error ? error.message : \"Connection failed\",\n );\n throw error;\n }\n }\n\n /**\n * Disconnect from the MCP server\n */\n async disconnect(): Promise<void> {\n if (this.state.connectionState === \"disconnected\") {\n return;\n }\n\n // Cancel any pending requests\n this.rpcHandler.cancelAllPending(\"Client disconnecting\");\n\n // Disconnect transport\n if (this.transport) {\n await this.transport.disconnect();\n this.transport = undefined;\n }\n\n // Reset state\n this.state = {\n connectionState: \"disconnected\",\n tools: [],\n };\n }\n\n /**\n * Call an MCP tool\n */\n async callTool(\n name: string,\n args?: Record<string, unknown>,\n ): Promise<MCPToolCallResult> {\n this.ensureConnected();\n\n const result = await this.request(\n MCP_METHODS.TOOLS_CALL,\n createToolCallParams(name, args) as unknown as Record<string, unknown>,\n );\n\n if (!isToolCallResult(result)) {\n throw new MCPError(\n \"Invalid tool call result from server\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n\n return result;\n }\n\n /**\n * Refresh the list of available tools\n */\n async refreshTools(): Promise<MCPToolDefinition[]> {\n this.ensureConnected();\n\n const allTools: MCPToolDefinition[] = [];\n let cursor: string | undefined;\n\n // Handle pagination\n do {\n const result = await this.request(\n MCP_METHODS.TOOLS_LIST,\n createToolsListParams(cursor),\n );\n\n if (!isToolsListResult(result)) {\n throw new MCPError(\n \"Invalid tools list result from server\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n\n allTools.push(...result.tools);\n cursor = result.nextCursor;\n } while (cursor);\n\n this.state.tools = allTools;\n this.state.lastActivity = Date.now();\n this.events.onToolsChange?.(allTools);\n\n return allTools;\n }\n\n /**\n * Convert MCP tools to ToolDefinition format for use with CopilotProvider\n */\n toToolDefinitions(options?: {\n prefixToolNames?: boolean;\n serverLocation?: boolean;\n }): ToolDefinition[] {\n const prefix = options?.prefixToolNames !== false;\n const asServer = options?.serverLocation ?? false;\n\n return this.state.tools.map((tool) =>\n this.toolAdapter.toToolDefinition(tool, {\n prefix,\n asServerTool: asServer,\n callTool: this.callTool.bind(this),\n }),\n );\n }\n\n /**\n * Get the list of MCP tools\n */\n getTools(): MCPToolDefinition[] {\n return [...this.state.tools];\n }\n\n /**\n * Get server info\n */\n getServerInfo(): MCPServerInfo | undefined {\n return this.state.serverInfo;\n }\n\n /**\n * Get server capabilities\n */\n getServerCapabilities(): MCPServerCapabilities | undefined {\n return this.state.serverCapabilities;\n }\n\n /**\n * Ping the server to check connectivity\n */\n async ping(): Promise<boolean> {\n try {\n await this.request(MCP_METHODS.PING, createPingParams());\n return true;\n } catch {\n return false;\n }\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n /**\n * Create transport based on config\n */\n private createTransport(): MCPTransport {\n switch (this.config.transport) {\n case \"http\":\n if (!this.config.url) {\n throw new MCPError(\n \"URL is required for HTTP transport\",\n JSON_RPC_ERROR_CODES.INVALID_PARAMS,\n );\n }\n return new HttpTransport({\n url: this.config.url,\n headers: this.config.headers,\n timeout: this.config.timeout,\n });\n\n case \"sse\":\n // SSE uses the same transport but with different behavior\n if (!this.config.url) {\n throw new MCPError(\n \"URL is required for SSE transport\",\n JSON_RPC_ERROR_CODES.INVALID_PARAMS,\n );\n }\n return new HttpTransport({\n url: this.config.url,\n headers: this.config.headers,\n timeout: this.config.timeout,\n });\n\n case \"stdio\":\n // Stdio transport will be implemented in Phase 3\n throw new MCPError(\n \"Stdio transport not yet implemented. Use HTTP or SSE transport.\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n\n default:\n throw new MCPError(\n `Unknown transport type: ${this.config.transport}`,\n JSON_RPC_ERROR_CODES.INVALID_PARAMS,\n );\n }\n }\n\n /**\n * Perform MCP initialization handshake\n */\n private async initialize(): Promise<void> {\n const params = createInitializeParams(\n this.config.clientInfo,\n this.config.capabilities,\n );\n\n const result = await this.request(\n MCP_METHODS.INITIALIZE,\n params as unknown as Record<string, unknown>,\n );\n\n if (!isInitializeResult(result)) {\n throw new MCPError(\n \"Invalid initialization result from server\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n\n // Store server info\n this.state.serverInfo = result.serverInfo;\n this.state.serverCapabilities = result.capabilities;\n\n // Send initialized notification\n await this.notify(MCP_METHODS.INITIALIZED);\n }\n\n /**\n * Send a JSON-RPC request and wait for response\n */\n private async request(\n method: string,\n params?: Record<string, unknown>,\n ): Promise<unknown> {\n if (!this.transport) {\n throw new MCPError(\n \"Transport not initialized\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n\n const request = this.rpcHandler.createRequest(method, params);\n const responsePromise = this.rpcHandler.registerRequest(\n request,\n this.config.timeout,\n );\n\n await this.transport.send(request);\n\n return responsePromise;\n }\n\n /**\n * Send a JSON-RPC notification (no response expected)\n */\n private async notify(\n method: string,\n params?: Record<string, unknown>,\n ): Promise<void> {\n if (!this.transport) {\n throw new MCPError(\n \"Transport not initialized\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n\n const notification = this.rpcHandler.createNotification(method, params);\n await this.transport.send(notification);\n }\n\n /**\n * Handle incoming JSON-RPC message\n */\n private handleMessage(message: JsonRpcMessage): void {\n // Check if it's a response to a pending request\n if (this.rpcHandler.isResponse(message)) {\n this.rpcHandler.handleResponse(message as JsonRpcResponse);\n return;\n }\n\n // Check if it's a notification\n if (this.rpcHandler.isNotification(message)) {\n const notification = message as import(\"../types\").JsonRpcNotification;\n this.handleNotification(notification.method, notification.params);\n return;\n }\n\n // Check if it's a request (server-initiated, e.g., elicitation)\n if (this.rpcHandler.isRequest(message)) {\n const request = message as import(\"../types\").JsonRpcRequest;\n this.handleServerRequest(request.id, request.method, request.params);\n }\n }\n\n /**\n * Handle server notification\n */\n private handleNotification(\n method: string,\n params?: Record<string, unknown>,\n ): void {\n switch (method) {\n case MCP_METHODS.TOOLS_LIST_CHANGED:\n // Refresh tools when server notifies of changes\n this.refreshTools().catch((error) => {\n this.events.onError?.(error);\n });\n break;\n\n default:\n // Pass unknown notifications to event handler\n this.events.onNotification?.(method, params);\n }\n }\n\n /**\n * Handle server-initiated request (e.g., elicitation)\n */\n private async handleServerRequest(\n _id: string | number,\n method: string,\n params?: Record<string, unknown>,\n ): Promise<void> {\n // Handle elicitation requests\n if (\n method === MCP_METHODS.ELICITATION_REQUEST &&\n this.events.onElicitationRequest\n ) {\n try {\n const elicitationRequest =\n params as unknown as import(\"../types\").MCPElicitationRequest;\n const response =\n await this.events.onElicitationRequest(elicitationRequest);\n\n // Send response back to server\n await this.notify(\n MCP_METHODS.ELICITATION_RESPONSE,\n response as unknown as Record<string, unknown>,\n );\n } catch (error) {\n // Send rejection response\n await this.notify(MCP_METHODS.ELICITATION_RESPONSE, {\n requestId: params?.requestId as string,\n accepted: false,\n reason: error instanceof Error ? error.message : \"User rejected\",\n });\n }\n }\n }\n\n /**\n * Handle transport error\n */\n private handleError(error: Error): void {\n this.setConnectionState(\"error\", error.message);\n this.events.onError?.(error);\n }\n\n /**\n * Handle transport close\n */\n private handleClose(): void {\n if (this.state.connectionState === \"connected\") {\n this.setConnectionState(\"disconnected\");\n }\n }\n\n /**\n * Update connection state\n */\n private setConnectionState(state: MCPConnectionState, error?: string): void {\n this.state.connectionState = state;\n this.state.error = error;\n this.events.onConnectionStateChange?.(state);\n }\n\n /**\n * Ensure client is connected\n */\n private ensureConnected(): void {\n if (!this.isConnected()) {\n throw new MCPError(\n \"Client not connected. Call connect() first.\",\n JSON_RPC_ERROR_CODES.INTERNAL_ERROR,\n );\n }\n }\n}\n\n/**\n * Create an MCP client\n *\n * Factory function for creating MCPClient instances.\n *\n * @example\n * ```typescript\n * const client = createMCPClient({\n * name: \"github\",\n * transport: \"http\",\n * url: \"https://mcp.github.com\",\n * });\n *\n * await client.connect();\n * const tools = client.toToolDefinitions();\n * ```\n */\nexport function createMCPClient(\n config: MCPClientConfig,\n events?: MCPClientEvents,\n): MCPClient {\n return new MCPClient(config, events);\n}\n"]}
@@ -0,0 +1,67 @@
1
+ // src/core/types/tools.ts
2
+ function tool(config) {
3
+ return {
4
+ description: config.description,
5
+ location: config.location ?? "client",
6
+ // Display configuration
7
+ title: config.title,
8
+ executingTitle: config.executingTitle,
9
+ completedTitle: config.completedTitle,
10
+ // Schema and handlers
11
+ inputSchema: config.inputSchema ?? {
12
+ type: "object",
13
+ properties: {},
14
+ required: []
15
+ },
16
+ handler: config.handler,
17
+ render: config.render,
18
+ available: config.available,
19
+ hidden: config.hidden,
20
+ needsApproval: config.needsApproval,
21
+ approvalMessage: config.approvalMessage,
22
+ aiResponseMode: config.aiResponseMode,
23
+ aiContext: config.aiContext
24
+ };
25
+ }
26
+ function toolToOpenAIFormat(tool2) {
27
+ return {
28
+ type: "function",
29
+ function: {
30
+ name: tool2.name,
31
+ description: tool2.description,
32
+ parameters: tool2.inputSchema
33
+ }
34
+ };
35
+ }
36
+ function toolToAnthropicFormat(tool2) {
37
+ return {
38
+ name: tool2.name,
39
+ description: tool2.description,
40
+ input_schema: tool2.inputSchema
41
+ };
42
+ }
43
+ function createToolResult(toolCallId, response) {
44
+ return {
45
+ toolCallId,
46
+ content: JSON.stringify(response),
47
+ success: response.success,
48
+ error: response.error
49
+ };
50
+ }
51
+ function success(data, message) {
52
+ return {
53
+ success: true,
54
+ data,
55
+ message
56
+ };
57
+ }
58
+ function failure(error) {
59
+ return {
60
+ success: false,
61
+ error
62
+ };
63
+ }
64
+
65
+ export { createToolResult, failure, success, tool, toolToAnthropicFormat, toolToOpenAIFormat };
66
+ //# sourceMappingURL=chunk-BKO7DSPU.js.map
67
+ //# sourceMappingURL=chunk-BKO7DSPU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/types/tools.ts"],"names":["tool"],"mappings":";AAqvBO,SAAS,KACd,MAAA,EACuC;AACvC,EAAA,OAAO;AAAA,IACL,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,QAAA,EAAU,OAAO,QAAA,IAAY,QAAA;AAAA;AAAA,IAE7B,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,gBAAgB,MAAA,CAAO,cAAA;AAAA;AAAA,IAEvB,WAAA,EAAa,OAAO,WAAA,IAAe;AAAA,MACjC,IAAA,EAAM,QAAA;AAAA,MACN,YAAY,EAAC;AAAA,MACb,UAAU;AAAC,KACb;AAAA,IACA,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,iBAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,WAAW,MAAA,CAAO;AAAA,GACpB;AACF;AASO,SAAS,mBAAmBA,KAAAA,EAA8B;AAC/D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,MAAMA,KAAAA,CAAK,IAAA;AAAA,MACX,aAAaA,KAAAA,CAAK,WAAA;AAAA,MAClB,YAAYA,KAAAA,CAAK;AAAA;AACnB,GACF;AACF;AAKO,SAAS,sBAAsBA,KAAAA,EAA8B;AAClE,EAAA,OAAO;AAAA,IACL,MAAMA,KAAAA,CAAK,IAAA;AAAA,IACX,aAAaA,KAAAA,CAAK,WAAA;AAAA,IAClB,cAAcA,KAAAA,CAAK;AAAA,GACrB;AACF;AAKO,SAAS,gBAAA,CACd,YACA,QAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,IAChC,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,OAAO,QAAA,CAAS;AAAA,GAClB;AACF;AAKO,SAAS,OAAA,CACd,MACA,OAAA,EACiB;AACjB,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,IAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,QAAQ,KAAA,EAA6B;AACnD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT;AAAA,GACF;AACF","file":"chunk-BKO7DSPU.js","sourcesContent":["/**\n * Tool-related types for the agentic loop\n */\n\nimport type { ActionRenderProps } from \"./actions\";\n\n// ============================================\n// Provider Types\n// ============================================\n\n/**\n * Supported AI providers for tool calling\n */\nexport type AIProvider =\n | \"anthropic\"\n | \"openai\"\n | \"xai\"\n | \"grok\"\n | \"gemini\"\n | \"groq\"\n | \"ollama\";\n\n/**\n * Where the tool executes\n */\nexport type ToolLocation = \"server\" | \"client\";\n\n// ============================================\n// Tool Definition Types\n// ============================================\n\n/**\n * JSON Schema property definition\n */\nexport interface JSONSchemaProperty {\n type:\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"object\"\n | \"array\"\n | \"integer\"\n | \"null\";\n description?: string;\n enum?: (string | number | boolean)[];\n items?: JSONSchemaProperty;\n properties?: Record<string, JSONSchemaProperty>;\n required?: string[];\n default?: unknown;\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n pattern?: string;\n}\n\n/**\n * JSON Schema for tool input\n */\nexport interface ToolInputSchema {\n type: \"object\";\n properties: Record<string, JSONSchemaProperty>;\n required?: string[];\n additionalProperties?: boolean;\n}\n\n/**\n * Tool execution context\n *\n * Provides runtime information to tool handlers including cancellation signals,\n * request metadata, and custom context data.\n */\nexport interface ToolContext {\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Thread ID if using threads */\n threadId?: string;\n /** Custom context data passed from runtime config */\n data?: Record<string, unknown>;\n\n // ============================================\n // Rich Context (Vercel AI SDK pattern)\n // ============================================\n\n /**\n * Unique ID for this specific tool call.\n * Useful for logging, tracing, and correlating tool executions.\n */\n toolCallId?: string;\n\n /**\n * Request headers (for auth in server tools).\n * Contains headers from the original HTTP request.\n *\n * @example\n * ```typescript\n * handler: async (params, context) => {\n * const token = context?.headers?.authorization;\n * if (!token) return failure('Authentication required');\n * // ...\n * }\n * ```\n */\n headers?: Record<string, string>;\n\n /**\n * Full request metadata for server-side tools.\n * Provides access to HTTP method, URL, and headers.\n *\n * @example\n * ```typescript\n * handler: async (params, context) => {\n * console.log(`Tool called from: ${context?.request?.url}`);\n * // Forward auth to internal service\n * const authHeader = context?.request?.headers?.authorization;\n * }\n * ```\n */\n request?: {\n /** HTTP method (GET, POST, etc.) */\n method?: string;\n /** Request URL path */\n url?: string;\n /** Request headers */\n headers?: Record<string, string>;\n };\n\n /**\n * Data passed from user's approval action.\n * Only present when tool has `needsApproval: true` and user approved with extra data.\n *\n * @example\n * ```typescript\n * // In render function:\n * approval.onApprove({ supervisor: selectedSupervisor });\n *\n * // In handler:\n * handler: async (params, context) => {\n * const supervisor = context?.approvalData?.supervisor;\n * await assignToSupervisor(params.ticketId, supervisor);\n * }\n * ```\n */\n approvalData?: Record<string, unknown>;\n}\n\n// ============================================\n// AI Response Control Types\n// ============================================\n\n/**\n * AI response behavior for tool results.\n *\n * Controls what the AI sees after a tool executes and renders UI.\n *\n * - `'none'`: AI generates minimal response, UI component handles display\n * - `'brief'`: AI gets summary context (via aiContext), gives brief acknowledgment\n * - `'full'`: AI receives full data and responds accordingly (default)\n */\nexport type AIResponseMode = \"none\" | \"brief\" | \"full\";\n\n/**\n * Multimodal content for AI to analyze\n */\nexport type AIContent =\n | { type: \"image\"; data: string; mediaType: string }\n | { type: \"text\"; text: string };\n\n/**\n * Tool response format\n */\nexport interface ToolResponse<T = unknown> {\n /** Whether the tool succeeded */\n success: boolean;\n /** Human-readable message */\n message?: string;\n /** Error message if failed */\n error?: string;\n /** Result data */\n data?: T;\n\n // ============================================\n // AI Response Control (result-level overrides)\n // ============================================\n\n /**\n * Override AI context for this specific result.\n * Takes precedence over tool-level aiContext config.\n * If set, this message is sent to AI instead of full result data.\n *\n * @example\n * ```typescript\n * return {\n * success: true,\n * data: sensitiveData,\n * _aiContext: '[Data retrieved - contains sensitive info, displayed to user]'\n * };\n * ```\n */\n _aiContext?: string;\n\n /**\n * Override AI response mode for this specific result.\n * Takes precedence over tool-level aiResponseMode config.\n */\n _aiResponseMode?: AIResponseMode;\n\n /**\n * Content for AI to analyze (images, documents, etc.).\n * When present, these are included as multimodal content for AI analysis.\n *\n * @example\n * ```typescript\n * // Screenshot for AI to analyze\n * return {\n * success: true,\n * message: 'Screenshot captured',\n * _aiContent: [{ type: 'image', data: base64, mediaType: 'image/png' }]\n * };\n * ```\n */\n _aiContent?: AIContent[];\n\n /**\n * MCP-UI resources for rendering interactive UI components.\n * These are extracted from MCP tool results and rendered as iframes.\n * Not sent to the AI - purely for UI rendering.\n *\n * @example\n * ```typescript\n * // MCP tool returning UI\n * return {\n * success: true,\n * message: 'Product displayed',\n * _uiResources: [{\n * uri: 'ui://shop/product/123',\n * mimeType: 'text/html',\n * content: '<div class=\"product\">...</div>',\n * metadata: { height: '300px' }\n * }]\n * };\n * ```\n */\n _uiResources?: Array<{\n uri: string;\n mimeType:\n | \"text/html\"\n | \"text/uri-list\"\n | \"application/vnd.mcp-ui.remote-dom\";\n content?: string;\n blob?: string;\n metadata?: {\n title?: string;\n width?: string;\n height?: string;\n sandbox?: string[];\n className?: string;\n };\n }>;\n}\n\n/**\n * Approval callbacks passed to render when tool requires user action.\n * Only present when status is \"approval-required\".\n */\nexport interface ToolApprovalCallbacks {\n /**\n * Approve execution and optionally pass extra data to the handler.\n * The extraData is available in handler via `context.approvalData`.\n *\n * @example\n * ```tsx\n * // Simple approval\n * approval.onApprove();\n *\n * // Approval with data (e.g., user selection)\n * approval.onApprove({ supervisor: { name: \"John\", role: \"Manager\" } });\n * ```\n */\n onApprove: (extraData?: Record<string, unknown>) => void;\n\n /**\n * Reject the tool execution with optional reason.\n * This stops the tool from executing and returns an error to AI.\n */\n onReject: (reason?: string) => void;\n\n /** Custom message from tool's approvalMessage config */\n message?: string;\n}\n\n/**\n * Props passed to tool render function.\n *\n * The render function is called for every status change, enabling\n * full lifecycle rendering similar to Vercel AI SDK.\n *\n * @example\n * ```tsx\n * render: ({ status, args, approval, result }) => {\n * if (status === \"approval-required\" && approval) {\n * return <ApprovalCard onConfirm={() => approval.onApprove()} />;\n * }\n * if (status === \"executing\") {\n * return <LoadingSkeleton />;\n * }\n * if (status === \"completed\") {\n * return <ResultCard data={result.data} />;\n * }\n * return null;\n * }\n * ```\n */\nexport interface ToolRenderProps<TParams = Record<string, unknown>> {\n /**\n * Current execution status:\n * - `pending`: Tool call received, waiting to start\n * - `approval-required`: Waiting for user approval (when needsApproval is set)\n * - `executing`: Handler is running\n * - `completed`: Handler finished successfully\n * - `error`: Handler failed\n */\n status: \"pending\" | \"approval-required\" | \"executing\" | \"completed\" | \"error\";\n\n /** Arguments passed to the tool */\n args: TParams;\n\n /** Result if completed */\n result?: ToolResponse;\n\n /** Error if failed */\n error?: string;\n\n /** Tool call ID */\n toolCallId: string;\n\n /** Tool name */\n toolName: string;\n\n /**\n * Approval callbacks - only present when status is \"approval-required\".\n * Use these to create custom approval UIs that can pass extra data to the handler.\n */\n approval?: ToolApprovalCallbacks;\n}\n\n/**\n * Tool definition with JSON Schema\n */\nexport interface ToolDefinition<TParams = Record<string, unknown>> {\n /** Unique tool name */\n name: string;\n /** Tool description for LLM */\n description: string;\n /** Where the tool executes (server or client) */\n location: ToolLocation;\n\n // ============================================\n // Display Configuration\n // ============================================\n\n /**\n * Human-readable title for UI display.\n * Can be a static string or a function that generates title from args.\n *\n * @example\n * ```typescript\n * title: \"Get order details\"\n * // or dynamic:\n * title: (args) => `Order #${args.orderId}`\n * ```\n */\n title?: string | ((args: TParams) => string);\n\n /**\n * Title shown while executing (present tense with \"...\").\n * If not provided, uses `title` with \"...\" appended.\n *\n * @example\n * ```typescript\n * executingTitle: (args) => `Fetching order #${args.orderId}...`\n * ```\n */\n executingTitle?: string | ((args: TParams) => string);\n\n /**\n * Title shown after completion.\n * If not provided, defaults to `title`.\n *\n * @example\n * ```typescript\n * completedTitle: (args) => `Retrieved order #${args.orderId}`\n * ```\n */\n completedTitle?: string | ((args: TParams) => string);\n /** JSON Schema for input parameters */\n inputSchema: ToolInputSchema;\n /** Handler function (optional for client tools registered on server) */\n handler?: (\n params: TParams,\n context?: ToolContext,\n ) => Promise<ToolResponse> | ToolResponse;\n /** Optional render function for UI */\n render?: (props: ToolRenderProps<TParams>) => unknown;\n /** Whether the tool is available (for conditional registration) */\n available?: boolean;\n\n /**\n * Hide this tool's execution from the chat UI.\n * When true, tool calls and results won't be displayed to the user,\n * but the tool will still execute normally.\n * @default false\n */\n hidden?: boolean;\n\n /**\n * Require user approval before execution.\n * Can be:\n * - `true`: Always require approval\n * - `false` or `undefined`: No approval needed (default)\n * - `(params) => boolean`: Conditional approval based on input\n *\n * Similar to Vercel AI SDK v6's needsApproval pattern.\n */\n needsApproval?: boolean | ((params: TParams) => boolean | Promise<boolean>);\n\n /**\n * Custom message shown in the approval UI.\n * Can be a string or a function that generates a message from params.\n * If not provided, a default message with the tool name is shown.\n */\n approvalMessage?: string | ((params: TParams) => string);\n\n // ============================================\n // AI Response Control\n // ============================================\n\n /**\n * How the AI should respond when this tool's result is rendered as UI.\n *\n * - `'none'`: AI generates minimal response (\"[Result displayed to user]\").\n * Use for tools where UI component fully handles the display (stats cards, etc.)\n *\n * - `'brief'`: AI receives summary context (from aiContext) and gives brief acknowledgment.\n * Use for charts/visualizations where AI should acknowledge but not repeat data.\n *\n * - `'full'`: AI receives complete data and responds accordingly (default).\n * Use for tools where AI should analyze and elaborate on results.\n *\n * @default 'full'\n *\n * @example\n * ```typescript\n * // Chart tool - AI acknowledges without repeating data\n * const chartTool: ToolDefinition = {\n * name: 'get_chart',\n * aiResponseMode: 'brief',\n * aiContext: (result) => `[Chart displayed: ${result.data.title}]`,\n * handler: async () => ({ success: true, data: chartData })\n * };\n * ```\n */\n aiResponseMode?: AIResponseMode;\n\n /**\n * Context/summary sent to AI instead of (or along with) full result.\n *\n * Used when:\n * - `aiResponseMode: 'brief'` - This becomes the only thing AI sees\n * - `aiResponseMode: 'full'` - This is prepended to full data for context\n *\n * Can be:\n * - `string`: Static message (e.g., \"[Weather data displayed]\")\n * - `function`: Dynamic based on result (e.g., (result) => `[Chart: ${result.data.title}]`)\n *\n * @example\n * ```typescript\n * // Static context\n * aiContext: '[Analytics chart displayed to user]'\n *\n * // Dynamic context based on result\n * aiContext: (result, args) => {\n * const { title, currentValue } = result.data;\n * return `[Chart displayed: ${title}, showing ${currentValue}]`;\n * }\n * ```\n */\n aiContext?:\n | string\n | ((result: ToolResponse, args: Record<string, unknown>) => string);\n}\n\n// ============================================\n// Unified Tool Call Types (Provider-Agnostic)\n// ============================================\n\n/**\n * Unified tool call format (internal representation)\n */\nexport interface UnifiedToolCall {\n /** Unique tool call ID */\n id: string;\n /** Tool name */\n name: string;\n /** Tool input arguments */\n input: Record<string, unknown>;\n}\n\n/**\n * Unified tool result format\n */\nexport interface UnifiedToolResult {\n /** Tool call ID this result is for */\n toolCallId: string;\n /** Serialized result content (JSON string) */\n content: string;\n /** Whether the tool succeeded */\n success: boolean;\n /** Error message if failed */\n error?: string;\n}\n\n// ============================================\n// Tool Execution Types\n// ============================================\n\n/**\n * Tool execution status\n */\nexport type ToolExecutionStatus =\n | \"pending\"\n | \"executing\"\n | \"completed\"\n | \"error\";\n\n/**\n * Tool approval status (for human-in-the-loop)\n *\n * Similar to Vercel AI SDK v6's tool approval pattern.\n */\nexport type ToolApprovalStatus =\n | \"none\" // No approval needed (default)\n | \"required\" // Waiting for user decision\n | \"approved\" // User approved, execution can proceed\n | \"rejected\"; // User rejected, execution skipped\n\n// ============================================\n// Permission Persistence Types\n// ============================================\n\n/**\n * Permission level for tool execution\n *\n * Controls whether approval is needed and how the choice is remembered:\n * - \"ask\" - Always prompt user (default)\n * - \"allow_always\" - Auto-approve, persisted to storage\n * - \"deny_always\" - Auto-reject, persisted to storage\n * - \"session\" - Auto-approve for current session only\n */\nexport type PermissionLevel =\n | \"ask\"\n | \"allow_always\"\n | \"deny_always\"\n | \"session\";\n\n/**\n * Stored tool permission record\n */\nexport interface ToolPermission {\n /** Tool name (unique identifier) */\n toolName: string;\n /** Permission level */\n level: PermissionLevel;\n /** When permission was set */\n createdAt: number;\n /** Last time this permission was used */\n lastUsedAt?: number;\n}\n\n/**\n * Permission storage configuration\n */\nexport interface PermissionStorageConfig {\n /**\n * Storage type:\n * - \"localStorage\" - Persists across browser sessions\n * - \"sessionStorage\" - Clears when tab closes\n * - \"memory\" - In-memory only (for SSR or testing)\n */\n type: \"localStorage\" | \"sessionStorage\" | \"memory\";\n /** Storage key prefix (default: \"yourgpt-permissions\") */\n keyPrefix?: string;\n}\n\n/**\n * Permission storage adapter interface (for custom implementations)\n */\nexport interface PermissionStorageAdapter {\n /** Get permission for a tool */\n get(toolName: string): Promise<ToolPermission | null>;\n /** Set permission for a tool */\n set(permission: ToolPermission): Promise<void>;\n /** Remove permission for a tool */\n remove(toolName: string): Promise<void>;\n /** Get all permissions */\n getAll(): Promise<ToolPermission[]>;\n /** Clear all permissions */\n clear(): Promise<void>;\n}\n\n/**\n * Tool execution record (for UI tracking)\n */\nexport interface ToolExecution {\n /** Tool call ID */\n id: string;\n /** Tool name */\n name: string;\n /** Tool arguments */\n args: Record<string, unknown>;\n /** Execution status */\n status: ToolExecutionStatus;\n /** Result if completed */\n result?: ToolResponse;\n /** Error message if failed */\n error?: string;\n /** Timestamp when execution started */\n timestamp: number;\n /** Duration in ms (set when completed) */\n duration?: number;\n\n // Approval fields (for needsApproval tools)\n\n /** Approval status for this execution */\n approvalStatus: ToolApprovalStatus;\n /** Message shown in approval UI (from tool's approvalMessage) */\n approvalMessage?: string;\n /** Timestamp when user responded to approval request */\n approvalTimestamp?: number;\n}\n\n// ============================================\n// Agent Loop Types\n// ============================================\n\n/**\n * Agentic loop configuration\n */\nexport interface AgentLoopConfig {\n /** Maximum iterations before stopping (default: 20) */\n maxIterations?: number;\n /** Enable debug logging */\n debug?: boolean;\n /** Whether to enable the agentic loop (default: true) */\n enabled?: boolean;\n}\n\n/**\n * Agent loop state (for tracking)\n */\nexport interface AgentLoopState {\n /** Current iteration number */\n iteration: number;\n /** Maximum iterations allowed */\n maxIterations: number;\n /** Whether the loop is currently running */\n running: boolean;\n /** Whether max iterations was reached */\n maxIterationsReached: boolean;\n /** Whether the loop was aborted */\n aborted: boolean;\n}\n\n// ============================================\n// ToolSet Type (Vercel AI SDK pattern)\n// ============================================\n\n/**\n * A set of tools, keyed by tool name\n *\n * @example\n * ```typescript\n * const myTools: ToolSet = {\n * capture_screenshot: screenshotTool,\n * get_weather: weatherTool,\n * };\n * ```\n */\nexport type ToolSet = Record<string, ToolDefinition>;\n\n// ============================================\n// Tool Helper Function (Vercel AI SDK pattern)\n// ============================================\n\n/**\n * Configuration for creating a tool\n */\nexport interface ToolConfig<TParams = Record<string, unknown>> {\n /** Tool description for LLM */\n description: string;\n /** Where the tool executes (default: 'client') */\n location?: ToolLocation;\n\n // Display Configuration\n /** Human-readable title for UI display */\n title?: string | ((args: TParams) => string);\n /** Title shown while executing */\n executingTitle?: string | ((args: TParams) => string);\n /** Title shown after completion */\n completedTitle?: string | ((args: TParams) => string);\n\n /** JSON Schema for input parameters */\n inputSchema?: ToolInputSchema;\n /** Handler function */\n handler?: (\n params: TParams,\n context?: ToolContext,\n ) => Promise<ToolResponse> | ToolResponse;\n /** Optional render function for UI */\n render?: (props: ToolRenderProps<TParams>) => unknown;\n /** Whether the tool is available */\n available?: boolean;\n /** Hide this tool from chat UI display */\n hidden?: boolean;\n /** Require user approval before execution */\n needsApproval?: boolean | ((params: TParams) => boolean | Promise<boolean>);\n /** Custom message shown in the approval UI */\n approvalMessage?: string | ((params: TParams) => string);\n /** AI response mode for this tool (default: 'full') */\n aiResponseMode?: AIResponseMode;\n /** Context/summary sent to AI instead of full result */\n aiContext?:\n | string\n | ((result: ToolResponse, args: Record<string, unknown>) => string);\n}\n\n/**\n * Create a tool definition (similar to Vercel AI SDK's tool())\n *\n * @example\n * ```typescript\n * const weatherTool = tool({\n * description: 'Get weather for a location',\n * inputSchema: {\n * type: 'object',\n * properties: {\n * location: { type: 'string', description: 'City name' },\n * },\n * required: ['location'],\n * },\n * handler: async ({ location }) => {\n * const weather = await fetchWeather(location);\n * return success(weather);\n * },\n * });\n * ```\n */\nexport function tool<TParams = Record<string, unknown>>(\n config: ToolConfig<TParams>,\n): Omit<ToolDefinition<TParams>, \"name\"> {\n return {\n description: config.description,\n location: config.location ?? \"client\",\n // Display configuration\n title: config.title,\n executingTitle: config.executingTitle,\n completedTitle: config.completedTitle,\n // Schema and handlers\n inputSchema: config.inputSchema ?? {\n type: \"object\",\n properties: {},\n required: [],\n },\n handler: config.handler,\n render: config.render,\n available: config.available,\n hidden: config.hidden,\n needsApproval: config.needsApproval,\n approvalMessage: config.approvalMessage,\n aiResponseMode: config.aiResponseMode,\n aiContext: config.aiContext,\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Convert ToolDefinition to OpenAI tool format\n */\nexport function toolToOpenAIFormat(tool: ToolDefinition): object {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n };\n}\n\n/**\n * Convert ToolDefinition to Anthropic tool format\n */\nexport function toolToAnthropicFormat(tool: ToolDefinition): object {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n };\n}\n\n/**\n * Create a tool result response\n */\nexport function createToolResult(\n toolCallId: string,\n response: ToolResponse,\n): UnifiedToolResult {\n return {\n toolCallId,\n content: JSON.stringify(response),\n success: response.success,\n error: response.error,\n };\n}\n\n/**\n * Create a successful tool response\n */\nexport function success<T = unknown>(\n data?: T,\n message?: string,\n): ToolResponse<T> {\n return {\n success: true,\n data,\n message,\n };\n}\n\n/**\n * Create a failed tool response\n */\nexport function failure(error: string): ToolResponse {\n return {\n success: false,\n error,\n };\n}\n"]}
@@ -0,0 +1,76 @@
1
+ 'use strict';
2
+
3
+ // src/core/tools/webSearch/providers/tavily.ts
4
+ var TAVILY_API_URL = "https://api.tavily.com/search";
5
+ function validateTavilyConfig(config) {
6
+ if (!config.apiKey) {
7
+ throw new Error(
8
+ "Tavily API key is required. Get one at https://tavily.com/"
9
+ );
10
+ }
11
+ }
12
+ async function searchTavily(params, config) {
13
+ validateTavilyConfig(config);
14
+ const startTime = Date.now();
15
+ const requestBody = {
16
+ api_key: config.apiKey,
17
+ query: params.query,
18
+ search_depth: params.searchDepth || config.searchDepth || "basic",
19
+ max_results: params.maxResults ?? config.maxResults ?? 5,
20
+ include_answer: config.includeAnswer ?? true,
21
+ include_images: config.includeImages ?? false,
22
+ include_raw_content: config.includeRawContent ?? false,
23
+ include_domains: config.includeDomains,
24
+ exclude_domains: config.excludeDomains
25
+ };
26
+ const response = await fetch(TAVILY_API_URL, {
27
+ method: "POST",
28
+ headers: {
29
+ "Content-Type": "application/json"
30
+ },
31
+ body: JSON.stringify(requestBody),
32
+ signal: config.timeout ? AbortSignal.timeout(config.timeout) : void 0
33
+ });
34
+ if (!response.ok) {
35
+ const errorText = await response.text().catch(() => "Unknown error");
36
+ throw new Error(`Tavily API error (${response.status}): ${errorText}`);
37
+ }
38
+ const data = await response.json();
39
+ const searchTime = Date.now() - startTime;
40
+ return {
41
+ query: params.query,
42
+ answer: data.answer,
43
+ results: data.results.map((result) => ({
44
+ title: result.title,
45
+ url: result.url,
46
+ content: result.content,
47
+ score: result.score,
48
+ publishedDate: result.published_date,
49
+ domain: extractDomain(result.url)
50
+ })),
51
+ images: data.images?.map((img) => ({
52
+ url: img.url,
53
+ description: img.description
54
+ })),
55
+ provider: "tavily",
56
+ totalResults: data.results.length,
57
+ searchTime
58
+ };
59
+ }
60
+ function extractDomain(url) {
61
+ try {
62
+ return new URL(url).hostname;
63
+ } catch {
64
+ return url;
65
+ }
66
+ }
67
+ var tavilyProvider = {
68
+ search: searchTavily,
69
+ validateConfig: validateTavilyConfig
70
+ };
71
+
72
+ exports.searchTavily = searchTavily;
73
+ exports.tavilyProvider = tavilyProvider;
74
+ exports.validateTavilyConfig = validateTavilyConfig;
75
+ //# sourceMappingURL=chunk-CBAHCI4R.cjs.map
76
+ //# sourceMappingURL=chunk-CBAHCI4R.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/tools/webSearch/providers/tavily.ts"],"names":[],"mappings":"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","file":"chunk-CBAHCI4R.cjs","sourcesContent":["/**\n * Tavily Search Provider\n *\n * Tavily is an AI-native search engine optimized for LLMs.\n * It provides high-quality results with optional AI-generated answers.\n *\n * @see https://tavily.com/\n */\n\nimport type {\n WebSearchConfig,\n WebSearchParams,\n WebSearchResponse,\n TavilyApiResponse,\n WebSearchProviderInterface,\n} from \"../types\";\n\nconst TAVILY_API_URL = \"https://api.tavily.com/search\";\n\n/**\n * Validate Tavily configuration\n */\nexport function validateTavilyConfig(config: WebSearchConfig): void {\n if (!config.apiKey) {\n throw new Error(\n \"Tavily API key is required. Get one at https://tavily.com/\",\n );\n }\n}\n\n/**\n * Search using Tavily API\n */\nexport async function searchTavily(\n params: WebSearchParams,\n config: WebSearchConfig,\n): Promise<WebSearchResponse> {\n validateTavilyConfig(config);\n\n const startTime = Date.now();\n\n const requestBody = {\n api_key: config.apiKey,\n query: params.query,\n search_depth: params.searchDepth || config.searchDepth || \"basic\",\n max_results: params.maxResults ?? config.maxResults ?? 5,\n include_answer: config.includeAnswer ?? true,\n include_images: config.includeImages ?? false,\n include_raw_content: config.includeRawContent ?? false,\n include_domains: config.includeDomains,\n exclude_domains: config.excludeDomains,\n };\n\n const response = await fetch(TAVILY_API_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(requestBody),\n signal: config.timeout ? AbortSignal.timeout(config.timeout) : undefined,\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\");\n throw new Error(`Tavily API error (${response.status}): ${errorText}`);\n }\n\n const data: TavilyApiResponse = await response.json();\n const searchTime = Date.now() - startTime;\n\n return {\n query: params.query,\n answer: data.answer,\n results: data.results.map((result) => ({\n title: result.title,\n url: result.url,\n content: result.content,\n score: result.score,\n publishedDate: result.published_date,\n domain: extractDomain(result.url),\n })),\n images: data.images?.map((img) => ({\n url: img.url,\n description: img.description,\n })),\n provider: \"tavily\",\n totalResults: data.results.length,\n searchTime,\n };\n}\n\n/**\n * Extract domain from URL\n */\nfunction extractDomain(url: string): string {\n try {\n return new URL(url).hostname;\n } catch {\n return url;\n }\n}\n\n/**\n * Tavily provider implementation\n */\nexport const tavilyProvider: WebSearchProviderInterface = {\n search: searchTavily,\n validateConfig: validateTavilyConfig,\n};\n"]}
@@ -0,0 +1,74 @@
1
+ 'use strict';
2
+
3
+ // src/core/types/tools.ts
4
+ function tool(config) {
5
+ return {
6
+ description: config.description,
7
+ location: config.location ?? "client",
8
+ // Display configuration
9
+ title: config.title,
10
+ executingTitle: config.executingTitle,
11
+ completedTitle: config.completedTitle,
12
+ // Schema and handlers
13
+ inputSchema: config.inputSchema ?? {
14
+ type: "object",
15
+ properties: {},
16
+ required: []
17
+ },
18
+ handler: config.handler,
19
+ render: config.render,
20
+ available: config.available,
21
+ hidden: config.hidden,
22
+ needsApproval: config.needsApproval,
23
+ approvalMessage: config.approvalMessage,
24
+ aiResponseMode: config.aiResponseMode,
25
+ aiContext: config.aiContext
26
+ };
27
+ }
28
+ function toolToOpenAIFormat(tool2) {
29
+ return {
30
+ type: "function",
31
+ function: {
32
+ name: tool2.name,
33
+ description: tool2.description,
34
+ parameters: tool2.inputSchema
35
+ }
36
+ };
37
+ }
38
+ function toolToAnthropicFormat(tool2) {
39
+ return {
40
+ name: tool2.name,
41
+ description: tool2.description,
42
+ input_schema: tool2.inputSchema
43
+ };
44
+ }
45
+ function createToolResult(toolCallId, response) {
46
+ return {
47
+ toolCallId,
48
+ content: JSON.stringify(response),
49
+ success: response.success,
50
+ error: response.error
51
+ };
52
+ }
53
+ function success(data, message) {
54
+ return {
55
+ success: true,
56
+ data,
57
+ message
58
+ };
59
+ }
60
+ function failure(error) {
61
+ return {
62
+ success: false,
63
+ error
64
+ };
65
+ }
66
+
67
+ exports.createToolResult = createToolResult;
68
+ exports.failure = failure;
69
+ exports.success = success;
70
+ exports.tool = tool;
71
+ exports.toolToAnthropicFormat = toolToAnthropicFormat;
72
+ exports.toolToOpenAIFormat = toolToOpenAIFormat;
73
+ //# sourceMappingURL=chunk-CEKAYA2Q.cjs.map
74
+ //# sourceMappingURL=chunk-CEKAYA2Q.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/types/tools.ts"],"names":["tool"],"mappings":";;;AAqvBO,SAAS,KACd,MAAA,EACuC;AACvC,EAAA,OAAO;AAAA,IACL,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,QAAA,EAAU,OAAO,QAAA,IAAY,QAAA;AAAA;AAAA,IAE7B,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,gBAAgB,MAAA,CAAO,cAAA;AAAA;AAAA,IAEvB,WAAA,EAAa,OAAO,WAAA,IAAe;AAAA,MACjC,IAAA,EAAM,QAAA;AAAA,MACN,YAAY,EAAC;AAAA,MACb,UAAU;AAAC,KACb;AAAA,IACA,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,iBAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,WAAW,MAAA,CAAO;AAAA,GACpB;AACF;AASO,SAAS,mBAAmBA,KAAAA,EAA8B;AAC/D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR,MAAMA,KAAAA,CAAK,IAAA;AAAA,MACX,aAAaA,KAAAA,CAAK,WAAA;AAAA,MAClB,YAAYA,KAAAA,CAAK;AAAA;AACnB,GACF;AACF;AAKO,SAAS,sBAAsBA,KAAAA,EAA8B;AAClE,EAAA,OAAO;AAAA,IACL,MAAMA,KAAAA,CAAK,IAAA;AAAA,IACX,aAAaA,KAAAA,CAAK,WAAA;AAAA,IAClB,cAAcA,KAAAA,CAAK;AAAA,GACrB;AACF;AAKO,SAAS,gBAAA,CACd,YACA,QAAA,EACmB;AACnB,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,IAChC,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,OAAO,QAAA,CAAS;AAAA,GAClB;AACF;AAKO,SAAS,OAAA,CACd,MACA,OAAA,EACiB;AACjB,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,IAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,QAAQ,KAAA,EAA6B;AACnD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT;AAAA,GACF;AACF","file":"chunk-CEKAYA2Q.cjs","sourcesContent":["/**\n * Tool-related types for the agentic loop\n */\n\nimport type { ActionRenderProps } from \"./actions\";\n\n// ============================================\n// Provider Types\n// ============================================\n\n/**\n * Supported AI providers for tool calling\n */\nexport type AIProvider =\n | \"anthropic\"\n | \"openai\"\n | \"xai\"\n | \"grok\"\n | \"gemini\"\n | \"groq\"\n | \"ollama\";\n\n/**\n * Where the tool executes\n */\nexport type ToolLocation = \"server\" | \"client\";\n\n// ============================================\n// Tool Definition Types\n// ============================================\n\n/**\n * JSON Schema property definition\n */\nexport interface JSONSchemaProperty {\n type:\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"object\"\n | \"array\"\n | \"integer\"\n | \"null\";\n description?: string;\n enum?: (string | number | boolean)[];\n items?: JSONSchemaProperty;\n properties?: Record<string, JSONSchemaProperty>;\n required?: string[];\n default?: unknown;\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n pattern?: string;\n}\n\n/**\n * JSON Schema for tool input\n */\nexport interface ToolInputSchema {\n type: \"object\";\n properties: Record<string, JSONSchemaProperty>;\n required?: string[];\n additionalProperties?: boolean;\n}\n\n/**\n * Tool execution context\n *\n * Provides runtime information to tool handlers including cancellation signals,\n * request metadata, and custom context data.\n */\nexport interface ToolContext {\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Thread ID if using threads */\n threadId?: string;\n /** Custom context data passed from runtime config */\n data?: Record<string, unknown>;\n\n // ============================================\n // Rich Context (Vercel AI SDK pattern)\n // ============================================\n\n /**\n * Unique ID for this specific tool call.\n * Useful for logging, tracing, and correlating tool executions.\n */\n toolCallId?: string;\n\n /**\n * Request headers (for auth in server tools).\n * Contains headers from the original HTTP request.\n *\n * @example\n * ```typescript\n * handler: async (params, context) => {\n * const token = context?.headers?.authorization;\n * if (!token) return failure('Authentication required');\n * // ...\n * }\n * ```\n */\n headers?: Record<string, string>;\n\n /**\n * Full request metadata for server-side tools.\n * Provides access to HTTP method, URL, and headers.\n *\n * @example\n * ```typescript\n * handler: async (params, context) => {\n * console.log(`Tool called from: ${context?.request?.url}`);\n * // Forward auth to internal service\n * const authHeader = context?.request?.headers?.authorization;\n * }\n * ```\n */\n request?: {\n /** HTTP method (GET, POST, etc.) */\n method?: string;\n /** Request URL path */\n url?: string;\n /** Request headers */\n headers?: Record<string, string>;\n };\n\n /**\n * Data passed from user's approval action.\n * Only present when tool has `needsApproval: true` and user approved with extra data.\n *\n * @example\n * ```typescript\n * // In render function:\n * approval.onApprove({ supervisor: selectedSupervisor });\n *\n * // In handler:\n * handler: async (params, context) => {\n * const supervisor = context?.approvalData?.supervisor;\n * await assignToSupervisor(params.ticketId, supervisor);\n * }\n * ```\n */\n approvalData?: Record<string, unknown>;\n}\n\n// ============================================\n// AI Response Control Types\n// ============================================\n\n/**\n * AI response behavior for tool results.\n *\n * Controls what the AI sees after a tool executes and renders UI.\n *\n * - `'none'`: AI generates minimal response, UI component handles display\n * - `'brief'`: AI gets summary context (via aiContext), gives brief acknowledgment\n * - `'full'`: AI receives full data and responds accordingly (default)\n */\nexport type AIResponseMode = \"none\" | \"brief\" | \"full\";\n\n/**\n * Multimodal content for AI to analyze\n */\nexport type AIContent =\n | { type: \"image\"; data: string; mediaType: string }\n | { type: \"text\"; text: string };\n\n/**\n * Tool response format\n */\nexport interface ToolResponse<T = unknown> {\n /** Whether the tool succeeded */\n success: boolean;\n /** Human-readable message */\n message?: string;\n /** Error message if failed */\n error?: string;\n /** Result data */\n data?: T;\n\n // ============================================\n // AI Response Control (result-level overrides)\n // ============================================\n\n /**\n * Override AI context for this specific result.\n * Takes precedence over tool-level aiContext config.\n * If set, this message is sent to AI instead of full result data.\n *\n * @example\n * ```typescript\n * return {\n * success: true,\n * data: sensitiveData,\n * _aiContext: '[Data retrieved - contains sensitive info, displayed to user]'\n * };\n * ```\n */\n _aiContext?: string;\n\n /**\n * Override AI response mode for this specific result.\n * Takes precedence over tool-level aiResponseMode config.\n */\n _aiResponseMode?: AIResponseMode;\n\n /**\n * Content for AI to analyze (images, documents, etc.).\n * When present, these are included as multimodal content for AI analysis.\n *\n * @example\n * ```typescript\n * // Screenshot for AI to analyze\n * return {\n * success: true,\n * message: 'Screenshot captured',\n * _aiContent: [{ type: 'image', data: base64, mediaType: 'image/png' }]\n * };\n * ```\n */\n _aiContent?: AIContent[];\n\n /**\n * MCP-UI resources for rendering interactive UI components.\n * These are extracted from MCP tool results and rendered as iframes.\n * Not sent to the AI - purely for UI rendering.\n *\n * @example\n * ```typescript\n * // MCP tool returning UI\n * return {\n * success: true,\n * message: 'Product displayed',\n * _uiResources: [{\n * uri: 'ui://shop/product/123',\n * mimeType: 'text/html',\n * content: '<div class=\"product\">...</div>',\n * metadata: { height: '300px' }\n * }]\n * };\n * ```\n */\n _uiResources?: Array<{\n uri: string;\n mimeType:\n | \"text/html\"\n | \"text/uri-list\"\n | \"application/vnd.mcp-ui.remote-dom\";\n content?: string;\n blob?: string;\n metadata?: {\n title?: string;\n width?: string;\n height?: string;\n sandbox?: string[];\n className?: string;\n };\n }>;\n}\n\n/**\n * Approval callbacks passed to render when tool requires user action.\n * Only present when status is \"approval-required\".\n */\nexport interface ToolApprovalCallbacks {\n /**\n * Approve execution and optionally pass extra data to the handler.\n * The extraData is available in handler via `context.approvalData`.\n *\n * @example\n * ```tsx\n * // Simple approval\n * approval.onApprove();\n *\n * // Approval with data (e.g., user selection)\n * approval.onApprove({ supervisor: { name: \"John\", role: \"Manager\" } });\n * ```\n */\n onApprove: (extraData?: Record<string, unknown>) => void;\n\n /**\n * Reject the tool execution with optional reason.\n * This stops the tool from executing and returns an error to AI.\n */\n onReject: (reason?: string) => void;\n\n /** Custom message from tool's approvalMessage config */\n message?: string;\n}\n\n/**\n * Props passed to tool render function.\n *\n * The render function is called for every status change, enabling\n * full lifecycle rendering similar to Vercel AI SDK.\n *\n * @example\n * ```tsx\n * render: ({ status, args, approval, result }) => {\n * if (status === \"approval-required\" && approval) {\n * return <ApprovalCard onConfirm={() => approval.onApprove()} />;\n * }\n * if (status === \"executing\") {\n * return <LoadingSkeleton />;\n * }\n * if (status === \"completed\") {\n * return <ResultCard data={result.data} />;\n * }\n * return null;\n * }\n * ```\n */\nexport interface ToolRenderProps<TParams = Record<string, unknown>> {\n /**\n * Current execution status:\n * - `pending`: Tool call received, waiting to start\n * - `approval-required`: Waiting for user approval (when needsApproval is set)\n * - `executing`: Handler is running\n * - `completed`: Handler finished successfully\n * - `error`: Handler failed\n */\n status: \"pending\" | \"approval-required\" | \"executing\" | \"completed\" | \"error\";\n\n /** Arguments passed to the tool */\n args: TParams;\n\n /** Result if completed */\n result?: ToolResponse;\n\n /** Error if failed */\n error?: string;\n\n /** Tool call ID */\n toolCallId: string;\n\n /** Tool name */\n toolName: string;\n\n /**\n * Approval callbacks - only present when status is \"approval-required\".\n * Use these to create custom approval UIs that can pass extra data to the handler.\n */\n approval?: ToolApprovalCallbacks;\n}\n\n/**\n * Tool definition with JSON Schema\n */\nexport interface ToolDefinition<TParams = Record<string, unknown>> {\n /** Unique tool name */\n name: string;\n /** Tool description for LLM */\n description: string;\n /** Where the tool executes (server or client) */\n location: ToolLocation;\n\n // ============================================\n // Display Configuration\n // ============================================\n\n /**\n * Human-readable title for UI display.\n * Can be a static string or a function that generates title from args.\n *\n * @example\n * ```typescript\n * title: \"Get order details\"\n * // or dynamic:\n * title: (args) => `Order #${args.orderId}`\n * ```\n */\n title?: string | ((args: TParams) => string);\n\n /**\n * Title shown while executing (present tense with \"...\").\n * If not provided, uses `title` with \"...\" appended.\n *\n * @example\n * ```typescript\n * executingTitle: (args) => `Fetching order #${args.orderId}...`\n * ```\n */\n executingTitle?: string | ((args: TParams) => string);\n\n /**\n * Title shown after completion.\n * If not provided, defaults to `title`.\n *\n * @example\n * ```typescript\n * completedTitle: (args) => `Retrieved order #${args.orderId}`\n * ```\n */\n completedTitle?: string | ((args: TParams) => string);\n /** JSON Schema for input parameters */\n inputSchema: ToolInputSchema;\n /** Handler function (optional for client tools registered on server) */\n handler?: (\n params: TParams,\n context?: ToolContext,\n ) => Promise<ToolResponse> | ToolResponse;\n /** Optional render function for UI */\n render?: (props: ToolRenderProps<TParams>) => unknown;\n /** Whether the tool is available (for conditional registration) */\n available?: boolean;\n\n /**\n * Hide this tool's execution from the chat UI.\n * When true, tool calls and results won't be displayed to the user,\n * but the tool will still execute normally.\n * @default false\n */\n hidden?: boolean;\n\n /**\n * Require user approval before execution.\n * Can be:\n * - `true`: Always require approval\n * - `false` or `undefined`: No approval needed (default)\n * - `(params) => boolean`: Conditional approval based on input\n *\n * Similar to Vercel AI SDK v6's needsApproval pattern.\n */\n needsApproval?: boolean | ((params: TParams) => boolean | Promise<boolean>);\n\n /**\n * Custom message shown in the approval UI.\n * Can be a string or a function that generates a message from params.\n * If not provided, a default message with the tool name is shown.\n */\n approvalMessage?: string | ((params: TParams) => string);\n\n // ============================================\n // AI Response Control\n // ============================================\n\n /**\n * How the AI should respond when this tool's result is rendered as UI.\n *\n * - `'none'`: AI generates minimal response (\"[Result displayed to user]\").\n * Use for tools where UI component fully handles the display (stats cards, etc.)\n *\n * - `'brief'`: AI receives summary context (from aiContext) and gives brief acknowledgment.\n * Use for charts/visualizations where AI should acknowledge but not repeat data.\n *\n * - `'full'`: AI receives complete data and responds accordingly (default).\n * Use for tools where AI should analyze and elaborate on results.\n *\n * @default 'full'\n *\n * @example\n * ```typescript\n * // Chart tool - AI acknowledges without repeating data\n * const chartTool: ToolDefinition = {\n * name: 'get_chart',\n * aiResponseMode: 'brief',\n * aiContext: (result) => `[Chart displayed: ${result.data.title}]`,\n * handler: async () => ({ success: true, data: chartData })\n * };\n * ```\n */\n aiResponseMode?: AIResponseMode;\n\n /**\n * Context/summary sent to AI instead of (or along with) full result.\n *\n * Used when:\n * - `aiResponseMode: 'brief'` - This becomes the only thing AI sees\n * - `aiResponseMode: 'full'` - This is prepended to full data for context\n *\n * Can be:\n * - `string`: Static message (e.g., \"[Weather data displayed]\")\n * - `function`: Dynamic based on result (e.g., (result) => `[Chart: ${result.data.title}]`)\n *\n * @example\n * ```typescript\n * // Static context\n * aiContext: '[Analytics chart displayed to user]'\n *\n * // Dynamic context based on result\n * aiContext: (result, args) => {\n * const { title, currentValue } = result.data;\n * return `[Chart displayed: ${title}, showing ${currentValue}]`;\n * }\n * ```\n */\n aiContext?:\n | string\n | ((result: ToolResponse, args: Record<string, unknown>) => string);\n}\n\n// ============================================\n// Unified Tool Call Types (Provider-Agnostic)\n// ============================================\n\n/**\n * Unified tool call format (internal representation)\n */\nexport interface UnifiedToolCall {\n /** Unique tool call ID */\n id: string;\n /** Tool name */\n name: string;\n /** Tool input arguments */\n input: Record<string, unknown>;\n}\n\n/**\n * Unified tool result format\n */\nexport interface UnifiedToolResult {\n /** Tool call ID this result is for */\n toolCallId: string;\n /** Serialized result content (JSON string) */\n content: string;\n /** Whether the tool succeeded */\n success: boolean;\n /** Error message if failed */\n error?: string;\n}\n\n// ============================================\n// Tool Execution Types\n// ============================================\n\n/**\n * Tool execution status\n */\nexport type ToolExecutionStatus =\n | \"pending\"\n | \"executing\"\n | \"completed\"\n | \"error\";\n\n/**\n * Tool approval status (for human-in-the-loop)\n *\n * Similar to Vercel AI SDK v6's tool approval pattern.\n */\nexport type ToolApprovalStatus =\n | \"none\" // No approval needed (default)\n | \"required\" // Waiting for user decision\n | \"approved\" // User approved, execution can proceed\n | \"rejected\"; // User rejected, execution skipped\n\n// ============================================\n// Permission Persistence Types\n// ============================================\n\n/**\n * Permission level for tool execution\n *\n * Controls whether approval is needed and how the choice is remembered:\n * - \"ask\" - Always prompt user (default)\n * - \"allow_always\" - Auto-approve, persisted to storage\n * - \"deny_always\" - Auto-reject, persisted to storage\n * - \"session\" - Auto-approve for current session only\n */\nexport type PermissionLevel =\n | \"ask\"\n | \"allow_always\"\n | \"deny_always\"\n | \"session\";\n\n/**\n * Stored tool permission record\n */\nexport interface ToolPermission {\n /** Tool name (unique identifier) */\n toolName: string;\n /** Permission level */\n level: PermissionLevel;\n /** When permission was set */\n createdAt: number;\n /** Last time this permission was used */\n lastUsedAt?: number;\n}\n\n/**\n * Permission storage configuration\n */\nexport interface PermissionStorageConfig {\n /**\n * Storage type:\n * - \"localStorage\" - Persists across browser sessions\n * - \"sessionStorage\" - Clears when tab closes\n * - \"memory\" - In-memory only (for SSR or testing)\n */\n type: \"localStorage\" | \"sessionStorage\" | \"memory\";\n /** Storage key prefix (default: \"yourgpt-permissions\") */\n keyPrefix?: string;\n}\n\n/**\n * Permission storage adapter interface (for custom implementations)\n */\nexport interface PermissionStorageAdapter {\n /** Get permission for a tool */\n get(toolName: string): Promise<ToolPermission | null>;\n /** Set permission for a tool */\n set(permission: ToolPermission): Promise<void>;\n /** Remove permission for a tool */\n remove(toolName: string): Promise<void>;\n /** Get all permissions */\n getAll(): Promise<ToolPermission[]>;\n /** Clear all permissions */\n clear(): Promise<void>;\n}\n\n/**\n * Tool execution record (for UI tracking)\n */\nexport interface ToolExecution {\n /** Tool call ID */\n id: string;\n /** Tool name */\n name: string;\n /** Tool arguments */\n args: Record<string, unknown>;\n /** Execution status */\n status: ToolExecutionStatus;\n /** Result if completed */\n result?: ToolResponse;\n /** Error message if failed */\n error?: string;\n /** Timestamp when execution started */\n timestamp: number;\n /** Duration in ms (set when completed) */\n duration?: number;\n\n // Approval fields (for needsApproval tools)\n\n /** Approval status for this execution */\n approvalStatus: ToolApprovalStatus;\n /** Message shown in approval UI (from tool's approvalMessage) */\n approvalMessage?: string;\n /** Timestamp when user responded to approval request */\n approvalTimestamp?: number;\n}\n\n// ============================================\n// Agent Loop Types\n// ============================================\n\n/**\n * Agentic loop configuration\n */\nexport interface AgentLoopConfig {\n /** Maximum iterations before stopping (default: 20) */\n maxIterations?: number;\n /** Enable debug logging */\n debug?: boolean;\n /** Whether to enable the agentic loop (default: true) */\n enabled?: boolean;\n}\n\n/**\n * Agent loop state (for tracking)\n */\nexport interface AgentLoopState {\n /** Current iteration number */\n iteration: number;\n /** Maximum iterations allowed */\n maxIterations: number;\n /** Whether the loop is currently running */\n running: boolean;\n /** Whether max iterations was reached */\n maxIterationsReached: boolean;\n /** Whether the loop was aborted */\n aborted: boolean;\n}\n\n// ============================================\n// ToolSet Type (Vercel AI SDK pattern)\n// ============================================\n\n/**\n * A set of tools, keyed by tool name\n *\n * @example\n * ```typescript\n * const myTools: ToolSet = {\n * capture_screenshot: screenshotTool,\n * get_weather: weatherTool,\n * };\n * ```\n */\nexport type ToolSet = Record<string, ToolDefinition>;\n\n// ============================================\n// Tool Helper Function (Vercel AI SDK pattern)\n// ============================================\n\n/**\n * Configuration for creating a tool\n */\nexport interface ToolConfig<TParams = Record<string, unknown>> {\n /** Tool description for LLM */\n description: string;\n /** Where the tool executes (default: 'client') */\n location?: ToolLocation;\n\n // Display Configuration\n /** Human-readable title for UI display */\n title?: string | ((args: TParams) => string);\n /** Title shown while executing */\n executingTitle?: string | ((args: TParams) => string);\n /** Title shown after completion */\n completedTitle?: string | ((args: TParams) => string);\n\n /** JSON Schema for input parameters */\n inputSchema?: ToolInputSchema;\n /** Handler function */\n handler?: (\n params: TParams,\n context?: ToolContext,\n ) => Promise<ToolResponse> | ToolResponse;\n /** Optional render function for UI */\n render?: (props: ToolRenderProps<TParams>) => unknown;\n /** Whether the tool is available */\n available?: boolean;\n /** Hide this tool from chat UI display */\n hidden?: boolean;\n /** Require user approval before execution */\n needsApproval?: boolean | ((params: TParams) => boolean | Promise<boolean>);\n /** Custom message shown in the approval UI */\n approvalMessage?: string | ((params: TParams) => string);\n /** AI response mode for this tool (default: 'full') */\n aiResponseMode?: AIResponseMode;\n /** Context/summary sent to AI instead of full result */\n aiContext?:\n | string\n | ((result: ToolResponse, args: Record<string, unknown>) => string);\n}\n\n/**\n * Create a tool definition (similar to Vercel AI SDK's tool())\n *\n * @example\n * ```typescript\n * const weatherTool = tool({\n * description: 'Get weather for a location',\n * inputSchema: {\n * type: 'object',\n * properties: {\n * location: { type: 'string', description: 'City name' },\n * },\n * required: ['location'],\n * },\n * handler: async ({ location }) => {\n * const weather = await fetchWeather(location);\n * return success(weather);\n * },\n * });\n * ```\n */\nexport function tool<TParams = Record<string, unknown>>(\n config: ToolConfig<TParams>,\n): Omit<ToolDefinition<TParams>, \"name\"> {\n return {\n description: config.description,\n location: config.location ?? \"client\",\n // Display configuration\n title: config.title,\n executingTitle: config.executingTitle,\n completedTitle: config.completedTitle,\n // Schema and handlers\n inputSchema: config.inputSchema ?? {\n type: \"object\",\n properties: {},\n required: [],\n },\n handler: config.handler,\n render: config.render,\n available: config.available,\n hidden: config.hidden,\n needsApproval: config.needsApproval,\n approvalMessage: config.approvalMessage,\n aiResponseMode: config.aiResponseMode,\n aiContext: config.aiContext,\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Convert ToolDefinition to OpenAI tool format\n */\nexport function toolToOpenAIFormat(tool: ToolDefinition): object {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n };\n}\n\n/**\n * Convert ToolDefinition to Anthropic tool format\n */\nexport function toolToAnthropicFormat(tool: ToolDefinition): object {\n return {\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n };\n}\n\n/**\n * Create a tool result response\n */\nexport function createToolResult(\n toolCallId: string,\n response: ToolResponse,\n): UnifiedToolResult {\n return {\n toolCallId,\n content: JSON.stringify(response),\n success: response.success,\n error: response.error,\n };\n}\n\n/**\n * Create a successful tool response\n */\nexport function success<T = unknown>(\n data?: T,\n message?: string,\n): ToolResponse<T> {\n return {\n success: true,\n data,\n message,\n };\n}\n\n/**\n * Create a failed tool response\n */\nexport function failure(error: string): ToolResponse {\n return {\n success: false,\n error,\n };\n}\n"]}