@yourgpt/copilot-sdk 2.1.5-alpha.1 → 2.1.5-alpha.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 (76) hide show
  1. package/dist/{chunk-4QXY2PBG.js → chunk-3AONOZLY.js} +2 -2
  2. package/dist/{chunk-4QXY2PBG.js.map → chunk-3AONOZLY.js.map} +1 -1
  3. package/dist/{chunk-JKGFQUHJ.cjs → chunk-MDS23G2S.cjs} +5 -5
  4. package/dist/{chunk-JKGFQUHJ.cjs.map → chunk-MDS23G2S.cjs.map} +1 -1
  5. package/dist/{chunk-5Q72LZ5H.js → chunk-PT2TOHG5.js} +7 -3
  6. package/dist/chunk-PT2TOHG5.js.map +1 -0
  7. package/dist/{chunk-ENFWM3EY.js → chunk-RKGRQRZU.js} +3 -3
  8. package/dist/{chunk-ENFWM3EY.js.map → chunk-RKGRQRZU.js.map} +1 -1
  9. package/dist/{chunk-IXWNDR7H.cjs → chunk-TCPAT3WG.cjs} +35 -31
  10. package/dist/chunk-TCPAT3WG.cjs.map +1 -0
  11. package/dist/{chunk-246B6X5D.cjs → chunk-TPB7XED6.cjs} +2 -2
  12. package/dist/{chunk-246B6X5D.cjs.map → chunk-TPB7XED6.cjs.map} +1 -1
  13. package/dist/{chunk-I3SQUNTT.cjs → chunk-WIXFZUEZ.cjs} +23 -23
  14. package/dist/{chunk-I3SQUNTT.cjs.map → chunk-WIXFZUEZ.cjs.map} +1 -1
  15. package/dist/{chunk-UXJ6LIZB.js → chunk-WZ2TOZ7M.js} +4 -4
  16. package/dist/{chunk-UXJ6LIZB.js.map → chunk-WZ2TOZ7M.js.map} +1 -1
  17. package/dist/core/index.cjs +82 -82
  18. package/dist/core/index.d.cts +3 -3
  19. package/dist/core/index.d.ts +3 -3
  20. package/dist/core/index.js +3 -3
  21. package/dist/{index-CiExk87c.d.cts → index-CzJB8Ddo.d.cts} +1 -1
  22. package/dist/{index-Dwrcf-CP.d.ts → index-D7169xuR.d.ts} +1 -1
  23. package/dist/mcp/index.d.cts +3 -3
  24. package/dist/mcp/index.d.ts +3 -3
  25. package/dist/react/index.cjs +65 -65
  26. package/dist/react/index.d.cts +8 -4
  27. package/dist/react/index.d.ts +8 -4
  28. package/dist/react/index.js +4 -4
  29. package/dist/styles.css +43 -0
  30. package/dist/tools/anthropic/index.d.cts +1 -1
  31. package/dist/tools/anthropic/index.d.ts +1 -1
  32. package/dist/tools/brave/index.cjs +2 -2
  33. package/dist/tools/brave/index.d.cts +1 -1
  34. package/dist/tools/brave/index.d.ts +1 -1
  35. package/dist/tools/brave/index.js +1 -1
  36. package/dist/tools/exa/index.cjs +2 -2
  37. package/dist/tools/exa/index.d.cts +1 -1
  38. package/dist/tools/exa/index.d.ts +1 -1
  39. package/dist/tools/exa/index.js +1 -1
  40. package/dist/tools/google/index.cjs +2 -2
  41. package/dist/tools/google/index.d.cts +1 -1
  42. package/dist/tools/google/index.d.ts +1 -1
  43. package/dist/tools/google/index.js +1 -1
  44. package/dist/tools/openai/index.cjs +2 -2
  45. package/dist/tools/openai/index.d.cts +1 -1
  46. package/dist/tools/openai/index.d.ts +1 -1
  47. package/dist/tools/openai/index.js +1 -1
  48. package/dist/tools/searxng/index.cjs +2 -2
  49. package/dist/tools/searxng/index.d.cts +1 -1
  50. package/dist/tools/searxng/index.d.ts +1 -1
  51. package/dist/tools/searxng/index.js +1 -1
  52. package/dist/tools/serper/index.cjs +2 -2
  53. package/dist/tools/serper/index.d.cts +1 -1
  54. package/dist/tools/serper/index.d.ts +1 -1
  55. package/dist/tools/serper/index.js +1 -1
  56. package/dist/tools/tavily/index.cjs +2 -2
  57. package/dist/tools/tavily/index.d.cts +1 -1
  58. package/dist/tools/tavily/index.d.ts +1 -1
  59. package/dist/tools/tavily/index.js +1 -1
  60. package/dist/tools/web-search/index.cjs +3 -3
  61. package/dist/tools/web-search/index.d.cts +2 -2
  62. package/dist/tools/web-search/index.d.ts +2 -2
  63. package/dist/tools/web-search/index.js +2 -2
  64. package/dist/{tools-DHZhF5km.d.cts → tools-tmksfhUo.d.cts} +9 -0
  65. package/dist/{tools-DHZhF5km.d.ts → tools-tmksfhUo.d.ts} +9 -0
  66. package/dist/{types-BdX7uPj0.d.cts → types-BLw7mxtW.d.cts} +1 -1
  67. package/dist/{types-BTyJu0WD.d.ts → types-BqwW3Baj.d.ts} +1 -1
  68. package/dist/ui/index.cjs +291 -301
  69. package/dist/ui/index.cjs.map +1 -1
  70. package/dist/ui/index.d.cts +40 -56
  71. package/dist/ui/index.d.ts +40 -56
  72. package/dist/ui/index.js +238 -248
  73. package/dist/ui/index.js.map +1 -1
  74. package/package.json +1 -1
  75. package/dist/chunk-5Q72LZ5H.js.map +0 -1
  76. package/dist/chunk-IXWNDR7H.cjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { tool, failure } from './chunk-4QXY2PBG.js';
