@yourgpt/copilot-sdk 2.1.5-alpha.0 → 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-6BMQZIS3.js → chunk-PT2TOHG5.js} +23 -8
  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-76RE7AJE.cjs → chunk-TCPAT3WG.cjs} +51 -36
  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 +434 -449
  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 +381 -396
  73. package/dist/ui/index.js.map +1 -1
  74. package/package.json +1 -1
  75. package/dist/chunk-6BMQZIS3.js.map +0 -1
  76. package/dist/chunk-76RE7AJE.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');
@@ -1647,18 +1647,23 @@ var AbstractChat = class {
1647
1647
  "resolveUnresolvedToolCalls",
1648
1648
  `Adding ${unresolvedIds.length} missing tool results`
1649
1649
  );
1650
+ const visibleMsgs = this.state.messages;
1651
+ let errorChainParentId = visibleMsgs.length > 0 ? visibleMsgs[visibleMsgs.length - 1].id : void 0;
1650
1652
  for (const toolCallId of unresolvedIds) {
1653
+ const toolMessageId = generateMessageId();
1651
1654
  const toolMessage = {
1652
- id: generateMessageId(),
1655
+ id: toolMessageId,
1653
1656
  role: "tool",
1654
1657
  content: JSON.stringify({
1655
1658
  success: false,
1656
1659
  error: "Tool execution was interrupted. Please try again."
1657
1660
  }),
1658
1661
  toolCallId,
1659
- createdAt: /* @__PURE__ */ new Date()
1662
+ createdAt: /* @__PURE__ */ new Date(),
1663
+ ...errorChainParentId !== void 0 ? { parentId: errorChainParentId } : {}
1660
1664
  };
1661
1665
  this.state.pushMessage(toolMessage);
1666
+ errorChainParentId = toolMessageId;
1662
1667
  }
1663
1668
  this.callbacks.onMessagesChange?.(this._allMessages());
1664
1669
  }
