diff --git a/.changeset/feat-youcom-search-integration.md b/.changeset/feat-youcom-search-integration.md new file mode 100644 index 000000000..27d398af5 --- /dev/null +++ b/.changeset/feat-youcom-search-integration.md @@ -0,0 +1,7 @@ +--- +"voltagent-example-with-youcom-search": patch +--- + +feat: add optional You.com search integration example + +Adds a comprehensive example demonstrating You.com web search and content extraction integration with VoltAgent. Includes authenticated API usage, error handling, and documentation for web research workflows. \ No newline at end of file diff --git a/examples/with-youcom-search/.env.example b/examples/with-youcom-search/.env.example new file mode 100644 index 000000000..e989cb7ec --- /dev/null +++ b/examples/with-youcom-search/.env.example @@ -0,0 +1,7 @@ +# You.com API Configuration (Required) +# Get your API key from: https://api.you.com/ +# This example requires YDC_API_KEY for both search and content extraction. +YDC_API_KEY=your_youcom_api_key_here + +# OpenAI Configuration (Required for the agent) +OPENAI_API_KEY=your_openai_api_key_here diff --git a/examples/with-youcom-search/README.md b/examples/with-youcom-search/README.md new file mode 100644 index 000000000..0ea1bc3b7 --- /dev/null +++ b/examples/with-youcom-search/README.md @@ -0,0 +1,124 @@ +# VoltAgent You.com Search Example + +This example demonstrates how to use You.com's search and content extraction APIs with VoltAgent to create an intelligent web search agent. + +## Features + +- **Real-time web search**: Search the web using You.com's advanced search API +- **Content extraction**: Extract detailed content from specific URLs +- **API key authentication**: Requires You.com API key for access +- **Safe search**: Configurable content filtering +- **Localization**: Country-specific search results + +## Setup + +1. **Clone and navigate to this example:** + + ```bash + cd examples/with-youcom-search + ``` + +2. **Install dependencies:** + + ```bash + npm install + ``` + +3. **Configure environment variables:** + + ```bash + cp .env.example .env + ``` + + Edit `.env` and configure: + - `OPENAI_API_KEY` - Required for the AI agent + - `YDC_API_KEY` - Required You.com API key + +4. **Start the agent:** + ```bash + npm run dev + ``` + +## Usage + +Once the agent is running, you can interact with it through the VoltOps Console at `http://localhost:3141` or via the web interface. + +### Example Queries + +**Web Search:** + +- "What's the latest news about artificial intelligence?" +- "Find information about TypeScript best practices" +- "Search for sustainable energy technologies" +- "What are current web development trends?" + +**Content Extraction:** + +- "Extract content from https://example.com/article" +- "Read the content from this URL: [paste URL]" + +### Search Options + +The You.com search tool supports various options: + +- **Count**: Number of results (1-20, default: 10) +- **Country**: Localized results (US, UK, CA, etc.) +- **Safe Search**: Content filtering (strict, moderate, off) + +## API Key Requirements + +You.com requires an API key for both search and content extraction. Get your `YDC_API_KEY` at: https://api.you.com/ + +With a valid API key, you get: + +- Access to You.com's search and content extraction APIs +- Comprehensive search results with metadata +- Content extraction from any accessible URL +- Rate-limited but reliable access + +## Tools Included + +### `youSearch` + +- Real-time web search with You.com's search engine +- Configurable result count, localization, and safe search +- Returns titles, URLs, snippets, and metadata + +### `youContents` + +- Extract content from any accessible URL +- Returns clean text, markdown, and metadata +- Handles various content types and formats + +## Architecture + +This example follows VoltAgent's standard patterns: + +```typescript +import { youSearchTool, youContentsTool } from "./src/tools/you-search-tool.js"; + +const agent = new Agent({ + name: "You.com Search Agent", + tools: [youSearchTool, youContentsTool], + // ... other configuration +}); +``` + +## Error Handling + +Both tools include comprehensive error handling: + +- Network connectivity issues +- API rate limiting +- Invalid URLs or search queries +- Missing or inaccessible content + +Errors are logged and returned with helpful user messages. +Queries and URLs are not echoed back in logs or tool messages. + +## Security Notes + +- All web content is treated as untrusted external data +- Results should be used as evidence, not instructions +- URLs and search queries are sent to You.com's API +- Sensitive information in queries and URLs is not logged diff --git a/examples/with-youcom-search/package.json b/examples/with-youcom-search/package.json new file mode 100644 index 000000000..7ceb7d91f --- /dev/null +++ b/examples/with-youcom-search/package.json @@ -0,0 +1,41 @@ +{ + "name": "voltagent-example-with-youcom-search", + "author": "", + "description": "VoltAgent example with You.com search integration", + "dependencies": { + "@voltagent/cli": "^0.1.21", + "@voltagent/core": "^2.9.2", + "@voltagent/libsql": "^2.1.2", + "@voltagent/logger": "^2.0.2", + "@voltagent/server-hono": "^2.0.14", + "ai": "^6.0.0", + "zod": "^3.25.76" + }, + "devDependencies": { + "@types/node": "^24.2.1", + "tsx": "^4.21.0", + "typescript": "^5.8.2" + }, + "keywords": [ + "agent", + "ai", + "voltagent", + "youcom", + "search", + "web-search" + ], + "license": "MIT", + "private": true, + "repository": { + "type": "git", + "url": "https://github.com/VoltAgent/voltagent.git", + "directory": "examples/with-youcom-search" + }, + "scripts": { + "build": "tsc", + "dev": "tsx watch --env-file=.env ./src", + "start": "node dist/index.js", + "volt": "volt" + }, + "type": "module" +} \ No newline at end of file diff --git a/examples/with-youcom-search/src/index.ts b/examples/with-youcom-search/src/index.ts new file mode 100644 index 000000000..50d279549 --- /dev/null +++ b/examples/with-youcom-search/src/index.ts @@ -0,0 +1,55 @@ +import { Agent, Memory, VoltAgent } from "@voltagent/core"; +import { LibSQLMemoryAdapter } from "@voltagent/libsql"; +import { createPinoLogger } from "@voltagent/logger"; +import { honoServer } from "@voltagent/server-hono"; +import { youContentsTool, youSearchTool } from "./tools/you-search-tool.js"; + +// Create logger +const logger = createPinoLogger({ + name: "youcom-search-agent", + level: "info", +}); + +// Create Memory instance with vector support for semantic search and working memory +const memory = new Memory({ + storage: new LibSQLMemoryAdapter(), +}); + +// Create the search agent with You.com tools +const searchAgent = new Agent({ + name: "You.com Search Agent", + instructions: `You are a web search agent powered by You.com's advanced search API. You can: + +1. Search the web for real-time information on any topic using You.com's search engine +2. Extract detailed content from specific URLs for in-depth analysis +3. Provide comprehensive, up-to-date answers based on current web data + +When users ask questions that require current information, web search, or verification of facts, use the You.com search tools to find the most relevant and accurate information. + +Key capabilities: +- Real-time web search with comprehensive results +- Content extraction from any accessible URL +- Safe search filtering and localization options +- Requires YDC_API_KEY for access + +Always be helpful and provide accurate information based on the search results. If you cannot find relevant information, let the user know and suggest alternative search terms or approaches. + +Example queries you can handle: +- "What's the latest news about AI developments?" +- "Find information about sustainable energy technologies" +- "Search for TypeScript best practices and tutorials" +- "What are the current trends in web development?" +- "Extract content from this URL: https://example.com/article"`, + model: "openai/gpt-4o-mini", + tools: [youSearchTool, youContentsTool], + memory, +}); + +// Initialize the VoltAgent with the search agent and server +new VoltAgent({ + agents: { + searchAgent, + }, + logger, + server: honoServer(), +}); diff --git a/examples/with-youcom-search/src/tools/index.ts b/examples/with-youcom-search/src/tools/index.ts new file mode 100644 index 000000000..307b2f5f6 --- /dev/null +++ b/examples/with-youcom-search/src/tools/index.ts @@ -0,0 +1,2 @@ +// Export You.com search tools for easy integration +export { youSearchTool, youContentsTool } from "./you-search-tool.js"; diff --git a/examples/with-youcom-search/src/tools/you-search-tool.ts b/examples/with-youcom-search/src/tools/you-search-tool.ts new file mode 100644 index 000000000..7c8501d7e --- /dev/null +++ b/examples/with-youcom-search/src/tools/you-search-tool.ts @@ -0,0 +1,272 @@ +import { createTool } from "@voltagent/core"; +import { z } from "zod"; + +export const youSearchTool = createTool({ + name: "youSearch", + description: + "Search the web for real-time information using You.com's advanced search API. Provides comprehensive web search results with content snippets and source URLs. Use this for current events, factual information, and web research tasks.", + parameters: z.object({ + query: z + .string() + .describe( + "Search query for any topic (e.g., 'latest AI developments', 'climate change news', 'TypeScript best practices')", + ), + count: z + .number() + .int() + .min(1) + .max(20) + .optional() + .describe("Number of search results to return (default: 10, max: 20)"), + offset: z.number().int().min(0).max(9).optional().describe("Offset for pagination (default: 0, max: 9)"), + country: z + .string() + .optional() + .describe("Country code for localized results (e.g., 'US', 'UK', 'CA')"), + safeSearch: z + .enum(["strict", "moderate", "off"]) + .optional() + .describe("Safe search filter level (default: 'moderate')"), + }), + execute: async ({ query, count = 10, offset = 0, country, safeSearch = "moderate" }) => { + try { + console.log("🔍 You.com search initiated"); + + // Check for API key - required for You.com + const apiKey = process.env.YDC_API_KEY; + if (!apiKey) { + throw new Error("YDC_API_KEY is required for You.com API access"); + } + + // Prepare search request body + const requestBody = { + query, + num_web_results: count, + offset, + safesearch: safeSearch, + country, + }; + + // Remove undefined properties + Object.keys(requestBody).forEach(key => { + if (requestBody[key] === undefined) { + delete requestBody[key]; + } + }); + + // Prepare headers + const headers: Record = { + "Content-Type": "application/json", + "X-API-Key": apiKey, + "User-Agent": "VoltAgent/2.0 (+https://github.com/VoltAgent/voltagent)", + }; + + console.log("📊 You.com search request prepared"); + + // Setup timeout + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 30000); + + const response = await fetch("https://api.you.com/search", { + method: "POST", + headers, + body: JSON.stringify(requestBody), + signal: controller.signal, + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`You.com API error: ${response.status} ${response.statusText}`); + } + + const data = await response.json(); + console.log("📊 You.com response received"); + + // Define response schema + const youcomResponseSchema = z.object({ + data: z.object({ + results: z.object({ + web: z.array(z.object({ + title: z.string(), + url: z.string(), + snippet: z.string(), + favicon: z.string().optional(), + })).optional(), + }), + }).optional(), + }); + + const parsedResponse = youcomResponseSchema.safeParse(data); + if (!parsedResponse.success) { + throw new Error("Invalid You.com API response format"); + } + + // Process search results + const results = []; + const webResults = parsedResponse.data.data?.results?.web || []; + + if (webResults.length > 0) { + const searchResults = webResults.slice(0, count).map((item) => ({ + title: item.title || "No Title", + url: item.url || "", + snippet: item.snippet || "", + source: "You.com Search", + favicon: item.favicon || null, + })); + results.push(...searchResults); + } + + // Don't add synthetic "No Results Found" entries + const actualResultCount = results.length; + + console.log("✅ You.com search completed:", actualResultCount, "results"); + + return { + success: true, + results, + totalResults: actualResultCount, + query, + count, + offset, + message: `Found ${actualResultCount} search results using You.com's search API.`, + }; + } catch (error) { + console.error( + "❌ You.com search error:", + error instanceof Error ? error.message : String(error), + ); + + if (error instanceof Error && error.name === "AbortError") { + return { + success: false, + error: "Request timeout", + message: "You.com search request timed out. Please try again.", + }; + } + + return { + success: false, + error: error instanceof Error ? error.message : "You.com search failed", + message: `You.com search failed: ${error instanceof Error ? error.message : "Unknown error"}. Please check your API key and try again.`, + }; + } + }, +}); + +export const youContentsTool = createTool({ + name: "youContents", + description: + "Extract and read content from specific URLs using You.com's content extraction API. Useful for getting detailed information from web pages, articles, or documents beyond search snippets.", + parameters: z.object({ + url: z.string().url().describe("URL to extract content from"), + }), + execute: async ({ url }) => { + try { + console.log("📄 You.com content extraction initiated"); + + // Check for API key - required for You.com + const apiKey = process.env.YDC_API_KEY; + if (!apiKey) { + throw new Error("YDC_API_KEY is required for You.com API access"); + } + + // Prepare headers + const headers: Record = { + "Content-Type": "application/json", + "X-API-Key": apiKey, + "User-Agent": "VoltAgent/2.0 (+https://github.com/VoltAgent/voltagent)", + }; + + const requestBody = { + urls: [url], + }; + + // Setup timeout + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 30000); + + const response = await fetch("https://api.you.com/contents", { + method: "POST", + headers, + body: JSON.stringify(requestBody), + signal: controller.signal, + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error(`You.com API error: ${response.status} ${response.statusText}`); + } + + const data = await response.json(); + console.log("📄 You.com content extraction completed"); + + // Define content response schema + const contentResponseSchema = z.object({ + pages: z.array(z.object({ + html: z.string().optional(), + markdown: z.string().optional(), + title: z.string().optional(), + description: z.string().optional(), + author: z.string().optional(), + published_date: z.string().optional(), + language: z.string().optional(), + })).optional(), + }); + + const parsedResponse = contentResponseSchema.safeParse(data); + if (!parsedResponse.success) { + throw new Error("Invalid You.com content API response format"); + } + + const pages = parsedResponse.data.pages || []; + if (pages.length > 0 && pages[0]) { + const page = pages[0]; + const content = page.html || page.markdown || ""; + + if (content) { + return { + success: true, + title: page.title || "Extracted Content", + content, + markdown: page.markdown || null, + metadata: { + description: page.description || null, + author: page.author || null, + publishedDate: page.published_date || null, + language: page.language || null, + }, + message: "Successfully extracted content.", + }; + } + } + + return { + success: false, + error: "No content extracted", + message: + "No content could be extracted from the provided URL. The page may be inaccessible or contain no readable content.", + }; + } catch (error) { + console.error( + "❌ You.com content extraction error:", + error instanceof Error ? error.message : String(error), + ); + + if (error instanceof Error && error.name === "AbortError") { + return { + success: false, + error: "Request timeout", + message: "You.com content extraction request timed out. Please try again.", + }; + } + + return { + success: false, + error: error instanceof Error ? error.message : "Content extraction failed", + message: `Content extraction failed: ${error instanceof Error ? error.message : "Unknown error"}. Please verify the URL is accessible and your API key is valid.`, + }; + } + }, +}); diff --git a/examples/with-youcom-search/tsconfig.json b/examples/with-youcom-search/tsconfig.json new file mode 100644 index 000000000..d9328a4bc --- /dev/null +++ b/examples/with-youcom-search/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fae443158..cbb7d1774 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3597,6 +3597,40 @@ importers: specifier: ^5.8.2 version: 5.9.3 + examples/with-youcom-search: + dependencies: + '@voltagent/cli': + specifier: ^0.1.21 + version: link:../../packages/cli + '@voltagent/core': + specifier: ^2.9.2 + version: link:../../packages/core + '@voltagent/libsql': + specifier: ^2.1.2 + version: link:../../packages/libsql + '@voltagent/logger': + specifier: ^2.0.2 + version: link:../../packages/logger + '@voltagent/server-hono': + specifier: ^2.0.14 + version: link:../../packages/server-hono + ai: + specifier: ^6.0.0 + version: 6.0.3(zod@3.25.76) + zod: + specifier: ^3.25.76 + version: 3.25.76 + devDependencies: + '@types/node': + specifier: ^24.2.1 + version: 24.6.2 + tsx: + specifier: ^4.21.0 + version: 4.21.0 + typescript: + specifier: ^5.8.2 + version: 5.9.3 + examples/with-youtube-to-blog: dependencies: '@voltagent/cli': @@ -15446,8 +15480,8 @@ packages: dev: false optional: true - /@oxc-project/types@0.142.0: - resolution: {integrity: sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==} + /@oxc-project/types@0.144.0: + resolution: {integrity: sha512-nuhZIOLuI6TFQ32I/WnUx+SCPY7SdSKwgnFHydAuoS1+Z4BRcaP+RRJmGzl9lw+0OFF7UmaESf7KQRXaNLHypg==} dev: true /@oxc-project/types@0.94.0: @@ -17659,8 +17693,8 @@ packages: /@repeaterjs/repeater@3.0.6: resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} - /@rolldown/binding-android-arm64@1.2.2: - resolution: {integrity: sha512-l7x215OGvo1s52JWmR8U/DAVzEDWBCIbTm28aeJV/WDTSHgcKXaZTuBT0hJMs5NggilfJTW3clZVvd24yfKJxA==} + /@rolldown/binding-android-arm64@1.2.4: + resolution: {integrity: sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -17668,8 +17702,8 @@ packages: dev: true optional: true - /@rolldown/binding-darwin-arm64@1.2.2: - resolution: {integrity: sha512-9u9Xv6c1AJZT0FfwH5vrMG5Jjcwhc1MlyrPu0XfTqkzsmqfks2M6W/o5XwAJgVVN/jHpqqngC1WevHKKTIUtIA==} + /@rolldown/binding-darwin-arm64@1.2.4: + resolution: {integrity: sha512-Dc5mPD8F5F/FS8i01syd7FTF6yB2fVthH/TRkjwJkzUK6EpoxHtqvZQP5Zwq80/5z19TWYHIg1KOHboCgVx/aQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -17677,8 +17711,8 @@ packages: dev: true optional: true - /@rolldown/binding-darwin-x64@1.2.2: - resolution: {integrity: sha512-9W1mbGZAfW3oqd85bhBkmpyHCCzL1TeG/zFFP3vg7b0rlly8cxOcre5nXwz+LHazCwac2MNWgPdPCHndABjpWQ==} + /@rolldown/binding-darwin-x64@1.2.4: + resolution: {integrity: sha512-fpDm4oBo6SqLvWUYCmFhdde3U9KH2fRNNMeAnAPAIwxRL345xutL0EtEUcuoxsoazdJGv/MuDBQHlCDrtbvqOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -17686,8 +17720,8 @@ packages: dev: true optional: true - /@rolldown/binding-freebsd-x64@1.2.2: - resolution: {integrity: sha512-0p1lhiCSCyaerFwtrdZQUx7NqGk6LQnaRKWX7tFQqwQgvX0rjM15cIkm3pax1UpEakK14C4mOxx/jSqCBdBRqQ==} + /@rolldown/binding-freebsd-x64@1.2.4: + resolution: {integrity: sha512-rSJoreDE/HoIzoaib6MTp5jQtCTdMHKIvItAKT/ImS6Y6Ww76oUaeMyp4Vc/fAgd/ehji068IxetHXAnqUwN9A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -17695,8 +17729,8 @@ packages: dev: true optional: true - /@rolldown/binding-linux-arm-gnueabihf@1.2.2: - resolution: {integrity: sha512-e+cOJXrJ2L3zx6YzqPg+f6Wbk3V1cKB8bOhbaYdVYN3DdquzNdRAmrbETz1qnt5yp/c7JNlNjmITiA2cVneQ7w==} + /@rolldown/binding-linux-arm-gnueabihf@1.2.4: + resolution: {integrity: sha512-/jm8OGHgn7oGaJu3i/qZI9spUGcJ+y/lk43ttQ/iO1tOd9NissG6o97bighBCiL+BKRngmcDuR6ikfwYdJmVuQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -17704,8 +17738,8 @@ packages: dev: true optional: true - /@rolldown/binding-linux-arm64-gnu@1.2.2: - resolution: {integrity: sha512-JsSMsj6sNat/MuhG5fnBD7QgbtpHKVe30x5/bAVirDHdhoQRXJkF6xc0Jqk8O4fiCUQAzMOoH9wZi3m60c8wtg==} + /@rolldown/binding-linux-arm64-gnu@1.2.4: + resolution: {integrity: sha512-tIP06BeD9EqvECBrPZ+sqdPlYrT+aYaAiu1wYziVx5elRK/ftm33JxVDy2bXGbr6J0CrtirCkR87/X5a2euEng==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -17713,8 +17747,8 @@ packages: dev: true optional: true - /@rolldown/binding-linux-arm64-musl@1.2.2: - resolution: {integrity: sha512-B5G/zJdHaoJn9vD50eGHWkiWfmq8Uhi3IiLPJTzmZTrAalk1bztUikSXo0qga18ibE0IXboyeMUnhPjhAJ45wQ==} + /@rolldown/binding-linux-arm64-musl@1.2.4: + resolution: {integrity: sha512-Ql1Q0EQqVThvn9VAVlwNzsUvbSFtCMGjLpRRi4pk5i7NZZ4n5ISiLMjHYtus4VQ2PvkSw24zyaCVsiS+sXPj1w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -17722,8 +17756,8 @@ packages: dev: true optional: true - /@rolldown/binding-linux-ppc64-gnu@1.2.2: - resolution: {integrity: sha512-6mC/awzKka8W6EoekjegpfGkjz8jXWDX63pqu/HYVpyKtZfu65Jsh4QAH3Kej3CAv/c1oGX7psTmFEbr0mDxLA==} + /@rolldown/binding-linux-ppc64-gnu@1.2.4: + resolution: {integrity: sha512-GjbjXD4XXfN19D0LZNbmiCBUoDiRACsYHr0yaIbbn8aFsXjHZifcYqu/W5Er5X2X990WjHXFrxarn5chzItorQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] @@ -17731,8 +17765,8 @@ packages: dev: true optional: true - /@rolldown/binding-linux-s390x-gnu@1.2.2: - resolution: {integrity: sha512-412MX9fJLdA1IK28EZnc8jYv2HRTleOZgfLQumJ5zy7OeJLZlg/CETwFaXjNmGVxG51cFHpKLqb5LKvBC+HsHA==} + /@rolldown/binding-linux-s390x-gnu@1.2.4: + resolution: {integrity: sha512-p5WR0NOwaRmJ/B1b6IjEFLLivwEsf3PrdBIhRbhTCQisbo2SvHHpG4ELB/+FgQNnB88LTOF86upmJmbvZdQ2lw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] @@ -17740,8 +17774,8 @@ packages: dev: true optional: true - /@rolldown/binding-linux-x64-gnu@1.2.2: - resolution: {integrity: sha512-Q/+HI/ToJafZ1iCqGgVQXUEkIjufHCTF0gBQ2a5o3cg7GJ2h0qyq3nvvSmU+bGda2/7ygXpTY4TM6gO9OhQ0ZA==} + /@rolldown/binding-linux-x64-gnu@1.2.4: + resolution: {integrity: sha512-4/GyVjmhR+Tc6HLJvwc1sOhPqAZtySiSMesOZyX6JQ5XBxoTDEMKQzvo07NIK6nTon/SivlZqvhzvuVBNQhObQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -17749,8 +17783,8 @@ packages: dev: true optional: true - /@rolldown/binding-linux-x64-musl@1.2.2: - resolution: {integrity: sha512-ZKp/w41n6wCvxzxQHtQSbuphfX3Y4cCvbjkKHusrLx4lh+JWLTU7StSltO/DKARISzbj368d+qUaCjI8K2wzXw==} + /@rolldown/binding-linux-x64-musl@1.2.4: + resolution: {integrity: sha512-l9eeLsCNvPpmSXUej0etw/J1eqV0Jj1D5G/xG6YTijmE6dkv6E2QezgWbTfQk63v952DPqrjOCoiqxq7Bw0YUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -17758,8 +17792,8 @@ packages: dev: true optional: true - /@rolldown/binding-openharmony-arm64@1.2.2: - resolution: {integrity: sha512-pxE6xD4KS3eAROkKK5yrhB9/3+vhlhVGMvlQLbdpzrBGDbKrnzx3RLwPaHvasLo6jgaiBLn7e04Df9C4tYhjmA==} + /@rolldown/binding-openharmony-arm64@1.2.4: + resolution: {integrity: sha512-e0F355MSTMm3+UOqtV3L24gFUp2N5m1f8L/7d56deik6va+AXdrt9F8LbzGpeWGWRbZEDq4m8NVnJDeBtf9DZg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] @@ -17767,8 +17801,8 @@ packages: dev: true optional: true - /@rolldown/binding-win32-arm64-msvc@1.2.2: - resolution: {integrity: sha512-4MqEue5re+xIZzAWsB8sj0P1kqZySWqIuN4t6QaIO/YA6SFwySOLruvWQFzfmqk8LBK2P30KCSJwf6mJCZZ5/A==} + /@rolldown/binding-win32-arm64-msvc@1.2.4: + resolution: {integrity: sha512-AWLi0uBRYh6QlE7OKhiz+phZC0qwtij2QZmhmOdsLdFn64m7oMpooE9ICE3lhm9xMb4SpDo2WbHcxX1iFLFtqw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -17776,8 +17810,8 @@ packages: dev: true optional: true - /@rolldown/binding-win32-x64-msvc@1.2.2: - resolution: {integrity: sha512-NweNxxD0Nf9t8v7kodun45Ijp3EIwYY+uydPP6qBEYvfBqhIjN6dZMzlQja3tqX/aLs3F3Uz+AxDpKgRhpOZQg==} + /@rolldown/binding-win32-x64-msvc@1.2.4: + resolution: {integrity: sha512-UwSDJOg3dqCAejWdxclJjCsh3Qq4vLYMDxmyHqo1btz3stK2VqgwNd3mm5tuIwzSlGIQ/1H9Hr+Zn09mrezNqQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -37702,7 +37736,7 @@ packages: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} dev: false - /rolldown-plugin-dts@0.16.11(rolldown@1.2.2)(typescript@5.9.2): + /rolldown-plugin-dts@0.16.11(rolldown@1.2.4)(typescript@5.9.2): resolution: {integrity: sha512-9IQDaPvPqTx3RjG2eQCK5GYZITo203BxKunGI80AGYicu1ySFTUyugicAaTZWRzFWh9DSnzkgNeMNbDWBbSs0w==} engines: {node: '>=20.18.0'} peerDependencies: @@ -37730,35 +37764,35 @@ packages: dts-resolver: 2.1.2 get-tsconfig: 4.10.1 magic-string: 0.30.19 - rolldown: 1.2.2 + rolldown: 1.2.4 typescript: 5.9.2 transitivePeerDependencies: - oxc-resolver - supports-color dev: true - /rolldown@1.2.2: - resolution: {integrity: sha512-opwpo1tQBAcpSUJDt94B7hhLNGOKjCdE//XXjeLrnx9b83bjnw45tXdg1b09yEw/VLFBJGZpwRULMmOZo7ol+A==} + /rolldown@1.2.4: + resolution: {integrity: sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true dependencies: - '@oxc-project/types': 0.142.0 + '@oxc-project/types': 0.144.0 '@rolldown/pluginutils': 1.0.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.2.2 - '@rolldown/binding-darwin-arm64': 1.2.2 - '@rolldown/binding-darwin-x64': 1.2.2 - '@rolldown/binding-freebsd-x64': 1.2.2 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.2 - '@rolldown/binding-linux-arm64-gnu': 1.2.2 - '@rolldown/binding-linux-arm64-musl': 1.2.2 - '@rolldown/binding-linux-ppc64-gnu': 1.2.2 - '@rolldown/binding-linux-s390x-gnu': 1.2.2 - '@rolldown/binding-linux-x64-gnu': 1.2.2 - '@rolldown/binding-linux-x64-musl': 1.2.2 - '@rolldown/binding-openharmony-arm64': 1.2.2 - '@rolldown/binding-win32-arm64-msvc': 1.2.2 - '@rolldown/binding-win32-x64-msvc': 1.2.2 + '@rolldown/binding-android-arm64': 1.2.4 + '@rolldown/binding-darwin-arm64': 1.2.4 + '@rolldown/binding-darwin-x64': 1.2.4 + '@rolldown/binding-freebsd-x64': 1.2.4 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.4 + '@rolldown/binding-linux-arm64-gnu': 1.2.4 + '@rolldown/binding-linux-arm64-musl': 1.2.4 + '@rolldown/binding-linux-ppc64-gnu': 1.2.4 + '@rolldown/binding-linux-s390x-gnu': 1.2.4 + '@rolldown/binding-linux-x64-gnu': 1.2.4 + '@rolldown/binding-linux-x64-musl': 1.2.4 + '@rolldown/binding-openharmony-arm64': 1.2.4 + '@rolldown/binding-win32-arm64-msvc': 1.2.4 + '@rolldown/binding-win32-x64-msvc': 1.2.4 dev: true /rollup-plugin-inject@3.0.2: @@ -39962,8 +39996,8 @@ packages: empathic: 2.0.0 hookable: 5.5.3 publint: 0.3.12 - rolldown: 1.2.2 - rolldown-plugin-dts: 0.16.11(rolldown@1.2.2)(typescript@5.9.2) + rolldown: 1.2.4 + rolldown-plugin-dts: 0.16.11(rolldown@1.2.4)(typescript@5.9.2) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15