1
+ import { tool, failure } from './chunk-3AONOZLY.js';
2
2
  import { formatSearchResultsForAI, executeWebSearch, summarizeSearchResults } from './chunk-LLM7AHMO.js';
3
3
 
4
4
  // src/core/tools/builtin/webSearch.ts
@@ -75,5 +75,5 @@ function createWebSearchTool(config) {
75
75
  }
76
76
 
77
77
  export { createWebSearchTool, webSearchTool };
78
- //# sourceMappingURL=chunk-ENFWM3EY.js.map
79
- //# sourceMappingURL=chunk-ENFWM3EY.js.map
78
+ //# sourceMappingURL=chunk-RKGRQRZU.js.map
79
+ //# sourceMappingURL=chunk-RKGRQRZU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/tools/builtin/webSearch.ts"],"names":[],"mappings":";;;;AAoDO,IAAM,gBAAgB,IAAA,CAAsB;AAAA,EACjD,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qDAAA,CAAA;AAAA,EAOb,QAAA,EAAU,QAAA;AAAA;AAAA,EAEV,KAAA,EAAO,CAAC,IAAA,KAAS,CAAA,eAAA,EAAkB,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,EAC7C,cAAA,EAAgB,CAAC,IAAA,KAAS,CAAA,uBAAA,EAA0B,KAAK,KAAK,CAAA,IAAA,CAAA;AAAA,EAC9D,cAAA,EAAgB,CAAC,IAAA,KAAS,CAAA,mBAAA,EAAsB,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,EAE1D,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE,2DAAA;AAAA,QACF,OAAA,EAAS,CAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,CAAC,OAAA,EAAS,UAAU,CAAA;AAAA,QAC1B,WAAA,EACE;AAAA;AACJ,KACF;AAAA,IACA,QAAA,EAAU,CAAC,OAAO;AAAA,GACpB;AAAA,EAEA,aAAA,EAAe,KAAA;AAAA;AAAA;AAAA,EAGf,cAAA,EAAgB,MAAA;AAAA,EAChB,SAAA,EAAW,CAAC,MAAA,EAAQ,IAAA,KAAS;AAC3B,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA,eAAA,EAAkB,OAAO,KAAK,CAAA,CAAA;AAC1D,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,OAAO,yBAAyB,IAAI,CAAA;AAAA,EACtC;AACF,CAAC;AAoEM,SAAS,oBACd,MAAA,EACiC;AACjC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,GAAG,aAAA;AAAA,IACH,OAAA,EAAS,OAAO,MAAA,KAA4B;AAC1C,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,UACrB;AAAA,YACE,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,IAAc,CAAA;AAAA,YACtD,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA,IAAe;AAAA,WAC3D;AAAA,UACA;AAAA,SACF;AAGA,QAAA,MAAM,SAAA,GAAY,yBAAyB,QAAQ,CAAA;AAEnD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,uBAAuB,QAAQ,CAAA;AAAA,UACxC,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACd;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,mBAAA;AAC3C,QAAA,OAAO,QAAQ,YAAY,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,GACF;AACF","file":"chunk-ENFWM3EY.js","sourcesContent":["/**\n * Built-in Web Search Tool\n *\n * A pre-configured tool for searching the web with multiple provider support.\n * Runs on the server to protect API keys.\n *\n * Supports tree-shaking - import providers directly for smaller bundles.\n *\n * @example\n * ```typescript\n * // Option 1: String provider (lazy loaded at runtime)\n * import { createWebSearchTool } from '@yourgpt/copilot-sdk';\n * const webSearch = createWebSearchTool({\n * provider: 'tavily',\n * apiKey: process.env.TAVILY_API_KEY,\n * });\n *\n * // Option 2: Direct provider import (best for tree-shaking)\n * import { createWebSearchTool, tavilyProvider } from '@yourgpt/copilot-sdk';\n * const webSearch = createWebSearchTool({\n * provider: tavilyProvider,\n * apiKey: process.env.TAVILY_API_KEY,\n * });\n *\n * // Add to your runtime\n * const runtime = createRuntime({\n * tools: [webSearch],\n * });\n * ```\n */\n\nimport { tool, success, failure } from \"../../types/tools\";\nimport type { ToolDefinition } from \"../../types/tools\";\nimport {\n executeWebSearch,\n formatSearchResultsForAI,\n summarizeSearchResults,\n type WebSearchConfigExtended,\n} from \"../webSearch\";\nimport type {\n WebSearchConfig,\n WebSearchParams,\n WebSearchResponse,\n WebSearchProviderInterface,\n} from \"../webSearch/types\";\n\n/**\n * Base web search tool definition\n *\n * This is the core tool definition. Use `createWebSearchTool()` to create\n * a configured instance with your provider settings.\n */\nexport const webSearchTool = tool<WebSearchParams>({\n description: `Search the web for current information. Use this when the user asks about:\n- Recent events, news, or current affairs\n- Real-time data (prices, weather, stocks, sports scores)\n- Information that might have changed after your training cutoff\n- Facts that need verification with current sources\n- Research topics that require up-to-date information`,\n\n location: \"server\", // Runs on server to protect API keys\n\n title: (args) => `Searching for \"${args.query}\"`,\n executingTitle: (args) => `Searching the web for \"${args.query}\"...`,\n completedTitle: (args) => `Found results for \"${args.query}\"`,\n\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query to find relevant information\",\n },\n maxResults: {\n type: \"number\",\n description:\n \"Maximum number of results to return (default: 5, max: 10)\",\n minimum: 1,\n maximum: 10,\n },\n searchDepth: {\n type: \"string\",\n enum: [\"basic\", \"advanced\"],\n description:\n \"Search depth - 'advanced' provides more thorough results but may be slower\",\n },\n },\n required: [\"query\"],\n },\n\n needsApproval: false, // No user data exposed, just searching\n\n // Control what AI sees from results\n aiResponseMode: \"full\",\n aiContext: (result, args) => {\n if (!result.success) return `Search failed: ${result.error}`;\n const data = result.data as WebSearchResponse;\n return formatSearchResultsForAI(data);\n },\n});\n\n/**\n * Create a configured web search tool\n *\n * Supports both string provider names (lazy loaded) and direct provider imports (tree-shakeable).\n *\n * @param config - Web search configuration including provider and API key\n * @returns A configured tool definition ready to use\n *\n * @example\n * ```typescript\n * // ===== BEST FOR TREE-SHAKING: Direct provider import =====\n * import { createWebSearchTool, openaiProvider } from '@yourgpt/copilot-sdk/core';\n *\n * const webSearch = createWebSearchTool({\n * provider: openaiProvider, // Only this provider in bundle\n * apiKey: process.env.OPENAI_API_KEY,\n * });\n *\n * // ===== STRING PROVIDERS (Lazy loaded at runtime) =====\n *\n * // OpenAI (uses your OpenAI API key)\n * const webSearch = createWebSearchTool({\n * provider: 'openai',\n * apiKey: process.env.OPENAI_API_KEY,\n * });\n *\n * // Google (uses your Google/Gemini API key)\n * const webSearch = createWebSearchTool({\n * provider: 'google',\n * apiKey: process.env.GOOGLE_API_KEY,\n * });\n *\n * // Tavily (AI-optimized search with answer generation)\n * const webSearch = createWebSearchTool({\n * provider: 'tavily',\n * apiKey: process.env.TAVILY_API_KEY,\n * includeAnswer: true,\n * maxResults: 5,\n * });\n *\n * // Serper (Google results)\n * const webSearch = createWebSearchTool({\n * provider: 'serper',\n * apiKey: process.env.SERPER_API_KEY,\n * });\n *\n * // Brave Search (privacy-focused)\n * const webSearch = createWebSearchTool({\n * provider: 'brave',\n * apiKey: process.env.BRAVE_API_KEY,\n * });\n *\n * // Self-hosted SearXNG (no API key needed)\n * const webSearch = createWebSearchTool({\n * provider: 'searxng',\n * baseUrl: 'https://your-searxng-instance.com',\n * });\n *\n * // Exa (AI-optimized semantic search)\n * const webSearch = createWebSearchTool({\n * provider: 'exa',\n * apiKey: process.env.EXA_API_KEY,\n * searchDepth: 'advanced',\n * });\n * ```\n */\nexport function createWebSearchTool(\n config: WebSearchConfigExtended,\n): ToolDefinition<WebSearchParams> {\n return {\n name: \"web_search\",\n ...webSearchTool,\n handler: async (params: WebSearchParams) => {\n try {\n const response = await executeWebSearch(\n {\n query: params.query,\n maxResults: params.maxResults ?? config.maxResults ?? 5,\n searchDepth: params.searchDepth ?? config.searchDepth ?? \"basic\",\n },\n config,\n );\n\n // Build the AI context string\n const aiContext = formatSearchResultsForAI(response);\n\n return {\n success: true,\n message: summarizeSearchResults(response),\n data: response,\n _aiContext: aiContext,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Web search failed\";\n return failure(errorMessage);\n }\n },\n };\n}\n\n/**\n * Utility types for web search tool configuration\n */\nexport type {\n WebSearchConfig,\n WebSearchParams,\n WebSearchResponse,\n WebSearchProviderInterface,\n};\nexport type { WebSearchConfigExtended };\n"]}
1
+ {"version":3,"sources":["../src/core/tools/builtin/webSearch.ts"],"names":[],"mappings":";;;;AAoDO,IAAM,gBAAgB,IAAA,CAAsB;AAAA,EACjD,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qDAAA,CAAA;AAAA,EAOb,QAAA,EAAU,QAAA;AAAA;AAAA,EAEV,KAAA,EAAO,CAAC,IAAA,KAAS,CAAA,eAAA,EAAkB,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,EAC7C,cAAA,EAAgB,CAAC,IAAA,KAAS,CAAA,uBAAA,EAA0B,KAAK,KAAK,CAAA,IAAA,CAAA;AAAA,EAC9D,cAAA,EAAgB,CAAC,IAAA,KAAS,CAAA,mBAAA,EAAsB,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,EAE1D,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE,2DAAA;AAAA,QACF,OAAA,EAAS,CAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACX;AAAA,MACA,WAAA,EAAa;AAAA,QACX,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,CAAC,OAAA,EAAS,UAAU,CAAA;AAAA,QAC1B,WAAA,EACE;AAAA;AACJ,KACF;AAAA,IACA,QAAA,EAAU,CAAC,OAAO;AAAA,GACpB;AAAA,EAEA,aAAA,EAAe,KAAA;AAAA;AAAA;AAAA,EAGf,cAAA,EAAgB,MAAA;AAAA,EAChB,SAAA,EAAW,CAAC,MAAA,EAAQ,IAAA,KAAS;AAC3B,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA,eAAA,EAAkB,OAAO,KAAK,CAAA,CAAA;AAC1D,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,OAAO,yBAAyB,IAAI,CAAA;AAAA,EACtC;AACF,CAAC;AAoEM,SAAS,oBACd,MAAA,EACiC;AACjC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,GAAG,aAAA;AAAA,IACH,OAAA,EAAS,OAAO,MAAA,KAA4B;AAC1C,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,gBAAA;AAAA,UACrB;AAAA,YACE,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,IAAc,CAAA;AAAA,YACtD,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA,IAAe;AAAA,WAC3D;AAAA,UACA;AAAA,SACF;AAGA,QAAA,MAAM,SAAA,GAAY,yBAAyB,QAAQ,CAAA;AAEnD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,uBAAuB,QAAQ,CAAA;AAAA,UACxC,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACd;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,mBAAA;AAC3C,QAAA,OAAO,QAAQ,YAAY,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,GACF;AACF","file":"chunk-RKGRQRZU.js","sourcesContent":["/**\n * Built-in Web Search Tool\n *\n * A pre-configured tool for searching the web with multiple provider support.\n * Runs on the server to protect API keys.\n *\n * Supports tree-shaking - import providers directly for smaller bundles.\n *\n * @example\n * ```typescript\n * // Option 1: String provider (lazy loaded at runtime)\n * import { createWebSearchTool } from '@yourgpt/copilot-sdk';\n * const webSearch = createWebSearchTool({\n * provider: 'tavily',\n * apiKey: process.env.TAVILY_API_KEY,\n * });\n *\n * // Option 2: Direct provider import (best for tree-shaking)\n * import { createWebSearchTool, tavilyProvider } from '@yourgpt/copilot-sdk';\n * const webSearch = createWebSearchTool({\n * provider: tavilyProvider,\n * apiKey: process.env.TAVILY_API_KEY,\n * });\n *\n * // Add to your runtime\n * const runtime = createRuntime({\n * tools: [webSearch],\n * });\n * ```\n */\n\nimport { tool, success, failure } from \"../../types/tools\";\nimport type { ToolDefinition } from \"../../types/tools\";\nimport {\n executeWebSearch,\n formatSearchResultsForAI,\n summarizeSearchResults,\n type WebSearchConfigExtended,\n} from \"../webSearch\";\nimport type {\n WebSearchConfig,\n WebSearchParams,\n WebSearchResponse,\n WebSearchProviderInterface,\n} from \"../webSearch/types\";\n\n/**\n * Base web search tool definition\n *\n * This is the core tool definition. Use `createWebSearchTool()` to create\n * a configured instance with your provider settings.\n */\nexport const webSearchTool = tool<WebSearchParams>({\n description: `Search the web for current information. Use this when the user asks about:\n- Recent events, news, or current affairs\n- Real-time data (prices, weather, stocks, sports scores)\n- Information that might have changed after your training cutoff\n- Facts that need verification with current sources\n- Research topics that require up-to-date information`,\n\n location: \"server\", // Runs on server to protect API keys\n\n title: (args) => `Searching for \"${args.query}\"`,\n executingTitle: (args) => `Searching the web for \"${args.query}\"...`,\n completedTitle: (args) => `Found results for \"${args.query}\"`,\n\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"The search query to find relevant information\",\n },\n maxResults: {\n type: \"number\",\n description:\n \"Maximum number of results to return (default: 5, max: 10)\",\n minimum: 1,\n maximum: 10,\n },\n searchDepth: {\n type: \"string\",\n enum: [\"basic\", \"advanced\"],\n description:\n \"Search depth - 'advanced' provides more thorough results but may be slower\",\n },\n },\n required: [\"query\"],\n },\n\n needsApproval: false, // No user data exposed, just searching\n\n // Control what AI sees from results\n aiResponseMode: \"full\",\n aiContext: (result, args) => {\n if (!result.success) return `Search failed: ${result.error}`;\n const data = result.data as WebSearchResponse;\n return formatSearchResultsForAI(data);\n },\n});\n\n/**\n * Create a configured web search tool\n *\n * Supports both string provider names (lazy loaded) and direct provider imports (tree-shakeable).\n *\n * @param config - Web search configuration including provider and API key\n * @returns A configured tool definition ready to use\n *\n * @example\n * ```typescript\n * // ===== BEST FOR TREE-SHAKING: Direct provider import =====\n * import { createWebSearchTool, openaiProvider } from '@yourgpt/copilot-sdk/core';\n *\n * const webSearch = createWebSearchTool({\n * provider: openaiProvider, // Only this provider in bundle\n * apiKey: process.env.OPENAI_API_KEY,\n * });\n *\n * // ===== STRING PROVIDERS (Lazy loaded at runtime) =====\n *\n * // OpenAI (uses your OpenAI API key)\n * const webSearch = createWebSearchTool({\n * provider: 'openai',\n * apiKey: process.env.OPENAI_API_KEY,\n * });\n *\n * // Google (uses your Google/Gemini API key)\n * const webSearch = createWebSearchTool({\n * provider: 'google',\n * apiKey: process.env.GOOGLE_API_KEY,\n * });\n *\n * // Tavily (AI-optimized search with answer generation)\n * const webSearch = createWebSearchTool({\n * provider: 'tavily',\n * apiKey: process.env.TAVILY_API_KEY,\n * includeAnswer: true,\n * maxResults: 5,\n * });\n *\n * // Serper (Google results)\n * const webSearch = createWebSearchTool({\n * provider: 'serper',\n * apiKey: process.env.SERPER_API_KEY,\n * });\n *\n * // Brave Search (privacy-focused)\n * const webSearch = createWebSearchTool({\n * provider: 'brave',\n * apiKey: process.env.BRAVE_API_KEY,\n * });\n *\n * // Self-hosted SearXNG (no API key needed)\n * const webSearch = createWebSearchTool({\n * provider: 'searxng',\n * baseUrl: 'https://your-searxng-instance.com',\n * });\n *\n * // Exa (AI-optimized semantic search)\n * const webSearch = createWebSearchTool({\n * provider: 'exa',\n * apiKey: process.env.EXA_API_KEY,\n * searchDepth: 'advanced',\n * });\n * ```\n */\nexport function createWebSearchTool(\n config: WebSearchConfigExtended,\n): ToolDefinition<WebSearchParams> {\n return {\n name: \"web_search\",\n ...webSearchTool,\n handler: async (params: WebSearchParams) => {\n try {\n const response = await executeWebSearch(\n {\n query: params.query,\n maxResults: params.maxResults ?? config.maxResults ?? 5,\n searchDepth: params.searchDepth ?? config.searchDepth ?? \"basic\",\n },\n config,\n );\n\n // Build the AI context string\n const aiContext = formatSearchResultsForAI(response);\n\n return {\n success: true,\n message: summarizeSearchResults(response),\n data: response,\n _aiContext: aiContext,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Web search failed\";\n return failure(errorMessage);\n }\n },\n };\n}\n\n/**\n * Utility types for web search tool configuration\n */\nexport type {\n WebSearchConfig,\n WebSearchParams,\n WebSearchResponse,\n WebSearchProviderInterface,\n};\nexport type { WebSearchConfigExtended };\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkI3SQUNTT_cjs = require('./chunk-I3SQUNTT.cjs');
3
+ var chunkWIXFZUEZ_cjs = require('./chunk-WIXFZUEZ.cjs');
4
4
  var chunkJGPDQDY4_cjs = require('./chunk-JGPDQDY4.cjs');
5
5
  var chunkBJYA5NDL_cjs = require('./chunk-BJYA5NDL.cjs');
6
6
  var React2 = require('react');
@@ -2419,7 +2419,7 @@ ${this.dynamicContext}`.trim() : this.config.systemPrompt;
2419
2419
  }
2420
2420
  get log() {
2421
2421
  if (!this._log) {
2422
- this._log = chunkI3SQUNTT_cjs.createLogger("streaming", () => this.config.debug ?? false);
2422
+ this._log = chunkWIXFZUEZ_cjs.createLogger("streaming", () => this.config.debug ?? false);
2423
2423
  }
2424
2424
  return this._log;
2425
2425
  }
@@ -2693,11 +2693,14 @@ var AbstractAgentLoop = class {
2693
2693
  }
2694
2694
  let approvalData;
2695
2695
  if (tool2.needsApproval && !this.config.autoApprove) {
2696
+ const approvalTitle = typeof tool2.approvalTitle === "function" ? tool2.approvalTitle(toolCall.args) : tool2.approvalTitle;
2696
2697
  const approvalMessage = typeof tool2.approvalMessage === "function" ? tool2.approvalMessage(toolCall.args) : tool2.approvalMessage;
2697
2698
  execution.approvalStatus = "required";
2699
+ execution.approvalTitle = approvalTitle;
2698
2700
  execution.approvalMessage = approvalMessage;
2699
2701
  this.updateToolExecution(toolCall.id, {
2700
2702
  approvalStatus: "required",
2703
+ approvalTitle,
2701
2704
  approvalMessage
2702
2705
  });
2703
2706
  this.callbacks.onApprovalRequired?.(execution);
@@ -3340,7 +3343,7 @@ var ChatWithTools = class {
3340
3343
  // Private
3341
3344
  // ============================================
3342
3345
  debug(message, ...args) {
3343
- chunkI3SQUNTT_cjs.createLogger("tools", () => this.config.debug ?? false)(
3346
+ chunkWIXFZUEZ_cjs.createLogger("tools", () => this.config.debug ?? false)(
3344
3347
  message,
3345
3348
  args.length === 1 ? args[0] : args.length > 1 ? args : void 0
3346
3349
  );
@@ -4854,7 +4857,7 @@ function useTool(config, dependencies = []) {
4854
4857
  configRef.current = config;
4855
4858
  const inputSchema = React2.useMemo(() => {
4856
4859
  if (isZodSchema(config.inputSchema)) {
4857
- return chunkI3SQUNTT_cjs.zodToJsonSchema(config.inputSchema);
4860
+ return chunkWIXFZUEZ_cjs.zodToJsonSchema(config.inputSchema);
4858
4861
  }
4859
4862
  return config.inputSchema;
4860
4863
  }, [config.inputSchema]);
@@ -4870,6 +4873,7 @@ function useTool(config, dependencies = []) {
4870
4873
  render: config.render,
4871
4874
  available: config.available ?? true,
4872
4875
  needsApproval: config.needsApproval,
4876
+ approvalTitle: config.approvalTitle,
4873
4877
  approvalMessage: config.approvalMessage,
4874
4878
  hidden: config.hidden,
4875
4879
  deferLoading: config.deferLoading,
@@ -5208,7 +5212,7 @@ function CopilotProvider({
5208
5212
  }) {
5209
5213
  const debugLog = React2.useCallback(
5210
5214
  (action, data) => {
5211
- chunkI3SQUNTT_cjs.createLogger("provider", () => debug ?? false)(action, data);
5215
+ chunkWIXFZUEZ_cjs.createLogger("provider", () => debug ?? false)(action, data);
5212
5216
  },
5213
5217
  [debug]
5214
5218
  );
@@ -5626,17 +5630,17 @@ function useAITools(options = {}) {
5626
5630
  const rememberedConsentRef = React2.useRef(/* @__PURE__ */ new Set());
5627
5631
  React2.useEffect(() => {
5628
5632
  if (!autoStart || !isEnabled) return;
5629
- if (consoleCapture && !chunkI3SQUNTT_cjs.isConsoleCaptureActive()) {
5630
- chunkI3SQUNTT_cjs.startConsoleCapture(consoleOptions);
5633
+ if (consoleCapture && !chunkWIXFZUEZ_cjs.isConsoleCaptureActive()) {
5634
+ chunkWIXFZUEZ_cjs.startConsoleCapture(consoleOptions);
5631
5635
  setActiveCaptures((prev) => ({ ...prev, console: true }));
5632
5636
  }
5633
- if (network && !chunkI3SQUNTT_cjs.isNetworkCaptureActive()) {
5634
- chunkI3SQUNTT_cjs.startNetworkCapture(networkOptions);
5637
+ if (network && !chunkWIXFZUEZ_cjs.isNetworkCaptureActive()) {
5638
+ chunkWIXFZUEZ_cjs.startNetworkCapture(networkOptions);
5635
5639
  setActiveCaptures((prev) => ({ ...prev, network: true }));
5636
5640
  }
5637
5641
  return () => {
5638
- chunkI3SQUNTT_cjs.stopConsoleCapture();
5639
- chunkI3SQUNTT_cjs.stopNetworkCapture();
5642
+ chunkWIXFZUEZ_cjs.stopConsoleCapture();
5643
+ chunkWIXFZUEZ_cjs.stopNetworkCapture();
5640
5644
  };
5641
5645
  }, [
5642
5646
  autoStart,
@@ -5651,12 +5655,12 @@ function useAITools(options = {}) {
5651
5655
  if (!screenshot) {
5652
5656
  throw new Error("Screenshot capture is not enabled");
5653
5657
  }
5654
- if (!chunkI3SQUNTT_cjs.isScreenshotSupported()) {
5658
+ if (!chunkWIXFZUEZ_cjs.isScreenshotSupported()) {
5655
5659
  throw new Error(
5656
5660
  "Screenshot capture is not supported in this environment"
5657
5661
  );
5658
5662
  }
5659
- return chunkI3SQUNTT_cjs.captureScreenshot({ ...screenshotOptions, ...opts });
5663
+ return chunkWIXFZUEZ_cjs.captureScreenshot({ ...screenshotOptions, ...opts });
5660
5664
  },
5661
5665
  [screenshot, screenshotOptions]
5662
5666
  );
@@ -5665,7 +5669,7 @@ function useAITools(options = {}) {
5665
5669
  if (!consoleCapture) {
5666
5670
  return { logs: [], totalCaptured: 0 };
5667
5671
  }
5668
- return chunkI3SQUNTT_cjs.getConsoleLogs({ ...consoleOptions, ...opts });
5672
+ return chunkWIXFZUEZ_cjs.getConsoleLogs({ ...consoleOptions, ...opts });
5669
5673
  },
5670
5674
  [consoleCapture, consoleOptions]
5671
5675
  );
@@ -5674,7 +5678,7 @@ function useAITools(options = {}) {
5674
5678
  if (!network) {
5675
5679
  return { requests: [], totalCaptured: 0 };
5676
5680
  }
5677
- return chunkI3SQUNTT_cjs.getNetworkRequests({ ...networkOptions, ...opts });
5681
+ return chunkWIXFZUEZ_cjs.getNetworkRequests({ ...networkOptions, ...opts });
5678
5682
  },
5679
5683
  [network, networkOptions]
5680
5684
  );
@@ -5767,23 +5771,23 @@ function useAITools(options = {}) {
5767
5771
  ]
5768
5772
  );
5769
5773
  const startCapturing = React2.useCallback(() => {
5770
- if (consoleCapture && !chunkI3SQUNTT_cjs.isConsoleCaptureActive()) {
5771
- chunkI3SQUNTT_cjs.startConsoleCapture(consoleOptions);
5774
+ if (consoleCapture && !chunkWIXFZUEZ_cjs.isConsoleCaptureActive()) {
5775
+ chunkWIXFZUEZ_cjs.startConsoleCapture(consoleOptions);
5772
5776
  setActiveCaptures((prev) => ({ ...prev, console: true }));
5773
5777
  }
5774
- if (network && !chunkI3SQUNTT_cjs.isNetworkCaptureActive()) {
5775
- chunkI3SQUNTT_cjs.startNetworkCapture(networkOptions);
5778
+ if (network && !chunkWIXFZUEZ_cjs.isNetworkCaptureActive()) {
5779
+ chunkWIXFZUEZ_cjs.startNetworkCapture(networkOptions);
5776
5780
  setActiveCaptures((prev) => ({ ...prev, network: true }));
5777
5781
  }
5778
5782
  }, [consoleCapture, network, consoleOptions, networkOptions]);
5779
5783
  const stopCapturing = React2.useCallback(() => {
5780
- chunkI3SQUNTT_cjs.stopConsoleCapture();
5781
- chunkI3SQUNTT_cjs.stopNetworkCapture();
5784
+ chunkWIXFZUEZ_cjs.stopConsoleCapture();
5785
+ chunkWIXFZUEZ_cjs.stopNetworkCapture();
5782
5786
  setActiveCaptures({ console: false, network: false });
5783
5787
  }, []);
5784
5788
  const clearCaptured = React2.useCallback(() => {
5785
- chunkI3SQUNTT_cjs.clearConsoleLogs();
5786
- chunkI3SQUNTT_cjs.clearNetworkRequests();
5789
+ chunkWIXFZUEZ_cjs.clearConsoleLogs();
5790
+ chunkWIXFZUEZ_cjs.clearNetworkRequests();
5787
5791
  }, []);
5788
5792
  const formatForAI = React2.useCallback((context) => {
5789
5793
  const parts = [];
@@ -5793,16 +5797,16 @@ function useAITools(options = {}) {
5793
5797
  );
5794
5798
  }
5795
5799
  if (context.consoleLogs && context.consoleLogs.logs.length > 0) {
5796
- parts.push(chunkI3SQUNTT_cjs.formatLogsForAI(context.consoleLogs.logs));
5800
+ parts.push(chunkWIXFZUEZ_cjs.formatLogsForAI(context.consoleLogs.logs));
5797
5801
  }
5798
5802
  if (context.networkRequests && context.networkRequests.requests.length > 0) {
5799
- parts.push(chunkI3SQUNTT_cjs.formatRequestsForAI(context.networkRequests.requests));
5803
+ parts.push(chunkWIXFZUEZ_cjs.formatRequestsForAI(context.networkRequests.requests));
5800
5804
  }
5801
5805
  return parts.length > 0 ? parts.join("\n\n---\n\n") : "No context captured.";
5802
5806
  }, []);
5803
5807
  const detectIntentFn = React2.useCallback(
5804
5808
  (message) => {
5805
- const result = chunkI3SQUNTT_cjs.detectIntent(message);
5809
+ const result = chunkWIXFZUEZ_cjs.detectIntent(message);
5806
5810
  result.suggestedTools = result.suggestedTools.filter((tool2) => {
5807
5811
  if (tool2 === "screenshot") return screenshot;
5808
5812
  if (tool2 === "console") return consoleCapture;
@@ -5865,7 +5869,7 @@ function convertZodSchema(schema, _toolName) {
5865
5869
  }
5866
5870
  } catch {
5867
5871
  }
5868
- return chunkI3SQUNTT_cjs.zodObjectToInputSchema(schema);
5872
+ return chunkWIXFZUEZ_cjs.zodObjectToInputSchema(schema);
5869
5873
  }
5870
5874
  function useToolWithSchema(config, dependencies = []) {
5871
5875
  const { registerTool, unregisterTool } = useCopilot();
@@ -6174,7 +6178,7 @@ function useAgent(options) {
6174
6178
  if (!response.ok) {
6175
6179
  throw new Error(`Agent error: ${response.status}`);
6176
6180
  }
6177
- for await (const event of chunkI3SQUNTT_cjs.streamSSE(response)) {
6181
+ for await (const event of chunkWIXFZUEZ_cjs.streamSSE(response)) {
6178
6182
  handleAgentEvent(event);
6179
6183
  }
6180
6184
  } catch (err) {
@@ -6668,7 +6672,7 @@ function createReactThreadManagerState(initialThreads) {
6668
6672
  }
6669
6673
 
6670
6674
  // src/react/internal/ReactThreadManager.ts
6671
- var _ReactThreadManager = class _ReactThreadManager extends chunkI3SQUNTT_cjs.ThreadManager {
6675
+ var _ReactThreadManager = class _ReactThreadManager extends chunkWIXFZUEZ_cjs.ThreadManager {
6672
6676
  constructor(config = {}, callbacks = {}) {
6673
6677
  const reactState = new ReactThreadManagerState();
6674
6678
  super({ ...config, state: reactState }, callbacks);
@@ -7499,5 +7503,5 @@ exports.useToolExecutor = useToolExecutor;
7499
7503
  exports.useToolWithSchema = useToolWithSchema;
7500
7504
  exports.useTools = useTools;
7501
7505
  exports.useToolsWithSchema = useToolsWithSchema;
7502
- //# sourceMappingURL=chunk-IXWNDR7H.cjs.map
7503
- //# sourceMappingURL=chunk-IXWNDR7H.cjs.map
7506
+ //# sourceMappingURL=chunk-TCPAT3WG.cjs.map
7507
+ //# sourceMappingURL=chunk-TCPAT3WG.cjs.map