diff --git a/supporting-blog-content/langgraph-js-elasticsearch/README.md b/supporting-blog-content/langgraph-js-elasticsearch/README.md new file mode 100644 index 00000000..619b0ea7 --- /dev/null +++ b/supporting-blog-content/langgraph-js-elasticsearch/README.md @@ -0,0 +1,43 @@ +# LangGraph.js + Elasticsearch + +This application was developed to demonstrate the integration of LangGraph.js with Elasticsearch for advanced search workflows, as part of the Search Labs blog post [LangGraph JS + Elasticsearch +](https://www.elastic.co/search-labs/blog/langgraph-js-elasticsearch). + +**Practical example:** A smart startup search system that combines LangGraph.js workflow orchestration with Elasticsearch's hybrid search capabilities to find venture capital opportunities using natural language queries. + +## Prerequisites + +- Node.js 18+ +- Elasticsearch 9.x running locally or remotely +- OpenAI API key + +## Setup + +### Environment Variables + +- `OPENAI_API_KEY` - Your OpenAI API key +- `ELASTICSEARCH_URL` - Elasticsearch endpoint +- `ELASTICSEARCH_API_KEY` - Elasticsearch API key + +1. Install dependencies: +```bash +npm install +``` + +2. Run the application: +```bash +npm start +``` + + +## Example usage queries + +- **Market focused:** +``` +Find fintech and healthcare startups in San Francisco, New York, or Boston +``` + +- **Invest focused:** +``` +Find startups with Series A or Series B funding between $8M-$25M and monthly revenue above $500K +``` \ No newline at end of file diff --git a/supporting-blog-content/langgraph-js-elasticsearch/dataset.json b/supporting-blog-content/langgraph-js-elasticsearch/dataset.json new file mode 100644 index 00000000..7728ff93 --- /dev/null +++ b/supporting-blog-content/langgraph-js-elasticsearch/dataset.json @@ -0,0 +1,222 @@ +[ + { + "description": "TechFlow optimizes supply chain operations using AI-powered route optimization and real-time tracking. Founded in 2023, shows remarkable growth with $500K monthly revenue.", + "company_name": "TechFlow", + "industry": "logistics", + "location": "San Francisco, CA", + "funding_stage": "Series A", + "funding_amount": 8000000, + "lead_investor": "Sequoia Capital", + "monthly_revenue": 500000, + "business_model": "B2B" + }, + { + "description": "UrbanMobility revolutionizes urban transportation through autonomous delivery drones and smart logistics hubs. Partners with major retailers for same-day delivery across Manhattan and Brooklyn.", + "company_name": "UrbanMobility", + "industry": "logistics", + "location": "New York, NY", + "funding_stage": "Series B", + "funding_amount": 15000000, + "lead_investor": "Kleiner Perkins", + "monthly_revenue": 750000, + "business_model": "B2B2C" + }, + { + "description": "FinanceAI provides AI-powered investment advisory services to retail investors. Uses machine learning to analyze market trends with over 100,000 active users.", + "company_name": "FinanceAI", + "industry": "fintech", + "location": "San Francisco, CA", + "funding_stage": "Series C", + "funding_amount": 25000000, + "lead_investor": "Tiger Global Management", + "monthly_revenue": 1200000, + "business_model": "B2C" + }, + { + "description": "HealthTech Solutions develops medical devices and software for remote patient monitoring. Comprehensive telehealth platform reducing hospital readmissions by 30%.", + "company_name": "HealthTech Solutions", + "industry": "healthcare", + "location": "Boston, MA", + "funding_stage": "Series B", + "funding_amount": 18000000, + "lead_investor": "General Catalyst", + "monthly_revenue": 900000, + "business_model": "B2B" + }, + { + "description": "SmartWarehouse transforms traditional warehouses into automated facilities using robotics and AI. Robotic systems pick, pack, and sort 5x faster than human workers.", + "company_name": "SmartWarehouse", + "industry": "logistics", + "location": "New York, NY", + "funding_stage": "Seed", + "funding_amount": 5000000, + "lead_investor": "Founders Fund", + "monthly_revenue": 300000, + "business_model": "B2B" + }, + { + "description": "EcoTransport provides carbon-neutral delivery services using electric vehicles and optimized routing algorithms. Popular with environmentally conscious brands.", + "company_name": "EcoTransport", + "industry": "logistics", + "location": "San Francisco, CA", + "funding_stage": "Series A", + "funding_amount": 12000000, + "lead_investor": "NEA (New Enterprise Associates)", + "monthly_revenue": 650000, + "business_model": "B2B" + }, + { + "description": "CyberSecure develops AI-powered threat detection and response systems for enterprise clients. Platform identifies and neutralizes cyber threats 10x faster than traditional systems.", + "company_name": "CyberSecure", + "industry": "cybersecurity", + "location": "Austin, TX", + "funding_stage": "Series B", + "funding_amount": 20000000, + "lead_investor": "Insight Partners", + "monthly_revenue": 1100000, + "business_model": "B2B" + }, + { + "description": "DataViz creates intuitive data visualization tools for enterprise customers. No-code platform allows business users to create dashboards without technical expertise.", + "company_name": "DataViz", + "industry": "enterprise software", + "location": "New York, NY", + "funding_stage": "Series A", + "funding_amount": 10000000, + "lead_investor": "Battery Ventures", + "monthly_revenue": 450000, + "business_model": "B2B" + }, + { + "description": "CloudNative builds kubernetes-native development tools for cloud deployment and management. Platform reduces deployment time by 80% for developers.", + "company_name": "CloudNative", + "industry": "developer tools", + "location": "Seattle, WA", + "funding_stage": "Seed", + "funding_amount": 6000000, + "lead_investor": "Madrona Venture Group", + "monthly_revenue": 250000, + "business_model": "B2B" + }, + { + "description": "LastMile Logistics revolutionizes final-mile delivery through micro-fulfillment centers and crowdsourced drivers. Uses predictive analytics for under 30-minute delivery times.", + "company_name": "LastMile Logistics", + "industry": "logistics", + "location": "San Francisco, CA", + "funding_stage": "Series A", + "funding_amount": 14000000, + "lead_investor": "Benchmark Capital", + "monthly_revenue": 580000, + "business_model": "B2B2C" + }, + { + "description": "TechMed develops AI-powered diagnostic tools for hospitals and clinics. Platform improves diagnostic accuracy by 45% using computer vision and machine learning.", + "company_name": "TechMed", + "industry": "healthcare", + "location": "Los Angeles, CA", + "funding_stage": "Series A", + "funding_amount": 9000000, + "lead_investor": "GV (Google Ventures)", + "monthly_revenue": 380000, + "business_model": "B2B" + }, + { + "description": "CryptoWallet provides secure digital wallet solutions for cryptocurrency trading and storage. Multi-chain support with enterprise-grade security features.", + "company_name": "CryptoWallet", + "industry": "fintech", + "location": "Miami, FL", + "funding_stage": "Series B", + "funding_amount": 16000000, + "lead_investor": "Coinbase Ventures", + "monthly_revenue": 820000, + "business_model": "B2C" + }, + { + "description": "GreenEnergy develops solar panel optimization software for residential and commercial installations. AI algorithms increase energy efficiency by 35%.", + "company_name": "GreenEnergy", + "industry": "cleantech", + "location": "Denver, CO", + "funding_stage": "Series B", + "funding_amount": 22000000, + "lead_investor": "Energy Impact Partners", + "monthly_revenue": 95000, + "business_model": "B2C" + }, + { + "description": "EduTech creates interactive learning platforms for K-12 education. Gamified learning experiences improve student engagement by 60% across 500+ schools.", + "company_name": "EduTech", + "industry": "edtech", + "location": "Chicago, IL", + "funding_stage": "Series A", + "funding_amount": 11000000, + "lead_investor": "Reach Capital", + "monthly_revenue": 420000, + "business_model": "B2B" + }, + { + "description": "RoboFarm develops autonomous farming robots for precision agriculture. Robots plant, monitor, and harvest crops with 90% less water usage than traditional farming.", + "company_name": "RoboFarm", + "industry": "agtech", + "location": "Portland, OR", + "funding_stage": "Seed", + "funding_amount": 7000000, + "lead_investor": "S2G Ventures", + "monthly_revenue": 290000, + "business_model": "B2B" + }, + { + "description": "VRFitness creates immersive virtual reality fitness experiences for home users. Platform offers 200+ workout programs with real-time coaching and social features.", + "company_name": "VRFitness", + "industry": "fitness tech", + "location": "San Diego, CA", + "funding_stage": "Seed", + "funding_amount": 4500000, + "lead_investor": "Bullpen Capital", + "monthly_revenue": 180000, + "business_model": "B2C" + }, + { + "description": "SmartRetail provides AI-powered inventory management and customer analytics for retail chains. Platform reduces inventory costs by 25% while improving customer satisfaction.", + "company_name": "SmartRetail", + "industry": "retail tech", + "location": "Atlanta, GA", + "funding_stage": "Series B", + "funding_amount": 19000000, + "lead_investor": "Norwest Venture Partners", + "monthly_revenue": 780000, + "business_model": "B2B" + }, + { + "description": "PropTech Solutions develops smart building management systems for commercial real estate. IoT sensors and AI optimize energy usage and maintenance schedules.", + "company_name": "PropTech Solutions", + "industry": "proptech", + "location": "Phoenix, AZ", + "funding_stage": "Series A", + "funding_amount": 13000000, + "lead_investor": "Fifth Wall", + "monthly_revenue": 540000, + "business_model": "B2B" + }, + { + "description": "GameStudio creates mobile gaming experiences with blockchain integration. Free-to-play games with NFT rewards have reached 2 million active users.", + "company_name": "GameStudio", + "industry": "gaming", + "location": "Las Vegas, NV", + "funding_stage": "Series A", + "funding_amount": 12000000, + "lead_investor": "Bitkraft Ventures", + "monthly_revenue": 680000, + "business_model": "B2C" + }, + { + "description": "SpaceTech develops satellite communication systems for rural internet connectivity. Low-orbit satellites provide high-speed internet to underserved areas globally.", + "company_name": "SpaceTech", + "industry": "aerospace", + "location": "Houston, TX", + "funding_stage": "Series C", + "funding_amount": 35000000, + "lead_investor": "Space Capital", + "monthly_revenue": 1400000, + "business_model": "B2B2C" + } +] diff --git a/supporting-blog-content/langgraph-js-elasticsearch/elasticsearchSetup.ts b/supporting-blog-content/langgraph-js-elasticsearch/elasticsearchSetup.ts new file mode 100644 index 00000000..7d1c09b0 --- /dev/null +++ b/supporting-blog-content/langgraph-js-elasticsearch/elasticsearchSetup.ts @@ -0,0 +1,220 @@ +import fs from "node:fs/promises"; +import { Client } from "@elastic/elasticsearch"; +import { z } from "zod"; +import dotenv from "dotenv"; + +dotenv.config(); + +const INDEX_NAME: string = "startups-index"; +const INVESTMENT_FOCUSED_TEMPLATE = "investment-focused-template"; +const MARKET_FOCUSED_TEMPLATE = "market-focused-template"; +const ELASTICSEARCH_ENDPOINT: string = process.env.ELASTICSEARCH_ENDPOINT ?? ""; +const ELASTICSEARCH_API_KEY: string = process.env.ELASTICSEARCH_API_KEY ?? ""; + +const esClient = new Client({ + node: ELASTICSEARCH_ENDPOINT, + auth: { + apiKey: ELASTICSEARCH_API_KEY, + }, +}); + +const StartupDocumentSchema = z.object({ + description: z.string(), + semantic_field: z.string(), + company_name: z.string(), + industry: z.string(), + location: z.string(), + funding_stage: z.string(), + funding_amount: z.number(), + lead_investor: z.string(), + monthly_revenue: z.number(), + business_model: z.string(), +}); + +type StartupDocumentType = z.infer; + +async function loadDataset(path: string): Promise { + const raw = await fs.readFile(path, "utf-8"); + const data = JSON.parse(raw); + + return data; +} + +async function createIndex() { + const indexExists = await esClient.indices.exists({ index: INDEX_NAME }); + + if (indexExists) { + console.log("✅ Index already exists."); + return; + } + + await esClient.indices.create({ + index: INDEX_NAME, + mappings: { + properties: { + description: { + type: "text", + copy_to: "semantic_field", + }, + company_name: { + type: "keyword", + copy_to: "semantic_field", + }, + industry: { + type: "keyword", + copy_to: "semantic_field", + }, + location: { + type: "keyword", + copy_to: "semantic_field", + }, + funding_stage: { + type: "keyword", + copy_to: "semantic_field", + }, + funding_amount: { type: "long" }, + lead_investor: { + type: "keyword", + copy_to: "semantic_field", + }, + monthly_revenue: { type: "long" }, + business_model: { + type: "keyword", + copy_to: "semantic_field", + }, + semantic_field: { type: "semantic_text" }, + }, + }, + }); + + console.log("✅ Index created successfully!"); +} + +async function ingestDocuments() { + const indexCount = await esClient.count({ index: INDEX_NAME }); + const documentCount = indexCount.count; + + if (documentCount == 0) { + const datasetPath = "./dataset.json"; + const documents = await loadDataset(datasetPath); + + console.log("Ingesting documents..."); + + try { + const body = documents.flatMap((doc) => [ + { index: { _index: INDEX_NAME } }, + doc, + ]); + + await esClient.bulk({ body }); + + console.log("✅ Documents ingested successfully!"); + } catch (error: any) { + console.error("❌ Error during ingestion:", error.message); + } + } +} + +// Register RRF hybrid search templates in Elasticsearch +async function createSearchTemplates() { + try { + await esClient.putScript({ + id: INVESTMENT_FOCUSED_TEMPLATE, + script: { + lang: "mustache", + source: `{ + "size": 5, + "retriever": { + "rrf": { + "retrievers": [ + { + "standard": { + "query": { + "semantic": { + "field": "semantic_field", + "query": "{{query_text}}" + } + } + } + }, + { + "standard": { + "query": { + "bool": { + "filter": [ + {"terms": {"funding_stage": {{#join}}{{#toJson}}funding_stage{{/toJson}}{{/join}}}}, + {"range": {"funding_amount": {"gte": {{funding_amount_gte}}{{#funding_amount_lte}},"lte": {{funding_amount_lte}}{{/funding_amount_lte}}}}}, + {"terms": {"lead_investor": {{#join}}{{#toJson}}lead_investor{{/toJson}}{{/join}}}}, + {"range": {"monthly_revenue": {"gte": {{monthly_revenue_gte}}{{#monthly_revenue_lte}},"lte": {{monthly_revenue_lte}}{{/monthly_revenue_lte}}}}} + ] + } + } + } + } + ], + "rank_window_size": 100, + "rank_constant": 20 + } + } + }`, + }, + }); + + console.log("✅ Investment-focused template created successfully!"); + + await esClient.putScript({ + id: MARKET_FOCUSED_TEMPLATE, + script: { + lang: "mustache", + source: `{ + "size": 5, + "retriever": { + "rrf": { + "retrievers": [ + { + "standard": { + "query": { + "semantic": { + "field": "semantic_field", + "query": "{{query_text}}" + } + } + } + }, + { + "standard": { + "query": { + "bool": { + "filter": [ + {"terms": {"industry": {{#join}}{{#toJson}}industry{{/toJson}}{{/join}}}}, + {"terms": {"location": {{#join}}{{#toJson}}location{{/toJson}}{{/join}}}}, + {"terms": {"business_model": {{#join}}{{#toJson}}business_model{{/toJson}}{{/join}}}} + ] + } + } + } + } + ], + "rank_window_size": 50, + "rank_constant": 10 + } + } + }`, + }, + }); + + console.log("✅ Market-focused template created successfully!"); + } catch (error) { + console.error("❌ Error creating RRF templates:", error); + } +} + +export { + createIndex, + ingestDocuments, + createSearchTemplates, + esClient, + INDEX_NAME, + INVESTMENT_FOCUSED_TEMPLATE, + MARKET_FOCUSED_TEMPLATE, +}; diff --git a/supporting-blog-content/langgraph-js-elasticsearch/main.ts b/supporting-blog-content/langgraph-js-elasticsearch/main.ts new file mode 100644 index 00000000..becb1c36 --- /dev/null +++ b/supporting-blog-content/langgraph-js-elasticsearch/main.ts @@ -0,0 +1,327 @@ +import { writeFileSync } from "node:fs"; +import { StateGraph, Annotation, START, END } from "@langchain/langgraph"; +import { ChatOpenAI } from "@langchain/openai"; +import { z } from "zod"; +import { + esClient, + ingestDocuments, + createSearchTemplates, + INDEX_NAME, + INVESTMENT_FOCUSED_TEMPLATE, + MARKET_FOCUSED_TEMPLATE, + createIndex, +} from "./elasticsearchSetup.js"; + +const llm = new ChatOpenAI({ model: "gpt-4o-mini" }); + +// Define state for workflow +const VCState = Annotation.Root({ + input: Annotation(), // User's natural language query + searchStrategy: Annotation(), // Search strategy chosen by LLM + searchParams: Annotation(), // Prepared search parameters + results: Annotation(), // Search results + final: Annotation(), // Final formatted response +}); + +// Extract available filter values from Elasticsearch using aggregations +async function getAvailableFilters() { + try { + const response = await esClient.search({ + index: INDEX_NAME, + size: 0, + aggs: { + industries: { + terms: { field: "industry", size: 100 }, + }, + locations: { + terms: { field: "location", size: 100 }, + }, + funding_stages: { + terms: { field: "funding_stage", size: 20 }, + }, + business_models: { + terms: { field: "business_model", size: 10 }, + }, + lead_investors: { + terms: { field: "lead_investor", size: 100 }, + }, + funding_amount_stats: { + stats: { field: "funding_amount" }, + }, + }, + }); + + console.log( + "✅ Available filters:", + JSON.stringify(response.aggregations, null, 2) + ); + + return response.aggregations; + } catch (error) { + console.error("❌ Error getting available filters:", error); + + return {}; + } +} + +// Node 1: Decide search strategy using LLM +async function decideSearchStrategy(state: typeof VCState.State) { + // Zod schema for specialized search strategy decision + const SearchDecisionSchema = z.object({ + search_type: z + .enum(["investment_focused", "market_focused"]) + .describe("Type of specialized search strategy to use"), + reasoning: z + .string() + .describe("Brief explanation of why this search strategy was chosen"), + }); + + const decisionLLM = llm.withStructuredOutput(SearchDecisionSchema); + + // Get dynamic filters from Elasticsearch + const availableFilters = await getAvailableFilters(); + + const prompt = `Query: "${state.input}" + Available filters: ${JSON.stringify(availableFilters, null, 2)} + + Choose between two specialized search strategies: + + - investment_focused: For queries about funding stages, funding amounts, monthly revenue, lead investors, financial performance + + - market_focused: For queries about industries, locations, business models, market segments, geographic markets + + Analyze the query intent and choose the most appropriate strategy. + `; + + try { + const result = await decisionLLM.invoke(prompt); + console.log( + `🤔 Search strategy: ${result.search_type} - ${result.reasoning}` + ); + + return { + searchStrategy: result.search_type, + }; + } catch (error: any) { + console.error("❌ Error in decideSearchStrategy:", error.message); + return { + searchStrategy: "investment_focused", + }; + } +} + +// Extract all possible filter values from user input +async function extractFilterValues(input: string) { + const FilterValuesSchema = z.object({ + // Investment-focused filters + funding_stage: z + .array(z.string()) + .default([]) + .describe("Funding stage values mentioned in query"), + funding_amount_gte: z + .number() + .default(0) + .describe("Minimum funding amount in USD"), + funding_amount_lte: z + .number() + .default(100000000) + .describe("Maximum funding amount in USD"), + lead_investor: z + .array(z.string()) + .default([]) + .describe("Lead investor values mentioned in query"), + monthly_revenue_gte: z + .number() + .default(0) + .describe("Minimum monthly revenue in USD"), + monthly_revenue_lte: z + .number() + .default(10000000) + .describe("Maximum monthly revenue in USD"), + industry: z + .array(z.string()) + .default([]) + .describe("Industry values mentioned in query"), + location: z + .array(z.string()) + .default([]) + .describe("Location values mentioned in query"), + business_model: z + .array(z.string()) + .default([]) + .describe("Business model values mentioned in query"), + }); + + const extractorLLM = llm.withStructuredOutput(FilterValuesSchema); + const availableFilters = await getAvailableFilters(); + + const extractPrompt = `Extract ALL relevant filter values from: "${input}" + Available options: ${JSON.stringify(availableFilters, null, 2)} + Extract only values explicitly mentioned in the query. Leave fields empty if not mentioned.`; + + return await extractorLLM.invoke(extractPrompt); +} + +// Node 2A: Prepare Investment-Focused Search Parameters +async function prepareInvestmentSearch(state: typeof VCState.State) { + console.log( + "💰 Preparing INVESTMENT-FOCUSED search parameters with financial emphasis..." + ); + + try { + // Extract all filter values from input + const values = await extractFilterValues(state.input); + + let searchParams: any = { + template_id: INVESTMENT_FOCUSED_TEMPLATE, + query_text: state.input, + ...values, + }; + + return { searchParams }; + } catch (error) { + console.error("❌ Error preparing investment-focused params:", error); + return { + searchParams: {}, + }; + } +} + +// Node 2B: Prepare Market-Focused Search Parameters +async function prepareMarketSearch(state: typeof VCState.State) { + console.log( + "🔍 Preparing MARKET-FOCUSED search parameters with market emphasis..." + ); + + try { + // Extract all filter values from input + const values = await extractFilterValues(state.input); + + let searchParams: any = { + template_id: MARKET_FOCUSED_TEMPLATE, + query_text: state.input, + ...values, + }; + + return { searchParams }; + } catch (error) { + console.error("❌ Error preparing market-focused params:", error); + return {}; + } +} + +// Node 3: Execute Search +async function executeSearch(state: typeof VCState.State) { + const { searchParams } = state; + + try { + // getting formed query from template for debugging + const renderedTemplate = await esClient.renderSearchTemplate({ + id: searchParams.template_id, + params: searchParams, + }); + + console.log( + "📋 Complete query:", + JSON.stringify(renderedTemplate.template_output, null, 2) + ); + + const results = await esClient.searchTemplate({ + index: INDEX_NAME, + id: searchParams.template_id, + params: searchParams, + }); + + return { + results: results.hits.hits.map((hit: any) => hit._source), + }; + } catch (error: any) { + console.error(`❌ ${state.searchParams.search_type} search error:`, error); + return { results: [] }; + } +} + +// Node 4: Visualize results +async function visualizeResults(state: typeof VCState.State) { + const results = state.results || []; + + let formattedResults = `🎯 Found ${results.length} startups matching your criteria:\n\n`; + + results.forEach((startup: any, index: number) => { + formattedResults += `${index + 1}. **${startup.company_name}**\n`; + formattedResults += ` 📍 ${startup.location} | 🏢 ${startup.industry} | 💼 ${startup.business_model}\n`; + formattedResults += ` 💰 ${startup.funding_stage} - $${( + startup.funding_amount / 1000000 + ).toFixed(1)}M\n`; + formattedResults += ` $${(startup.monthly_revenue / 1000).toFixed( + 0 + )}K MRR\n`; + formattedResults += ` 🏦 Lead: ${startup.lead_investor}\n`; + formattedResults += ` 📝 ${startup.description}\n\n`; + }); + + return { + final: formattedResults, + }; +} + +async function saveGraphImage(app: any): Promise { + try { + const drawableGraph = app.getGraph(); + const image = await drawableGraph.drawMermaidPng(); + const arrayBuffer = await image.arrayBuffer(); + + const filePath = "./workflow_graph.png"; + writeFileSync(filePath, new Uint8Array(arrayBuffer)); + console.log(`📊 Workflow graph saved as: ${filePath}`); + } catch (error: any) { + console.log("⚠️ Could not save graph image:", error.message); + } +} + +async function main() { + await createIndex(); + await createSearchTemplates(); + await ingestDocuments(); + + // Create the workflow graph with shared state + const workflow = new StateGraph(VCState) + // Register nodes - these are the processing functions + .addNode("decideStrategy", decideSearchStrategy) + .addNode("prepareInvestment", prepareInvestmentSearch) + .addNode("prepareMarket", prepareMarketSearch) + .addNode("executeSearch", executeSearch) + .addNode("visualizeResults", visualizeResults) + // Define execution flow with conditional branching + .addEdge(START, "decideStrategy") // Start with strategy decision + .addConditionalEdges( + "decideStrategy", + (state: typeof VCState.State) => state.searchStrategy, // Conditional function + { + investment_focused: "prepareInvestment", // If investment focused -> RRF template preparation + market_focused: "prepareMarket", // If market focused -> dynamic query preparation + } + ) + .addEdge("prepareInvestment", "executeSearch") // Investment prep -> execute + .addEdge("prepareMarket", "executeSearch") // Market prep -> execute + .addEdge("executeSearch", "visualizeResults") // Execute -> visualize + .addEdge("visualizeResults", END); // End workflow + + const app = workflow.compile(); + + await saveGraphImage(app); + + // Investment-focused query (emphasizes funding, revenue, financial metrics) + const query = + "Find startups with Series A or Series B funding between $8M-$25M and monthly revenue above $500K"; + + // Market-focused query (emphasizes industry, geography, market positioning) + // const query = + // "Find fintech and healthcare startups in San Francisco, New York, or Boston"; + // console.log("🔍 Query:", query); + + const marketResult = await app.invoke({ input: query }); + console.log(marketResult.final); +} + +main().catch(console.error); diff --git a/supporting-blog-content/langgraph-js-elasticsearch/package.json b/supporting-blog-content/langgraph-js-elasticsearch/package.json new file mode 100644 index 00000000..ede545e9 --- /dev/null +++ b/supporting-blog-content/langgraph-js-elasticsearch/package.json @@ -0,0 +1,20 @@ +{ + "name": "js-app", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "scripts": { + "start": "tsx main.ts" + }, + "dependencies": { + "@elastic/elasticsearch": "^9.1.1", + "@langchain/core": "^0.3.78", + "@langchain/langgraph": "^0.4.9", + "@langchain/openai": "^0.6.14", + "@types/node": "^24.6.0", + "dotenv": "^17.2.2", + "tsx": "^4.20.6", + "typescript": "^5.9.2", + "zod": "^3.23.8" + } +} diff --git a/supporting-blog-content/langgraph-js-elasticsearch/responses/aggregationsResponse.json b/supporting-blog-content/langgraph-js-elasticsearch/responses/aggregationsResponse.json new file mode 100644 index 00000000..e33c7b52 --- /dev/null +++ b/supporting-blog-content/langgraph-js-elasticsearch/responses/aggregationsResponse.json @@ -0,0 +1,263 @@ +{ + "industries": { + "doc_count_error_upper_bound": 0, + "sum_other_doc_count": 0, + "buckets": [ + { + "key": "logistics", + "doc_count": 5 + }, + { + "key": "fintech", + "doc_count": 2 + }, + { + "key": "healthcare", + "doc_count": 2 + }, + { + "key": "aerospace", + "doc_count": 1 + }, + { + "key": "agtech", + "doc_count": 1 + }, + { + "key": "cleantech", + "doc_count": 1 + }, + { + "key": "cybersecurity", + "doc_count": 1 + }, + { + "key": "developer tools", + "doc_count": 1 + }, + { + "key": "edtech", + "doc_count": 1 + }, + { + "key": "enterprise software", + "doc_count": 1 + }, + { + "key": "fitness tech", + "doc_count": 1 + }, + { + "key": "gaming", + "doc_count": 1 + }, + { + "key": "proptech", + "doc_count": 1 + }, + { + "key": "retail tech", + "doc_count": 1 + } + ] + }, + "locations": { + "doc_count_error_upper_bound": 0, + "sum_other_doc_count": 0, + "buckets": [ + { + "key": "San Francisco, CA", + "doc_count": 4 + }, + { + "key": "New York, NY", + "doc_count": 3 + }, + { + "key": "Atlanta, GA", + "doc_count": 1 + }, + { + "key": "Austin, TX", + "doc_count": 1 + }, + { + "key": "Boston, MA", + "doc_count": 1 + }, + { + "key": "Chicago, IL", + "doc_count": 1 + }, + { + "key": "Denver, CO", + "doc_count": 1 + }, + { + "key": "Houston, TX", + "doc_count": 1 + }, + { + "key": "Las Vegas, NV", + "doc_count": 1 + }, + { + "key": "Los Angeles, CA", + "doc_count": 1 + }, + { + "key": "Miami, FL", + "doc_count": 1 + }, + { + "key": "Phoenix, AZ", + "doc_count": 1 + }, + { + "key": "Portland, OR", + "doc_count": 1 + }, + { + "key": "San Diego, CA", + "doc_count": 1 + }, + { + "key": "Seattle, WA", + "doc_count": 1 + } + ] + }, + "funding_stages": { + "doc_count_error_upper_bound": 0, + "sum_other_doc_count": 0, + "buckets": [ + { + "key": "Series A", + "doc_count": 8 + }, + { + "key": "Series B", + "doc_count": 6 + }, + { + "key": "Seed", + "doc_count": 4 + }, + { + "key": "Series C", + "doc_count": 2 + } + ] + }, + "business_models": { + "doc_count_error_upper_bound": 0, + "sum_other_doc_count": 0, + "buckets": [ + { + "key": "B2B", + "doc_count": 13 + }, + { + "key": "B2C", + "doc_count": 4 + }, + { + "key": "B2B2C", + "doc_count": 3 + } + ] + }, + "lead_investors": { + "doc_count_error_upper_bound": 0, + "sum_other_doc_count": 0, + "buckets": [ + { + "key": "Battery Ventures", + "doc_count": 1 + }, + { + "key": "Benchmark Capital", + "doc_count": 1 + }, + { + "key": "Bitkraft Ventures", + "doc_count": 1 + }, + { + "key": "Bullpen Capital", + "doc_count": 1 + }, + { + "key": "Coinbase Ventures", + "doc_count": 1 + }, + { + "key": "Energy Impact Partners", + "doc_count": 1 + }, + { + "key": "Fifth Wall", + "doc_count": 1 + }, + { + "key": "Founders Fund", + "doc_count": 1 + }, + { + "key": "GV (Google Ventures)", + "doc_count": 1 + }, + { + "key": "General Catalyst", + "doc_count": 1 + }, + { + "key": "Insight Partners", + "doc_count": 1 + }, + { + "key": "Kleiner Perkins", + "doc_count": 1 + }, + { + "key": "Madrona Venture Group", + "doc_count": 1 + }, + { + "key": "NEA (New Enterprise Associates)", + "doc_count": 1 + }, + { + "key": "Norwest Venture Partners", + "doc_count": 1 + }, + { + "key": "Reach Capital", + "doc_count": 1 + }, + { + "key": "S2G Ventures", + "doc_count": 1 + }, + { + "key": "Sequoia Capital", + "doc_count": 1 + }, + { + "key": "Space Capital", + "doc_count": 1 + }, + { + "key": "Tiger Global Management", + "doc_count": 1 + } + ] + }, + "funding_amount_stats": { + "count": 20, + "min": 4500000, + "max": 35000000, + "avg": 14075000, + "sum": 281500000 + } +} diff --git a/supporting-blog-content/langgraph-js-elasticsearch/workflow_graph.png b/supporting-blog-content/langgraph-js-elasticsearch/workflow_graph.png new file mode 100644 index 00000000..0d8af861 Binary files /dev/null and b/supporting-blog-content/langgraph-js-elasticsearch/workflow_graph.png differ diff --git a/supporting-blog-content/langgraph-js-elasticsearch/yarn.lock b/supporting-blog-content/langgraph-js-elasticsearch/yarn.lock new file mode 100644 index 00000000..a024f630 --- /dev/null +++ b/supporting-blog-content/langgraph-js-elasticsearch/yarn.lock @@ -0,0 +1,638 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@cfworker/json-schema@^4.0.2": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@cfworker/json-schema/-/json-schema-4.1.1.tgz#4a2a3947ee9fa7b7c24be981422831b8674c3be6" + integrity sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og== + +"@elastic/elasticsearch@^9.1.1": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-9.1.1.tgz#b51cf99664f930dd598490917684e4b7687273f6" + integrity sha512-s/JZtHZjtbAYC2gdSzm4LLOSReR724e7cf7ZauIAZlGvAyMgZPZCJpq7xHazSy4rZZhule4ubMs4vepBgWvKQA== + dependencies: + "@elastic/transport" "^9.0.1" + apache-arrow "18.x - 20.x" + tslib "^2.4.0" + +"@elastic/transport@^9.0.1": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@elastic/transport/-/transport-9.2.0.tgz#343f5336f2e16a17c9eb44939aed24eb81989092" + integrity sha512-2HpxEX9eQE/viokiKHqRa1n3RaFqNKoOU5gc7AOJ4ahG9xZbim+Z3OdBwshW9aKuFeIn1WPtZxSrfghZ0UJFtg== + dependencies: + "@opentelemetry/api" "1.x" + "@opentelemetry/core" "2.x" + debug "^4.4.1" + hpagent "^1.2.0" + ms "^2.1.3" + secure-json-parse "^4.0.0" + tslib "^2.8.1" + undici "^7.16.0" + +"@esbuild/aix-ppc64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz#ee6b7163a13528e099ecf562b972f2bcebe0aa97" + integrity sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw== + +"@esbuild/android-arm64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz#115fc76631e82dd06811bfaf2db0d4979c16e2cb" + integrity sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg== + +"@esbuild/android-arm@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.10.tgz#8d5811912da77f615398611e5bbc1333fe321aa9" + integrity sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w== + +"@esbuild/android-x64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.10.tgz#e3e96516b2d50d74105bb92594c473e30ddc16b1" + integrity sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg== + +"@esbuild/darwin-arm64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz#6af6bb1d05887dac515de1b162b59dc71212ed76" + integrity sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA== + +"@esbuild/darwin-x64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz#99ae82347fbd336fc2d28ffd4f05694e6e5b723d" + integrity sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg== + +"@esbuild/freebsd-arm64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz#0c6d5558a6322b0bdb17f7025c19bd7d2359437d" + integrity sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg== + +"@esbuild/freebsd-x64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz#8c35873fab8c0857a75300a3dcce4324ca0b9844" + integrity sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA== + +"@esbuild/linux-arm64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz#3edc2f87b889a15b4cedaf65f498c2bed7b16b90" + integrity sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ== + +"@esbuild/linux-arm@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz#86501cfdfb3d110176d80c41b27ed4611471cde7" + integrity sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg== + +"@esbuild/linux-ia32@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz#e6589877876142537c6864680cd5d26a622b9d97" + integrity sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ== + +"@esbuild/linux-loong64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz#11119e18781f136d8083ea10eb6be73db7532de8" + integrity sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg== + +"@esbuild/linux-mips64el@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz#3052f5436b0c0c67a25658d5fc87f045e7def9e6" + integrity sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA== + +"@esbuild/linux-ppc64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz#2f098920ee5be2ce799f35e367b28709925a8744" + integrity sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA== + +"@esbuild/linux-riscv64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz#fa51d7fd0a22a62b51b4b94b405a3198cf7405dd" + integrity sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA== + +"@esbuild/linux-s390x@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz#a27642e36fc282748fdb38954bd3ef4f85791e8a" + integrity sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew== + +"@esbuild/linux-x64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz#9d9b09c0033d17529570ced6d813f98315dfe4e9" + integrity sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA== + +"@esbuild/netbsd-arm64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz#25c09a659c97e8af19e3f2afd1c9190435802151" + integrity sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A== + +"@esbuild/netbsd-x64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz#7fa5f6ffc19be3a0f6f5fd32c90df3dc2506937a" + integrity sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig== + +"@esbuild/openbsd-arm64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz#8faa6aa1afca0c6d024398321d6cb1c18e72a1c3" + integrity sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw== + +"@esbuild/openbsd-x64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz#a42979b016f29559a8453d32440d3c8cd420af5e" + integrity sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw== + +"@esbuild/openharmony-arm64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz#fd87bfeadd7eeb3aa384bbba907459ffa3197cb1" + integrity sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag== + +"@esbuild/sunos-x64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz#3a18f590e36cb78ae7397976b760b2b8c74407f4" + integrity sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ== + +"@esbuild/win32-arm64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz#e71741a251e3fd971408827a529d2325551f530c" + integrity sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw== + +"@esbuild/win32-ia32@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz#c6f010b5d3b943d8901a0c87ea55f93b8b54bf94" + integrity sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw== + +"@esbuild/win32-x64@0.25.10": + version "0.25.10" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz#e4b3e255a1b4aea84f6e1d2ae0b73f826c3785bd" + integrity sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw== + +"@langchain/core@^0.3.78": + version "0.3.78" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.78.tgz#40e69fba6688858edbcab4473358ec7affc685fd" + integrity sha512-Nn0x9erQlK3zgtRU1Z8NUjLuyW0gzdclMsvLQ6wwLeDqV91pE+YKl6uQb+L2NUDs4F0N7c2Zncgz46HxrvPzuA== + dependencies: + "@cfworker/json-schema" "^4.0.2" + ansi-styles "^5.0.0" + camelcase "6" + decamelize "1.2.0" + js-tiktoken "^1.0.12" + langsmith "^0.3.67" + mustache "^4.2.0" + p-queue "^6.6.2" + p-retry "4" + uuid "^10.0.0" + zod "^3.25.32" + zod-to-json-schema "^3.22.3" + +"@langchain/langgraph-checkpoint@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-0.1.1.tgz#500569a02af4b85172d775de63eeba06afa0c189" + integrity sha512-h2bP0RUikQZu0Um1ZUPErQLXyhzroJqKRbRcxYRTAh49oNlsfeq4A3K4YEDRbGGuyPZI/Jiqwhks1wZwY73AZw== + dependencies: + uuid "^10.0.0" + +"@langchain/langgraph-sdk@~0.1.0": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@langchain/langgraph-sdk/-/langgraph-sdk-0.1.9.tgz#5442bd1a4257b5d94927af6e09b0aed341ae8a1d" + integrity sha512-7WEDHtbI3pYPUiiHq+dPaF92ZN2W7lqObdpK0X+roa8zPdHUjve/HiqYuKNWS12u1N+L5QIuQWqZvVNvUA7BfQ== + dependencies: + "@types/json-schema" "^7.0.15" + p-queue "^6.6.2" + p-retry "4" + uuid "^9.0.0" + +"@langchain/langgraph@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@langchain/langgraph/-/langgraph-0.4.9.tgz#470a238ea98662d6ec9dfc42859a00acad00fc81" + integrity sha512-+rcdTGi4Ium4X/VtIX3Zw4RhxEkYWpwUyz806V6rffjHOAMamg6/WZDxpJbrP33RV/wJG1GH12Z29oX3Pqq3Aw== + dependencies: + "@langchain/langgraph-checkpoint" "^0.1.1" + "@langchain/langgraph-sdk" "~0.1.0" + uuid "^10.0.0" + zod "^3.25.32" + +"@langchain/openai@^0.6.14": + version "0.6.14" + resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.6.14.tgz#09f7370870804a9f0558a063af1957babfd593ad" + integrity sha512-SM/xJOFDxT9NN/07fvhNB5dgAsIOQaLhmANxrRlSQ7Qs1zImMrzOvq+/5JP/ifpC/YxcgEnt4dblKVqvNU/C5A== + dependencies: + js-tiktoken "^1.0.12" + openai "5.12.2" + zod "^3.25.32" + +"@opentelemetry/api@1.x": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe" + integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== + +"@opentelemetry/core@2.x": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-2.1.0.tgz#5539f04eb9e5245e000b0c3f77bdfaa07557e3a7" + integrity sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ== + dependencies: + "@opentelemetry/semantic-conventions" "^1.29.0" + +"@opentelemetry/semantic-conventions@^1.29.0": + version "1.37.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.37.0.tgz#aa2b4fa0b910b66a050c5ddfcac1d262e91a321a" + integrity sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA== + +"@swc/helpers@^0.5.11": + version "0.5.17" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.17.tgz#5a7be95ac0f0bf186e7e6e890e7a6f6cda6ce971" + integrity sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A== + dependencies: + tslib "^2.8.0" + +"@types/command-line-args@^5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@types/command-line-args/-/command-line-args-5.2.3.tgz#553ce2fd5acf160b448d307649b38ffc60d39639" + integrity sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw== + +"@types/command-line-usage@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/command-line-usage/-/command-line-usage-5.0.4.tgz#374e4c62d78fbc5a670a0f36da10235af879a0d5" + integrity sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg== + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/node@^20.13.0": + version "20.19.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.19.19.tgz#18c8982becd5728f92e5f1939f2f3dc85604abcd" + integrity sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg== + dependencies: + undici-types "~6.21.0" + +"@types/node@^24.6.0": + version "24.7.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.7.0.tgz#a34c9f0d3401db396782e440317dd5d8373c286f" + integrity sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw== + dependencies: + undici-types "~7.14.0" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/uuid@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" + integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +"apache-arrow@18.x - 20.x": + version "20.0.0" + resolved "https://registry.yarnpkg.com/apache-arrow/-/apache-arrow-20.0.0.tgz#c79dea09b798778f28558d18b6860c5030e991d0" + integrity sha512-JUeK0jFRUd7rbmrhhzR3O2KXjLaZ4YYYFOptyUfxOsMIoZCPi6bZR58gVi/xi3HTBMPseXm9PXyQ2V916930pA== + dependencies: + "@swc/helpers" "^0.5.11" + "@types/command-line-args" "^5.2.3" + "@types/command-line-usage" "^5.0.4" + "@types/node" "^20.13.0" + command-line-args "^6.0.1" + command-line-usage "^7.0.1" + flatbuffers "^25.1.24" + json-bignum "^0.0.3" + tslib "^2.6.2" + +array-back@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-6.2.2.tgz#f567d99e9af88a6d3d2f9dfcc21db6f9ba9fd157" + integrity sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw== + +base64-js@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +camelcase@6: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chalk-template@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-0.4.0.tgz#692c034d0ed62436b9062c1707fadcd0f753204b" + integrity sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg== + dependencies: + chalk "^4.1.2" + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +command-line-args@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-6.0.1.tgz#cbd1efb4f72b285dbd54bde9a8585c2d9694b070" + integrity sha512-Jr3eByUjqyK0qd8W0SGFW1nZwqCaNCtbXjRo2cRJC1OYxWl3MZ5t1US3jq+cO4sPavqgw4l9BMGX0CBe+trepg== + dependencies: + array-back "^6.2.2" + find-replace "^5.0.2" + lodash.camelcase "^4.3.0" + typical "^7.2.0" + +command-line-usage@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-7.0.3.tgz#6bce992354f6af10ecea2b631bfdf0c8b3bfaea3" + integrity sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q== + dependencies: + array-back "^6.2.2" + chalk-template "^0.4.0" + table-layout "^4.1.0" + typical "^7.1.1" + +console-table-printer@^2.12.1: + version "2.14.6" + resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.14.6.tgz#edfe0bf311fa2701922ed509443145ab51e06436" + integrity sha512-MCBl5HNVaFuuHW6FGbL/4fB7N/ormCy+tQ+sxTrF6QtSbSNETvPuOVbkJBhzDgYhvjWGrTma4eYJa37ZuoQsPw== + dependencies: + simple-wcswidth "^1.0.1" + +debug@^4.4.1: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +decamelize@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +dotenv@^17.2.2: + version "17.2.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.3.tgz#ad995d6997f639b11065f419a22fabf567cdb9a2" + integrity sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w== + +esbuild@~0.25.0: + version "0.25.10" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.10.tgz#37f5aa5cd14500f141be121c01b096ca83ac34a9" + integrity sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.10" + "@esbuild/android-arm" "0.25.10" + "@esbuild/android-arm64" "0.25.10" + "@esbuild/android-x64" "0.25.10" + "@esbuild/darwin-arm64" "0.25.10" + "@esbuild/darwin-x64" "0.25.10" + "@esbuild/freebsd-arm64" "0.25.10" + "@esbuild/freebsd-x64" "0.25.10" + "@esbuild/linux-arm" "0.25.10" + "@esbuild/linux-arm64" "0.25.10" + "@esbuild/linux-ia32" "0.25.10" + "@esbuild/linux-loong64" "0.25.10" + "@esbuild/linux-mips64el" "0.25.10" + "@esbuild/linux-ppc64" "0.25.10" + "@esbuild/linux-riscv64" "0.25.10" + "@esbuild/linux-s390x" "0.25.10" + "@esbuild/linux-x64" "0.25.10" + "@esbuild/netbsd-arm64" "0.25.10" + "@esbuild/netbsd-x64" "0.25.10" + "@esbuild/openbsd-arm64" "0.25.10" + "@esbuild/openbsd-x64" "0.25.10" + "@esbuild/openharmony-arm64" "0.25.10" + "@esbuild/sunos-x64" "0.25.10" + "@esbuild/win32-arm64" "0.25.10" + "@esbuild/win32-ia32" "0.25.10" + "@esbuild/win32-x64" "0.25.10" + +eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +find-replace@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-5.0.2.tgz#fe27ff0be05975aef6fc679c1139bbabea564e26" + integrity sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q== + +flatbuffers@^25.1.24: + version "25.9.23" + resolved "https://registry.yarnpkg.com/flatbuffers/-/flatbuffers-25.9.23.tgz#346811557fe9312ab5647535e793c761e9c81eb1" + integrity sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ== + +fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +get-tsconfig@^4.7.5: + version "4.11.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.11.0.tgz#5a4acc944244a2630c2ed3318b55e6dc051d034b" + integrity sha512-sNsqf7XKQ38IawiVGPOoAlqZo1DMrO7TU+ZcZwi7yLl7/7S0JwmoBMKz/IkUPhSoXM0Ng3vT0yB1iCe5XavDeQ== + dependencies: + resolve-pkg-maps "^1.0.0" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hpagent@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-1.2.0.tgz#0ae417895430eb3770c03443456b8d90ca464903" + integrity sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA== + +js-tiktoken@^1.0.12: + version "1.0.21" + resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.21.tgz#368a9957591a30a62997dd0c4cf30866f00f8221" + integrity sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g== + dependencies: + base64-js "^1.5.1" + +json-bignum@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/json-bignum/-/json-bignum-0.0.3.tgz#41163b50436c773d82424dbc20ed70db7604b8d7" + integrity sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg== + +langsmith@^0.3.67: + version "0.3.72" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.72.tgz#82e1dc8e23d7e1101e9e26353b18fb3170884f29" + integrity sha512-XjTonMq2fIebzV0BRlPx8mi+Ih/NsQT6W484hrW/pJYuq0aT5kpLtzQthVVmsXH8ZYYkgkbQ5Gh5Mz1qoCrAwg== + dependencies: + "@types/uuid" "^10.0.0" + chalk "^4.1.2" + console-table-printer "^2.12.1" + p-queue "^6.6.2" + p-retry "4" + semver "^7.6.3" + uuid "^10.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + +openai@5.12.2: + version "5.12.2" + resolved "https://registry.yarnpkg.com/openai/-/openai-5.12.2.tgz#512ab6b80eb8414837436e208f1b951442b97761" + integrity sha512-xqzHHQch5Tws5PcKR2xsZGX9xtch+JQFz5zb14dGqlshmmDAFBFEWmeIpf7wVqWV+w7Emj7jRgkNJakyKE0tYQ== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-retry@4: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +secure-json-parse@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-4.1.0.tgz#4f1ab41c67a13497ea1b9131bb4183a22865477c" + integrity sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA== + +semver@^7.6.3: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + +simple-wcswidth@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz#66722f37629d5203f9b47c5477b1225b85d6525b" + integrity sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +table-layout@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-4.1.1.tgz#0f72965de1a5c0c1419c9ba21cae4e73a2f73a42" + integrity sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA== + dependencies: + array-back "^6.2.2" + wordwrapjs "^5.1.0" + +tslib@^2.4.0, tslib@^2.6.2, tslib@^2.8.0, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tsx@^4.20.6: + version "4.20.6" + resolved "https://registry.yarnpkg.com/tsx/-/tsx-4.20.6.tgz#8fb803fd9c1f70e8ccc93b5d7c5e03c3979ccb2e" + integrity sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg== + dependencies: + esbuild "~0.25.0" + get-tsconfig "^4.7.5" + optionalDependencies: + fsevents "~2.3.3" + +typescript@^5.9.2: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + +typical@^7.1.1, typical@^7.2.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-7.3.0.tgz#930376be344228709f134613911fa22aa09617a4" + integrity sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw== + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + +undici-types@~7.14.0: + version "7.14.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.14.0.tgz#4c037b32ca4d7d62fae042174604341588bc0840" + integrity sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA== + +undici@^7.16.0: + version "7.16.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-7.16.0.tgz#cb2a1e957726d458b536e3f076bf51f066901c1a" + integrity sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g== + +uuid@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== + +uuid@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +wordwrapjs@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-5.1.0.tgz#4c4d20446dcc670b14fa115ef4f8fd9947af2b3a" + integrity sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg== + +zod-to-json-schema@^3.22.3: + version "3.24.6" + resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz#5920f020c4d2647edfbb954fa036082b92c9e12d" + integrity sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg== + +zod@^3.23.8, zod@^3.25.32: + version "3.25.76" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34" + integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==