@deepagents/toolbox 0.10.2 → 0.12.0

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.
package/dist/index.js CHANGED
@@ -211,6 +211,10 @@ ${context.scratchpad}`;
211
211
  // packages/toolbox/src/lib/weather.ts
212
212
  import { tool as tool5 } from "ai";
213
213
  import { z as z5 } from "zod";
214
+ var GetWeatherInputSchema = z5.object({
215
+ location: z5.string().describe("City name, address or coordinates"),
216
+ unit: z5.enum(["C", "F"]).default("C")
217
+ });
214
218
  var GetWeatherSchema = z5.object({
215
219
  location: z5.string(),
216
220
  unit: z5.enum(["C", "F"]),
@@ -223,12 +227,8 @@ var GetWeatherSchema = z5.object({
223
227
  icon: z5.string().optional()
224
228
  });
225
229
  var getWeatherTool = tool5({
226
- name: "weather",
227
230
  description: "Get the current weather for a location.",
228
- inputSchema: z5.object({
229
- location: z5.string().describe("City name, address or coordinates"),
230
- unit: z5.enum(["C", "F"]).default("C")
231
- }),
231
+ inputSchema: GetWeatherInputSchema,
232
232
  outputSchema: GetWeatherSchema,
233
233
  execute: async ({ location, unit }) => {
234
234
  const { latitude, longitude, name } = await geocodeLocation(location);
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/lib/container.ts", "../src/lib/ddg-search.ts", "../src/lib/ddg-stocks.ts", "../src/lib/scratchbad.ts", "../src/lib/weather.ts", "../src/lib/web-search.ts", "../src/lib/user-story-formatter.ts", "../src/lib/hackernews-search.ts"],
4
- "sourcesContent": ["import { tool } from 'ai';\nimport spawn from 'nano-spawn';\nimport { z } from 'zod';\n\nexport const execute_os_command = tool({\n description:\n 'Tool to execute Linux commands in an isolated Docker container with Node.js runtime. Use when you need OS operations like file management, package installation, network requests, or system commands.',\n inputSchema: z.object({\n command: z\n .array(z.string().min(1, 'Command parts cannot be empty'))\n .min(1, 'At least one command part is required')\n .max(20, 'Command cannot exceed 20 parts for security')\n .describe(\n 'Command and arguments as array. Examples: [\"ls\", \"-la\"], [\"npm\", \"install\", \"lodash\"], [\"curl\", \"-s\", \"https://api.github.com\"], [\"node\", \"--version\"]',\n ),\n working_directory: z\n .string()\n .regex(/^\\/[a-zA-Z0-9_/.,-]*$/, 'Must be a valid absolute Linux path')\n .optional()\n .describe(\n 'Absolute working directory path. Examples: \"/tmp\", \"/workspace\", \"/app\". Defaults to container root.',\n ),\n environment_vars: z\n .record(\n z.string().min(1, 'Environment variable values cannot be empty'),\n z.string(),\n )\n .optional()\n .describe(\n 'Environment variables as key-value pairs. Examples: {\"NODE_ENV\": \"development\", \"API_KEY\": \"secret123\"}',\n ),\n }),\n execute: ({ command, working_directory, environment_vars }) => {\n return exec(command, working_directory, environment_vars);\n },\n});\n\nfunction exec(\n command: string[],\n working_directory?: string,\n environment_vars?: Record<string, string>,\n) {\n const args = ['exec', '-i'];\n\n if (working_directory) {\n args.push('-w', working_directory);\n }\n\n if (environment_vars) {\n Object.entries(environment_vars).forEach(([key, value]) => {\n args.push('-e', `${key}=${value}`);\n });\n }\n\n args.push('toolos', ...command);\n\n return spawn('docker', args, {\n stdio: 'pipe',\n });\n}\n", "import { tool } from 'ai';\nimport * as ddg from 'duck-duck-scrape';\nimport { uniqBy } from 'lodash-es';\nimport { z } from 'zod';\n\nexport type Source = 'text' | 'news' | 'images';\n\nexport async function serp({\n query,\n source,\n locale = 'en-us',\n maxResults = 50,\n ...input\n}: z.input<typeof ddgSearchSchema>) {\n const safeSearch =\n ddg.SafeSearchType[\n 'STRICT'\n // input.safesearch.toUpperCase() as keyof typeof ddg.SafeSearchType\n ];\n const time =\n ddg.SearchTimeType[\n (input.time || 'y')?.toUpperCase() as keyof typeof ddg.SearchTimeType\n ];\n\n if (source === 'text') {\n const res = await ddg.search(\n query,\n {\n region: 'wt-wt',\n safeSearch,\n time,\n locale,\n },\n {\n uri_modifier: (rawUrl: string) => {\n const url = new URL(rawUrl);\n url.searchParams.delete('ss_mkt');\n return url.toString();\n },\n },\n );\n const items = res.results.slice(0, maxResults).map((r) => ({\n snippet: r.description,\n title: r.title,\n link: r.url,\n hostname: r.hostname,\n }));\n return { items, total: res.results.length, vqd: res.vqd } as const;\n }\n\n if (source === 'news') {\n const res = await ddg.searchNews(query, {\n safeSearch,\n time,\n });\n const items = res.results.slice(0, maxResults).map((r) => ({\n snippet: r.excerpt,\n title: r.title,\n link: r.url,\n date: r.date, // epoch ms\n source: r.syndicate,\n image: r.image,\n relativeTime: r.relativeTime,\n }));\n return { items, total: res.results.length, vqd: res.vqd } as const;\n }\n\n const res = await ddg.searchImages(query, { safeSearch });\n const items = res.results.slice(0, maxResults).map((r) => ({\n title: r.title,\n thumbnail: r.thumbnail,\n image: r.image,\n link: r.url,\n height: r.height,\n width: r.width,\n source: r.source,\n }));\n return { items, total: res.results.length, vqd: res.vqd } as const;\n}\n\nasync function performSearch(query: string) {\n const results = await serp({\n source: 'news',\n query: query,\n });\n const result = uniqBy(results.items as { link: string }[], (it) => it.link);\n return result as typeof results.items;\n}\n\nexport const ddgSearchSchema = z.object({\n query: z.string().min(1),\n source: z.enum(['text', 'news', 'images']).default('text'),\n locale: z.string().optional().default('en-us'),\n // region: z.string().default('wt-wt'),\n // safesearch: z.enum(['strict', 'moderate', 'off']).default('moderate'),\n time: z.enum(['d', 'w', 'm', 'y']).optional().default('y'),\n maxResults: z.number().int().positive().max(50).default(5),\n});\nexport const duckDuckGoSearch = tool({\n description:\n 'A tool for searching the web. Useful for when you need to find information about current events or topics that are not covered in your training data.',\n inputSchema: ddgSearchSchema,\n execute: serp,\n});\n", "import { tool } from 'ai';\nimport { stocks as ddgStocks } from 'duck-duck-scrape';\nimport { z } from 'zod';\n\ntype Quote = {\n symbol: string;\n name: string | null;\n exchange: string | null;\n currency: string | null;\n last: number | null;\n change: number | null;\n percentChange: number | null;\n open: number | null;\n high: number | null;\n low: number | null;\n prevClose: number | null;\n volume: number | null;\n date: string | null; // ET\n time: string | null; // ET\n halted: boolean | null;\n source: 'DuckDuckGo/Xignite';\n raw?: unknown; // optional raw for debugging\n};\n\nconst toQuote = (r: any): Quote => ({\n symbol: r?.Security?.Symbol ?? null,\n name: r?.Security?.Name ?? null,\n exchange: r?.Security?.Market ?? null,\n currency: r?.Currency ?? null,\n last: r?.Last ?? null,\n change: r?.ChangeFromPreviousClose ?? null,\n percentChange: r?.PercentChangeFromPreviousClose ?? null,\n open: r?.Open ?? null,\n high: r?.High ?? null,\n low: r?.Low ?? null,\n prevClose: r?.PreviousClose ?? null,\n volume: r?.Volume ?? null,\n date: r?.Date ?? null,\n time: r?.Time ?? null,\n halted: r?.TradingHalted ?? null,\n source: 'DuckDuckGo/Xignite',\n raw: r,\n});\n\nexport const duckStocks = tool({\n description: 'A tool for fetching stock market quotes. Useful for when you need to get the latest stock price and related information for one or more stock symbols.',\n inputSchema: z.object({\n symbols: z\n .union([z.string().min(1), z.array(z.string().min(1)).min(1)])\n .transform((s) => (Array.isArray(s) ? s : [s])),\n includeRaw: z.boolean().default(false),\n }),\n execute: async ({ symbols, includeRaw }) => {\n const tasks = symbols.map(async (s) => {\n const sym = s.trim().toUpperCase();\n try {\n const r = await ddgStocks(sym);\n if (!r || (r.Outcome && r.Outcome !== 'Success')) {\n return { symbol: sym, error: r?.Message || 'No quote' };\n }\n const q = toQuote(r);\n if (!includeRaw) delete q.raw;\n return q;\n } catch (e: any) {\n return { symbol: sym, error: e?.message || 'fetch_failed' };\n }\n });\n const results = await Promise.all(tasks);\n return { results };\n },\n});\n", "import { tool } from 'ai';\nimport z from 'zod';\n\nimport { toState } from '@deepagents/agent';\n\nexport const scratchpad_tool = tool({\n description: `Tool for strategic reflection on research progress and decision-making.\n\n Use this tool after each search to analyze results and plan next steps systematically.\n This creates a deliberate pause in the research workflow for quality decision-making.\n\n When to use:\n - After receiving search results: What key information did I find?\n - Before deciding next steps: Do I have enough to answer comprehensively?\n - When assessing research gaps: What specific information am I still missing?\n - Before concluding research: Can I provide a complete answer now?\n\n Reflection should address:\n 1. Analysis of current findings - What concrete information have I gathered?\n 2. Gap assessment - What crucial information is still missing?\n 3. Quality evaluation - Do I have sufficient evidence/examples for a good answer?\n 4. Strategic decision - Should I continue searching or provide my answer?\n`,\n inputSchema: z.object({\n reflection: z\n .string()\n .describe('Your detailed reflection on research progress.'),\n }),\n execute: async ({ reflection }, options) => {\n const context = toState<{ scratchpad: string }>(options);\n context.scratchpad += `- ${reflection}\\n`;\n return `Reflection recorded. Current scratchpad now:\\n---\\n${context.scratchpad}`;\n },\n});\n", "import { type UIToolInvocation, tool } from 'ai';\nimport { z } from 'zod';\n\nexport const GetWeatherSchema = z.object({\n location: z.string(),\n unit: z.enum(['C', 'F']),\n temperature: z.number(),\n condition: z.string(),\n high: z.number(),\n low: z.number(),\n humidity: z.number(),\n windKph: z.number(),\n icon: z.string().optional(),\n});\n\nexport type GetWeatherResult = z.infer<typeof GetWeatherSchema>;\n\nexport const getWeatherTool = tool({\n name: 'weather',\n description: 'Get the current weather for a location.',\n inputSchema: z.object({\n location: z.string().describe('City name, address or coordinates'),\n unit: z.enum(['C', 'F']).default('C'),\n }),\n outputSchema: GetWeatherSchema,\n execute: async ({ location, unit }) => {\n const { latitude, longitude, name } = await geocodeLocation(location);\n\n const params = new URLSearchParams({\n latitude: String(latitude),\n longitude: String(longitude),\n current: [\n 'temperature_2m',\n 'relative_humidity_2m',\n 'wind_speed_10m',\n 'weather_code',\n ].join(','),\n daily: ['temperature_2m_max', 'temperature_2m_min'].join(','),\n timezone: 'auto',\n temperature_unit: unit === 'F' ? 'fahrenheit' : 'celsius',\n wind_speed_unit: 'kmh',\n });\n\n const url = `https://api.open-meteo.com/v1/forecast?${params.toString()}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Weather API failed: ${res.status}`);\n const data = (await res.json()) as ForecastResponse;\n\n const current = data?.current;\n const daily = data?.daily;\n if (!current || !daily) throw new Error('Malformed weather API response');\n\n const weatherCode = Number(current.weather_code);\n const mapped = mapWeatherCode(weatherCode);\n\n const result: GetWeatherResult = {\n location: name,\n unit,\n temperature: Math.round(Number(current.temperature_2m)),\n condition: mapped.condition,\n high: Math.round(Number(daily.temperature_2m_max?.[0])),\n low: Math.round(Number(daily.temperature_2m_min?.[0])),\n humidity: Math.max(\n 0,\n Math.min(1, Number(current.relative_humidity_2m) / 100),\n ),\n windKph: Math.round(Number(current.wind_speed_10m)),\n icon: mapped.icon,\n };\n\n return result;\n },\n});\n\ninterface GeocodeItem {\n id: number;\n name: string;\n latitude: number;\n longitude: number;\n elevation?: number;\n country_code?: string;\n admin1?: string;\n timezone?: string;\n}\n\ninterface GeocodeResponse {\n results?: GeocodeItem[];\n}\n\ninterface ForecastCurrent {\n time: string;\n interval: number;\n temperature_2m: number;\n relative_humidity_2m: number;\n wind_speed_10m: number;\n weather_code: number;\n}\n\ninterface ForecastDaily {\n time: string[];\n temperature_2m_max: number[];\n temperature_2m_min: number[];\n}\n\ninterface ForecastResponse {\n current: ForecastCurrent;\n daily: ForecastDaily;\n}\n\nasync function geocodeLocation(location: string): Promise<{\n latitude: number;\n longitude: number;\n name: string;\n}> {\n // Allow \"lat,lon\" inputs without geocoding\n const coordMatch = location\n .trim()\n .match(/^\\s*(-?\\d+(?:\\.\\d+)?)\\s*,\\s*(-?\\d+(?:\\.\\d+)?)\\s*$/);\n if (coordMatch) {\n const latitude = parseFloat(coordMatch[1]);\n const longitude = parseFloat(coordMatch[2]);\n return {\n latitude,\n longitude,\n name: `${latitude.toFixed(3)}, ${longitude.toFixed(3)}`,\n };\n }\n\n const url = `https://geocoding-api.open-meteo.com/v1/search?name=${encodeURIComponent(\n location,\n )}&count=1&language=en&format=json`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Geocoding failed: ${res.status}`);\n const data = (await res.json()) as GeocodeResponse;\n const first = data?.results?.[0];\n if (!first) throw new Error(`Location not found: ${location}`);\n const nameParts = [first.name, first.admin1, first.country_code].filter(\n Boolean,\n );\n return {\n latitude: first.latitude,\n longitude: first.longitude,\n name: nameParts.join(', '),\n };\n}\n\nfunction mapWeatherCode(code: number): { condition: string; icon?: string } {\n switch (code) {\n case 0:\n return { condition: 'Clear sky', icon: 'weather-sun' };\n case 1:\n return { condition: 'Mainly clear', icon: 'weather-sun' };\n case 2:\n return { condition: 'Partly cloudy', icon: 'weather-partly' };\n case 3:\n return { condition: 'Overcast', icon: 'weather-cloud' };\n case 45:\n case 48:\n return { condition: 'Fog', icon: 'weather-fog' };\n case 51:\n case 53:\n case 55:\n case 56:\n case 57:\n return { condition: 'Drizzle', icon: 'weather-drizzle' };\n case 61:\n case 63:\n case 65:\n case 66:\n case 67:\n return { condition: 'Rain', icon: 'weather-rain' };\n case 71:\n case 73:\n case 75:\n case 77:\n return { condition: 'Snow', icon: 'weather-snow' };\n case 80:\n case 81:\n case 82:\n return { condition: 'Showers', icon: 'weather-showers' };\n case 85:\n case 86:\n return { condition: 'Snow showers', icon: 'weather-snow' };\n case 95:\n case 96:\n case 99:\n return { condition: 'Thunderstorm', icon: 'weather-thunder' };\n default:\n return { condition: 'Unknown' };\n }\n}\n\nexport type WeatherToolType = UIToolInvocation<typeof getWeatherTool>;\n", "import { groq } from '@ai-sdk/groq';\n\nimport { agent } from '@deepagents/agent';\n\nimport { duckDuckGoSearch } from './ddg-search.ts';\n\n\nexport const web_search_tool = duckDuckGoSearch;\n\nexport const searchAgent = agent({\n name: 'research_agent',\n model: groq('openai/gpt-oss-20b'),\n prompt:\n 'You are a diligent research assistant. Your task is to gather accurate and relevant information on a given topic using web search. Use the browser_search tool to find up-to-date information, and synthesize your findings into a concise summary.',\n tools: {\n browser_search: duckDuckGoSearch,\n },\n});\n", "import { tool } from 'ai';\nimport z from 'zod';\n\nimport { toState } from '@deepagents/agent';\n\nconst AcceptanceCriteriaSchema = z.object({\n criterion: z.string().describe('A specific, testable acceptance criterion'),\n});\n\nconst UserStorySchema = z.object({\n title: z.string().describe('Clear, concise title for the user story'),\n userRole: z\n .string()\n .describe('The user role or persona (e.g., \"developer\", \"end user\")'),\n action: z.string().describe('What the user wants to do'),\n benefit: z.string().describe('The value or benefit the user gets'),\n acceptanceCriteria: z\n .array(AcceptanceCriteriaSchema)\n .describe('List of specific, testable conditions that must be met'),\n technicalNotes: z\n .string()\n .optional()\n .describe(\n 'Relevant files, components, or dependencies from the repository',\n ),\n priority: z\n .enum(['High', 'Medium', 'Low'])\n .describe('Priority level based on complexity and dependencies'),\n storyPoints: z\n .enum(['1', '2', '3', '5', '8', '13'])\n .describe('Estimated complexity using Fibonacci sequence'),\n epicOrFeature: z\n .string()\n .optional()\n .describe('The epic or feature group this story belongs to'),\n});\n\nexport const user_story_formatter_tool = tool({\n description: `Tool for formatting and recording user stories in a standardized format.\n\n Use this tool to create well-structured user stories following product management best practices.\n Each story should follow the format: \"As a [role], I want to [action], so that [benefit]\"\n\n When to use:\n - After analyzing a feature or component in the codebase\n - When you've gathered enough information to write a complete user story\n - To document findings in a structured, actionable format\n - To maintain consistency across all generated user stories\n\n The tool will:\n 1. Format the story in the standard user story template\n 2. Store it in the context for later synthesis\n 3. Return a formatted version for immediate review\n`,\n inputSchema: UserStorySchema,\n execute: async (story, options) => {\n const context = toState<{ userStories: (typeof story)[] }>(options);\n context.userStories ??= [];\n context.userStories.push(story);\n\n // Format the user story for output\n const formatted = `\n## ${story.title}\n\n**User Story:**\nAs a **${story.userRole}**, I want to **${story.action}**, so that **${story.benefit}**.\n\n**Acceptance Criteria:**\n${story.acceptanceCriteria.map((ac, i) => `${i + 1}. ${ac.criterion}`).join('\\n')}\n\n**Technical Notes:**\n${story.technicalNotes || 'N/A'}\n\n**Priority:** ${story.priority}\n**Story Points:** ${story.storyPoints}\n${story.epicOrFeature ? `**Epic/Feature:** ${story.epicOrFeature}` : ''}\n\n---\n`.trim();\n\n return `User story recorded successfully!\\n\\n${formatted}\\n\\nTotal stories recorded: ${context.userStories.length}`;\n },\n});\n", "import { tool } from 'ai';\nimport { z } from 'zod';\n\nimport { toState } from '@deepagents/agent';\n\nexport interface HNSearchItem {\n objectID: string;\n title: string | null;\n url: string | null;\n author: string;\n points: number | null;\n story_text: string | null;\n comment_text: string | null;\n num_comments: number | null;\n created_at: string;\n created_at_i: number;\n _tags: string[];\n}\n\nexport interface HNSearchResponse {\n query: string;\n hits: HNSearchItem[];\n nbHits: number;\n page: number;\n nbPages: number;\n hitsPerPage: number;\n}\n\nexport interface HNItemResponse {\n id: string;\n created_at: string;\n created_at_i: number;\n type: 'story' | 'comment' | 'poll' | 'pollopt' | 'show' | 'ask' | 'job';\n author: string;\n title?: string;\n url?: string;\n text?: string;\n points?: number;\n parent_id?: string;\n children?: HNItemResponse[];\n story_id?: string;\n story_title?: string;\n story_url?: string;\n}\n\nexport interface HNUserResponse {\n username: string;\n about?: string;\n karma: number;\n created_at: string;\n created_at_i: number;\n}\n\nfunction buildTags(options: {\n type?: 'story' | 'comment' | 'all';\n author?: string;\n}): string | undefined {\n const tags: string[] = [];\n\n if (options.type && options.type !== 'all') {\n tags.push(options.type);\n }\n\n if (options.author) {\n tags.push(`author_${options.author}`);\n }\n\n return tags.length > 0 ? tags.join(',') : undefined;\n}\n\nfunction buildNumericFilters(options: {\n timeFilter?: 'd' | 'w' | 'm' | 'y' | 'all';\n minPoints?: number;\n minComments?: number;\n maxAgeHours?: number;\n}): string | undefined {\n const filters: string[] = [];\n\n if (options.timeFilter && options.timeFilter !== 'all') {\n const now = Math.floor(Date.now() / 1000);\n const timeMap = {\n d: 86400, // 1 day in seconds\n w: 604800, // 1 week\n m: 2592000, // ~30 days\n y: 31536000, // ~365 days\n };\n const seconds = timeMap[options.timeFilter];\n const timestamp = now - seconds;\n filters.push(`created_at_i>${timestamp}`);\n }\n\n if (options.maxAgeHours !== undefined && options.maxAgeHours > 0) {\n const now = Math.floor(Date.now() / 1000);\n const seconds = options.maxAgeHours * 3600;\n const timestamp = now - seconds;\n filters.push(`created_at_i>${timestamp}`);\n }\n\n if (options.minPoints !== undefined && options.minPoints > 0) {\n filters.push(`points>=${options.minPoints}`);\n }\n\n if (options.minComments !== undefined && options.minComments > 0) {\n filters.push(`num_comments>=${options.minComments}`);\n }\n\n return filters.length > 0 ? filters.join(',') : undefined;\n}\n\nasync function searchHackerNewsAPI(params: {\n query?: string;\n tags?: string;\n numericFilters?: string;\n sortBy?: 'relevance' | 'date';\n page?: number;\n hitsPerPage?: number;\n}): Promise<HNSearchResponse> {\n const {\n query = '',\n tags,\n numericFilters,\n sortBy = 'relevance',\n page = 0,\n hitsPerPage = 20,\n } = params;\n\n const endpoint =\n sortBy === 'date'\n ? 'http://hn.algolia.com/api/v1/search_by_date'\n : 'http://hn.algolia.com/api/v1/search';\n\n const urlParams = new URLSearchParams();\n\n if (query) {\n urlParams.set('query', query);\n }\n\n if (tags) {\n urlParams.set('tags', tags);\n }\n\n if (numericFilters) {\n urlParams.set('numericFilters', numericFilters);\n }\n\n urlParams.set('page', page.toString());\n urlParams.set('hitsPerPage', Math.min(hitsPerPage, 1000).toString());\n\n const url = `${endpoint}?${urlParams.toString()}`;\n\n try {\n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `HN API error: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data as HNSearchResponse;\n } catch (error) {\n throw new Error(\n `Failed to search HackerNews: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n}\n\nasync function fetchHNItem(id: string): Promise<HNItemResponse> {\n const url = `http://hn.algolia.com/api/v1/items/${id}`;\n\n try {\n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `HN API error: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data as HNItemResponse;\n } catch (error) {\n throw new Error(\n `Failed to fetch HN item: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n}\n\nasync function fetchHNUser(username: string): Promise<HNUserResponse> {\n const url = `http://hn.algolia.com/api/v1/users/${username}`;\n\n try {\n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `HN API error: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data as HNUserResponse;\n } catch (error) {\n throw new Error(\n `Failed to fetch HN user: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n}\n\nfunction formatDate(timestamp: number): string {\n return new Date(timestamp * 1000).toLocaleString();\n}\n\nfunction formatHNLink(id: string): string {\n return `https://news.ycombinator.com/item?id=${id}`;\n}\n\nfunction truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return `${text.substring(0, maxLength)}...`;\n}\n\nfunction formatStoryItem(\n hit: HNSearchItem,\n index: number,\n page: number,\n hitsPerPage: number,\n): string {\n const lines: string[] = [];\n const itemNumber = page * hitsPerPage + index + 1;\n\n lines.push(`\\n${itemNumber}. ${hit.title || '(No title)'}`);\n\n if (hit.url) {\n lines.push(` URL: ${hit.url}`);\n }\n\n if (hit.points !== null) {\n lines.push(\n ` ${hit.points} points | by ${hit.author} | ${hit.num_comments || 0} comments`,\n );\n } else {\n lines.push(` by ${hit.author}`);\n }\n\n lines.push(` Date: ${formatDate(hit.created_at_i)}`);\n\n if (hit.story_text) {\n lines.push(` Text: ${truncateText(hit.story_text, 200)}`);\n }\n\n lines.push(` HN Link: ${formatHNLink(hit.objectID)}`);\n\n return lines.join('\\n');\n}\n\nfunction formatCommentItem(\n hit: HNSearchItem,\n index: number,\n page: number,\n hitsPerPage: number,\n): string {\n const lines: string[] = [];\n const itemNumber = page * hitsPerPage + index + 1;\n\n lines.push(`\\n${itemNumber}. Comment by ${hit.author}`);\n\n if (hit.comment_text) {\n lines.push(` ${truncateText(hit.comment_text, 300)}`);\n }\n\n lines.push(` Date: ${formatDate(hit.created_at_i)}`);\n lines.push(` HN Link: ${formatHNLink(hit.objectID)}`);\n\n return lines.join('\\n');\n}\n\nfunction formatMixedItem(\n hit: HNSearchItem,\n index: number,\n page: number,\n hitsPerPage: number,\n): string {\n const lines: string[] = [];\n const itemNumber = page * hitsPerPage + index + 1;\n const isStory = hit._tags.includes('story');\n const isComment = hit._tags.includes('comment');\n const type = isStory ? 'Story' : 'Comment';\n\n lines.push(`\\n${itemNumber}. [${type}] ${hit.title || 'Comment'}`);\n\n if (isStory) {\n if (hit.url) {\n lines.push(` URL: ${hit.url}`);\n }\n if (hit.points !== null) {\n lines.push(` ${hit.points} points | ${hit.num_comments || 0} comments`);\n }\n if (hit.story_text) {\n lines.push(` Text: ${truncateText(hit.story_text, 200)}`);\n }\n } else if (isComment && hit.comment_text) {\n lines.push(` ${truncateText(hit.comment_text, 200)}`);\n }\n\n lines.push(` Date: ${formatDate(hit.created_at_i)}`);\n lines.push(` HN Link: ${formatHNLink(hit.objectID)}`);\n\n return lines.join('\\n');\n}\n\nfunction formatSearchResults(\n response: HNSearchResponse,\n options: {\n itemType: 'story' | 'comment' | 'mixed';\n emptyMessage: string;\n },\n): string {\n const { hits, nbHits, page, nbPages } = response;\n const { itemType, emptyMessage } = options;\n\n if (hits.length === 0) {\n return emptyMessage;\n }\n\n const formatItem = (hit: HNSearchItem, index: number) => {\n switch (itemType) {\n case 'story':\n return formatStoryItem(hit, index, page, response.hitsPerPage);\n case 'comment':\n return formatCommentItem(hit, index, page, response.hitsPerPage);\n case 'mixed':\n return formatMixedItem(hit, index, page, response.hitsPerPage);\n }\n };\n\n const results = hits.map(formatItem);\n const typeLabel =\n itemType === 'mixed'\n ? 'results'\n : `${itemType === 'story' ? 'stories' : 'comments'}`;\n const header = `Found ${nbHits} ${typeLabel} (showing page ${page + 1} of ${nbPages}):\\n`;\n\n return header + results.join('\\n');\n}\n\nfunction formatStoryResults(response: HNSearchResponse): string {\n return formatSearchResults(response, {\n itemType: 'story',\n emptyMessage: `No stories found for query: \"${response.query}\"`,\n });\n}\n\nfunction formatCommentResults(response: HNSearchResponse): string {\n return formatSearchResults(response, {\n itemType: 'comment',\n emptyMessage: `No comments found for query: \"${response.query}\"`,\n });\n}\n\nfunction formatAuthorResults(response: HNSearchResponse): string {\n return formatSearchResults(response, {\n itemType: 'mixed',\n emptyMessage: 'No results found for this author',\n });\n}\n\nfunction formatItemDetails(item: HNItemResponse): string {\n const lines: string[] = [];\n\n if (item.type === 'story') {\n lines.push(`Story: ${item.title || '(No title)'}`);\n if (item.url) {\n lines.push(`URL: ${item.url}`);\n }\n lines.push(`By: ${item.author}`);\n if (item.points !== undefined) {\n lines.push(`Points: ${item.points}`);\n }\n lines.push(`Date: ${formatDate(item.created_at_i)}`);\n if (item.text) {\n lines.push(`\\nText:\\n${item.text}`);\n }\n lines.push(`\\nHN Link: ${formatHNLink(item.id)}`);\n } else if (item.type === 'comment') {\n lines.push(`Comment by ${item.author}`);\n if (item.story_title) {\n lines.push(`On story: ${item.story_title}`);\n }\n lines.push(`Date: ${formatDate(item.created_at_i)}`);\n if (item.text) {\n lines.push(`\\n${item.text}`);\n }\n lines.push(`\\nHN Link: ${formatHNLink(item.id)}`);\n }\n\n return lines.join('\\n');\n}\n\nfunction formatUserProfile(user: HNUserResponse): string {\n const lines: string[] = [];\n\n lines.push(`User: ${user.username}`);\n lines.push(`Karma: ${user.karma.toLocaleString()}`);\n lines.push(`Member since: ${formatDate(user.created_at_i)}`);\n\n if (user.about) {\n lines.push(`\\nAbout:\\n${user.about}`);\n }\n\n lines.push(\n `\\nProfile: https://news.ycombinator.com/user?id=${user.username}`,\n );\n\n return lines.join('\\n');\n}\n\nfunction formatJobItem(\n hit: HNSearchItem,\n index: number,\n page: number,\n hitsPerPage: number,\n): string {\n const lines: string[] = [];\n const itemNumber = page * hitsPerPage + index + 1;\n\n lines.push(`\\n${itemNumber}. ${hit.title || '(No title)'}`);\n\n if (hit.url) {\n lines.push(` URL: ${hit.url}`);\n }\n\n lines.push(` Posted by: ${hit.author}`);\n lines.push(` Date: ${formatDate(hit.created_at_i)}`);\n\n if (hit.story_text) {\n lines.push(` Description: ${truncateText(hit.story_text, 300)}`);\n }\n\n lines.push(` HN Link: ${formatHNLink(hit.objectID)}`);\n\n return lines.join('\\n');\n}\n\nfunction formatJobResults(response: HNSearchResponse): string {\n const { hits, nbHits, page, nbPages } = response;\n\n if (hits.length === 0) {\n return `No job postings found for query: \"${response.query}\"`;\n }\n\n const results = hits.map((hit, index) =>\n formatJobItem(hit, index, page, response.hitsPerPage),\n );\n\n const header = `Found ${nbHits} job postings (showing page ${page + 1} of ${nbPages}):\\n`;\n return header + results.join('\\n');\n}\n\nexport const search_by_query = tool({\n description:\n 'Tool to search HackerNews stories by keywords and filters. Use when you need to find HN stories matching specific search criteria, time periods, or popularity thresholds.',\n inputSchema: z.object({\n query: z\n .string()\n .describe(\n 'Search query for story titles and content. Examples: \"artificial intelligence\", \"python\"',\n ),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n minPoints: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum points threshold'),\n minComments: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum comments threshold'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('relevance')\n .describe('Sort results by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n minPoints: input.minPoints,\n minComments: input.minComments,\n });\n\n const response = await searchHackerNewsAPI({\n query: input.query,\n tags: 'story',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nexport const search_by_author = tool({\n description:\n 'Tool to search HackerNews content by author username. Use when you need to find all stories, comments, or both by a specific HN user.',\n inputSchema: z.object({\n author: z\n .string()\n .describe('HackerNews username to search for. Examples: \"pg\", \"tptacek\"'),\n type: z\n .enum(['story', 'comment', 'all'])\n .default('all')\n .describe('Type of content: story, comment, or all'),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n minComments: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum comments threshold (for stories only)'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort results by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const tags = buildTags({ type: input.type, author: input.author });\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n minComments: input.minComments,\n });\n\n const response = await searchHackerNewsAPI({\n tags,\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatAuthorResults(response);\n },\n});\n\nexport const get_story_item = tool({\n description:\n 'Tool to get detailed information about a specific HackerNews story by ID. Use when you need full details about a particular HN story including title, URL, author, points, and comments.',\n inputSchema: z.object({\n storyId: z.string().describe('HackerNews story ID. Example: \"38709478\"'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const item = await fetchHNItem(input.storyId);\n\n if (item.type !== 'story') {\n throw new Error(\n `Item ${input.storyId} is not a story (type: ${item.type})`,\n );\n }\n\n context.hackernews_sources.push({\n title: item.title || 'Untitled',\n hn_url: `https://news.ycombinator.com/item?id=${item.id}`,\n story_url: item.url || '',\n });\n\n return formatItemDetails(item);\n },\n});\n\nexport const get_story_comment = tool({\n description:\n 'Tool to get detailed information about a specific HackerNews comment by ID. Use when you need full details about a particular comment including text, author, and parent story information.',\n inputSchema: z.object({\n commentId: z\n .string()\n .describe('HackerNews comment ID. Example: \"38710123\"'),\n }),\n execute: async (input) => {\n const item = await fetchHNItem(input.commentId);\n\n if (item.type !== 'comment') {\n throw new Error(\n `Item ${input.commentId} is not a comment (type: ${item.type})`,\n );\n }\n\n return formatItemDetails(item);\n },\n});\n\nexport const get_front_page_stories = tool({\n description:\n 'Tool to get current HackerNews front page stories. Use when you need to see the latest trending and popular stories on HN.',\n inputSchema: z.object({\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(50)\n .default(30)\n .describe('Results per page (max 50)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const response = await searchHackerNewsAPI({\n tags: 'front_page',\n sortBy: 'date',\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nexport const get_story_comments = tool({\n description:\n 'Tool to get all comments for a specific HackerNews story. Use when you need to read the discussion and comments on a particular HN story.',\n inputSchema: z.object({\n storyId: z.string().describe('HackerNews story ID. Example: \"38709478\"'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort comments by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(50)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input) => {\n const response = await searchHackerNewsAPI({\n tags: `comment,story_${input.storyId}`,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n return formatCommentResults(response);\n },\n});\n\nexport const search_ask_hn = tool({\n description:\n 'Tool to search Ask HN posts - questions posed to the HackerNews community. Use when you need to find community questions and discussions on specific topics.',\n inputSchema: z.object({\n query: z\n .string()\n .default('')\n .describe(\n 'Search query for Ask HN posts. Examples: \"artificial intelligence\", \"career\"',\n ),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n minPoints: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum points threshold'),\n minComments: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum comments threshold'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('relevance')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n minPoints: input.minPoints,\n minComments: input.minComments,\n });\n\n const response = await searchHackerNewsAPI({\n query: input.query,\n tags: 'ask_hn',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nexport const search_show_hn = tool({\n description:\n 'Tool to search Show HN posts - projects and products shared with the HackerNews community. Use when you need to discover community projects, demos, or products on specific topics.',\n inputSchema: z.object({\n query: z\n .string()\n .default('')\n .describe(\n 'Search query for Show HN posts. Examples: \"web app\", \"open source\"',\n ),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n minPoints: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum points threshold'),\n minComments: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum comments threshold'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('relevance')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n minPoints: input.minPoints,\n minComments: input.minComments,\n });\n\n const response = await searchHackerNewsAPI({\n query: input.query,\n tags: 'show_hn',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nexport const search_jobs = tool({\n description:\n 'Tool to search HackerNews job postings. Use when you need to find tech job opportunities posted on HN.',\n inputSchema: z.object({\n query: z\n .string()\n .default('')\n .describe(\n 'Search query for job postings. Examples: \"remote\", \"machine learning\"',\n ),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n });\n\n const response = await searchHackerNewsAPI({\n query: input.query,\n tags: 'job',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatJobResults(response);\n },\n});\n\nexport const search_polls = tool({\n description:\n 'Tool to search HackerNews polls - community surveys and voting. Use when you need to find community polls on various topics.',\n inputSchema: z.object({\n query: z\n .string()\n .default('')\n .describe('Search query for polls. Example: \"programming language\"'),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n });\n\n const response = await searchHackerNewsAPI({\n query: input.query,\n tags: 'poll',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nexport const get_user_profile = tool({\n description:\n \"Tool to get HackerNews user profile information. Use when you need to view a user's karma, account creation date, and bio.\",\n inputSchema: z.object({\n username: z.string().describe('HackerNews username. Example: \"pg\"'),\n }),\n execute: async (input) => {\n const user = await fetchHNUser(input.username);\n return formatUserProfile(user);\n },\n});\n\nexport const search_by_domain = tool({\n description:\n 'Tool to search HackerNews stories from a specific domain or website. Use when you need to find all HN posts from a particular domain or track discussions about content from specific websites.',\n inputSchema: z.object({\n domain: z\n .string()\n .describe('Domain to search. Examples: \"github.com\", \"arxiv.org\"'),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n minPoints: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum points threshold'),\n minComments: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum comments threshold'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n minPoints: input.minPoints,\n minComments: input.minComments,\n });\n\n const urlParams = new URLSearchParams();\n urlParams.set('query', input.domain);\n urlParams.set('restrictSearchableAttributes', 'url');\n urlParams.set('tags', 'story');\n if (numericFilters) {\n urlParams.set('numericFilters', numericFilters);\n }\n urlParams.set('page', input.page.toString());\n urlParams.set('hitsPerPage', input.hitsPerPage.toString());\n\n const endpoint =\n input.sortBy === 'date'\n ? 'http://hn.algolia.com/api/v1/search_by_date'\n : 'http://hn.algolia.com/api/v1/search';\n\n const url = `${endpoint}?${urlParams.toString()}`;\n\n const response = await fetch(url, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!response.ok) {\n throw new Error(\n `HN API error: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = (await response.json()) as HNSearchResponse;\n fillContext(context, data);\n return formatStoryResults(data);\n },\n});\n\nexport const search_highly_discussed = tool({\n description:\n 'Tool to search for highly discussed HackerNews stories with many comments. Use when you need to find engaging or controversial discussions with significant community participation.',\n inputSchema: z.object({\n minComments: z\n .number()\n .int()\n .min(1)\n .describe(\n 'Minimum number of comments (required). Example: 100 for highly discussed stories',\n ),\n query: z\n .string()\n .default('')\n .describe('Optional search query. Example: \"AI\"'),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n minPoints: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum points threshold'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n minPoints: input.minPoints,\n minComments: input.minComments,\n });\n\n const response = await searchHackerNewsAPI({\n query: input.query,\n tags: 'story',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nexport const search_trending = tool({\n description:\n \"Tool to find currently trending HackerNews stories - recent posts with high engagement. Use when you need to discover what's hot right now on HN by combining recency with high points and comments.\",\n inputSchema: z.object({\n minPoints: z\n .number()\n .int()\n .min(10)\n .default(50)\n .describe(\n 'Minimum points threshold. Example: 100 for highly upvoted stories',\n ),\n maxAgeHours: z\n .number()\n .int()\n .min(1)\n .max(72)\n .default(24)\n .describe('Maximum age in hours. Example: 24 for stories from today'),\n minComments: z\n .number()\n .int()\n .min(0)\n .default(10)\n .describe('Minimum comments threshold'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(100)\n .default(30)\n .describe('Results per page (max 100)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n maxAgeHours: input.maxAgeHours,\n minPoints: input.minPoints,\n minComments: input.minComments,\n });\n\n const response = await searchHackerNewsAPI({\n tags: 'story',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nfunction fillContext(\n context: {\n hackernews_sources: {\n title?: string | null;\n hn_url?: string | null;\n story_url?: string | null;\n story_text?: string | null;\n comment_text?: string | null;\n }[];\n },\n result: HNSearchResponse,\n) {\n result.hits.forEach((hit) => {\n context.hackernews_sources.push({\n title: hit.title,\n hn_url: hit.objectID\n ? `https://news.ycombinator.com/item?id=${hit.objectID}`\n : undefined,\n story_url: hit.url,\n story_text: hit.story_text,\n comment_text: hit.comment_text,\n });\n });\n}\n\nexport const hackernewsTools = {\n search_by_query,\n search_by_author,\n get_story_item,\n get_story_comment,\n get_front_page_stories,\n get_story_comments,\n search_ask_hn,\n search_show_hn,\n search_jobs,\n search_polls,\n get_user_profile,\n search_by_domain,\n search_highly_discussed,\n search_trending,\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { tool } from 'ai';\nimport spawn from 'nano-spawn';\nimport { z } from 'zod';\n\nexport const execute_os_command = tool({\n description:\n 'Tool to execute Linux commands in an isolated Docker container with Node.js runtime. Use when you need OS operations like file management, package installation, network requests, or system commands.',\n inputSchema: z.object({\n command: z\n .array(z.string().min(1, 'Command parts cannot be empty'))\n .min(1, 'At least one command part is required')\n .max(20, 'Command cannot exceed 20 parts for security')\n .describe(\n 'Command and arguments as array. Examples: [\"ls\", \"-la\"], [\"npm\", \"install\", \"lodash\"], [\"curl\", \"-s\", \"https://api.github.com\"], [\"node\", \"--version\"]',\n ),\n working_directory: z\n .string()\n .regex(/^\\/[a-zA-Z0-9_/.,-]*$/, 'Must be a valid absolute Linux path')\n .optional()\n .describe(\n 'Absolute working directory path. Examples: \"/tmp\", \"/workspace\", \"/app\". Defaults to container root.',\n ),\n environment_vars: z\n .record(\n z.string().min(1, 'Environment variable values cannot be empty'),\n z.string(),\n )\n .optional()\n .describe(\n 'Environment variables as key-value pairs. Examples: {\"NODE_ENV\": \"development\", \"API_KEY\": \"secret123\"}',\n ),\n }),\n execute: ({ command, working_directory, environment_vars }) => {\n return exec(command, working_directory, environment_vars);\n },\n});\n\nfunction exec(\n command: string[],\n working_directory?: string,\n environment_vars?: Record<string, string>,\n) {\n const args = ['exec', '-i'];\n\n if (working_directory) {\n args.push('-w', working_directory);\n }\n\n if (environment_vars) {\n Object.entries(environment_vars).forEach(([key, value]) => {\n args.push('-e', `${key}=${value}`);\n });\n }\n\n args.push('toolos', ...command);\n\n return spawn('docker', args, {\n stdio: 'pipe',\n });\n}\n", "import { tool } from 'ai';\nimport * as ddg from 'duck-duck-scrape';\nimport { uniqBy } from 'lodash-es';\nimport { z } from 'zod';\n\nexport type Source = 'text' | 'news' | 'images';\n\nexport async function serp({\n query,\n source,\n locale = 'en-us',\n maxResults = 50,\n ...input\n}: z.input<typeof ddgSearchSchema>) {\n const safeSearch =\n ddg.SafeSearchType[\n 'STRICT'\n // input.safesearch.toUpperCase() as keyof typeof ddg.SafeSearchType\n ];\n const time =\n ddg.SearchTimeType[\n (input.time || 'y')?.toUpperCase() as keyof typeof ddg.SearchTimeType\n ];\n\n if (source === 'text') {\n const res = await ddg.search(\n query,\n {\n region: 'wt-wt',\n safeSearch,\n time,\n locale,\n },\n {\n uri_modifier: (rawUrl: string) => {\n const url = new URL(rawUrl);\n url.searchParams.delete('ss_mkt');\n return url.toString();\n },\n },\n );\n const items = res.results.slice(0, maxResults).map((r) => ({\n snippet: r.description,\n title: r.title,\n link: r.url,\n hostname: r.hostname,\n }));\n return { items, total: res.results.length, vqd: res.vqd } as const;\n }\n\n if (source === 'news') {\n const res = await ddg.searchNews(query, {\n safeSearch,\n time,\n });\n const items = res.results.slice(0, maxResults).map((r) => ({\n snippet: r.excerpt,\n title: r.title,\n link: r.url,\n date: r.date, // epoch ms\n source: r.syndicate,\n image: r.image,\n relativeTime: r.relativeTime,\n }));\n return { items, total: res.results.length, vqd: res.vqd } as const;\n }\n\n const res = await ddg.searchImages(query, { safeSearch });\n const items = res.results.slice(0, maxResults).map((r) => ({\n title: r.title,\n thumbnail: r.thumbnail,\n image: r.image,\n link: r.url,\n height: r.height,\n width: r.width,\n source: r.source,\n }));\n return { items, total: res.results.length, vqd: res.vqd } as const;\n}\n\nasync function performSearch(query: string) {\n const results = await serp({\n source: 'news',\n query: query,\n });\n const result = uniqBy(results.items as { link: string }[], (it) => it.link);\n return result as typeof results.items;\n}\n\nexport const ddgSearchSchema = z.object({\n query: z.string().min(1),\n source: z.enum(['text', 'news', 'images']).default('text'),\n locale: z.string().optional().default('en-us'),\n // region: z.string().default('wt-wt'),\n // safesearch: z.enum(['strict', 'moderate', 'off']).default('moderate'),\n time: z.enum(['d', 'w', 'm', 'y']).optional().default('y'),\n maxResults: z.number().int().positive().max(50).default(5),\n});\nexport const duckDuckGoSearch = tool({\n description:\n 'A tool for searching the web. Useful for when you need to find information about current events or topics that are not covered in your training data.',\n inputSchema: ddgSearchSchema,\n execute: serp,\n});\n", "import { tool } from 'ai';\nimport { stocks as ddgStocks } from 'duck-duck-scrape';\nimport { z } from 'zod';\n\ntype Quote = {\n symbol: string;\n name: string | null;\n exchange: string | null;\n currency: string | null;\n last: number | null;\n change: number | null;\n percentChange: number | null;\n open: number | null;\n high: number | null;\n low: number | null;\n prevClose: number | null;\n volume: number | null;\n date: string | null; // ET\n time: string | null; // ET\n halted: boolean | null;\n source: 'DuckDuckGo/Xignite';\n raw?: unknown; // optional raw for debugging\n};\n\nconst toQuote = (r: any): Quote => ({\n symbol: r?.Security?.Symbol ?? null,\n name: r?.Security?.Name ?? null,\n exchange: r?.Security?.Market ?? null,\n currency: r?.Currency ?? null,\n last: r?.Last ?? null,\n change: r?.ChangeFromPreviousClose ?? null,\n percentChange: r?.PercentChangeFromPreviousClose ?? null,\n open: r?.Open ?? null,\n high: r?.High ?? null,\n low: r?.Low ?? null,\n prevClose: r?.PreviousClose ?? null,\n volume: r?.Volume ?? null,\n date: r?.Date ?? null,\n time: r?.Time ?? null,\n halted: r?.TradingHalted ?? null,\n source: 'DuckDuckGo/Xignite',\n raw: r,\n});\n\nexport const duckStocks = tool({\n description: 'A tool for fetching stock market quotes. Useful for when you need to get the latest stock price and related information for one or more stock symbols.',\n inputSchema: z.object({\n symbols: z\n .union([z.string().min(1), z.array(z.string().min(1)).min(1)])\n .transform((s) => (Array.isArray(s) ? s : [s])),\n includeRaw: z.boolean().default(false),\n }),\n execute: async ({ symbols, includeRaw }) => {\n const tasks = symbols.map(async (s) => {\n const sym = s.trim().toUpperCase();\n try {\n const r = await ddgStocks(sym);\n if (!r || (r.Outcome && r.Outcome !== 'Success')) {\n return { symbol: sym, error: r?.Message || 'No quote' };\n }\n const q = toQuote(r);\n if (!includeRaw) delete q.raw;\n return q;\n } catch (e: any) {\n return { symbol: sym, error: e?.message || 'fetch_failed' };\n }\n });\n const results = await Promise.all(tasks);\n return { results };\n },\n});\n", "import { tool } from 'ai';\nimport z from 'zod';\n\nimport { toState } from '@deepagents/agent';\n\nexport const scratchpad_tool = tool({\n description: `Tool for strategic reflection on research progress and decision-making.\n\n Use this tool after each search to analyze results and plan next steps systematically.\n This creates a deliberate pause in the research workflow for quality decision-making.\n\n When to use:\n - After receiving search results: What key information did I find?\n - Before deciding next steps: Do I have enough to answer comprehensively?\n - When assessing research gaps: What specific information am I still missing?\n - Before concluding research: Can I provide a complete answer now?\n\n Reflection should address:\n 1. Analysis of current findings - What concrete information have I gathered?\n 2. Gap assessment - What crucial information is still missing?\n 3. Quality evaluation - Do I have sufficient evidence/examples for a good answer?\n 4. Strategic decision - Should I continue searching or provide my answer?\n`,\n inputSchema: z.object({\n reflection: z\n .string()\n .describe('Your detailed reflection on research progress.'),\n }),\n execute: async ({ reflection }, options) => {\n const context = toState<{ scratchpad: string }>(options);\n context.scratchpad += `- ${reflection}\\n`;\n return `Reflection recorded. Current scratchpad now:\\n---\\n${context.scratchpad}`;\n },\n});\n", "import { type UIToolInvocation, tool } from 'ai';\nimport { z } from 'zod';\n\nconst GetWeatherInputSchema = z.object({\n location: z.string().describe('City name, address or coordinates'),\n unit: z.enum(['C', 'F']).default('C'),\n});\n\nexport const GetWeatherSchema = z.object({\n location: z.string(),\n unit: z.enum(['C', 'F']),\n temperature: z.number(),\n condition: z.string(),\n high: z.number(),\n low: z.number(),\n humidity: z.number(),\n windKph: z.number(),\n icon: z.string().optional(),\n});\n\ntype GetWeatherInput = z.infer<typeof GetWeatherInputSchema>;\nexport type GetWeatherResult = z.infer<typeof GetWeatherSchema>;\n\nexport const getWeatherTool = tool<GetWeatherInput, GetWeatherResult>({\n description: 'Get the current weather for a location.',\n inputSchema: GetWeatherInputSchema,\n outputSchema: GetWeatherSchema,\n execute: async ({ location, unit }) => {\n const { latitude, longitude, name } = await geocodeLocation(location);\n\n const params = new URLSearchParams({\n latitude: String(latitude),\n longitude: String(longitude),\n current: [\n 'temperature_2m',\n 'relative_humidity_2m',\n 'wind_speed_10m',\n 'weather_code',\n ].join(','),\n daily: ['temperature_2m_max', 'temperature_2m_min'].join(','),\n timezone: 'auto',\n temperature_unit: unit === 'F' ? 'fahrenheit' : 'celsius',\n wind_speed_unit: 'kmh',\n });\n\n const url = `https://api.open-meteo.com/v1/forecast?${params.toString()}`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Weather API failed: ${res.status}`);\n const data = (await res.json()) as ForecastResponse;\n\n const current = data?.current;\n const daily = data?.daily;\n if (!current || !daily) throw new Error('Malformed weather API response');\n\n const weatherCode = Number(current.weather_code);\n const mapped = mapWeatherCode(weatherCode);\n\n const result: GetWeatherResult = {\n location: name,\n unit,\n temperature: Math.round(Number(current.temperature_2m)),\n condition: mapped.condition,\n high: Math.round(Number(daily.temperature_2m_max?.[0])),\n low: Math.round(Number(daily.temperature_2m_min?.[0])),\n humidity: Math.max(\n 0,\n Math.min(1, Number(current.relative_humidity_2m) / 100),\n ),\n windKph: Math.round(Number(current.wind_speed_10m)),\n icon: mapped.icon,\n };\n\n return result;\n },\n});\n\ninterface GeocodeItem {\n id: number;\n name: string;\n latitude: number;\n longitude: number;\n elevation?: number;\n country_code?: string;\n admin1?: string;\n timezone?: string;\n}\n\ninterface GeocodeResponse {\n results?: GeocodeItem[];\n}\n\ninterface ForecastCurrent {\n time: string;\n interval: number;\n temperature_2m: number;\n relative_humidity_2m: number;\n wind_speed_10m: number;\n weather_code: number;\n}\n\ninterface ForecastDaily {\n time: string[];\n temperature_2m_max: number[];\n temperature_2m_min: number[];\n}\n\ninterface ForecastResponse {\n current: ForecastCurrent;\n daily: ForecastDaily;\n}\n\nasync function geocodeLocation(location: string): Promise<{\n latitude: number;\n longitude: number;\n name: string;\n}> {\n // Allow \"lat,lon\" inputs without geocoding\n const coordMatch = location\n .trim()\n .match(/^\\s*(-?\\d+(?:\\.\\d+)?)\\s*,\\s*(-?\\d+(?:\\.\\d+)?)\\s*$/);\n if (coordMatch) {\n const latitude = parseFloat(coordMatch[1]);\n const longitude = parseFloat(coordMatch[2]);\n return {\n latitude,\n longitude,\n name: `${latitude.toFixed(3)}, ${longitude.toFixed(3)}`,\n };\n }\n\n const url = `https://geocoding-api.open-meteo.com/v1/search?name=${encodeURIComponent(\n location,\n )}&count=1&language=en&format=json`;\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Geocoding failed: ${res.status}`);\n const data = (await res.json()) as GeocodeResponse;\n const first = data?.results?.[0];\n if (!first) throw new Error(`Location not found: ${location}`);\n const nameParts = [first.name, first.admin1, first.country_code].filter(\n Boolean,\n );\n return {\n latitude: first.latitude,\n longitude: first.longitude,\n name: nameParts.join(', '),\n };\n}\n\nfunction mapWeatherCode(code: number): { condition: string; icon?: string } {\n switch (code) {\n case 0:\n return { condition: 'Clear sky', icon: 'weather-sun' };\n case 1:\n return { condition: 'Mainly clear', icon: 'weather-sun' };\n case 2:\n return { condition: 'Partly cloudy', icon: 'weather-partly' };\n case 3:\n return { condition: 'Overcast', icon: 'weather-cloud' };\n case 45:\n case 48:\n return { condition: 'Fog', icon: 'weather-fog' };\n case 51:\n case 53:\n case 55:\n case 56:\n case 57:\n return { condition: 'Drizzle', icon: 'weather-drizzle' };\n case 61:\n case 63:\n case 65:\n case 66:\n case 67:\n return { condition: 'Rain', icon: 'weather-rain' };\n case 71:\n case 73:\n case 75:\n case 77:\n return { condition: 'Snow', icon: 'weather-snow' };\n case 80:\n case 81:\n case 82:\n return { condition: 'Showers', icon: 'weather-showers' };\n case 85:\n case 86:\n return { condition: 'Snow showers', icon: 'weather-snow' };\n case 95:\n case 96:\n case 99:\n return { condition: 'Thunderstorm', icon: 'weather-thunder' };\n default:\n return { condition: 'Unknown' };\n }\n}\n\nexport type WeatherToolType = UIToolInvocation<typeof getWeatherTool>;\n", "import { groq } from '@ai-sdk/groq';\n\nimport { agent } from '@deepagents/agent';\n\nimport { duckDuckGoSearch } from './ddg-search.ts';\n\n\nexport const web_search_tool = duckDuckGoSearch;\n\nexport const searchAgent = agent({\n name: 'research_agent',\n model: groq('openai/gpt-oss-20b'),\n prompt:\n 'You are a diligent research assistant. Your task is to gather accurate and relevant information on a given topic using web search. Use the browser_search tool to find up-to-date information, and synthesize your findings into a concise summary.',\n tools: {\n browser_search: duckDuckGoSearch,\n },\n});\n", "import { tool } from 'ai';\nimport z from 'zod';\n\nimport { toState } from '@deepagents/agent';\n\nconst AcceptanceCriteriaSchema = z.object({\n criterion: z.string().describe('A specific, testable acceptance criterion'),\n});\n\nconst UserStorySchema = z.object({\n title: z.string().describe('Clear, concise title for the user story'),\n userRole: z\n .string()\n .describe('The user role or persona (e.g., \"developer\", \"end user\")'),\n action: z.string().describe('What the user wants to do'),\n benefit: z.string().describe('The value or benefit the user gets'),\n acceptanceCriteria: z\n .array(AcceptanceCriteriaSchema)\n .describe('List of specific, testable conditions that must be met'),\n technicalNotes: z\n .string()\n .optional()\n .describe(\n 'Relevant files, components, or dependencies from the repository',\n ),\n priority: z\n .enum(['High', 'Medium', 'Low'])\n .describe('Priority level based on complexity and dependencies'),\n storyPoints: z\n .enum(['1', '2', '3', '5', '8', '13'])\n .describe('Estimated complexity using Fibonacci sequence'),\n epicOrFeature: z\n .string()\n .optional()\n .describe('The epic or feature group this story belongs to'),\n});\n\nexport const user_story_formatter_tool = tool({\n description: `Tool for formatting and recording user stories in a standardized format.\n\n Use this tool to create well-structured user stories following product management best practices.\n Each story should follow the format: \"As a [role], I want to [action], so that [benefit]\"\n\n When to use:\n - After analyzing a feature or component in the codebase\n - When you've gathered enough information to write a complete user story\n - To document findings in a structured, actionable format\n - To maintain consistency across all generated user stories\n\n The tool will:\n 1. Format the story in the standard user story template\n 2. Store it in the context for later synthesis\n 3. Return a formatted version for immediate review\n`,\n inputSchema: UserStorySchema,\n execute: async (story, options) => {\n const context = toState<{ userStories: (typeof story)[] }>(options);\n context.userStories ??= [];\n context.userStories.push(story);\n\n // Format the user story for output\n const formatted = `\n## ${story.title}\n\n**User Story:**\nAs a **${story.userRole}**, I want to **${story.action}**, so that **${story.benefit}**.\n\n**Acceptance Criteria:**\n${story.acceptanceCriteria.map((ac, i) => `${i + 1}. ${ac.criterion}`).join('\\n')}\n\n**Technical Notes:**\n${story.technicalNotes || 'N/A'}\n\n**Priority:** ${story.priority}\n**Story Points:** ${story.storyPoints}\n${story.epicOrFeature ? `**Epic/Feature:** ${story.epicOrFeature}` : ''}\n\n---\n`.trim();\n\n return `User story recorded successfully!\\n\\n${formatted}\\n\\nTotal stories recorded: ${context.userStories.length}`;\n },\n});\n", "import { tool } from 'ai';\nimport { z } from 'zod';\n\nimport { toState } from '@deepagents/agent';\n\nexport interface HNSearchItem {\n objectID: string;\n title: string | null;\n url: string | null;\n author: string;\n points: number | null;\n story_text: string | null;\n comment_text: string | null;\n num_comments: number | null;\n created_at: string;\n created_at_i: number;\n _tags: string[];\n}\n\nexport interface HNSearchResponse {\n query: string;\n hits: HNSearchItem[];\n nbHits: number;\n page: number;\n nbPages: number;\n hitsPerPage: number;\n}\n\nexport interface HNItemResponse {\n id: string;\n created_at: string;\n created_at_i: number;\n type: 'story' | 'comment' | 'poll' | 'pollopt' | 'show' | 'ask' | 'job';\n author: string;\n title?: string;\n url?: string;\n text?: string;\n points?: number;\n parent_id?: string;\n children?: HNItemResponse[];\n story_id?: string;\n story_title?: string;\n story_url?: string;\n}\n\nexport interface HNUserResponse {\n username: string;\n about?: string;\n karma: number;\n created_at: string;\n created_at_i: number;\n}\n\nfunction buildTags(options: {\n type?: 'story' | 'comment' | 'all';\n author?: string;\n}): string | undefined {\n const tags: string[] = [];\n\n if (options.type && options.type !== 'all') {\n tags.push(options.type);\n }\n\n if (options.author) {\n tags.push(`author_${options.author}`);\n }\n\n return tags.length > 0 ? tags.join(',') : undefined;\n}\n\nfunction buildNumericFilters(options: {\n timeFilter?: 'd' | 'w' | 'm' | 'y' | 'all';\n minPoints?: number;\n minComments?: number;\n maxAgeHours?: number;\n}): string | undefined {\n const filters: string[] = [];\n\n if (options.timeFilter && options.timeFilter !== 'all') {\n const now = Math.floor(Date.now() / 1000);\n const timeMap = {\n d: 86400, // 1 day in seconds\n w: 604800, // 1 week\n m: 2592000, // ~30 days\n y: 31536000, // ~365 days\n };\n const seconds = timeMap[options.timeFilter];\n const timestamp = now - seconds;\n filters.push(`created_at_i>${timestamp}`);\n }\n\n if (options.maxAgeHours !== undefined && options.maxAgeHours > 0) {\n const now = Math.floor(Date.now() / 1000);\n const seconds = options.maxAgeHours * 3600;\n const timestamp = now - seconds;\n filters.push(`created_at_i>${timestamp}`);\n }\n\n if (options.minPoints !== undefined && options.minPoints > 0) {\n filters.push(`points>=${options.minPoints}`);\n }\n\n if (options.minComments !== undefined && options.minComments > 0) {\n filters.push(`num_comments>=${options.minComments}`);\n }\n\n return filters.length > 0 ? filters.join(',') : undefined;\n}\n\nasync function searchHackerNewsAPI(params: {\n query?: string;\n tags?: string;\n numericFilters?: string;\n sortBy?: 'relevance' | 'date';\n page?: number;\n hitsPerPage?: number;\n}): Promise<HNSearchResponse> {\n const {\n query = '',\n tags,\n numericFilters,\n sortBy = 'relevance',\n page = 0,\n hitsPerPage = 20,\n } = params;\n\n const endpoint =\n sortBy === 'date'\n ? 'http://hn.algolia.com/api/v1/search_by_date'\n : 'http://hn.algolia.com/api/v1/search';\n\n const urlParams = new URLSearchParams();\n\n if (query) {\n urlParams.set('query', query);\n }\n\n if (tags) {\n urlParams.set('tags', tags);\n }\n\n if (numericFilters) {\n urlParams.set('numericFilters', numericFilters);\n }\n\n urlParams.set('page', page.toString());\n urlParams.set('hitsPerPage', Math.min(hitsPerPage, 1000).toString());\n\n const url = `${endpoint}?${urlParams.toString()}`;\n\n try {\n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `HN API error: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data as HNSearchResponse;\n } catch (error) {\n throw new Error(\n `Failed to search HackerNews: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n}\n\nasync function fetchHNItem(id: string): Promise<HNItemResponse> {\n const url = `http://hn.algolia.com/api/v1/items/${id}`;\n\n try {\n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `HN API error: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data as HNItemResponse;\n } catch (error) {\n throw new Error(\n `Failed to fetch HN item: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n}\n\nasync function fetchHNUser(username: string): Promise<HNUserResponse> {\n const url = `http://hn.algolia.com/api/v1/users/${username}`;\n\n try {\n const response = await fetch(url, {\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `HN API error: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = await response.json();\n return data as HNUserResponse;\n } catch (error) {\n throw new Error(\n `Failed to fetch HN user: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n}\n\nfunction formatDate(timestamp: number): string {\n return new Date(timestamp * 1000).toLocaleString();\n}\n\nfunction formatHNLink(id: string): string {\n return `https://news.ycombinator.com/item?id=${id}`;\n}\n\nfunction truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return `${text.substring(0, maxLength)}...`;\n}\n\nfunction formatStoryItem(\n hit: HNSearchItem,\n index: number,\n page: number,\n hitsPerPage: number,\n): string {\n const lines: string[] = [];\n const itemNumber = page * hitsPerPage + index + 1;\n\n lines.push(`\\n${itemNumber}. ${hit.title || '(No title)'}`);\n\n if (hit.url) {\n lines.push(` URL: ${hit.url}`);\n }\n\n if (hit.points !== null) {\n lines.push(\n ` ${hit.points} points | by ${hit.author} | ${hit.num_comments || 0} comments`,\n );\n } else {\n lines.push(` by ${hit.author}`);\n }\n\n lines.push(` Date: ${formatDate(hit.created_at_i)}`);\n\n if (hit.story_text) {\n lines.push(` Text: ${truncateText(hit.story_text, 200)}`);\n }\n\n lines.push(` HN Link: ${formatHNLink(hit.objectID)}`);\n\n return lines.join('\\n');\n}\n\nfunction formatCommentItem(\n hit: HNSearchItem,\n index: number,\n page: number,\n hitsPerPage: number,\n): string {\n const lines: string[] = [];\n const itemNumber = page * hitsPerPage + index + 1;\n\n lines.push(`\\n${itemNumber}. Comment by ${hit.author}`);\n\n if (hit.comment_text) {\n lines.push(` ${truncateText(hit.comment_text, 300)}`);\n }\n\n lines.push(` Date: ${formatDate(hit.created_at_i)}`);\n lines.push(` HN Link: ${formatHNLink(hit.objectID)}`);\n\n return lines.join('\\n');\n}\n\nfunction formatMixedItem(\n hit: HNSearchItem,\n index: number,\n page: number,\n hitsPerPage: number,\n): string {\n const lines: string[] = [];\n const itemNumber = page * hitsPerPage + index + 1;\n const isStory = hit._tags.includes('story');\n const isComment = hit._tags.includes('comment');\n const type = isStory ? 'Story' : 'Comment';\n\n lines.push(`\\n${itemNumber}. [${type}] ${hit.title || 'Comment'}`);\n\n if (isStory) {\n if (hit.url) {\n lines.push(` URL: ${hit.url}`);\n }\n if (hit.points !== null) {\n lines.push(` ${hit.points} points | ${hit.num_comments || 0} comments`);\n }\n if (hit.story_text) {\n lines.push(` Text: ${truncateText(hit.story_text, 200)}`);\n }\n } else if (isComment && hit.comment_text) {\n lines.push(` ${truncateText(hit.comment_text, 200)}`);\n }\n\n lines.push(` Date: ${formatDate(hit.created_at_i)}`);\n lines.push(` HN Link: ${formatHNLink(hit.objectID)}`);\n\n return lines.join('\\n');\n}\n\nfunction formatSearchResults(\n response: HNSearchResponse,\n options: {\n itemType: 'story' | 'comment' | 'mixed';\n emptyMessage: string;\n },\n): string {\n const { hits, nbHits, page, nbPages } = response;\n const { itemType, emptyMessage } = options;\n\n if (hits.length === 0) {\n return emptyMessage;\n }\n\n const formatItem = (hit: HNSearchItem, index: number) => {\n switch (itemType) {\n case 'story':\n return formatStoryItem(hit, index, page, response.hitsPerPage);\n case 'comment':\n return formatCommentItem(hit, index, page, response.hitsPerPage);\n case 'mixed':\n return formatMixedItem(hit, index, page, response.hitsPerPage);\n }\n };\n\n const results = hits.map(formatItem);\n const typeLabel =\n itemType === 'mixed'\n ? 'results'\n : `${itemType === 'story' ? 'stories' : 'comments'}`;\n const header = `Found ${nbHits} ${typeLabel} (showing page ${page + 1} of ${nbPages}):\\n`;\n\n return header + results.join('\\n');\n}\n\nfunction formatStoryResults(response: HNSearchResponse): string {\n return formatSearchResults(response, {\n itemType: 'story',\n emptyMessage: `No stories found for query: \"${response.query}\"`,\n });\n}\n\nfunction formatCommentResults(response: HNSearchResponse): string {\n return formatSearchResults(response, {\n itemType: 'comment',\n emptyMessage: `No comments found for query: \"${response.query}\"`,\n });\n}\n\nfunction formatAuthorResults(response: HNSearchResponse): string {\n return formatSearchResults(response, {\n itemType: 'mixed',\n emptyMessage: 'No results found for this author',\n });\n}\n\nfunction formatItemDetails(item: HNItemResponse): string {\n const lines: string[] = [];\n\n if (item.type === 'story') {\n lines.push(`Story: ${item.title || '(No title)'}`);\n if (item.url) {\n lines.push(`URL: ${item.url}`);\n }\n lines.push(`By: ${item.author}`);\n if (item.points !== undefined) {\n lines.push(`Points: ${item.points}`);\n }\n lines.push(`Date: ${formatDate(item.created_at_i)}`);\n if (item.text) {\n lines.push(`\\nText:\\n${item.text}`);\n }\n lines.push(`\\nHN Link: ${formatHNLink(item.id)}`);\n } else if (item.type === 'comment') {\n lines.push(`Comment by ${item.author}`);\n if (item.story_title) {\n lines.push(`On story: ${item.story_title}`);\n }\n lines.push(`Date: ${formatDate(item.created_at_i)}`);\n if (item.text) {\n lines.push(`\\n${item.text}`);\n }\n lines.push(`\\nHN Link: ${formatHNLink(item.id)}`);\n }\n\n return lines.join('\\n');\n}\n\nfunction formatUserProfile(user: HNUserResponse): string {\n const lines: string[] = [];\n\n lines.push(`User: ${user.username}`);\n lines.push(`Karma: ${user.karma.toLocaleString()}`);\n lines.push(`Member since: ${formatDate(user.created_at_i)}`);\n\n if (user.about) {\n lines.push(`\\nAbout:\\n${user.about}`);\n }\n\n lines.push(\n `\\nProfile: https://news.ycombinator.com/user?id=${user.username}`,\n );\n\n return lines.join('\\n');\n}\n\nfunction formatJobItem(\n hit: HNSearchItem,\n index: number,\n page: number,\n hitsPerPage: number,\n): string {\n const lines: string[] = [];\n const itemNumber = page * hitsPerPage + index + 1;\n\n lines.push(`\\n${itemNumber}. ${hit.title || '(No title)'}`);\n\n if (hit.url) {\n lines.push(` URL: ${hit.url}`);\n }\n\n lines.push(` Posted by: ${hit.author}`);\n lines.push(` Date: ${formatDate(hit.created_at_i)}`);\n\n if (hit.story_text) {\n lines.push(` Description: ${truncateText(hit.story_text, 300)}`);\n }\n\n lines.push(` HN Link: ${formatHNLink(hit.objectID)}`);\n\n return lines.join('\\n');\n}\n\nfunction formatJobResults(response: HNSearchResponse): string {\n const { hits, nbHits, page, nbPages } = response;\n\n if (hits.length === 0) {\n return `No job postings found for query: \"${response.query}\"`;\n }\n\n const results = hits.map((hit, index) =>\n formatJobItem(hit, index, page, response.hitsPerPage),\n );\n\n const header = `Found ${nbHits} job postings (showing page ${page + 1} of ${nbPages}):\\n`;\n return header + results.join('\\n');\n}\n\nexport const search_by_query = tool({\n description:\n 'Tool to search HackerNews stories by keywords and filters. Use when you need to find HN stories matching specific search criteria, time periods, or popularity thresholds.',\n inputSchema: z.object({\n query: z\n .string()\n .describe(\n 'Search query for story titles and content. Examples: \"artificial intelligence\", \"python\"',\n ),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n minPoints: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum points threshold'),\n minComments: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum comments threshold'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('relevance')\n .describe('Sort results by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n minPoints: input.minPoints,\n minComments: input.minComments,\n });\n\n const response = await searchHackerNewsAPI({\n query: input.query,\n tags: 'story',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nexport const search_by_author = tool({\n description:\n 'Tool to search HackerNews content by author username. Use when you need to find all stories, comments, or both by a specific HN user.',\n inputSchema: z.object({\n author: z\n .string()\n .describe('HackerNews username to search for. Examples: \"pg\", \"tptacek\"'),\n type: z\n .enum(['story', 'comment', 'all'])\n .default('all')\n .describe('Type of content: story, comment, or all'),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n minComments: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum comments threshold (for stories only)'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort results by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const tags = buildTags({ type: input.type, author: input.author });\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n minComments: input.minComments,\n });\n\n const response = await searchHackerNewsAPI({\n tags,\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatAuthorResults(response);\n },\n});\n\nexport const get_story_item = tool({\n description:\n 'Tool to get detailed information about a specific HackerNews story by ID. Use when you need full details about a particular HN story including title, URL, author, points, and comments.',\n inputSchema: z.object({\n storyId: z.string().describe('HackerNews story ID. Example: \"38709478\"'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const item = await fetchHNItem(input.storyId);\n\n if (item.type !== 'story') {\n throw new Error(\n `Item ${input.storyId} is not a story (type: ${item.type})`,\n );\n }\n\n context.hackernews_sources.push({\n title: item.title || 'Untitled',\n hn_url: `https://news.ycombinator.com/item?id=${item.id}`,\n story_url: item.url || '',\n });\n\n return formatItemDetails(item);\n },\n});\n\nexport const get_story_comment = tool({\n description:\n 'Tool to get detailed information about a specific HackerNews comment by ID. Use when you need full details about a particular comment including text, author, and parent story information.',\n inputSchema: z.object({\n commentId: z\n .string()\n .describe('HackerNews comment ID. Example: \"38710123\"'),\n }),\n execute: async (input) => {\n const item = await fetchHNItem(input.commentId);\n\n if (item.type !== 'comment') {\n throw new Error(\n `Item ${input.commentId} is not a comment (type: ${item.type})`,\n );\n }\n\n return formatItemDetails(item);\n },\n});\n\nexport const get_front_page_stories = tool({\n description:\n 'Tool to get current HackerNews front page stories. Use when you need to see the latest trending and popular stories on HN.',\n inputSchema: z.object({\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(50)\n .default(30)\n .describe('Results per page (max 50)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const response = await searchHackerNewsAPI({\n tags: 'front_page',\n sortBy: 'date',\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nexport const get_story_comments = tool({\n description:\n 'Tool to get all comments for a specific HackerNews story. Use when you need to read the discussion and comments on a particular HN story.',\n inputSchema: z.object({\n storyId: z.string().describe('HackerNews story ID. Example: \"38709478\"'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort comments by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(50)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input) => {\n const response = await searchHackerNewsAPI({\n tags: `comment,story_${input.storyId}`,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n return formatCommentResults(response);\n },\n});\n\nexport const search_ask_hn = tool({\n description:\n 'Tool to search Ask HN posts - questions posed to the HackerNews community. Use when you need to find community questions and discussions on specific topics.',\n inputSchema: z.object({\n query: z\n .string()\n .default('')\n .describe(\n 'Search query for Ask HN posts. Examples: \"artificial intelligence\", \"career\"',\n ),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n minPoints: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum points threshold'),\n minComments: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum comments threshold'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('relevance')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n minPoints: input.minPoints,\n minComments: input.minComments,\n });\n\n const response = await searchHackerNewsAPI({\n query: input.query,\n tags: 'ask_hn',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nexport const search_show_hn = tool({\n description:\n 'Tool to search Show HN posts - projects and products shared with the HackerNews community. Use when you need to discover community projects, demos, or products on specific topics.',\n inputSchema: z.object({\n query: z\n .string()\n .default('')\n .describe(\n 'Search query for Show HN posts. Examples: \"web app\", \"open source\"',\n ),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n minPoints: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum points threshold'),\n minComments: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum comments threshold'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('relevance')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n minPoints: input.minPoints,\n minComments: input.minComments,\n });\n\n const response = await searchHackerNewsAPI({\n query: input.query,\n tags: 'show_hn',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nexport const search_jobs = tool({\n description:\n 'Tool to search HackerNews job postings. Use when you need to find tech job opportunities posted on HN.',\n inputSchema: z.object({\n query: z\n .string()\n .default('')\n .describe(\n 'Search query for job postings. Examples: \"remote\", \"machine learning\"',\n ),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n });\n\n const response = await searchHackerNewsAPI({\n query: input.query,\n tags: 'job',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatJobResults(response);\n },\n});\n\nexport const search_polls = tool({\n description:\n 'Tool to search HackerNews polls - community surveys and voting. Use when you need to find community polls on various topics.',\n inputSchema: z.object({\n query: z\n .string()\n .default('')\n .describe('Search query for polls. Example: \"programming language\"'),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n });\n\n const response = await searchHackerNewsAPI({\n query: input.query,\n tags: 'poll',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nexport const get_user_profile = tool({\n description:\n \"Tool to get HackerNews user profile information. Use when you need to view a user's karma, account creation date, and bio.\",\n inputSchema: z.object({\n username: z.string().describe('HackerNews username. Example: \"pg\"'),\n }),\n execute: async (input) => {\n const user = await fetchHNUser(input.username);\n return formatUserProfile(user);\n },\n});\n\nexport const search_by_domain = tool({\n description:\n 'Tool to search HackerNews stories from a specific domain or website. Use when you need to find all HN posts from a particular domain or track discussions about content from specific websites.',\n inputSchema: z.object({\n domain: z\n .string()\n .describe('Domain to search. Examples: \"github.com\", \"arxiv.org\"'),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n minPoints: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum points threshold'),\n minComments: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum comments threshold'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n minPoints: input.minPoints,\n minComments: input.minComments,\n });\n\n const urlParams = new URLSearchParams();\n urlParams.set('query', input.domain);\n urlParams.set('restrictSearchableAttributes', 'url');\n urlParams.set('tags', 'story');\n if (numericFilters) {\n urlParams.set('numericFilters', numericFilters);\n }\n urlParams.set('page', input.page.toString());\n urlParams.set('hitsPerPage', input.hitsPerPage.toString());\n\n const endpoint =\n input.sortBy === 'date'\n ? 'http://hn.algolia.com/api/v1/search_by_date'\n : 'http://hn.algolia.com/api/v1/search';\n\n const url = `${endpoint}?${urlParams.toString()}`;\n\n const response = await fetch(url, {\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!response.ok) {\n throw new Error(\n `HN API error: ${response.status} ${response.statusText}`,\n );\n }\n\n const data = (await response.json()) as HNSearchResponse;\n fillContext(context, data);\n return formatStoryResults(data);\n },\n});\n\nexport const search_highly_discussed = tool({\n description:\n 'Tool to search for highly discussed HackerNews stories with many comments. Use when you need to find engaging or controversial discussions with significant community participation.',\n inputSchema: z.object({\n minComments: z\n .number()\n .int()\n .min(1)\n .describe(\n 'Minimum number of comments (required). Example: 100 for highly discussed stories',\n ),\n query: z\n .string()\n .default('')\n .describe('Optional search query. Example: \"AI\"'),\n timeFilter: z\n .enum(['d', 'w', 'm', 'y', 'all'])\n .default('all')\n .describe('Time filter: d=day, w=week, m=month, y=year, all=no filter'),\n minPoints: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('Minimum points threshold'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(1000)\n .default(20)\n .describe('Results per page (max 1000)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n timeFilter: input.timeFilter,\n minPoints: input.minPoints,\n minComments: input.minComments,\n });\n\n const response = await searchHackerNewsAPI({\n query: input.query,\n tags: 'story',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nexport const search_trending = tool({\n description:\n \"Tool to find currently trending HackerNews stories - recent posts with high engagement. Use when you need to discover what's hot right now on HN by combining recency with high points and comments.\",\n inputSchema: z.object({\n minPoints: z\n .number()\n .int()\n .min(10)\n .default(50)\n .describe(\n 'Minimum points threshold. Example: 100 for highly upvoted stories',\n ),\n maxAgeHours: z\n .number()\n .int()\n .min(1)\n .max(72)\n .default(24)\n .describe('Maximum age in hours. Example: 24 for stories from today'),\n minComments: z\n .number()\n .int()\n .min(0)\n .default(10)\n .describe('Minimum comments threshold'),\n sortBy: z\n .enum(['relevance', 'date'])\n .default('date')\n .describe('Sort by relevance or date'),\n page: z\n .number()\n .int()\n .min(0)\n .default(0)\n .describe('Page number (0-indexed)'),\n hitsPerPage: z\n .number()\n .int()\n .min(1)\n .max(100)\n .default(30)\n .describe('Results per page (max 100)'),\n }),\n execute: async (input, options) => {\n const context = toState<{\n hackernews_sources: {\n title: string;\n hn_url: string;\n story_url: string;\n }[];\n }>(options);\n context.hackernews_sources ??= [];\n\n const numericFilters = buildNumericFilters({\n maxAgeHours: input.maxAgeHours,\n minPoints: input.minPoints,\n minComments: input.minComments,\n });\n\n const response = await searchHackerNewsAPI({\n tags: 'story',\n numericFilters,\n sortBy: input.sortBy,\n page: input.page,\n hitsPerPage: input.hitsPerPage,\n });\n\n fillContext(context, response);\n return formatStoryResults(response);\n },\n});\n\nfunction fillContext(\n context: {\n hackernews_sources: {\n title?: string | null;\n hn_url?: string | null;\n story_url?: string | null;\n story_text?: string | null;\n comment_text?: string | null;\n }[];\n },\n result: HNSearchResponse,\n) {\n result.hits.forEach((hit) => {\n context.hackernews_sources.push({\n title: hit.title,\n hn_url: hit.objectID\n ? `https://news.ycombinator.com/item?id=${hit.objectID}`\n : undefined,\n story_url: hit.url,\n story_text: hit.story_text,\n comment_text: hit.comment_text,\n });\n });\n}\n\nexport const hackernewsTools = {\n search_by_query,\n search_by_author,\n get_story_item,\n get_story_comment,\n get_front_page_stories,\n get_story_comments,\n search_ask_hn,\n search_show_hn,\n search_jobs,\n search_polls,\n get_user_profile,\n search_by_domain,\n search_highly_discussed,\n search_trending,\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["tool", "z", "res", "items", "z", "tool", "tool", "z", "tool", "z", "tool", "z", "tool", "z", "toState", "tool", "z", "toState"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"weather.d.ts","sourceRoot":"","sources":["../../src/lib/weather.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAQ,MAAM,IAAI,CAAC;AACjD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;iBAU3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,eAAO,MAAM,cAAc;;;;;;;;;;;;;EAuDzB,CAAC;AAwHH,MAAM,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"weather.d.ts","sourceRoot":"","sources":["../../src/lib/weather.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAQ,MAAM,IAAI,CAAC;AACjD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;iBAU3B,CAAC;AAGH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,eAAO,MAAM,cAAc;;;;;;;;;;;;;EAmDzB,CAAC;AAwHH,MAAM,MAAM,eAAe,GAAG,gBAAgB,CAAC,OAAO,cAAc,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepagents/toolbox",
3
- "version": "0.10.2",
3
+ "version": "0.12.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -37,9 +37,9 @@
37
37
  "access": "public"
38
38
  },
39
39
  "dependencies": {
40
- "@ai-sdk/groq": "2.0.26",
41
- "@deepagents/agent": "0.10.2",
42
- "ai": "^5.0.82",
40
+ "@ai-sdk/groq": "^3.0.10",
41
+ "@deepagents/agent": "0.12.0",
42
+ "ai": "^6.0.39",
43
43
  "duck-duck-scrape": "^2.2.7",
44
44
  "lodash-es": "^4.17.21",
45
45
  "nano-spawn": "^2.0.0",