@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,12 @@
1
+ 'use strict';
2
+
3
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
4
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
5
+ }) : x)(function(x) {
6
+ if (typeof require !== "undefined") return require.apply(this, arguments);
7
+ throw Error('Dynamic require of "' + x + '" is not supported');
8
+ });
9
+
10
+ exports.__require = __require;
11
+ //# sourceMappingURL=chunk-JEQ2X3Z6.cjs.map
12
+ //# sourceMappingURL=chunk-JEQ2X3Z6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-JEQ2X3Z6.cjs"}
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+
3
+ // src/mcp/ui/types.ts
4
+ function isMCPUIResourceContent(content) {
5
+ return typeof content === "object" && content !== null && "type" in content && content.type === "ui" && "resource" in content;
6
+ }
7
+ function isMCPUIIntent(data) {
8
+ if (typeof data !== "object" || data === null) return false;
9
+ const intent = data;
10
+ return intent.type === "tool" || intent.type === "intent" || intent.type === "prompt" || intent.type === "notify" || intent.type === "link";
11
+ }
12
+ function isMCPUIMessage(data) {
13
+ if (typeof data !== "object" || data === null) return false;
14
+ const message = data;
15
+ if (message.source === "mcp-ui" && message.intent) {
16
+ return isMCPUIIntent(message.intent);
17
+ }
18
+ return isMCPUIIntent(data);
19
+ }
20
+ function parseMCPUIMessage(data) {
21
+ if (typeof data === "object" && data !== null && "source" in data && data.source === "mcp-ui") {
22
+ const message = data;
23
+ return isMCPUIIntent(message.intent) ? message.intent : null;
24
+ }
25
+ if (isMCPUIIntent(data)) {
26
+ return data;
27
+ }
28
+ return null;
29
+ }
30
+ var DEFAULT_MCP_UI_SANDBOX = "allow-scripts allow-forms";
31
+ var RESTRICTED_MCP_UI_SANDBOX = "allow-scripts";
32
+
33
+ exports.DEFAULT_MCP_UI_SANDBOX = DEFAULT_MCP_UI_SANDBOX;
34
+ exports.RESTRICTED_MCP_UI_SANDBOX = RESTRICTED_MCP_UI_SANDBOX;
35
+ exports.isMCPUIIntent = isMCPUIIntent;
36
+ exports.isMCPUIMessage = isMCPUIMessage;
37
+ exports.isMCPUIResourceContent = isMCPUIResourceContent;
38
+ exports.parseMCPUIMessage = parseMCPUIMessage;
39
+ //# sourceMappingURL=chunk-JO4BHPAD.cjs.map
40
+ //# sourceMappingURL=chunk-JO4BHPAD.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/ui/types.ts"],"names":[],"mappings":";;;AA6YO,SAAS,uBACd,OAAA,EACiC;AACjC,EAAA,OACE,OAAO,OAAA,KAAY,QAAA,IACnB,OAAA,KAAY,IAAA,IACZ,UAAU,OAAA,IACT,OAAA,CAAiC,IAAA,KAAS,IAAA,IAC3C,UAAA,IAAc,OAAA;AAElB;AAKO,SAAS,cAAc,IAAA,EAAoC;AAChE,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,MAAM,OAAO,KAAA;AAEtD,EAAA,MAAM,MAAA,GAAS,IAAA;AACf,EAAA,OACE,MAAA,CAAO,IAAA,KAAS,MAAA,IAChB,MAAA,CAAO,IAAA,KAAS,QAAA,IAChB,MAAA,CAAO,IAAA,KAAS,QAAA,IAChB,MAAA,CAAO,IAAA,KAAS,QAAA,IAChB,OAAO,IAAA,KAAS,MAAA;AAEpB;AAKO,SAAS,eAAe,IAAA,EAAqC;AAClE,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,MAAM,OAAO,KAAA;AAEtD,EAAA,MAAM,OAAA,GAAU,IAAA;AAEhB,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,QAAA,IAAY,OAAA,CAAQ,MAAA,EAAQ;AACjD,IAAA,OAAO,aAAA,CAAc,QAAQ,MAAM,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,cAAc,IAAI,CAAA;AAC3B;AAMO,SAAS,kBAAkB,IAAA,EAAmC;AAEnE,EAAA,IACE,OAAO,SAAS,QAAA,IAChB,IAAA,KAAS,QACT,QAAA,IAAY,IAAA,IACX,IAAA,CAAsB,MAAA,KAAW,QAAA,EAClC;AACA,IAAA,MAAM,OAAA,GAAU,IAAA;AAChB,IAAA,OAAO,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA,GAAI,QAAQ,MAAA,GAAS,IAAA;AAAA,EAC1D;AAGA,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAMO,IAAM,sBAAA,GAAyB;AAM/B,IAAM,yBAAA,GAA4B","file":"chunk-JO4BHPAD.cjs","sourcesContent":["/**\n * MCP-UI Type Definitions\n *\n * This module defines types for MCP-UI support, enabling MCP tools\n * to return interactive UI components (forms, charts, product selectors, etc.)\n * that render directly in the chat interface.\n *\n * @see https://github.com/idosal/mcp-ui\n * @see https://shopify.engineering/mcp-ui-breaking-the-text-wall\n */\n\n// ============================================\n// UI Resource Types\n// ============================================\n\n/**\n * MCP UI Resource MIME types\n *\n * - `text/html`: Inline HTML content rendered in iframe\n * - `text/uri-list`: External URL to load in iframe\n * - `application/vnd.mcp-ui.remote-dom`: Remote DOM rendering (advanced)\n */\nexport type MCPUIResourceMimeType =\n | \"text/html\"\n | \"text/uri-list\"\n | \"application/vnd.mcp-ui.remote-dom\";\n\n/**\n * MCP UI Resource metadata\n *\n * Optional configuration for how the UI should be displayed.\n */\nexport interface MCPUIResourceMetadata {\n /** Title shown above the UI component */\n title?: string;\n /** Width of the iframe (e.g., \"100%\", \"400px\") */\n width?: string;\n /** Height of the iframe (e.g., \"200px\", \"auto\") */\n height?: string;\n /**\n * Custom iframe sandbox permissions\n * @default [\"allow-scripts\", \"allow-forms\"]\n */\n sandbox?: string[];\n /** Additional CSS classes for styling */\n className?: string;\n}\n\n/**\n * MCP UI Resource\n *\n * Represents a UI component returned by an MCP tool.\n * Can be inline HTML, an external URL, or Remote DOM content.\n *\n * @example\n * ```typescript\n * // Inline HTML\n * const resource: MCPUIResource = {\n * uri: \"ui://shop/product/123\",\n * mimeType: \"text/html\",\n * content: \"<div class='product-card'>...</div>\",\n * metadata: { height: \"300px\" }\n * };\n *\n * // External URL\n * const urlResource: MCPUIResource = {\n * uri: \"ui://dashboard/chart\",\n * mimeType: \"text/uri-list\",\n * content: \"https://charts.example.com/embed/abc123\",\n * metadata: { height: \"400px\", title: \"Sales Chart\" }\n * };\n * ```\n */\nexport interface MCPUIResource {\n /** Unique URI identifying this UI resource (e.g., ui://server/resource-id) */\n uri: string;\n /** MIME type determining how to render the content */\n mimeType: MCPUIResourceMimeType;\n /** Content: inline HTML for text/html, URL for text/uri-list */\n content?: string;\n /** Base64-encoded content (alternative to content) */\n blob?: string;\n /** Display configuration */\n metadata?: MCPUIResourceMetadata;\n}\n\n/**\n * MCP UI Resource content type for tool results\n *\n * This is the content array item format returned by MCP tools.\n *\n * @example\n * ```typescript\n * // MCP tool returning UI\n * return {\n * content: [\n * { type: \"text\", text: \"Here's the product:\" },\n * {\n * type: \"ui\",\n * resource: {\n * uri: \"ui://shop/product/123\",\n * mimeType: \"text/html\",\n * content: \"<div>...</div>\"\n * }\n * }\n * ]\n * };\n * ```\n */\nexport interface MCPUIResourceContent {\n type: \"ui\";\n resource: MCPUIResource;\n}\n\n// ============================================\n// Intent Types (UI → Host Communication)\n// ============================================\n\n/**\n * Tool intent - Request to call another MCP tool\n *\n * @example\n * ```typescript\n * // Button click triggers tool call\n * window.parent.postMessage({\n * type: \"tool\",\n * name: \"add_to_cart\",\n * arguments: { productId: \"123\", quantity: 1 }\n * }, \"*\");\n * ```\n */\nexport interface MCPUIToolIntent {\n type: \"tool\";\n /** Name of the tool to call */\n name: string;\n /** Arguments to pass to the tool */\n arguments?: Record<string, unknown>;\n}\n\n/**\n * Action intent - Semantic action for the agent to interpret\n *\n * Unlike tool intents, these don't directly call tools but let the\n * AI agent decide how to handle the action.\n *\n * @example\n * ```typescript\n * // User selects a product variant\n * window.parent.postMessage({\n * type: \"intent\",\n * action: \"select_variant\",\n * data: { variantId: \"blue-xl\", productId: \"123\" }\n * }, \"*\");\n * ```\n */\nexport interface MCPUIActionIntent {\n type: \"intent\";\n /** Semantic action name */\n action: string;\n /** Action data */\n data?: Record<string, unknown>;\n}\n\n/**\n * Prompt intent - Add text to the chat input\n *\n * @example\n * ```typescript\n * // \"Ask about this\" button\n * window.parent.postMessage({\n * type: \"prompt\",\n * text: \"Tell me more about product X\"\n * }, \"*\");\n * ```\n */\nexport interface MCPUIPromptIntent {\n type: \"prompt\";\n /** Text to add to chat input */\n text: string;\n}\n\n/**\n * Notify intent - Show a notification/toast\n *\n * @example\n * ```typescript\n * // Show success message\n * window.parent.postMessage({\n * type: \"notify\",\n * message: \"Added to cart!\",\n * level: \"success\"\n * }, \"*\");\n * ```\n */\nexport interface MCPUINotifyIntent {\n type: \"notify\";\n /** Notification message */\n message: string;\n /** Notification level */\n level?: \"info\" | \"success\" | \"warning\" | \"error\";\n}\n\n/**\n * Link intent - Open a URL (with user consent)\n *\n * @example\n * ```typescript\n * // \"View full details\" button\n * window.parent.postMessage({\n * type: \"link\",\n * url: \"https://shop.example.com/product/123\"\n * }, \"*\");\n * ```\n */\nexport interface MCPUILinkIntent {\n type: \"link\";\n /** URL to open */\n url: string;\n /** Open in new tab (default: true) */\n newTab?: boolean;\n}\n\n/**\n * Union of all MCP-UI intent types\n *\n * These are messages sent from the UI iframe to the host application\n * via postMessage.\n */\nexport type MCPUIIntent =\n | MCPUIToolIntent\n | MCPUIActionIntent\n | MCPUIPromptIntent\n | MCPUINotifyIntent\n | MCPUILinkIntent;\n\n// ============================================\n// Message Types (for postMessage)\n// ============================================\n\n/**\n * Message envelope for postMessage communication\n *\n * All messages from UI iframes should include a source identifier\n * for validation.\n */\nexport interface MCPUIMessage {\n /** Source identifier for validation */\n source?: \"mcp-ui\";\n /** The intent payload */\n intent: MCPUIIntent;\n}\n\n// ============================================\n// Intent Handler Types\n// ============================================\n\n/**\n * Intent handler callback signature\n */\nexport type MCPUIIntentHandler<T extends MCPUIIntent = MCPUIIntent> = (\n intent: T,\n context?: MCPUIIntentContext,\n) => void | Promise<void>;\n\n/**\n * Context passed to intent handlers\n */\nexport interface MCPUIIntentContext {\n /** Source tool name that rendered the UI */\n toolName?: string;\n /** Tool call ID */\n toolCallId?: string;\n /** Original UI resource */\n resource?: MCPUIResource;\n}\n\n/**\n * Configuration for useMCPUIIntents hook\n */\nexport interface UseMCPUIIntentsConfig {\n /**\n * Handler for tool intents - call another MCP tool\n */\n onToolCall?: (\n name: string,\n args?: Record<string, unknown>,\n context?: MCPUIIntentContext,\n ) => void | Promise<void>;\n\n /**\n * Handler for action intents - semantic actions for agent interpretation\n */\n onIntent?: (\n action: string,\n data?: Record<string, unknown>,\n context?: MCPUIIntentContext,\n ) => void | Promise<void>;\n\n /**\n * Handler for prompt intents - add text to chat input\n */\n onPrompt?: (text: string, context?: MCPUIIntentContext) => void;\n\n /**\n * Handler for notify intents - show notifications\n */\n onNotify?: (\n message: string,\n level?: \"info\" | \"success\" | \"warning\" | \"error\",\n context?: MCPUIIntentContext,\n ) => void;\n\n /**\n * Handler for link intents - open URLs\n * Return false to prevent default behavior\n */\n onLink?: (\n url: string,\n newTab?: boolean,\n context?: MCPUIIntentContext,\n ) => boolean | void;\n\n /**\n * Whether to require user consent for sensitive intents\n * @default true for \"tool\" and \"link\" intents\n */\n requireConsent?: {\n tool?: boolean;\n link?: boolean;\n };\n}\n\n/**\n * Return type for useMCPUIIntents hook\n */\nexport interface UseMCPUIIntentsReturn {\n /**\n * Handle an intent from a UI component\n * This should be passed to MCPUIFrame's onIntent prop\n */\n handleIntent: (\n intent: MCPUIIntent,\n context?: MCPUIIntentContext,\n ) => void | Promise<void>;\n}\n\n// ============================================\n// Component Props Types\n// ============================================\n\n/**\n * Props for MCPUIFrame component\n */\nexport interface MCPUIFrameProps {\n /** UI resource to render */\n resource: MCPUIResource;\n /**\n * Callback when UI emits an intent\n * @param intent The intent from the UI\n */\n onIntent?: (intent: MCPUIIntent) => void;\n /**\n * Callback when an error occurs\n * @param error The error\n */\n onError?: (error: Error) => void;\n /**\n * Callback when iframe loads\n */\n onLoad?: () => void;\n /** Additional CSS class names */\n className?: string;\n /** Inline styles */\n style?: React.CSSProperties;\n /**\n * Override default sandbox permissions\n * @default \"allow-scripts allow-forms\"\n */\n sandbox?: string;\n /**\n * Whether to show a loading state while iframe loads\n * @default true\n */\n showLoading?: boolean;\n /**\n * Test ID for testing\n */\n testId?: string;\n}\n\n// ============================================\n// Utility Types\n// ============================================\n\n/**\n * Type guard for MCPUIResourceContent\n */\nexport function isMCPUIResourceContent(\n content: unknown,\n): content is MCPUIResourceContent {\n return (\n typeof content === \"object\" &&\n content !== null &&\n \"type\" in content &&\n (content as MCPUIResourceContent).type === \"ui\" &&\n \"resource\" in content\n );\n}\n\n/**\n * Type guard for MCPUIIntent\n */\nexport function isMCPUIIntent(data: unknown): data is MCPUIIntent {\n if (typeof data !== \"object\" || data === null) return false;\n\n const intent = data as { type?: string };\n return (\n intent.type === \"tool\" ||\n intent.type === \"intent\" ||\n intent.type === \"prompt\" ||\n intent.type === \"notify\" ||\n intent.type === \"link\"\n );\n}\n\n/**\n * Type guard for MCPUIMessage (postMessage envelope)\n */\nexport function isMCPUIMessage(data: unknown): data is MCPUIMessage {\n if (typeof data !== \"object\" || data === null) return false;\n\n const message = data as MCPUIMessage;\n // Accept messages with source: \"mcp-ui\" OR direct intents\n if (message.source === \"mcp-ui\" && message.intent) {\n return isMCPUIIntent(message.intent);\n }\n // Also accept direct intents without envelope\n return isMCPUIIntent(data);\n}\n\n/**\n * Parse a postMessage event data to MCPUIIntent\n * Returns null if the data is not a valid MCP-UI message\n */\nexport function parseMCPUIMessage(data: unknown): MCPUIIntent | null {\n // Check for envelope format\n if (\n typeof data === \"object\" &&\n data !== null &&\n \"source\" in data &&\n (data as MCPUIMessage).source === \"mcp-ui\"\n ) {\n const message = data as MCPUIMessage;\n return isMCPUIIntent(message.intent) ? message.intent : null;\n }\n\n // Check for direct intent format\n if (isMCPUIIntent(data)) {\n return data;\n }\n\n return null;\n}\n\n/**\n * Default iframe sandbox permissions\n * Provides a secure default that allows interactivity\n */\nexport const DEFAULT_MCP_UI_SANDBOX = \"allow-scripts allow-forms\";\n\n/**\n * Restricted sandbox for untrusted content\n * More secure but limits functionality\n */\nexport const RESTRICTED_MCP_UI_SANDBOX = \"allow-scripts\";\n"]}
@@ -0,0 +1,89 @@
1
+ 'use strict';
2
+
3
+ // src/core/tools/webSearch/providers/serper.ts
4
+ var SERPER_API_URL = "https://google.serper.dev/search";
5
+ function validateSerperConfig(config) {
6
+ if (!config.apiKey) {
7
+ throw new Error(
8
+ "Serper API key is required. Get one at https://serper.dev/"
9
+ );
10
+ }
11
+ }
12
+ async function searchSerper(params, config) {
13
+ validateSerperConfig(config);
14
+ const startTime = Date.now();
15
+ const requestBody = {
16
+ q: params.query,
17
+ num: params.maxResults ?? config.maxResults ?? 5
18
+ };
19
+ if (config.country) {
20
+ requestBody.gl = config.country;
21
+ }
22
+ if (config.language) {
23
+ requestBody.hl = config.language;
24
+ }
25
+ const response = await fetch(SERPER_API_URL, {
26
+ method: "POST",
27
+ headers: {
28
+ "Content-Type": "application/json",
29
+ "X-API-KEY": config.apiKey
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(`Serper API error (${response.status}): ${errorText}`);
37
+ }
38
+ const data = await response.json();
39
+ const searchTime = Date.now() - startTime;
40
+ let results = data.organic || [];
41
+ if (config.includeDomains?.length) {
42
+ results = results.filter(
43
+ (r) => config.includeDomains.some((domain) => r.link.includes(domain))
44
+ );
45
+ }
46
+ if (config.excludeDomains?.length) {
47
+ results = results.filter(
48
+ (r) => !config.excludeDomains.some((domain) => r.link.includes(domain))
49
+ );
50
+ }
51
+ const answer = data.answerBox?.answer || data.answerBox?.snippet;
52
+ return {
53
+ query: params.query,
54
+ answer,
55
+ results: results.map((result) => ({
56
+ title: result.title,
57
+ url: result.link,
58
+ content: result.snippet,
59
+ publishedDate: result.date,
60
+ image: result.imageUrl,
61
+ domain: extractDomain(result.link)
62
+ })),
63
+ images: data.images?.map((img) => ({
64
+ url: img.imageUrl,
65
+ description: img.title,
66
+ sourceUrl: img.link
67
+ })),
68
+ provider: "serper",
69
+ totalResults: results.length,
70
+ searchTime
71
+ };
72
+ }
73
+ function extractDomain(url) {
74
+ try {
75
+ return new URL(url).hostname;
76
+ } catch {
77
+ return url;
78
+ }
79
+ }
80
+ var serperProvider = {
81
+ search: searchSerper,
82
+ validateConfig: validateSerperConfig
83
+ };
84
+
85
+ exports.searchSerper = searchSerper;
86
+ exports.serperProvider = serperProvider;
87
+ exports.validateSerperConfig = validateSerperConfig;
88
+ //# sourceMappingURL=chunk-MEBXW75C.cjs.map
89
+ //# sourceMappingURL=chunk-MEBXW75C.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/tools/webSearch/providers/serper.ts"],"names":[],"mappings":"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","file":"chunk-MEBXW75C.cjs","sourcesContent":["/**\n * Serper Search Provider\n *\n * Serper is a Google Search API that provides SERP data.\n * Fast and cost-effective for real-time Google results.\n *\n * @see https://serper.dev/\n */\n\nimport type {\n WebSearchConfig,\n WebSearchParams,\n WebSearchResponse,\n SerperApiResponse,\n WebSearchProviderInterface,\n} from \"../types\";\n\nconst SERPER_API_URL = \"https://google.serper.dev/search\";\n\n/**\n * Validate Serper configuration\n */\nexport function validateSerperConfig(config: WebSearchConfig): void {\n if (!config.apiKey) {\n throw new Error(\n \"Serper API key is required. Get one at https://serper.dev/\",\n );\n }\n}\n\n/**\n * Search using Serper API\n */\nexport async function searchSerper(\n params: WebSearchParams,\n config: WebSearchConfig,\n): Promise<WebSearchResponse> {\n validateSerperConfig(config);\n\n const startTime = Date.now();\n\n const requestBody: Record<string, unknown> = {\n q: params.query,\n num: params.maxResults ?? config.maxResults ?? 5,\n };\n\n // Add locale settings\n if (config.country) {\n requestBody.gl = config.country;\n }\n if (config.language) {\n requestBody.hl = config.language;\n }\n\n const response = await fetch(SERPER_API_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-KEY\": config.apiKey!,\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(`Serper API error (${response.status}): ${errorText}`);\n }\n\n const data: SerperApiResponse = await response.json();\n const searchTime = Date.now() - startTime;\n\n // Filter by domains if specified\n let results = data.organic || [];\n if (config.includeDomains?.length) {\n results = results.filter((r) =>\n config.includeDomains!.some((domain) => r.link.includes(domain)),\n );\n }\n if (config.excludeDomains?.length) {\n results = results.filter(\n (r) => !config.excludeDomains!.some((domain) => r.link.includes(domain)),\n );\n }\n\n // Extract answer from answer box if available\n const answer = data.answerBox?.answer || data.answerBox?.snippet;\n\n return {\n query: params.query,\n answer,\n results: results.map((result) => ({\n title: result.title,\n url: result.link,\n content: result.snippet,\n publishedDate: result.date,\n image: result.imageUrl,\n domain: extractDomain(result.link),\n })),\n images: data.images?.map((img) => ({\n url: img.imageUrl,\n description: img.title,\n sourceUrl: img.link,\n })),\n provider: \"serper\",\n totalResults: 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 * Serper provider implementation\n */\nexport const serperProvider: WebSearchProviderInterface = {\n search: searchSerper,\n validateConfig: validateSerperConfig,\n};\n"]}
@@ -0,0 +1,76 @@
1
+ // src/core/tools/webSearch/providers/exa.ts
2
+ var EXA_API_URL = "https://api.exa.ai/search";
3
+ function validateExaConfig(config) {
4
+ if (!config.apiKey) {
5
+ throw new Error("Exa API key is required. Get one at https://exa.ai/");
6
+ }
7
+ }
8
+ async function searchExa(params, config) {
9
+ validateExaConfig(config);
10
+ const startTime = Date.now();
11
+ const searchType = params.searchDepth === "advanced" || config.searchDepth === "advanced" ? "auto" : "keyword";
12
+ const requestBody = {
13
+ query: params.query,
14
+ numResults: params.maxResults ?? config.maxResults ?? 5,
15
+ type: searchType,
16
+ useAutoprompt: searchType === "auto"
17
+ };
18
+ if (config.includeRawContent) {
19
+ requestBody.contents = {
20
+ text: true,
21
+ highlights: true
22
+ };
23
+ }
24
+ if (config.includeDomains?.length) {
25
+ requestBody.includeDomains = config.includeDomains;
26
+ }
27
+ if (config.excludeDomains?.length) {
28
+ requestBody.excludeDomains = config.excludeDomains;
29
+ }
30
+ const response = await fetch(EXA_API_URL, {
31
+ method: "POST",
32
+ headers: {
33
+ "Content-Type": "application/json",
34
+ "x-api-key": config.apiKey
35
+ },
36
+ body: JSON.stringify(requestBody),
37
+ signal: config.timeout ? AbortSignal.timeout(config.timeout) : void 0
38
+ });
39
+ if (!response.ok) {
40
+ const errorText = await response.text().catch(() => "Unknown error");
41
+ throw new Error(`Exa API error (${response.status}): ${errorText}`);
42
+ }
43
+ const data = await response.json();
44
+ const searchTime = Date.now() - startTime;
45
+ return {
46
+ query: params.query,
47
+ // Exa uses autoprompt to improve the query, include it as context
48
+ answer: data.autopromptString ? `Enhanced query: ${data.autopromptString}` : void 0,
49
+ results: data.results.map((result) => ({
50
+ title: result.title,
51
+ url: result.url,
52
+ content: result.highlights?.join(" ") || result.text?.slice(0, 300) || "",
53
+ score: result.score,
54
+ publishedDate: result.publishedDate,
55
+ domain: extractDomain(result.url)
56
+ })),
57
+ provider: "exa",
58
+ totalResults: data.results.length,
59
+ searchTime
60
+ };
61
+ }
62
+ function extractDomain(url) {
63
+ try {
64
+ return new URL(url).hostname;
65
+ } catch {
66
+ return url;
67
+ }
68
+ }
69
+ var exaProvider = {
70
+ search: searchExa,
71
+ validateConfig: validateExaConfig
72
+ };
73
+
74
+ export { exaProvider, searchExa, validateExaConfig };
75
+ //# sourceMappingURL=chunk-MNDGIW47.js.map
76
+ //# sourceMappingURL=chunk-MNDGIW47.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/tools/webSearch/providers/exa.ts"],"names":[],"mappings":"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","file":"chunk-MNDGIW47.js","sourcesContent":["/**\n * Exa Search Provider\n *\n * Exa (formerly Metaphor) is an AI-native search engine\n * that understands queries semantically for better results.\n *\n * @see https://exa.ai/\n */\n\nimport type {\n WebSearchConfig,\n WebSearchParams,\n WebSearchResponse,\n ExaApiResponse,\n WebSearchProviderInterface,\n} from \"../types\";\n\nconst EXA_API_URL = \"https://api.exa.ai/search\";\n\n/**\n * Validate Exa configuration\n */\nexport function validateExaConfig(config: WebSearchConfig): void {\n if (!config.apiKey) {\n throw new Error(\"Exa API key is required. Get one at https://exa.ai/\");\n }\n}\n\n/**\n * Search using Exa API\n */\nexport async function searchExa(\n params: WebSearchParams,\n config: WebSearchConfig,\n): Promise<WebSearchResponse> {\n validateExaConfig(config);\n\n const startTime = Date.now();\n\n // Exa uses \"auto\" for their autoprompt feature which enhances queries\n const searchType =\n params.searchDepth === \"advanced\" || config.searchDepth === \"advanced\"\n ? \"auto\"\n : \"keyword\";\n\n const requestBody: Record<string, unknown> = {\n query: params.query,\n numResults: params.maxResults ?? config.maxResults ?? 5,\n type: searchType,\n useAutoprompt: searchType === \"auto\",\n };\n\n // Add content retrieval if raw content is requested\n if (config.includeRawContent) {\n requestBody.contents = {\n text: true,\n highlights: true,\n };\n }\n\n // Domain filtering\n if (config.includeDomains?.length) {\n requestBody.includeDomains = config.includeDomains;\n }\n if (config.excludeDomains?.length) {\n requestBody.excludeDomains = config.excludeDomains;\n }\n\n const response = await fetch(EXA_API_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": config.apiKey!,\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(`Exa API error (${response.status}): ${errorText}`);\n }\n\n const data: ExaApiResponse = await response.json();\n const searchTime = Date.now() - startTime;\n\n return {\n query: params.query,\n // Exa uses autoprompt to improve the query, include it as context\n answer: data.autopromptString\n ? `Enhanced query: ${data.autopromptString}`\n : undefined,\n results: data.results.map((result) => ({\n title: result.title,\n url: result.url,\n content: result.highlights?.join(\" \") || result.text?.slice(0, 300) || \"\",\n score: result.score,\n publishedDate: result.publishedDate,\n domain: extractDomain(result.url),\n })),\n provider: \"exa\",\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 * Exa provider implementation\n */\nexport const exaProvider: WebSearchProviderInterface = {\n search: searchExa,\n validateConfig: validateExaConfig,\n};\n"]}
@@ -0,0 +1,83 @@
1
+ // src/core/tools/webSearch/providers/brave.ts
2
+ var BRAVE_API_URL = "https://api.search.brave.com/res/v1/web/search";
3
+ function validateBraveConfig(config) {
4
+ if (!config.apiKey) {
5
+ throw new Error(
6
+ "Brave Search API key is required. Get one at https://brave.com/search/api/"
7
+ );
8
+ }
9
+ }
10
+ async function searchBrave(params, config) {
11
+ validateBraveConfig(config);
12
+ const startTime = Date.now();
13
+ const searchParams = new URLSearchParams({
14
+ q: params.query,
15
+ count: String(params.maxResults ?? config.maxResults ?? 5)
16
+ });
17
+ if (config.country) {
18
+ searchParams.set("country", config.country);
19
+ }
20
+ if (config.language) {
21
+ searchParams.set("search_lang", config.language);
22
+ }
23
+ const url = `${BRAVE_API_URL}?${searchParams.toString()}`;
24
+ const response = await fetch(url, {
25
+ method: "GET",
26
+ headers: {
27
+ Accept: "application/json",
28
+ "Accept-Encoding": "gzip",
29
+ "X-Subscription-Token": config.apiKey
30
+ },
31
+ signal: config.timeout ? AbortSignal.timeout(config.timeout) : void 0
32
+ });
33
+ if (!response.ok) {
34
+ const errorText = await response.text().catch(() => "Unknown error");
35
+ throw new Error(
36
+ `Brave Search API error (${response.status}): ${errorText}`
37
+ );
38
+ }
39
+ const data = await response.json();
40
+ const searchTime = Date.now() - startTime;
41
+ let results = data.web?.results || [];
42
+ if (config.includeDomains?.length) {
43
+ results = results.filter(
44
+ (r) => config.includeDomains.some((domain) => r.url.includes(domain))
45
+ );
46
+ }
47
+ if (config.excludeDomains?.length) {
48
+ results = results.filter(
49
+ (r) => !config.excludeDomains.some((domain) => r.url.includes(domain))
50
+ );
51
+ }
52
+ const answer = data.infobox?.description;
53
+ return {
54
+ query: params.query,
55
+ answer,
56
+ results: results.map((result) => ({
57
+ title: result.title,
58
+ url: result.url,
59
+ content: result.description,
60
+ publishedDate: result.page_age,
61
+ image: result.thumbnail?.src,
62
+ domain: extractDomain(result.url)
63
+ })),
64
+ provider: "brave",
65
+ totalResults: results.length,
66
+ searchTime
67
+ };
68
+ }
69
+ function extractDomain(url) {
70
+ try {
71
+ return new URL(url).hostname;
72
+ } catch {
73
+ return url;
74
+ }
75
+ }
76
+ var braveProvider = {
77
+ search: searchBrave,
78
+ validateConfig: validateBraveConfig
79
+ };
80
+
81
+ export { braveProvider, searchBrave, validateBraveConfig };
82
+ //# sourceMappingURL=chunk-PPFHA6IL.js.map
83
+ //# sourceMappingURL=chunk-PPFHA6IL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/tools/webSearch/providers/brave.ts"],"names":[],"mappings":"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","file":"chunk-PPFHA6IL.js","sourcesContent":["/**\n * Brave Search Provider\n *\n * Brave Search is a privacy-focused search engine with its own index.\n * Provides independent search results without tracking.\n *\n * @see https://brave.com/search/api/\n */\n\nimport type {\n WebSearchConfig,\n WebSearchParams,\n WebSearchResponse,\n BraveApiResponse,\n WebSearchProviderInterface,\n} from \"../types\";\n\nconst BRAVE_API_URL = \"https://api.search.brave.com/res/v1/web/search\";\n\n/**\n * Validate Brave configuration\n */\nexport function validateBraveConfig(config: WebSearchConfig): void {\n if (!config.apiKey) {\n throw new Error(\n \"Brave Search API key is required. Get one at https://brave.com/search/api/\",\n );\n }\n}\n\n/**\n * Search using Brave Search API\n */\nexport async function searchBrave(\n params: WebSearchParams,\n config: WebSearchConfig,\n): Promise<WebSearchResponse> {\n validateBraveConfig(config);\n\n const startTime = Date.now();\n\n const searchParams = new URLSearchParams({\n q: params.query,\n count: String(params.maxResults ?? config.maxResults ?? 5),\n });\n\n // Add locale settings\n if (config.country) {\n searchParams.set(\"country\", config.country);\n }\n if (config.language) {\n searchParams.set(\"search_lang\", config.language);\n }\n\n const url = `${BRAVE_API_URL}?${searchParams.toString()}`;\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"Accept-Encoding\": \"gzip\",\n \"X-Subscription-Token\": config.apiKey!,\n },\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(\n `Brave Search API error (${response.status}): ${errorText}`,\n );\n }\n\n const data: BraveApiResponse = await response.json();\n const searchTime = Date.now() - startTime;\n\n // Filter by domains if specified\n let results = data.web?.results || [];\n if (config.includeDomains?.length) {\n results = results.filter((r) =>\n config.includeDomains!.some((domain) => r.url.includes(domain)),\n );\n }\n if (config.excludeDomains?.length) {\n results = results.filter(\n (r) => !config.excludeDomains!.some((domain) => r.url.includes(domain)),\n );\n }\n\n // Extract answer from infobox if available\n const answer = data.infobox?.description;\n\n return {\n query: params.query,\n answer,\n results: results.map((result) => ({\n title: result.title,\n url: result.url,\n content: result.description,\n publishedDate: result.page_age,\n image: result.thumbnail?.src,\n domain: extractDomain(result.url),\n })),\n provider: \"brave\",\n totalResults: 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 * Brave provider implementation\n */\nexport const braveProvider: WebSearchProviderInterface = {\n search: searchBrave,\n validateConfig: validateBraveConfig,\n};\n"]}
@@ -0,0 +1,128 @@
1
+ // src/core/tools/webSearch/providers/anthropic.ts
2
+ var ANTHROPIC_API_URL = "https://api.anthropic.com/v1/messages";
3
+ function validateAnthropicConfig(config) {
4
+ if (!config.apiKey) {
5
+ throw new Error(
6
+ "Anthropic API key is required for native web search. Pass apiKey or set ANTHROPIC_API_KEY environment variable."
7
+ );
8
+ }
9
+ }
10
+ async function searchAnthropic(params, config) {
11
+ validateAnthropicConfig(config);
12
+ const startTime = Date.now();
13
+ const apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY;
14
+ const webSearchTool = {
15
+ type: "web_search_20250305",
16
+ // Use stable version
17
+ name: "web_search",
18
+ max_uses: config.maxResults ?? 5
19
+ };
20
+ if (config.includeDomains?.length) {
21
+ webSearchTool.allowed_domains = config.includeDomains;
22
+ }
23
+ if (config.excludeDomains?.length) {
24
+ webSearchTool.blocked_domains = config.excludeDomains;
25
+ }
26
+ if (config.country) {
27
+ webSearchTool.user_location = {
28
+ type: "approximate",
29
+ country: config.country.toUpperCase()
30
+ };
31
+ }
32
+ const response = await fetch(ANTHROPIC_API_URL, {
33
+ method: "POST",
34
+ headers: {
35
+ "Content-Type": "application/json",
36
+ "x-api-key": apiKey,
37
+ "anthropic-version": "2023-06-01"
38
+ },
39
+ body: JSON.stringify({
40
+ model: "claude-sonnet-4-20250514",
41
+ // Use Sonnet 4 for balance of speed/quality
42
+ max_tokens: 2048,
43
+ tools: [webSearchTool],
44
+ messages: [
45
+ {
46
+ role: "user",
47
+ content: params.query
48
+ }
49
+ ]
50
+ }),
51
+ signal: config.timeout ? AbortSignal.timeout(config.timeout) : void 0
52
+ });
53
+ if (!response.ok) {
54
+ const errorText = await response.text().catch(() => "Unknown error");
55
+ console.error(
56
+ "[Anthropic Native Search] API error:",
57
+ response.status,
58
+ errorText
59
+ );
60
+ throw new Error(
61
+ `Anthropic Messages API error (${response.status}): ${errorText}`
62
+ );
63
+ }
64
+ const data = await response.json();
65
+ const searchTime = Date.now() - startTime;
66
+ let outputText = "";
67
+ const sources = [];
68
+ const searchResults = [];
69
+ if (data.content && Array.isArray(data.content)) {
70
+ for (const block of data.content) {
71
+ if (block.type === "text" && block.text) {
72
+ outputText += block.text;
73
+ if (block.citations && Array.isArray(block.citations)) {
74
+ for (const citation of block.citations) {
75
+ if (citation.url && !sources.find((s) => s.url === citation.url)) {
76
+ sources.push({
77
+ url: citation.url,
78
+ title: citation.title || extractDomain(citation.url),
79
+ cited_text: citation.cited_text
80
+ });
81
+ }
82
+ }
83
+ }
84
+ }
85
+ if (block.type === "web_search_tool_result" && block.content) {
86
+ for (const result of block.content) {
87
+ if (result.type === "web_search_result" && result.url) {
88
+ searchResults.push({
89
+ url: result.url,
90
+ title: result.title || extractDomain(result.url),
91
+ page_age: result.page_age
92
+ });
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ const finalSources = sources.length > 0 ? sources : searchResults;
99
+ return {
100
+ query: params.query,
101
+ answer: outputText,
102
+ results: finalSources.slice(0, params.maxResults ?? config.maxResults ?? 5).map((source, i) => ({
103
+ title: source.title,
104
+ url: source.url,
105
+ content: "cited_text" in source ? source.cited_text || "" : "",
106
+ score: 1 - i * 0.1,
107
+ domain: extractDomain(source.url)
108
+ })),
109
+ provider: "anthropic",
110
+ totalResults: finalSources.length,
111
+ searchTime
112
+ };
113
+ }
114
+ function extractDomain(url) {
115
+ try {
116
+ return new URL(url).hostname.replace("www.", "");
117
+ } catch {
118
+ return url;
119
+ }
120
+ }
121
+ var anthropicProvider = {
122
+ search: searchAnthropic,
123
+ validateConfig: validateAnthropicConfig
124
+ };
125
+
126
+ export { anthropicProvider, searchAnthropic, validateAnthropicConfig };
127
+ //# sourceMappingURL=chunk-RQ74USYU.js.map
128
+ //# sourceMappingURL=chunk-RQ74USYU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/tools/webSearch/providers/anthropic.ts"],"names":[],"mappings":"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","file":"chunk-RQ74USYU.js","sourcesContent":["/**\n * Anthropic Web Search Provider\n *\n * Uses Anthropic's built-in web_search tool via the Messages API.\n * Returns reliable citations with cited_text, url, and title.\n *\n * @see https://docs.anthropic.com/en/docs/build-with-claude/tool-use/web-search-tool\n */\n\nimport type {\n WebSearchConfig,\n WebSearchParams,\n WebSearchResponse,\n WebSearchProviderInterface,\n} from \"../types\";\n\nconst ANTHROPIC_API_URL = \"https://api.anthropic.com/v1/messages\";\n\n/**\n * Validate Anthropic native search configuration\n */\nexport function validateAnthropicConfig(config: WebSearchConfig): void {\n if (!config.apiKey) {\n throw new Error(\n \"Anthropic API key is required for native web search. \" +\n \"Pass apiKey or set ANTHROPIC_API_KEY environment variable.\",\n );\n }\n}\n\n// Type definitions for Anthropic response\ninterface AnthropicWebSearchResult {\n type: \"web_search_result\";\n url: string;\n title: string;\n encrypted_content?: string;\n page_age?: string;\n}\n\ninterface AnthropicCitation {\n type: \"web_search_result_location\";\n url: string;\n title: string;\n encrypted_index?: string;\n cited_text?: string;\n}\n\ninterface AnthropicContentBlock {\n type: string;\n text?: string;\n tool_use_id?: string;\n content?: AnthropicWebSearchResult[];\n citations?: AnthropicCitation[];\n}\n\ninterface AnthropicMessagesResponse {\n id: string;\n content: AnthropicContentBlock[];\n usage?: {\n input_tokens: number;\n output_tokens: number;\n server_tool_use?: {\n web_search_requests?: number;\n };\n };\n}\n\n/**\n * Search using Anthropic's native web_search tool\n */\nexport async function searchAnthropic(\n params: WebSearchParams,\n config: WebSearchConfig,\n): Promise<WebSearchResponse> {\n validateAnthropicConfig(config);\n\n const startTime = Date.now();\n const apiKey = config.apiKey || process.env.ANTHROPIC_API_KEY;\n\n // Build web search tool configuration\n const webSearchTool: Record<string, unknown> = {\n type: \"web_search_20250305\", // Use stable version\n name: \"web_search\",\n max_uses: config.maxResults ?? 5,\n };\n\n // Add domain filtering if provided\n if (config.includeDomains?.length) {\n webSearchTool.allowed_domains = config.includeDomains;\n }\n if (config.excludeDomains?.length) {\n webSearchTool.blocked_domains = config.excludeDomains;\n }\n\n // Add user location if country is set\n if (config.country) {\n webSearchTool.user_location = {\n type: \"approximate\",\n country: config.country.toUpperCase(),\n };\n }\n\n // Call Anthropic Messages API\n const response = await fetch(ANTHROPIC_API_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": apiKey!,\n \"anthropic-version\": \"2023-06-01\",\n },\n body: JSON.stringify({\n model: \"claude-sonnet-4-20250514\", // Use Sonnet 4 for balance of speed/quality\n max_tokens: 2048,\n tools: [webSearchTool],\n messages: [\n {\n role: \"user\",\n content: params.query,\n },\n ],\n }),\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 console.error(\n \"[Anthropic Native Search] API error:\",\n response.status,\n errorText,\n );\n throw new Error(\n `Anthropic Messages API error (${response.status}): ${errorText}`,\n );\n }\n\n const data: AnthropicMessagesResponse = await response.json();\n const searchTime = Date.now() - startTime;\n\n // Extract answer text and citations\n let outputText = \"\";\n const sources: Array<{ url: string; title: string; cited_text?: string }> =\n [];\n const searchResults: Array<{\n url: string;\n title: string;\n page_age?: string;\n }> = [];\n\n if (data.content && Array.isArray(data.content)) {\n for (const block of data.content) {\n // Extract text blocks\n if (block.type === \"text\" && block.text) {\n outputText += block.text;\n\n // Extract citations from text blocks\n if (block.citations && Array.isArray(block.citations)) {\n for (const citation of block.citations) {\n if (citation.url && !sources.find((s) => s.url === citation.url)) {\n sources.push({\n url: citation.url,\n title: citation.title || extractDomain(citation.url),\n cited_text: citation.cited_text,\n });\n }\n }\n }\n }\n\n // Extract search results from web_search_tool_result\n if (block.type === \"web_search_tool_result\" && block.content) {\n for (const result of block.content) {\n if (result.type === \"web_search_result\" && result.url) {\n searchResults.push({\n url: result.url,\n title: result.title || extractDomain(result.url),\n page_age: result.page_age,\n });\n }\n }\n }\n }\n }\n\n // Prefer citations (have cited_text) over raw search results\n const finalSources = sources.length > 0 ? sources : searchResults;\n\n return {\n query: params.query,\n answer: outputText,\n results: finalSources\n .slice(0, params.maxResults ?? config.maxResults ?? 5)\n .map((source, i) => ({\n title: source.title,\n url: source.url,\n content: \"cited_text\" in source ? source.cited_text || \"\" : \"\",\n score: 1 - i * 0.1,\n domain: extractDomain(source.url),\n })),\n provider: \"anthropic\",\n totalResults: finalSources.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.replace(\"www.\", \"\");\n } catch {\n return url;\n }\n}\n\n/**\n * Anthropic native search provider implementation\n */\nexport const anthropicProvider: WebSearchProviderInterface = {\n search: searchAnthropic,\n validateConfig: validateAnthropicConfig,\n};\n"]}