@@ -1674,6 +1679,8 @@ var AbstractChat = class {
1674
1679
  this.debug("continueWithToolResults", toolResults);
1675
1680
  try {
1676
1681
  const attachmentsToAdd = [];
1682
+ const visibleMessages = this.state.messages;
1683
+ let chainParentId = visibleMessages.length > 0 ? visibleMessages[visibleMessages.length - 1].id : void 0;
1677
1684
  for (const { toolCallId, result } of toolResults) {
1678
1685
  const typedResult = result;
1679
1686
  let messageContent;
@@ -1690,14 +1697,17 @@ var AbstractChat = class {
1690
1697
  } else {
1691
1698
  messageContent = typeof result === "string" ? result : JSON.stringify(result);
1692
1699
  }
1700
+ const toolMessageId = generateMessageId();
1693
1701
  const toolMessage = {
1694
- id: generateMessageId(),
1702
+ id: toolMessageId,
1695
1703
  role: "tool",
1696
1704
  content: messageContent,
1697
1705
  toolCallId,
1698
- createdAt: /* @__PURE__ */ new Date()
1706
+ createdAt: /* @__PURE__ */ new Date(),
1707
+ ...chainParentId !== void 0 ? { parentId: chainParentId } : {}
1699
1708
  };
1700
1709
  this.state.pushMessage(toolMessage);
1710
+ chainParentId = toolMessageId;
1701
1711
  }
1702
1712
  if (attachmentsToAdd.length > 0) {
1703
1713
  this.debug(
@@ -1709,7 +1719,8 @@ var AbstractChat = class {
1709
1719
  role: "user",
1710
1720
  content: "Here's my screen:",
1711
1721
  attachments: attachmentsToAdd,
1712
- createdAt: /* @__PURE__ */ new Date()
1722
+ createdAt: /* @__PURE__ */ new Date(),
1723
+ ...chainParentId !== void 0 ? { parentId: chainParentId } : {}
1713
1724
  };
1714
1725
  this.state.pushMessage(userMessage);
1715
1726
  }
@@ -2408,7 +2419,7 @@ ${this.dynamicContext}`.trim() : this.config.systemPrompt;
2408
2419
  }
2409
2420
  get log() {
2410
2421
  if (!this._log) {
2411
- this._log = chunkI3SQUNTT_cjs.createLogger("streaming", () => this.config.debug ?? false);
2422
+ this._log = chunkWIXFZUEZ_cjs.createLogger("streaming", () => this.config.debug ?? false);
2412
2423
  }
2413
2424
  return this._log;
2414
2425
  }
@@ -2682,11 +2693,14 @@ var AbstractAgentLoop = class {
2682
2693
  }
2683
2694
  let approvalData;
2684
2695
  if (tool2.needsApproval && !this.config.autoApprove) {
2696
+ const approvalTitle = typeof tool2.approvalTitle === "function" ? tool2.approvalTitle(toolCall.args) : tool2.approvalTitle;
2685
2697
  const approvalMessage = typeof tool2.approvalMessage === "function" ? tool2.approvalMessage(toolCall.args) : tool2.approvalMessage;
2686
2698
  execution.approvalStatus = "required";
2699
+ execution.approvalTitle = approvalTitle;
2687
2700
  execution.approvalMessage = approvalMessage;
2688
2701
  this.updateToolExecution(toolCall.id, {
2689
2702
  approvalStatus: "required",
2703
+ approvalTitle,
2690
2704
  approvalMessage
2691
2705
  });
2692
2706
  this.callbacks.onApprovalRequired?.(execution);
@@ -3329,7 +3343,7 @@ var ChatWithTools = class {
3329
3343
  // Private
3330
3344
  // ============================================
3331
3345
  debug(message, ...args) {
3332
- chunkI3SQUNTT_cjs.createLogger("tools", () => this.config.debug ?? false)(
3346
+ chunkWIXFZUEZ_cjs.createLogger("tools", () => this.config.debug ?? false)(
3333
3347
  message,
3334
3348
  args.length === 1 ? args[0] : args.length > 1 ? args : void 0
3335
3349
  );
@@ -4843,7 +4857,7 @@ function useTool(config, dependencies = []) {
4843
4857
  configRef.current = config;
4844
4858
  const inputSchema = React2.useMemo(() => {
4845
4859
  if (isZodSchema(config.inputSchema)) {
4846
- return chunkI3SQUNTT_cjs.zodToJsonSchema(config.inputSchema);
4860
+ return chunkWIXFZUEZ_cjs.zodToJsonSchema(config.inputSchema);
4847
4861
  }
4848
4862
  return config.inputSchema;
4849
4863
  }, [config.inputSchema]);
@@ -4859,6 +4873,7 @@ function useTool(config, dependencies = []) {
4859
4873
  render: config.render,
4860
4874
  available: config.available ?? true,
4861
4875
  needsApproval: config.needsApproval,
4876
+ approvalTitle: config.approvalTitle,
4862
4877
  approvalMessage: config.approvalMessage,
4863
4878
  hidden: config.hidden,
4864
4879
  deferLoading: config.deferLoading,
@@ -5197,7 +5212,7 @@ function CopilotProvider({
5197
5212
  }) {
5198
5213
  const debugLog = React2.useCallback(
5199
5214
  (action, data) => {
5200
- chunkI3SQUNTT_cjs.createLogger("provider", () => debug ?? false)(action, data);
5215
+ chunkWIXFZUEZ_cjs.createLogger("provider", () => debug ?? false)(action, data);
5201
5216
  },
5202
5217
  [debug]
5203
5218
  );
@@ -5615,17 +5630,17 @@ function useAITools(options = {}) {
5615
5630
  const rememberedConsentRef = React2.useRef(/* @__PURE__ */ new Set());
5616
5631
  React2.useEffect(() => {
5617
5632
  if (!autoStart || !isEnabled) return;
5618
- if (consoleCapture && !chunkI3SQUNTT_cjs.isConsoleCaptureActive()) {
5619
- chunkI3SQUNTT_cjs.startConsoleCapture(consoleOptions);
5633
+ if (consoleCapture && !chunkWIXFZUEZ_cjs.isConsoleCaptureActive()) {
5634
+ chunkWIXFZUEZ_cjs.startConsoleCapture(consoleOptions);
5620
5635
  setActiveCaptures((prev) => ({ ...prev, console: true }));
5621
5636
  }
5622
- if (network && !chunkI3SQUNTT_cjs.isNetworkCaptureActive()) {
5623
- chunkI3SQUNTT_cjs.startNetworkCapture(networkOptions);
5637
+ if (network && !chunkWIXFZUEZ_cjs.isNetworkCaptureActive()) {
5638
+ chunkWIXFZUEZ_cjs.startNetworkCapture(networkOptions);
5624
5639
  setActiveCaptures((prev) => ({ ...prev, network: true }));
5625
5640
  }
5626
5641
  return () => {
5627
- chunkI3SQUNTT_cjs.stopConsoleCapture();
5628
- chunkI3SQUNTT_cjs.stopNetworkCapture();
5642
+ chunkWIXFZUEZ_cjs.stopConsoleCapture();
5643
+ chunkWIXFZUEZ_cjs.stopNetworkCapture();
5629
5644
  };
5630
5645
  }, [
5631
5646
  autoStart,
@@ -5640,12 +5655,12 @@ function useAITools(options = {}) {
5640
5655
  if (!screenshot) {
5641
5656
  throw new Error("Screenshot capture is not enabled");
5642
5657
  }
5643
- if (!chunkI3SQUNTT_cjs.isScreenshotSupported()) {
5658
+ if (!chunkWIXFZUEZ_cjs.isScreenshotSupported()) {
5644
5659
  throw new Error(
5645
5660
  "Screenshot capture is not supported in this environment"
5646
5661
  );
5647
5662
  }
5648
- return chunkI3SQUNTT_cjs.captureScreenshot({ ...screenshotOptions, ...opts });
5663
+ return chunkWIXFZUEZ_cjs.captureScreenshot({ ...screenshotOptions, ...opts });
5649
5664
  },
5650
5665
  [screenshot, screenshotOptions]
5651
5666
  );
@@ -5654,7 +5669,7 @@ function useAITools(options = {}) {
5654
5669
  if (!consoleCapture) {
5655
5670
  return { logs: [], totalCaptured: 0 };
5656
5671
  }
5657
- return chunkI3SQUNTT_cjs.getConsoleLogs({ ...consoleOptions, ...opts });
5672
+ return chunkWIXFZUEZ_cjs.getConsoleLogs({ ...consoleOptions, ...opts });
5658
5673
  },
5659
5674
  [consoleCapture, consoleOptions]
5660
5675
  );
@@ -5663,7 +5678,7 @@ function useAITools(options = {}) {
5663
5678
  if (!network) {
5664
5679
  return { requests: [], totalCaptured: 0 };
5665
5680
  }
5666
- return chunkI3SQUNTT_cjs.getNetworkRequests({ ...networkOptions, ...opts });
5681
+ return chunkWIXFZUEZ_cjs.getNetworkRequests({ ...networkOptions, ...opts });
5667
5682
  },
5668
5683
  [network, networkOptions]
5669
5684
  );
@@ -5756,23 +5771,23 @@ function useAITools(options = {}) {
5756
5771
  ]
5757
5772
  );
5758
5773
  const startCapturing = React2.useCallback(() => {
5759
- if (consoleCapture && !chunkI3SQUNTT_cjs.isConsoleCaptureActive()) {
5760
- chunkI3SQUNTT_cjs.startConsoleCapture(consoleOptions);
5774
+ if (consoleCapture && !chunkWIXFZUEZ_cjs.isConsoleCaptureActive()) {
5775
+ chunkWIXFZUEZ_cjs.startConsoleCapture(consoleOptions);
5761
5776
  setActiveCaptures((prev) => ({ ...prev, console: true }));
5762
5777
  }
5763
- if (network && !chunkI3SQUNTT_cjs.isNetworkCaptureActive()) {
5764
- chunkI3SQUNTT_cjs.startNetworkCapture(networkOptions);
5778
+ if (network && !chunkWIXFZUEZ_cjs.isNetworkCaptureActive()) {
5779
+ chunkWIXFZUEZ_cjs.startNetworkCapture(networkOptions);
5765
5780
  setActiveCaptures((prev) => ({ ...prev, network: true }));
5766
5781
  }
5767
5782
  }, [consoleCapture, network, consoleOptions, networkOptions]);
5768
5783
  const stopCapturing = React2.useCallback(() => {
5769
- chunkI3SQUNTT_cjs.stopConsoleCapture();
5770
- chunkI3SQUNTT_cjs.stopNetworkCapture();
5784
+ chunkWIXFZUEZ_cjs.stopConsoleCapture();
5785
+ chunkWIXFZUEZ_cjs.stopNetworkCapture();
5771
5786
  setActiveCaptures({ console: false, network: false });
5772
5787
  }, []);
5773
5788
  const clearCaptured = React2.useCallback(() => {
5774
- chunkI3SQUNTT_cjs.clearConsoleLogs();
5775
- chunkI3SQUNTT_cjs.clearNetworkRequests();
5789
+ chunkWIXFZUEZ_cjs.clearConsoleLogs();
5790
+ chunkWIXFZUEZ_cjs.clearNetworkRequests();
5776
5791
  }, []);
5777
5792
  const formatForAI = React2.useCallback((context) => {
5778
5793
  const parts = [];
@@ -5782,16 +5797,16 @@ function useAITools(options = {}) {
5782
5797
  );
5783
5798
  }
5784
5799
  if (context.consoleLogs && context.consoleLogs.logs.length > 0) {
5785
- parts.push(chunkI3SQUNTT_cjs.formatLogsForAI(context.consoleLogs.logs));
5800
+ parts.push(chunkWIXFZUEZ_cjs.formatLogsForAI(context.consoleLogs.logs));
5786
5801
  }
5787
5802
  if (context.networkRequests && context.networkRequests.requests.length > 0) {
5788
- parts.push(chunkI3SQUNTT_cjs.formatRequestsForAI(context.networkRequests.requests));
5803
+ parts.push(chunkWIXFZUEZ_cjs.formatRequestsForAI(context.networkRequests.requests));
5789
5804
  }
5790
5805
  return parts.length > 0 ? parts.join("\n\n---\n\n") : "No context captured.";
5791
5806
  }, []);
5792
5807
  const detectIntentFn = React2.useCallback(
5793
5808
  (message) => {
5794
- const result = chunkI3SQUNTT_cjs.detectIntent(message);
5809
+ const result = chunkWIXFZUEZ_cjs.detectIntent(message);
5795
5810
  result.suggestedTools = result.suggestedTools.filter((tool2) => {
5796
5811
  if (tool2 === "screenshot") return screenshot;
5797
5812
  if (tool2 === "console") return consoleCapture;
@@ -5854,7 +5869,7 @@ function convertZodSchema(schema, _toolName) {
5854
5869
  }
5855
5870
  } catch {
5856
5871
  }
5857
- return chunkI3SQUNTT_cjs.zodObjectToInputSchema(schema);
5872
+ return chunkWIXFZUEZ_cjs.zodObjectToInputSchema(schema);
5858
5873
  }
5859
5874
  function useToolWithSchema(config, dependencies = []) {
5860
5875
  const { registerTool, unregisterTool } = useCopilot();
@@ -6163,7 +6178,7 @@ function useAgent(options) {
6163
6178
  if (!response.ok) {
6164
6179
  throw new Error(`Agent error: ${response.status}`);
6165
6180
  }
6166
- for await (const event of chunkI3SQUNTT_cjs.streamSSE(response)) {
6181
+ for await (const event of chunkWIXFZUEZ_cjs.streamSSE(response)) {
6167
6182
  handleAgentEvent(event);
6168
6183
  }
6169
6184
  } catch (err) {
@@ -6657,7 +6672,7 @@ function createReactThreadManagerState(initialThreads) {
6657
6672
  }
6658
6673
 
6659
6674
  // src/react/internal/ReactThreadManager.ts
6660
- var _ReactThreadManager = class _ReactThreadManager extends chunkI3SQUNTT_cjs.ThreadManager {
6675
+ var _ReactThreadManager = class _ReactThreadManager extends chunkWIXFZUEZ_cjs.ThreadManager {
6661
6676
  constructor(config = {}, callbacks = {}) {
6662
6677
  const reactState = new ReactThreadManagerState();
6663
6678
  super({ ...config, state: reactState }, callbacks);
@@ -7488,5 +7503,5 @@ exports.useToolExecutor = useToolExecutor;
7488
7503
  exports.useToolWithSchema = useToolWithSchema;
7489
7504
  exports.useTools = useTools;
7490
7505
  exports.useToolsWithSchema = useToolsWithSchema;
7491
- //# sourceMappingURL=chunk-76RE7AJE.cjs.map
7492
- //# sourceMappingURL=chunk-76RE7AJE.cjs.map
7506
+ //# sourceMappingURL=chunk-TCPAT3WG.cjs.map
7507
+ //# sourceMappingURL=chunk-TCPAT3WG.cjs.map