illuma-agents 1.0.19 → 1.0.21

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.
@@ -1 +1 @@
1
- {"version":3,"file":"BrowserTools.cjs","sources":["../../../src/tools/BrowserTools.ts"],"sourcesContent":["/**\r\n * Browser Automation Tools for Ranger Browser Extension\r\n * \r\n * These tools allow the LLM to interact with the browser through the \r\n * ranger-browser extension. They generate structured actions that are\r\n * sent to the extension via SSE streaming for execution.\r\n * \r\n * The extension handles:\r\n * - DOM extraction with element indexing\r\n * - Click, type, hover, scroll actions\r\n * - Navigation and page context\r\n * - Visual element highlighting\r\n */\r\n\r\nimport { z } from 'zod';\r\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\r\n\r\n// ============================================\r\n// Tool Schemas\r\n// ============================================\r\n\r\n/**\r\n * Enhanced click schema that supports both index-based and coordinate-based clicking\r\n */\r\nconst BrowserClickSchema = z.object({\r\n index: z.number().optional().describe(\r\n 'The index of the element to click, as shown in the page context (e.g., [0], [1], [2]). ' +\r\n 'Use the element index from the interactive elements list provided in the page context. ' +\r\n 'Either index OR coordinates must be provided.'\r\n ),\r\n coordinates: z.object({\r\n x: z.number().describe('X coordinate in viewport pixels'),\r\n y: z.number().describe('Y coordinate in viewport pixels'),\r\n }).optional().describe(\r\n 'Coordinates for clicking elements that lack semantic info (marked with ⚠️). ' +\r\n 'The coordinates are provided in the element listing as coords:(x,y). ' +\r\n 'Either index OR coordinates must be provided.'\r\n ),\r\n visualDescription: z.string().optional().describe(\r\n 'Description of what the element looks like visually. Used when clicking by appearance ' +\r\n '(e.g., \"blue button in top right corner\", \"hamburger menu icon\")'\r\n ),\r\n reason: z.string().optional().describe(\r\n 'Brief explanation of why you are clicking this element (for user transparency)'\r\n ),\r\n});\r\n\r\nconst BrowserTypeSchema = z.object({\r\n index: z.number().describe(\r\n 'The index of the input element to type into, as shown in the page context'\r\n ),\r\n text: z.string().describe(\r\n 'The text to type into the input field'\r\n ),\r\n clear: z.boolean().optional().describe(\r\n 'Whether to clear the existing content before typing (default: false)'\r\n ),\r\n pressEnter: z.boolean().optional().describe(\r\n 'Whether to press Enter after typing (useful for search fields, default: false)'\r\n ),\r\n});\r\n\r\nconst BrowserNavigateSchema = z.object({\r\n url: z.string().describe(\r\n 'The URL to navigate to. Can be a full URL or a relative path.'\r\n ),\r\n reason: z.string().optional().describe(\r\n 'Brief explanation of why you are navigating to this URL'\r\n ),\r\n});\r\n\r\nconst BrowserScrollSchema = z.object({\r\n direction: z.enum(['up', 'down', 'left', 'right']).describe(\r\n 'The direction to scroll'\r\n ),\r\n amount: z.number().optional().describe(\r\n 'The amount to scroll in pixels (default: 500)'\r\n ),\r\n});\r\n\r\nconst BrowserExtractSchema = z.object({\r\n query: z.string().optional().describe(\r\n 'Optional query to filter extracted content. If provided, only content related to the query will be extracted.'\r\n ),\r\n selector: z.string().optional().describe(\r\n 'Optional CSS selector to extract content from a specific element'\r\n ),\r\n});\r\n\r\nconst BrowserHoverSchema = z.object({\r\n index: z.number().describe(\r\n 'The index of the element to hover over, as shown in the page context'\r\n ),\r\n});\r\n\r\nconst BrowserWaitSchema = z.object({\r\n duration: z.number().optional().describe(\r\n 'Duration to wait in milliseconds (default: 1000)'\r\n ),\r\n reason: z.string().optional().describe(\r\n 'Why we are waiting (e.g., \"for page to load\", \"for animation to complete\")'\r\n ),\r\n});\r\n\r\nconst BrowserGoBackSchema = z.object({\r\n reason: z.string().optional().describe(\r\n 'Brief explanation of why you are going back'\r\n ),\r\n});\r\n\r\nconst BrowserScreenshotSchema = z.object({\r\n fullPage: z.boolean().optional().describe(\r\n 'Whether to capture the full page or just the viewport (default: viewport only)'\r\n ),\r\n reason: z.string().optional().describe(\r\n 'Why you need a screenshot (e.g., \"to identify visual elements\", \"to analyze page layout\")'\r\n ),\r\n});\r\n\r\n// ============================================\r\n// Tool Implementations\r\n// ============================================\r\n\r\n/**\r\n * Browser click tool - clicks an element by index or coordinates\r\n * Supports both semantic (index-based) and vision (coordinate-based) clicking\r\n */\r\nexport function createBrowserClickTool(): DynamicStructuredTool<typeof BrowserClickSchema> {\r\n return tool<typeof BrowserClickSchema>(\r\n async ({ index, coordinates, visualDescription, reason }) => {\r\n // Validate that at least one targeting method is provided\r\n if (index === undefined && !coordinates) {\r\n return JSON.stringify({\r\n type: 'error',\r\n error: 'Either index or coordinates must be provided to click an element',\r\n });\r\n }\r\n\r\n // Return a structured action for the extension to execute\r\n // The actual execution happens in the browser extension\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'click',\r\n ...(index !== undefined && { index }),\r\n ...(coordinates && { coordinates }),\r\n ...(visualDescription && { visualDescription }),\r\n reason,\r\n },\r\n // Signal that this requires browser execution\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.CLICK,\r\n description: `Click an interactive element on the current page.\r\n\r\n**Two ways to target elements:**\r\n\r\n1. **By index (preferred)**: Use the element's index number from the interactive elements list\r\n - Format: [index] {semantic role} <tag>text</tag>\r\n - Example: browser_click({ index: 5 }) to click element [5]\r\n\r\n2. **By coordinates (vision fallback)**: For elements marked with ⚠️ that lack semantic info\r\n - Use the coords:(x,y) shown after the ⚠️ marker\r\n - Example: browser_click({ coordinates: { x: 150, y: 200 } })\r\n\r\n**When to use coordinates:**\r\n- Elements marked with ⚠️ have poor semantic understanding\r\n- Icon-only buttons without labels\r\n- Custom canvas/SVG elements\r\n- When you identify an element visually in a screenshot\r\n\r\nExample: If element shows \\`[12] {button} <div>⚠️ [left side, small, clickable] coords:(45,120)\\`\r\nUse either: browser_click({ index: 12 }) or browser_click({ coordinates: { x: 45, y: 120 } })`,\r\n schema: BrowserClickSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser type tool - types text into an input field\r\n */\r\nexport function createBrowserTypeTool(): DynamicStructuredTool<typeof BrowserTypeSchema> {\r\n return tool<typeof BrowserTypeSchema>(\r\n async ({ index, text, clear, pressEnter }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'type',\r\n index,\r\n text,\r\n clear: clear ?? false,\r\n pressEnter: pressEnter ?? false,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.TYPE,\r\n description: `Type text into an input field on the current page.\r\n\r\nUse this tool when you need to:\r\n- Fill in a text input or textarea\r\n- Enter a search query\r\n- Fill out form fields\r\n\r\nThe element index comes from the page context's interactive elements list.\r\nSet 'clear: true' to clear existing content before typing.\r\nSet 'pressEnter: true' to submit after typing (useful for search fields).\r\n\r\nExample: To type \"hello world\" into a search field shown as \"[2]<input>Search...</input>\",\r\nuse index: 2, text: \"hello world\"`,\r\n schema: BrowserTypeSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser navigate tool - navigates to a URL\r\n */\r\nexport function createBrowserNavigateTool(): DynamicStructuredTool<typeof BrowserNavigateSchema> {\r\n return tool<typeof BrowserNavigateSchema>(\r\n async ({ url, reason }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'navigate',\r\n url,\r\n reason,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.NAVIGATE,\r\n description: `Navigate to a specific URL in the browser.\r\n\r\nUse this tool when you need to:\r\n- Go to a specific website\r\n- Navigate to a different page\r\n- Open a new URL\r\n\r\nProvide the full URL including the protocol (https://).\r\n\r\nExample: browser_navigate({ url: \"https://www.google.com\" })`,\r\n schema: BrowserNavigateSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser scroll tool - scrolls the page\r\n */\r\nexport function createBrowserScrollTool(): DynamicStructuredTool<typeof BrowserScrollSchema> {\r\n return tool<typeof BrowserScrollSchema>(\r\n async ({ direction, amount }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'scroll',\r\n scroll: {\r\n direction,\r\n amount: amount ?? 500,\r\n },\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.SCROLL,\r\n description: `Scroll the current page in a specified direction.\r\n\r\nUse this tool when you need to:\r\n- See more content on the page\r\n- Scroll to find elements not currently visible\r\n- Navigate long pages\r\n\r\nDefault scroll amount is 500 pixels. Adjust as needed.\r\n\r\nExample: browser_scroll({ direction: \"down\", amount: 800 })`,\r\n schema: BrowserScrollSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser extract tool - extracts content from the page\r\n */\r\nexport function createBrowserExtractTool(): DynamicStructuredTool<typeof BrowserExtractSchema> {\r\n return tool<typeof BrowserExtractSchema>(\r\n async ({ query, selector }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'extract',\r\n query,\r\n selector,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.EXTRACT,\r\n description: `Extract text content from the current page.\r\n\r\nUse this tool when you need to:\r\n- Get specific information from the page\r\n- Extract text that matches a query\r\n- Read content from a specific element\r\n\r\nIf no query or selector is provided, extracts the main page content.\r\nUse a CSS selector to extract from a specific element.\r\nUse a query to filter for relevant content.\r\n\r\nExample: browser_extract({ query: \"price\" }) - extracts content related to pricing`,\r\n schema: BrowserExtractSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser hover tool - hovers over an element\r\n */\r\nexport function createBrowserHoverTool(): DynamicStructuredTool<typeof BrowserHoverSchema> {\r\n return tool<typeof BrowserHoverSchema>(\r\n async ({ index }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'hover',\r\n index,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.HOVER,\r\n description: `Hover over an element to reveal tooltips or dropdown menus.\r\n\r\nUse this tool when you need to:\r\n- Reveal a dropdown menu\r\n- Show a tooltip\r\n- Trigger hover effects\r\n\r\nExample: browser_hover({ index: 3 }) - hovers over element at index 3`,\r\n schema: BrowserHoverSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser wait tool - waits for a specified duration\r\n */\r\nexport function createBrowserWaitTool(): DynamicStructuredTool<typeof BrowserWaitSchema> {\r\n return tool<typeof BrowserWaitSchema>(\r\n async ({ duration, reason }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'wait',\r\n duration: duration ?? 1000,\r\n reason,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.WAIT,\r\n description: `Wait for a specified duration before the next action.\r\n\r\nUse this tool when you need to:\r\n- Wait for a page to load\r\n- Wait for an animation to complete\r\n- Add delay between actions\r\n\r\nDefault wait time is 1000ms (1 second).\r\n\r\nExample: browser_wait({ duration: 2000, reason: \"waiting for page to load\" })`,\r\n schema: BrowserWaitSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser go back tool - navigates back in history\r\n */\r\nexport function createBrowserGoBackTool(): DynamicStructuredTool<typeof BrowserGoBackSchema> {\r\n return tool<typeof BrowserGoBackSchema>(\r\n async ({ reason }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'back',\r\n reason,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.BACK,\r\n description: `Navigate back to the previous page in browser history.\r\n\r\nUse this tool when you need to:\r\n- Return to a previous page\r\n- Undo a navigation\r\n\r\nExample: browser_back({ reason: \"returning to search results\" })`,\r\n schema: BrowserGoBackSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser screenshot tool - captures a screenshot\r\n */\r\nexport function createBrowserScreenshotTool(): DynamicStructuredTool<typeof BrowserScreenshotSchema> {\r\n return tool<typeof BrowserScreenshotSchema>(\r\n async ({ fullPage }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'screenshot',\r\n fullPage: fullPage ?? false,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.SCREENSHOT,\r\n description: `Capture a screenshot of the current page.\r\n\r\nUse this tool when you need to:\r\n- Capture the current state of a page\r\n- Document visual elements\r\n- Verify page appearance\r\n\r\nSet fullPage: true to capture the entire page (may be large).\r\nDefault captures only the visible viewport.\r\n\r\nExample: browser_screenshot({ fullPage: false })`,\r\n schema: BrowserScreenshotSchema,\r\n }\r\n );\r\n}\r\n\r\n// ============================================\r\n// Tool Collection\r\n// ============================================\r\n\r\nexport type BrowserToolsConfig = {\r\n /** Enable click tool */\r\n enableClick?: boolean;\r\n /** Enable type tool */\r\n enableType?: boolean;\r\n /** Enable navigate tool */\r\n enableNavigate?: boolean;\r\n /** Enable scroll tool */\r\n enableScroll?: boolean;\r\n /** Enable extract tool */\r\n enableExtract?: boolean;\r\n /** Enable hover tool */\r\n enableHover?: boolean;\r\n /** Enable wait tool */\r\n enableWait?: boolean;\r\n /** Enable back tool */\r\n enableBack?: boolean;\r\n /** Enable screenshot tool */\r\n enableScreenshot?: boolean;\r\n};\r\n\r\n/**\r\n * Create all browser automation tools\r\n * \r\n * IMPORTANT: These tools should ONLY be registered when:\r\n * 1. The request comes from a browser extension that can execute them\r\n * 2. The client has indicated browser capability (e.g., via header or parameter)\r\n * \r\n * DO NOT register these for normal web UI users - they cannot execute browser actions.\r\n * \r\n * Detection in Ranger API:\r\n * - Check for `X-Ranger-Browser-Extension: true` header\r\n * - Or check for `browserCapable: true` in request body\r\n * - Or check user agent for extension identifier\r\n * \r\n * @example\r\n * // In Ranger API endpoint:\r\n * const hasBrowserExtension = req.headers['x-ranger-browser-extension'] === 'true';\r\n * const tools = hasBrowserExtension \r\n * ? [...normalTools, ...createBrowserTools()]\r\n * : normalTools;\r\n */\r\nexport function createBrowserTools(config: BrowserToolsConfig = {}): DynamicStructuredTool[] {\r\n const tools: DynamicStructuredTool[] = [];\r\n \r\n // Enable all by default\r\n const {\r\n enableClick = true,\r\n enableType = true,\r\n enableNavigate = true,\r\n enableScroll = true,\r\n enableExtract = true,\r\n enableHover = true,\r\n enableWait = true,\r\n enableBack = true,\r\n enableScreenshot = true,\r\n } = config;\r\n \r\n if (enableClick) tools.push(createBrowserClickTool());\r\n if (enableType) tools.push(createBrowserTypeTool());\r\n if (enableNavigate) tools.push(createBrowserNavigateTool());\r\n if (enableScroll) tools.push(createBrowserScrollTool());\r\n if (enableExtract) tools.push(createBrowserExtractTool());\r\n if (enableHover) tools.push(createBrowserHoverTool());\r\n if (enableWait) tools.push(createBrowserWaitTool());\r\n if (enableBack) tools.push(createBrowserGoBackTool());\r\n if (enableScreenshot) tools.push(createBrowserScreenshotTool());\r\n \r\n return tools;\r\n}\r\n\r\n/**\r\n * Browser tool name constants\r\n * Use these instead of magic strings\r\n */\r\nexport const EBrowserTools = {\r\n CLICK: 'browser_click',\r\n TYPE: 'browser_type',\r\n NAVIGATE: 'browser_navigate',\r\n SCROLL: 'browser_scroll',\r\n EXTRACT: 'browser_extract',\r\n HOVER: 'browser_hover',\r\n WAIT: 'browser_wait',\r\n BACK: 'browser_back',\r\n SCREENSHOT: 'browser_screenshot',\r\n} as const;\r\n\r\n/**\r\n * Get browser tool names for filtering/identification\r\n */\r\nexport const BROWSER_TOOL_NAMES = [\r\n EBrowserTools.CLICK,\r\n EBrowserTools.TYPE,\r\n EBrowserTools.NAVIGATE,\r\n EBrowserTools.SCROLL,\r\n EBrowserTools.EXTRACT,\r\n EBrowserTools.HOVER,\r\n EBrowserTools.WAIT,\r\n EBrowserTools.BACK,\r\n EBrowserTools.SCREENSHOT,\r\n] as const;\r\n\r\nexport type BrowserToolName = typeof BROWSER_TOOL_NAMES[number];\r\n\r\n/**\r\n * Check if a tool call is a browser action\r\n */\r\nexport function isBrowserToolCall(toolName: string): toolName is BrowserToolName {\r\n return BROWSER_TOOL_NAMES.includes(toolName as BrowserToolName);\r\n}\r\n\r\n/**\r\n * Check if request indicates browser extension capability\r\n * Use this to conditionally register browser tools\r\n * \r\n * @example\r\n * // In Express middleware or endpoint:\r\n * if (hasBrowserCapability(req.headers)) {\r\n * tools.push(...createBrowserTools());\r\n * }\r\n */\r\nexport function hasBrowserCapability(headers: Record<string, string | string[] | undefined>): boolean {\r\n const extensionHeader = headers['x-ranger-browser-extension'];\r\n const capableHeader = headers['x-ranger-browser-capable'];\r\n \r\n return (\r\n extensionHeader === 'true' || \r\n capableHeader === 'true' ||\r\n (Array.isArray(extensionHeader) && extensionHeader.includes('true')) ||\r\n (Array.isArray(capableHeader) && capableHeader.includes('true'))\r\n );\r\n}\r\n"],"names":["z","tool"],"mappings":"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"}
1
+ {"version":3,"file":"BrowserTools.cjs","sources":["../../../src/tools/BrowserTools.ts"],"sourcesContent":["/**\r\n * Browser Automation Tools for Ranger Browser Extension\r\n * \r\n * These tools allow the LLM to interact with the browser through the \r\n * ranger-browser extension. They generate structured actions that are\r\n * sent to the extension via SSE streaming for execution.\r\n * \r\n * The extension handles:\r\n * - DOM extraction with element indexing\r\n * - Click, type, hover, scroll actions\r\n * - Navigation and page context\r\n * - Visual element highlighting\r\n */\r\n\r\nimport { z } from 'zod';\r\nimport { tool, DynamicStructuredTool } from '@langchain/core/tools';\r\n\r\n// ============================================\r\n// Tool Schemas\r\n// ============================================\r\n\r\n/**\r\n * Enhanced click schema that supports both index-based and coordinate-based clicking\r\n */\r\nconst BrowserClickSchema = z.object({\r\n index: z.number().optional().describe(\r\n 'The index of the element to click, as shown in the page context (e.g., [0], [1], [2]). ' +\r\n 'Use the element index from the interactive elements list provided in the page context. ' +\r\n 'Either index OR coordinates must be provided.'\r\n ),\r\n coordinates: z.object({\r\n x: z.number().describe('X coordinate in viewport pixels'),\r\n y: z.number().describe('Y coordinate in viewport pixels'),\r\n }).optional().describe(\r\n 'Coordinates for clicking elements that lack semantic info (marked with ⚠️). ' +\r\n 'The coordinates are provided in the element listing as coords:(x,y). ' +\r\n 'Either index OR coordinates must be provided.'\r\n ),\r\n visualDescription: z.string().optional().describe(\r\n 'Description of what the element looks like visually. Used when clicking by appearance ' +\r\n '(e.g., \"blue button in top right corner\", \"hamburger menu icon\")'\r\n ),\r\n reason: z.string().optional().describe(\r\n 'Brief explanation of why you are clicking this element (for user transparency)'\r\n ),\r\n});\r\n\r\nconst BrowserTypeSchema = z.object({\r\n index: z.number().describe(\r\n 'The index of the input element to type into, as shown in the page context'\r\n ),\r\n text: z.string().describe(\r\n 'The text to type into the input field'\r\n ),\r\n clear: z.boolean().optional().describe(\r\n 'Whether to clear the existing content before typing (default: false)'\r\n ),\r\n pressEnter: z.boolean().optional().describe(\r\n 'Whether to press Enter after typing (useful for search fields, default: false)'\r\n ),\r\n});\r\n\r\nconst BrowserNavigateSchema = z.object({\r\n url: z.string().describe(\r\n 'The URL to navigate to. Can be a full URL or a relative path.'\r\n ),\r\n reason: z.string().optional().describe(\r\n 'Brief explanation of why you are navigating to this URL'\r\n ),\r\n});\r\n\r\nconst BrowserScrollSchema = z.object({\r\n direction: z.enum(['up', 'down', 'left', 'right']).describe(\r\n 'The direction to scroll'\r\n ),\r\n amount: z.number().optional().describe(\r\n 'The amount to scroll in pixels (default: 500)'\r\n ),\r\n});\r\n\r\nconst BrowserExtractSchema = z.object({\r\n query: z.string().optional().describe(\r\n 'Optional query to filter extracted content. If provided, only content related to the query will be extracted.'\r\n ),\r\n selector: z.string().optional().describe(\r\n 'Optional CSS selector to extract content from a specific element'\r\n ),\r\n});\r\n\r\nconst BrowserHoverSchema = z.object({\r\n index: z.number().describe(\r\n 'The index of the element to hover over, as shown in the page context'\r\n ),\r\n});\r\n\r\nconst BrowserWaitSchema = z.object({\r\n duration: z.number().optional().describe(\r\n 'Duration to wait in milliseconds (default: 1000)'\r\n ),\r\n reason: z.string().optional().describe(\r\n 'Why we are waiting (e.g., \"for page to load\", \"for animation to complete\")'\r\n ),\r\n});\r\n\r\nconst BrowserGoBackSchema = z.object({\r\n reason: z.string().optional().describe(\r\n 'Brief explanation of why you are going back'\r\n ),\r\n});\r\n\r\nconst BrowserScreenshotSchema = z.object({\r\n fullPage: z.boolean().optional().describe(\r\n 'Whether to capture the full page or just the viewport (default: viewport only)'\r\n ),\r\n reason: z.string().optional().describe(\r\n 'Why you need a screenshot (e.g., \"to identify visual elements\", \"to analyze page layout\")'\r\n ),\r\n});\r\n\r\nconst BrowserGetPageStateSchema = z.object({\r\n reason: z.string().optional().describe(\r\n 'Why you need fresh page state (e.g., \"after navigation\", \"to see updated elements\")'\r\n ),\r\n});\r\n\r\n// ============================================\r\n// Tool Implementations\r\n// ============================================\r\n\r\n/**\r\n * Browser click tool - clicks an element by index or coordinates\r\n * Supports both semantic (index-based) and vision (coordinate-based) clicking\r\n */\r\nexport function createBrowserClickTool(): DynamicStructuredTool<typeof BrowserClickSchema> {\r\n return tool<typeof BrowserClickSchema>(\r\n async ({ index, coordinates, visualDescription, reason }) => {\r\n // Validate that at least one targeting method is provided\r\n if (index === undefined && !coordinates) {\r\n return JSON.stringify({\r\n type: 'error',\r\n error: 'Either index or coordinates must be provided to click an element',\r\n });\r\n }\r\n\r\n // Return a structured action for the extension to execute\r\n // The actual execution happens in the browser extension\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'click',\r\n ...(index !== undefined && { index }),\r\n ...(coordinates && { coordinates }),\r\n ...(visualDescription && { visualDescription }),\r\n reason,\r\n },\r\n // Signal that this requires browser execution\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.CLICK,\r\n description: `Click an interactive element on the current page.\r\n\r\n**Two ways to target elements:**\r\n\r\n1. **By index (preferred)**: Use the element's index number from the interactive elements list\r\n - Format: [index] {semantic role} <tag>text</tag>\r\n - Example: browser_click({ index: 5 }) to click element [5]\r\n\r\n2. **By coordinates (vision fallback)**: For elements marked with ⚠️ that lack semantic info\r\n - Use the coords:(x,y) shown after the ⚠️ marker\r\n - Example: browser_click({ coordinates: { x: 150, y: 200 } })\r\n\r\n**When to use coordinates:**\r\n- Elements marked with ⚠️ have poor semantic understanding\r\n- Icon-only buttons without labels\r\n- Custom canvas/SVG elements\r\n- When you identify an element visually in a screenshot\r\n\r\nExample: If element shows \\`[12] {button} <div>⚠️ [left side, small, clickable] coords:(45,120)\\`\r\nUse either: browser_click({ index: 12 }) or browser_click({ coordinates: { x: 45, y: 120 } })`,\r\n schema: BrowserClickSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser type tool - types text into an input field\r\n */\r\nexport function createBrowserTypeTool(): DynamicStructuredTool<typeof BrowserTypeSchema> {\r\n return tool<typeof BrowserTypeSchema>(\r\n async ({ index, text, clear, pressEnter }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'type',\r\n index,\r\n text,\r\n clear: clear ?? false,\r\n pressEnter: pressEnter ?? false,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.TYPE,\r\n description: `Type text into an input field on the current page.\r\n\r\nUse this tool when you need to:\r\n- Fill in a text input or textarea\r\n- Enter a search query\r\n- Fill out form fields\r\n\r\nThe element index comes from the page context's interactive elements list.\r\nSet 'clear: true' to clear existing content before typing.\r\nSet 'pressEnter: true' to submit after typing (useful for search fields).\r\n\r\nExample: To type \"hello world\" into a search field shown as \"[2]<input>Search...</input>\",\r\nuse index: 2, text: \"hello world\"`,\r\n schema: BrowserTypeSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser navigate tool - navigates to a URL\r\n */\r\nexport function createBrowserNavigateTool(): DynamicStructuredTool<typeof BrowserNavigateSchema> {\r\n return tool<typeof BrowserNavigateSchema>(\r\n async ({ url, reason }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'navigate',\r\n url,\r\n reason,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.NAVIGATE,\r\n description: `Navigate to a specific URL in the browser.\r\n\r\nUse this tool when you need to:\r\n- Go to a specific website\r\n- Navigate to a different page\r\n- Open a new URL\r\n\r\n**IMPORTANT**: After calling browser_navigate, you MUST call browser_get_page_state \r\nbefore using browser_click or browser_type. This is because navigation changes the page,\r\nand you need to see the new page's elements before you can interact with them.\r\n\r\nProvide the full URL including the protocol (https://).\r\n\r\n**Correct workflow**:\r\n1. browser_navigate({ url: \"https://www.amazon.com\" })\r\n2. browser_get_page_state({ reason: \"see elements on Amazon\" })\r\n3. Now find the search input's [index] in the returned state\r\n4. browser_type({ index: <search_input_index>, text: \"query\", pressEnter: true })\r\n\r\nExample: browser_navigate({ url: \"https://www.google.com\" })`,\r\n schema: BrowserNavigateSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser scroll tool - scrolls the page\r\n */\r\nexport function createBrowserScrollTool(): DynamicStructuredTool<typeof BrowserScrollSchema> {\r\n return tool<typeof BrowserScrollSchema>(\r\n async ({ direction, amount }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'scroll',\r\n scroll: {\r\n direction,\r\n amount: amount ?? 500,\r\n },\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.SCROLL,\r\n description: `Scroll the current page in a specified direction.\r\n\r\nUse this tool when you need to:\r\n- See more content on the page\r\n- Scroll to find elements not currently visible\r\n- Navigate long pages\r\n\r\nDefault scroll amount is 500 pixels. Adjust as needed.\r\n\r\nExample: browser_scroll({ direction: \"down\", amount: 800 })`,\r\n schema: BrowserScrollSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser extract tool - extracts content from the page\r\n */\r\nexport function createBrowserExtractTool(): DynamicStructuredTool<typeof BrowserExtractSchema> {\r\n return tool<typeof BrowserExtractSchema>(\r\n async ({ query, selector }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'extract',\r\n query,\r\n selector,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.EXTRACT,\r\n description: `Extract text content from the current page.\r\n\r\nUse this tool when you need to:\r\n- Get specific information from the page\r\n- Extract text that matches a query\r\n- Read content from a specific element\r\n\r\nIf no query or selector is provided, extracts the main page content.\r\nUse a CSS selector to extract from a specific element.\r\nUse a query to filter for relevant content.\r\n\r\nExample: browser_extract({ query: \"price\" }) - extracts content related to pricing`,\r\n schema: BrowserExtractSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser hover tool - hovers over an element\r\n */\r\nexport function createBrowserHoverTool(): DynamicStructuredTool<typeof BrowserHoverSchema> {\r\n return tool<typeof BrowserHoverSchema>(\r\n async ({ index }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'hover',\r\n index,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.HOVER,\r\n description: `Hover over an element to reveal tooltips or dropdown menus.\r\n\r\nUse this tool when you need to:\r\n- Reveal a dropdown menu\r\n- Show a tooltip\r\n- Trigger hover effects\r\n\r\nExample: browser_hover({ index: 3 }) - hovers over element at index 3`,\r\n schema: BrowserHoverSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser wait tool - waits for a specified duration\r\n */\r\nexport function createBrowserWaitTool(): DynamicStructuredTool<typeof BrowserWaitSchema> {\r\n return tool<typeof BrowserWaitSchema>(\r\n async ({ duration, reason }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'wait',\r\n duration: duration ?? 1000,\r\n reason,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.WAIT,\r\n description: `Wait for a specified duration before the next action.\r\n\r\nUse this tool when you need to:\r\n- Wait for a page to load\r\n- Wait for an animation to complete\r\n- Add delay between actions\r\n\r\nDefault wait time is 1000ms (1 second).\r\n\r\nExample: browser_wait({ duration: 2000, reason: \"waiting for page to load\" })`,\r\n schema: BrowserWaitSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser go back tool - navigates back in history\r\n */\r\nexport function createBrowserGoBackTool(): DynamicStructuredTool<typeof BrowserGoBackSchema> {\r\n return tool<typeof BrowserGoBackSchema>(\r\n async ({ reason }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'back',\r\n reason,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.BACK,\r\n description: `Navigate back to the previous page in browser history.\r\n\r\nUse this tool when you need to:\r\n- Return to a previous page\r\n- Undo a navigation\r\n\r\nExample: browser_back({ reason: \"returning to search results\" })`,\r\n schema: BrowserGoBackSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser screenshot tool - captures a screenshot\r\n */\r\nexport function createBrowserScreenshotTool(): DynamicStructuredTool<typeof BrowserScreenshotSchema> {\r\n return tool<typeof BrowserScreenshotSchema>(\r\n async ({ fullPage }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'screenshot',\r\n fullPage: fullPage ?? false,\r\n },\r\n requiresBrowserExecution: true,\r\n });\r\n },\r\n {\r\n name: EBrowserTools.SCREENSHOT,\r\n description: `Capture a screenshot of the current page.\r\n\r\nUse this tool when you need to:\r\n- Capture the current state of a page\r\n- Document visual elements\r\n- Verify page appearance\r\n\r\nSet fullPage: true to capture the entire page (may be large).\r\nDefault captures only the visible viewport.\r\n\r\nExample: browser_screenshot({ fullPage: false })`,\r\n schema: BrowserScreenshotSchema,\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Browser get page state tool - gets fresh page context after navigation or actions\r\n * CRITICAL: Use this after browser_navigate or any action that changes the page\r\n */\r\nexport function createBrowserGetPageStateTool(): DynamicStructuredTool<typeof BrowserGetPageStateSchema> {\r\n return tool<typeof BrowserGetPageStateSchema>(\r\n async ({ reason }) => {\r\n return JSON.stringify({\r\n type: 'browser_action',\r\n action: {\r\n type: 'get_page_state',\r\n reason,\r\n },\r\n requiresBrowserExecution: true,\r\n // Special flag: extension should inject fresh context into the conversation\r\n requiresContextRefresh: true,\r\n // IMPORTANT: Tell the agent to wait\r\n message: 'Page state is being captured by the browser extension. The element list will be provided in the next message. DO NOT proceed with click or type actions until you receive the actual element list.',\r\n });\r\n },\r\n {\r\n name: EBrowserTools.GET_PAGE_STATE,\r\n description: `Get fresh page state showing current interactive elements.\r\n\r\n**CRITICAL WORKFLOW**: After calling this tool, you MUST STOP and WAIT. The browser extension will capture the page state and return the element list. DO NOT plan any browser_click or browser_type actions in the same response - you don't have the element indices yet!\r\n\r\n**When to use**:\r\n- After browser_navigate (to see elements on the new page)\r\n- After browser_click (if it caused navigation or page changes)\r\n- Any time you need to see what elements are currently on the page\r\n\r\n**IMPORTANT**: This tool captures the page state asynchronously. The actual element list will be provided AFTER this tool completes. You should:\r\n1. Call this tool\r\n2. STOP and wait for the response with the element list\r\n3. In your NEXT response, use the element indices for click/type actions\r\n\r\nExample workflow:\r\n- Turn 1: browser_navigate to amazon.com, then browser_get_page_state\r\n- Turn 2: (After receiving element list) browser_type with the correct search input index\r\n\r\nExample: browser_get_page_state({ reason: \"to see elements after navigation\" })`,\r\n schema: BrowserGetPageStateSchema,\r\n }\r\n );\r\n}\r\n\r\n// ============================================\r\n// Tool Collection\r\n// ============================================\r\n\r\nexport type BrowserToolsConfig = {\r\n /** Enable click tool */\r\n enableClick?: boolean;\r\n /** Enable type tool */\r\n enableType?: boolean;\r\n /** Enable navigate tool */\r\n enableNavigate?: boolean;\r\n /** Enable scroll tool */\r\n enableScroll?: boolean;\r\n /** Enable extract tool */\r\n enableExtract?: boolean;\r\n /** Enable hover tool */\r\n enableHover?: boolean;\r\n /** Enable wait tool */\r\n enableWait?: boolean;\r\n /** Enable back tool */\r\n enableBack?: boolean;\r\n /** Enable screenshot tool */\r\n enableScreenshot?: boolean;\r\n /** Enable get page state tool */\r\n enableGetPageState?: boolean;\r\n};\r\n\r\n/**\r\n * Create all browser automation tools\r\n * \r\n * IMPORTANT: These tools should ONLY be registered when:\r\n * 1. The request comes from a browser extension that can execute them\r\n * 2. The client has indicated browser capability (e.g., via header or parameter)\r\n * \r\n * DO NOT register these for normal web UI users - they cannot execute browser actions.\r\n * \r\n * Detection in Ranger API:\r\n * - Check for `X-Ranger-Browser-Extension: true` header\r\n * - Or check for `browserCapable: true` in request body\r\n * - Or check user agent for extension identifier\r\n * \r\n * @example\r\n * // In Ranger API endpoint:\r\n * const hasBrowserExtension = req.headers['x-ranger-browser-extension'] === 'true';\r\n * const tools = hasBrowserExtension \r\n * ? [...normalTools, ...createBrowserTools()]\r\n * : normalTools;\r\n */\r\nexport function createBrowserTools(config: BrowserToolsConfig = {}): DynamicStructuredTool[] {\r\n const tools: DynamicStructuredTool[] = [];\r\n \r\n // Enable all by default\r\n const {\r\n enableClick = true,\r\n enableType = true,\r\n enableNavigate = true,\r\n enableScroll = true,\r\n enableExtract = true,\r\n enableHover = true,\r\n enableWait = true,\r\n enableBack = true,\r\n enableScreenshot = true,\r\n enableGetPageState = true,\r\n } = config;\r\n \r\n if (enableClick) tools.push(createBrowserClickTool());\r\n if (enableType) tools.push(createBrowserTypeTool());\r\n if (enableNavigate) tools.push(createBrowserNavigateTool());\r\n if (enableScroll) tools.push(createBrowserScrollTool());\r\n if (enableExtract) tools.push(createBrowserExtractTool());\r\n if (enableHover) tools.push(createBrowserHoverTool());\r\n if (enableWait) tools.push(createBrowserWaitTool());\r\n if (enableBack) tools.push(createBrowserGoBackTool());\r\n if (enableScreenshot) tools.push(createBrowserScreenshotTool());\r\n if (enableGetPageState) tools.push(createBrowserGetPageStateTool());\r\n \r\n return tools;\r\n}\r\n\r\n/**\r\n * Browser tool name constants\r\n * Use these instead of magic strings\r\n */\r\nexport const EBrowserTools = {\r\n CLICK: 'browser_click',\r\n TYPE: 'browser_type',\r\n NAVIGATE: 'browser_navigate',\r\n SCROLL: 'browser_scroll',\r\n EXTRACT: 'browser_extract',\r\n HOVER: 'browser_hover',\r\n WAIT: 'browser_wait',\r\n BACK: 'browser_back',\r\n SCREENSHOT: 'browser_screenshot',\r\n GET_PAGE_STATE: 'browser_get_page_state',\r\n} as const;\r\n\r\n/**\r\n * Get browser tool names for filtering/identification\r\n */\r\nexport const BROWSER_TOOL_NAMES = [\r\n EBrowserTools.CLICK,\r\n EBrowserTools.TYPE,\r\n EBrowserTools.NAVIGATE,\r\n EBrowserTools.SCROLL,\r\n EBrowserTools.EXTRACT,\r\n EBrowserTools.HOVER,\r\n EBrowserTools.WAIT,\r\n EBrowserTools.BACK,\r\n EBrowserTools.SCREENSHOT,\r\n EBrowserTools.GET_PAGE_STATE,\r\n] as const;\r\n\r\nexport type BrowserToolName = typeof BROWSER_TOOL_NAMES[number];\r\n\r\n/**\r\n * Check if a tool call is a browser action\r\n */\r\nexport function isBrowserToolCall(toolName: string): toolName is BrowserToolName {\r\n return BROWSER_TOOL_NAMES.includes(toolName as BrowserToolName);\r\n}\r\n\r\n/**\r\n * Check if request indicates browser extension capability\r\n * Use this to conditionally register browser tools\r\n * \r\n * @example\r\n * // In Express middleware or endpoint:\r\n * if (hasBrowserCapability(req.headers)) {\r\n * tools.push(...createBrowserTools());\r\n * }\r\n */\r\nexport function hasBrowserCapability(headers: Record<string, string | string[] | undefined>): boolean {\r\n const extensionHeader = headers['x-ranger-browser-extension'];\r\n const capableHeader = headers['x-ranger-browser-capable'];\r\n \r\n return (\r\n extensionHeader === 'true' || \r\n capableHeader === 'true' ||\r\n (Array.isArray(extensionHeader) && extensionHeader.includes('true')) ||\r\n (Array.isArray(capableHeader) && capableHeader.includes('true'))\r\n );\r\n}\r\n"],"names":["z","tool"],"mappings":";;;;;AAAA;;;;;;;;;;;;AAYG;AAKH;AACA;AACA;AAEA;;AAEG;AACH,MAAM,kBAAkB,GAAGA,KAAC,CAAC,MAAM,CAAC;IAClC,KAAK,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACnC,yFAAyF;QACzF,yFAAyF;AACzF,QAAA,+CAA+C,CAChD;AACD,IAAA,WAAW,EAAEA,KAAC,CAAC,MAAM,CAAC;QACpB,CAAC,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QACzD,CAAC,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;AAC1D,KAAA,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpB,8EAA8E;QAC9E,uEAAuE;AACvE,QAAA,+CAA+C,CAChD;IACD,iBAAiB,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC/C,wFAAwF;AACxF,QAAA,kEAAkE,CACnE;AACD,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,gFAAgF,CACjF;AACF,CAAA,CAAC;AAEF,MAAM,iBAAiB,GAAGA,KAAC,CAAC,MAAM,CAAC;IACjC,KAAK,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACxB,2EAA2E,CAC5E;IACD,IAAI,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACvB,uCAAuC,CACxC;AACD,IAAA,KAAK,EAAEA,KAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,sEAAsE,CACvE;AACD,IAAA,UAAU,EAAEA,KAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACzC,gFAAgF,CACjF;AACF,CAAA,CAAC;AAEF,MAAM,qBAAqB,GAAGA,KAAC,CAAC,MAAM,CAAC;IACrC,GAAG,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACtB,+DAA+D,CAChE;AACD,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,yDAAyD,CAC1D;AACF,CAAA,CAAC;AAEF,MAAM,mBAAmB,GAAGA,KAAC,CAAC,MAAM,CAAC;AACnC,IAAA,SAAS,EAAEA,KAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CACzD,yBAAyB,CAC1B;AACD,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,+CAA+C,CAChD;AACF,CAAA,CAAC;AAEF,MAAM,oBAAoB,GAAGA,KAAC,CAAC,MAAM,CAAC;AACpC,IAAA,KAAK,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACnC,+GAA+G,CAChH;AACD,IAAA,QAAQ,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACtC,kEAAkE,CACnE;AACF,CAAA,CAAC;AAEF,MAAM,kBAAkB,GAAGA,KAAC,CAAC,MAAM,CAAC;IAClC,KAAK,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACxB,sEAAsE,CACvE;AACF,CAAA,CAAC;AAEF,MAAM,iBAAiB,GAAGA,KAAC,CAAC,MAAM,CAAC;AACjC,IAAA,QAAQ,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACtC,kDAAkD,CACnD;AACD,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,4EAA4E,CAC7E;AACF,CAAA,CAAC;AAEF,MAAM,mBAAmB,GAAGA,KAAC,CAAC,MAAM,CAAC;AACnC,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,6CAA6C,CAC9C;AACF,CAAA,CAAC;AAEF,MAAM,uBAAuB,GAAGA,KAAC,CAAC,MAAM,CAAC;AACvC,IAAA,QAAQ,EAAEA,KAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACvC,gFAAgF,CACjF;AACD,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,2FAA2F,CAC5F;AACF,CAAA,CAAC;AAEF,MAAM,yBAAyB,GAAGA,KAAC,CAAC,MAAM,CAAC;AACzC,IAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,qFAAqF,CACtF;AACF,CAAA,CAAC;AAEF;AACA;AACA;AAEA;;;AAGG;SACa,sBAAsB,GAAA;AACpC,IAAA,OAAOC,UAAI,CACT,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,KAAI;;AAE1D,QAAA,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,WAAW,EAAE;YACvC,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,KAAK,EAAE,kEAAkE;AAC1E,aAAA,CAAC;;;;QAKJ,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,OAAO;gBACb,IAAI,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC;AACrC,gBAAA,IAAI,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC;AACnC,gBAAA,IAAI,iBAAiB,IAAI,EAAE,iBAAiB,EAAE,CAAC;gBAC/C,MAAM;AACP,aAAA;;AAED,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,KAAK;AACzB,QAAA,WAAW,EAAE,CAAA;;;;;;;;;;;;;;;;;;;AAmB2E,6FAAA,CAAA;AACxF,QAAA,MAAM,EAAE,kBAAkB;AAC3B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,qBAAqB,GAAA;AACnC,IAAA,OAAOA,UAAI,CACT,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAI;QAC3C,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,MAAM;gBACZ,KAAK;gBACL,IAAI;gBACJ,KAAK,EAAE,KAAK,IAAI,KAAK;gBACrB,UAAU,EAAE,UAAU,IAAI,KAAK;AAChC,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,IAAI;AACxB,QAAA,WAAW,EAAE,CAAA;;;;;;;;;;;;AAYe,iCAAA,CAAA;AAC5B,QAAA,MAAM,EAAE,iBAAiB;AAC1B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,yBAAyB,GAAA;IACvC,OAAOA,UAAI,CACT,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAI;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,UAAU;gBAChB,GAAG;gBACH,MAAM;AACP,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,QAAQ;AAC5B,QAAA,WAAW,EAAE,CAAA;;;;;;;;;;;;;;;;;;;AAmB0C,4DAAA,CAAA;AACvD,QAAA,MAAM,EAAE,qBAAqB;AAC9B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,uBAAuB,GAAA;IACrC,OAAOA,UAAI,CACT,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAI;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,MAAM,EAAE;oBACN,SAAS;oBACT,MAAM,EAAE,MAAM,IAAI,GAAG;AACtB,iBAAA;AACF,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,MAAM;AAC1B,QAAA,WAAW,EAAE,CAAA;;;;;;;;;AASyC,2DAAA,CAAA;AACtD,QAAA,MAAM,EAAE,mBAAmB;AAC5B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,wBAAwB,GAAA;IACtC,OAAOA,UAAI,CACT,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAI;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,SAAS;gBACf,KAAK;gBACL,QAAQ;AACT,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,OAAO;AAC3B,QAAA,WAAW,EAAE,CAAA;;;;;;;;;;;AAWgE,kFAAA,CAAA;AAC7E,QAAA,MAAM,EAAE,oBAAoB;AAC7B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,sBAAsB,GAAA;IACpC,OAAOA,UAAI,CACT,OAAO,EAAE,KAAK,EAAE,KAAI;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,OAAO;gBACb,KAAK;AACN,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,KAAK;AACzB,QAAA,WAAW,EAAE,CAAA;;;;;;;AAOmD,qEAAA,CAAA;AAChE,QAAA,MAAM,EAAE,kBAAkB;AAC3B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,qBAAqB,GAAA;IACnC,OAAOA,UAAI,CACT,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAI;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,QAAQ,IAAI,IAAI;gBAC1B,MAAM;AACP,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,IAAI;AACxB,QAAA,WAAW,EAAE,CAAA;;;;;;;;;AAS2D,6EAAA,CAAA;AACxE,QAAA,MAAM,EAAE,iBAAiB;AAC1B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,uBAAuB,GAAA;IACrC,OAAOA,UAAI,CACT,OAAO,EAAE,MAAM,EAAE,KAAI;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,MAAM;gBACZ,MAAM;AACP,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,IAAI;AACxB,QAAA,WAAW,EAAE,CAAA;;;;;;AAM8C,gEAAA,CAAA;AAC3D,QAAA,MAAM,EAAE,mBAAmB;AAC5B,KAAA,CACF;AACH;AAEA;;AAEG;SACa,2BAA2B,GAAA;IACzC,OAAOA,UAAI,CACT,OAAO,EAAE,QAAQ,EAAE,KAAI;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,QAAQ,IAAI,KAAK;AAC5B,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;AAC/B,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,UAAU;AAC9B,QAAA,WAAW,EAAE,CAAA;;;;;;;;;;AAU8B,gDAAA,CAAA;AAC3C,QAAA,MAAM,EAAE,uBAAuB;AAChC,KAAA,CACF;AACH;AAEA;;;AAGG;SACa,6BAA6B,GAAA;IAC3C,OAAOA,UAAI,CACT,OAAO,EAAE,MAAM,EAAE,KAAI;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;AACpB,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACN,gBAAA,IAAI,EAAE,gBAAgB;gBACtB,MAAM;AACP,aAAA;AACD,YAAA,wBAAwB,EAAE,IAAI;;AAE9B,YAAA,sBAAsB,EAAE,IAAI;;AAE5B,YAAA,OAAO,EAAE,oMAAoM;AAC9M,SAAA,CAAC;AACJ,KAAC,EACD;QACE,IAAI,EAAE,aAAa,CAAC,cAAc;AAClC,QAAA,WAAW,EAAE,CAAA;;;;;;;;;;;;;;;;;;AAkB6D,+EAAA,CAAA;AAC1E,QAAA,MAAM,EAAE,yBAAyB;AAClC,KAAA,CACF;AACH;AA6BA;;;;;;;;;;;;;;;;;;;;AAoBG;AACa,SAAA,kBAAkB,CAAC,MAAA,GAA6B,EAAE,EAAA;IAChE,MAAM,KAAK,GAA4B,EAAE;;AAGzC,IAAA,MAAM,EACJ,WAAW,GAAG,IAAI,EAClB,UAAU,GAAG,IAAI,EACjB,cAAc,GAAG,IAAI,EACrB,YAAY,GAAG,IAAI,EACnB,aAAa,GAAG,IAAI,EACpB,WAAW,GAAG,IAAI,EAClB,UAAU,GAAG,IAAI,EACjB,UAAU,GAAG,IAAI,EACjB,gBAAgB,GAAG,IAAI,EACvB,kBAAkB,GAAG,IAAI,GAC1B,GAAG,MAAM;AAEV,IAAA,IAAI,WAAW;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;AACrD,IAAA,IAAI,UAAU;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;AACnD,IAAA,IAAI,cAAc;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC;AAC3D,IAAA,IAAI,YAAY;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;AACvD,IAAA,IAAI,aAAa;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;AACzD,IAAA,IAAI,WAAW;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;AACrD,IAAA,IAAI,UAAU;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;AACnD,IAAA,IAAI,UAAU;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;AACrD,IAAA,IAAI,gBAAgB;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC;AAC/D,IAAA,IAAI,kBAAkB;AAAE,QAAA,KAAK,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC;AAEnE,IAAA,OAAO,KAAK;AACd;AAEA;;;AAGG;AACU,MAAA,aAAa,GAAG;AAC3B,IAAA,KAAK,EAAE,eAAe;AACtB,IAAA,IAAI,EAAE,cAAc;AACpB,IAAA,QAAQ,EAAE,kBAAkB;AAC5B,IAAA,MAAM,EAAE,gBAAgB;AACxB,IAAA,OAAO,EAAE,iBAAiB;AAC1B,IAAA,KAAK,EAAE,eAAe;AACtB,IAAA,IAAI,EAAE,cAAc;AACpB,IAAA,IAAI,EAAE,cAAc;AACpB,IAAA,UAAU,EAAE,oBAAoB;AAChC,IAAA,cAAc,EAAE,wBAAwB;;AAG1C;;AAEG;AACU,MAAA,kBAAkB,GAAG;AAChC,IAAA,aAAa,CAAC,KAAK;AACnB,IAAA,aAAa,CAAC,IAAI;AAClB,IAAA,aAAa,CAAC,QAAQ;AACtB,IAAA,aAAa,CAAC,MAAM;AACpB,IAAA,aAAa,CAAC,OAAO;AACrB,IAAA,aAAa,CAAC,KAAK;AACnB,IAAA,aAAa,CAAC,IAAI;AAClB,IAAA,aAAa,CAAC,IAAI;AAClB,IAAA,aAAa,CAAC,UAAU;AACxB,IAAA,aAAa,CAAC,cAAc;;AAK9B;;AAEG;AACG,SAAU,iBAAiB,CAAC,QAAgB,EAAA;AAChD,IAAA,OAAO,kBAAkB,CAAC,QAAQ,CAAC,QAA2B,CAAC;AACjE;AAEA;;;;;;;;;AASG;AACG,SAAU,oBAAoB,CAAC,OAAsD,EAAA;AACzF,IAAA,MAAM,eAAe,GAAG,OAAO,CAAC,4BAA4B,CAAC;AAC7D,IAAA,MAAM,aAAa,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAEzD,QACE,eAAe,KAAK,MAAM;AAC1B,QAAA,aAAa,KAAK,MAAM;AACxB,SAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACpE,SAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAEpE;;;;;;;;;;;;;;;;;;"}
@@ -844,9 +844,9 @@ If I seem to be missing something we discussed earlier, just give me a quick rem
844
844
  });
845
845
  const workflow = new StateGraph(StateAnnotation)
846
846
  .addNode(this.defaultAgentId, agentNode, { ends: [END] })
847
- .addEdge(START, this.defaultAgentId)
848
- .compile();
849
- return workflow;
847
+ .addEdge(START, this.defaultAgentId);
848
+ // Pass compileOptions (e.g., checkpointer for browser interrupt support)
849
+ return workflow.compile(this.compileOptions);
850
850
  }
851
851
  /* Dispatchers */
852
852
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Graph.mjs","sources":["../../../src/graphs/Graph.ts"],"sourcesContent":["/* eslint-disable no-console */\n// src/graphs/Graph.ts\nimport { nanoid } from 'nanoid';\nimport { concat } from '@langchain/core/utils/stream';\nimport { ToolNode } from '@langchain/langgraph/prebuilt';\nimport { ChatVertexAI } from '@langchain/google-vertexai';\nimport {\n START,\n END,\n Command,\n StateGraph,\n Annotation,\n messagesStateReducer,\n} from '@langchain/langgraph';\nimport {\n Runnable,\n RunnableConfig,\n RunnableLambda,\n} from '@langchain/core/runnables';\nimport {\n ToolMessage,\n SystemMessage,\n AIMessageChunk,\n HumanMessage,\n} from '@langchain/core/messages';\nimport type {\n BaseMessageFields,\n UsageMetadata,\n BaseMessage,\n} from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type * as t from '@/types';\nimport {\n GraphNodeKeys,\n ContentTypes,\n GraphEvents,\n Providers,\n StepTypes,\n MessageTypes,\n} from '@/common';\nimport {\n formatAnthropicArtifactContent,\n ensureThinkingBlockInMessages,\n convertMessagesToContent,\n addBedrockCacheControl,\n modifyDeltaProperties,\n formatArtifactPayload,\n formatContentStrings,\n createPruneMessages,\n addCacheControl,\n extractToolDiscoveries,\n} from '@/messages';\nimport {\n resetIfNotEmpty,\n isOpenAILike,\n isGoogleLike,\n joinKeys,\n sleep,\n} from '@/utils';\nimport {\n buildContextAnalytics,\n type ContextAnalytics,\n} from '@/utils/contextAnalytics';\nimport { getChatModelClass, manualToolStreamProviders } from '@/llm/providers';\nimport { ToolNode as CustomToolNode, toolsCondition } from '@/tools/ToolNode';\nimport { ChatOpenAI, AzureChatOpenAI } from '@/llm/openai';\nimport { safeDispatchCustomEvent } from '@/utils/events';\nimport { AgentContext } from '@/agents/AgentContext';\nimport { createFakeStreamingLLM } from '@/llm/fake';\nimport { HandlerRegistry } from '@/events';\n\nconst { AGENT, TOOLS } = GraphNodeKeys;\n\nexport abstract class Graph<\n T extends t.BaseGraphState = t.BaseGraphState,\n _TNodeName extends string = string,\n> {\n abstract resetValues(): void;\n abstract initializeTools({\n currentTools,\n currentToolMap,\n }: {\n currentTools?: t.GraphTools;\n currentToolMap?: t.ToolMap;\n }): CustomToolNode<T> | ToolNode<T>;\n abstract initializeModel({\n currentModel,\n tools,\n clientOptions,\n }: {\n currentModel?: t.ChatModel;\n tools?: t.GraphTools;\n clientOptions?: t.ClientOptions;\n }): Runnable;\n abstract getRunMessages(): BaseMessage[] | undefined;\n abstract getContentParts(): t.MessageContentComplex[] | undefined;\n abstract generateStepId(stepKey: string): [string, number];\n abstract getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[];\n abstract getStepKey(metadata: Record<string, unknown> | undefined): string;\n abstract checkKeyList(keyList: (string | number | undefined)[]): boolean;\n abstract getStepIdByKey(stepKey: string, index?: number): string;\n abstract getRunStep(stepId: string): t.RunStep | undefined;\n abstract dispatchRunStep(\n stepKey: string,\n stepDetails: t.StepDetails,\n metadata?: Record<string, unknown>\n ): Promise<string>;\n abstract dispatchRunStepDelta(\n id: string,\n delta: t.ToolCallDelta\n ): Promise<void>;\n abstract dispatchMessageDelta(\n id: string,\n delta: t.MessageDelta\n ): Promise<void>;\n abstract dispatchReasoningDelta(\n stepId: string,\n delta: t.ReasoningDelta\n ): Promise<void>;\n abstract handleToolCallCompleted(\n data: t.ToolEndData,\n metadata?: Record<string, unknown>,\n omitOutput?: boolean\n ): Promise<void>;\n\n abstract createCallModel(\n agentId?: string,\n currentModel?: t.ChatModel\n ): (state: T, config?: RunnableConfig) => Promise<Partial<T>>;\n messageStepHasToolCalls: Map<string, boolean> = new Map();\n messageIdsByStepKey: Map<string, string> = new Map();\n prelimMessageIdsByStepKey: Map<string, string> = new Map();\n config: RunnableConfig | undefined;\n contentData: t.RunStep[] = [];\n stepKeyIds: Map<string, string[]> = new Map<string, string[]>();\n contentIndexMap: Map<string, number> = new Map();\n toolCallStepIds: Map<string, string> = new Map();\n signal?: AbortSignal;\n /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */\n invokedToolIds?: Set<string>;\n handlerRegistry: HandlerRegistry | undefined;\n}\n\nexport class StandardGraph extends Graph<t.BaseGraphState, t.GraphNode> {\n overrideModel?: t.ChatModel;\n /** Optional compile options passed into workflow.compile() */\n compileOptions?: t.CompileOptions | undefined;\n messages: BaseMessage[] = [];\n runId: string | undefined;\n startIndex: number = 0;\n signal?: AbortSignal;\n /** Map of agent contexts by agent ID */\n agentContexts: Map<string, AgentContext> = new Map();\n /** Default agent ID to use */\n defaultAgentId: string;\n\n constructor({\n // parent-level graph inputs\n runId,\n signal,\n agents,\n tokenCounter,\n indexTokenCountMap,\n }: t.StandardGraphInput) {\n super();\n this.runId = runId;\n this.signal = signal;\n\n if (agents.length === 0) {\n throw new Error('At least one agent configuration is required');\n }\n\n for (const agentConfig of agents) {\n const agentContext = AgentContext.fromConfig(\n agentConfig,\n tokenCounter,\n indexTokenCountMap\n );\n\n this.agentContexts.set(agentConfig.agentId, agentContext);\n }\n\n this.defaultAgentId = agents[0].agentId;\n }\n\n /* Init */\n\n resetValues(keepContent?: boolean): void {\n this.messages = [];\n this.config = resetIfNotEmpty(this.config, undefined);\n if (keepContent !== true) {\n this.contentData = resetIfNotEmpty(this.contentData, []);\n this.contentIndexMap = resetIfNotEmpty(this.contentIndexMap, new Map());\n }\n this.stepKeyIds = resetIfNotEmpty(this.stepKeyIds, new Map());\n this.toolCallStepIds = resetIfNotEmpty(this.toolCallStepIds, new Map());\n this.messageIdsByStepKey = resetIfNotEmpty(\n this.messageIdsByStepKey,\n new Map()\n );\n this.messageStepHasToolCalls = resetIfNotEmpty(\n this.messageStepHasToolCalls,\n new Map()\n );\n this.prelimMessageIdsByStepKey = resetIfNotEmpty(\n this.prelimMessageIdsByStepKey,\n new Map()\n );\n this.invokedToolIds = resetIfNotEmpty(this.invokedToolIds, undefined);\n for (const context of this.agentContexts.values()) {\n context.reset();\n }\n }\n\n /**\n * Estimates a human-friendly description of the conversation timeframe based on message count.\n * Uses rough heuristics to provide context about how much history is available.\n *\n * @param messageCount - Number of messages in the remaining context\n * @returns A friendly description like \"the last few minutes\", \"the past hour\", etc.\n */\n getContextTimeframeDescription(messageCount: number): string {\n // Rough heuristics based on typical conversation patterns:\n // - Very active chat: ~20-30 messages per hour\n // - Normal chat: ~10-15 messages per hour\n // - Slow/thoughtful chat: ~5-8 messages per hour\n // We use a middle estimate of ~12 messages per hour\n\n if (messageCount <= 5) {\n return 'just the last few exchanges';\n } else if (messageCount <= 15) {\n return 'the last several minutes';\n } else if (messageCount <= 30) {\n return 'roughly the past hour';\n } else if (messageCount <= 60) {\n return 'the past couple of hours';\n } else if (messageCount <= 150) {\n return 'the past few hours';\n } else if (messageCount <= 300) {\n return 'roughly a day\\'s worth';\n } else if (messageCount <= 700) {\n return 'the past few days';\n } else {\n return 'about a week or more';\n }\n }\n\n /* Run Step Processing */\n\n getRunStep(stepId: string): t.RunStep | undefined {\n const index = this.contentIndexMap.get(stepId);\n if (index !== undefined) {\n return this.contentData[index];\n }\n return undefined;\n }\n\n getAgentContext(metadata: Record<string, unknown> | undefined): AgentContext {\n if (!metadata) {\n throw new Error('No metadata provided to retrieve agent context');\n }\n\n const currentNode = metadata.langgraph_node as string;\n if (!currentNode) {\n throw new Error(\n 'No langgraph_node in metadata to retrieve agent context'\n );\n }\n\n let agentId: string | undefined;\n if (currentNode.startsWith(AGENT)) {\n agentId = currentNode.substring(AGENT.length);\n } else if (currentNode.startsWith(TOOLS)) {\n agentId = currentNode.substring(TOOLS.length);\n }\n\n const agentContext = this.agentContexts.get(agentId ?? '');\n if (!agentContext) {\n throw new Error(`No agent context found for agent ID ${agentId}`);\n }\n\n return agentContext;\n }\n\n getStepKey(metadata: Record<string, unknown> | undefined): string {\n if (!metadata) return '';\n\n const keyList = this.getKeyList(metadata);\n if (this.checkKeyList(keyList)) {\n throw new Error('Missing metadata');\n }\n\n return joinKeys(keyList);\n }\n\n getStepIdByKey(stepKey: string, index?: number): string {\n const stepIds = this.stepKeyIds.get(stepKey);\n if (!stepIds) {\n throw new Error(`No step IDs found for stepKey ${stepKey}`);\n }\n\n if (index === undefined) {\n return stepIds[stepIds.length - 1];\n }\n\n return stepIds[index];\n }\n\n generateStepId(stepKey: string): [string, number] {\n const stepIds = this.stepKeyIds.get(stepKey);\n let newStepId: string | undefined;\n let stepIndex = 0;\n if (stepIds) {\n stepIndex = stepIds.length;\n newStepId = `step_${nanoid()}`;\n stepIds.push(newStepId);\n this.stepKeyIds.set(stepKey, stepIds);\n } else {\n newStepId = `step_${nanoid()}`;\n this.stepKeyIds.set(stepKey, [newStepId]);\n }\n\n return [newStepId, stepIndex];\n }\n\n getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[] {\n if (!metadata) return [];\n\n const keyList = [\n metadata.run_id as string,\n metadata.thread_id as string,\n metadata.langgraph_node as string,\n metadata.langgraph_step as number,\n metadata.checkpoint_ns as string,\n ];\n\n const agentContext = this.getAgentContext(metadata);\n if (\n agentContext.currentTokenType === ContentTypes.THINK ||\n agentContext.currentTokenType === 'think_and_text'\n ) {\n keyList.push('reasoning');\n } else if (agentContext.tokenTypeSwitch === 'content') {\n keyList.push('post-reasoning');\n }\n\n if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {\n keyList.push(this.invokedToolIds.size + '');\n }\n\n return keyList;\n }\n\n checkKeyList(keyList: (string | number | undefined)[]): boolean {\n return keyList.some((key) => key === undefined);\n }\n\n /* Misc.*/\n\n getRunMessages(): BaseMessage[] | undefined {\n return this.messages.slice(this.startIndex);\n }\n\n getContentParts(): t.MessageContentComplex[] | undefined {\n return convertMessagesToContent(this.messages.slice(this.startIndex));\n }\n\n /**\n * Get all run steps, optionally filtered by agent ID\n */\n getRunSteps(agentId?: string): t.RunStep[] {\n if (agentId == null || agentId === '') {\n return [...this.contentData];\n }\n return this.contentData.filter((step) => step.agentId === agentId);\n }\n\n /**\n * Get run steps grouped by agent ID\n */\n getRunStepsByAgent(): Map<string, t.RunStep[]> {\n const stepsByAgent = new Map<string, t.RunStep[]>();\n\n for (const step of this.contentData) {\n if (step.agentId == null || step.agentId === '') continue;\n\n const steps = stepsByAgent.get(step.agentId) ?? [];\n steps.push(step);\n stepsByAgent.set(step.agentId, steps);\n }\n\n return stepsByAgent;\n }\n\n /**\n * Get agent IDs that participated in this run\n */\n getActiveAgentIds(): string[] {\n const agentIds = new Set<string>();\n for (const step of this.contentData) {\n if (step.agentId != null && step.agentId !== '') {\n agentIds.add(step.agentId);\n }\n }\n return Array.from(agentIds);\n }\n\n /**\n * Maps contentPart indices to agent IDs for post-run analysis\n * Returns a map where key is the contentPart index and value is the agentId\n */\n getContentPartAgentMap(): Map<number, string> {\n const contentPartAgentMap = new Map<number, string>();\n\n for (const step of this.contentData) {\n if (\n step.agentId != null &&\n step.agentId !== '' &&\n Number.isFinite(step.index)\n ) {\n contentPartAgentMap.set(step.index, step.agentId);\n }\n }\n\n return contentPartAgentMap;\n }\n\n /**\n * Get the context breakdown from the primary agent for admin token tracking.\n * Returns detailed token counts for instructions, tools, etc.\n */\n getContextBreakdown(): {\n instructions: number;\n artifacts: number;\n tools: number;\n toolCount: number;\n toolContext: number;\n total: number;\n toolsDetail: Array<{ name: string; tokens: number }>;\n toolContextDetail: Array<{ name: string; tokens: number }>;\n } | null {\n const primaryContext = this.agentContexts.get(this.defaultAgentId);\n if (!primaryContext) {\n return null;\n }\n return primaryContext.getContextBreakdown();\n }\n\n /**\n * Get the latest context analytics from the graph.\n * Returns metrics like utilization %, TOON stats, message breakdown.\n */\n getContextAnalytics(): ContextAnalytics | null {\n return this.lastContextAnalytics ?? null;\n }\n\n /** Store the latest context analytics for retrieval after run */\n private lastContextAnalytics: ContextAnalytics | null = null;\n\n /* Graph */\n\n createSystemRunnable({\n provider,\n clientOptions,\n instructions,\n additional_instructions,\n }: {\n provider?: Providers;\n clientOptions?: t.ClientOptions;\n instructions?: string;\n additional_instructions?: string;\n }): t.SystemRunnable | undefined {\n let finalInstructions: string | BaseMessageFields | undefined =\n instructions;\n if (additional_instructions != null && additional_instructions !== '') {\n finalInstructions =\n finalInstructions != null && finalInstructions\n ? `${finalInstructions}\\n\\n${additional_instructions}`\n : additional_instructions;\n }\n\n if (\n finalInstructions != null &&\n finalInstructions &&\n provider === Providers.ANTHROPIC &&\n ((\n (clientOptions as t.AnthropicClientOptions).clientOptions\n ?.defaultHeaders as Record<string, string> | undefined\n )?.['anthropic-beta']?.includes('prompt-caching') ??\n false)\n ) {\n finalInstructions = {\n content: [\n {\n type: 'text',\n text: instructions,\n cache_control: { type: 'ephemeral' },\n },\n ],\n };\n }\n\n if (finalInstructions != null && finalInstructions !== '') {\n const systemMessage = new SystemMessage(finalInstructions);\n return RunnableLambda.from((messages: BaseMessage[]) => {\n return [systemMessage, ...messages];\n }).withConfig({ runName: 'prompt' });\n }\n }\n\n initializeTools({\n currentTools,\n currentToolMap,\n agentContext,\n }: {\n currentTools?: t.GraphTools;\n currentToolMap?: t.ToolMap;\n agentContext?: AgentContext;\n }): CustomToolNode<t.BaseGraphState> | ToolNode<t.BaseGraphState> {\n return new CustomToolNode<t.BaseGraphState>({\n tools: (currentTools as t.GenericTool[] | undefined) ?? [],\n toolMap: currentToolMap,\n toolCallStepIds: this.toolCallStepIds,\n errorHandler: (data, metadata) =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n toolRegistry: agentContext?.toolRegistry,\n });\n }\n\n initializeModel({\n provider,\n tools,\n clientOptions,\n }: {\n provider: Providers;\n tools?: t.GraphTools;\n clientOptions?: t.ClientOptions;\n }): Runnable {\n const ChatModelClass = getChatModelClass(provider);\n const model = new ChatModelClass(clientOptions ?? {});\n\n if (\n isOpenAILike(provider) &&\n (model instanceof ChatOpenAI || model instanceof AzureChatOpenAI)\n ) {\n model.temperature = (clientOptions as t.OpenAIClientOptions)\n .temperature as number;\n model.topP = (clientOptions as t.OpenAIClientOptions).topP as number;\n model.frequencyPenalty = (clientOptions as t.OpenAIClientOptions)\n .frequencyPenalty as number;\n model.presencePenalty = (clientOptions as t.OpenAIClientOptions)\n .presencePenalty as number;\n model.n = (clientOptions as t.OpenAIClientOptions).n as number;\n } else if (\n provider === Providers.VERTEXAI &&\n model instanceof ChatVertexAI\n ) {\n model.temperature = (clientOptions as t.VertexAIClientOptions)\n .temperature as number;\n model.topP = (clientOptions as t.VertexAIClientOptions).topP as number;\n model.topK = (clientOptions as t.VertexAIClientOptions).topK as number;\n model.topLogprobs = (clientOptions as t.VertexAIClientOptions)\n .topLogprobs as number;\n model.frequencyPenalty = (clientOptions as t.VertexAIClientOptions)\n .frequencyPenalty as number;\n model.presencePenalty = (clientOptions as t.VertexAIClientOptions)\n .presencePenalty as number;\n model.maxOutputTokens = (clientOptions as t.VertexAIClientOptions)\n .maxOutputTokens as number;\n }\n\n if (!tools || tools.length === 0) {\n return model as unknown as Runnable;\n }\n\n return (model as t.ModelWithTools).bindTools(tools);\n }\n\n overrideTestModel(\n responses: string[],\n sleep?: number,\n toolCalls?: ToolCall[]\n ): void {\n this.overrideModel = createFakeStreamingLLM({\n responses,\n sleep,\n toolCalls,\n });\n }\n\n getNewModel({\n provider,\n clientOptions,\n }: {\n provider: Providers;\n clientOptions?: t.ClientOptions;\n }): t.ChatModelInstance {\n const ChatModelClass = getChatModelClass(provider);\n return new ChatModelClass(clientOptions ?? {});\n }\n\n getUsageMetadata(\n finalMessage?: BaseMessage\n ): Partial<UsageMetadata> | undefined {\n if (\n finalMessage &&\n 'usage_metadata' in finalMessage &&\n finalMessage.usage_metadata != null\n ) {\n return finalMessage.usage_metadata as Partial<UsageMetadata>;\n }\n }\n\n /** Execute model invocation with streaming support */\n private async attemptInvoke(\n {\n currentModel,\n finalMessages,\n provider,\n tools,\n }: {\n currentModel?: t.ChatModel;\n finalMessages: BaseMessage[];\n provider: Providers;\n tools?: t.GraphTools;\n },\n config?: RunnableConfig\n ): Promise<Partial<t.BaseGraphState>> {\n const model = this.overrideModel ?? currentModel;\n if (!model) {\n throw new Error('No model found');\n }\n\n if ((tools?.length ?? 0) > 0 && manualToolStreamProviders.has(provider)) {\n if (!model.stream) {\n throw new Error('Model does not support stream');\n }\n const stream = await model.stream(finalMessages, config);\n let finalChunk: AIMessageChunk | undefined;\n for await (const chunk of stream) {\n await safeDispatchCustomEvent(\n GraphEvents.CHAT_MODEL_STREAM,\n { chunk, emitted: true },\n config\n );\n finalChunk = finalChunk ? concat(finalChunk, chunk) : chunk;\n }\n finalChunk = modifyDeltaProperties(provider, finalChunk);\n return { messages: [finalChunk as AIMessageChunk] };\n } else {\n const finalMessage = await model.invoke(finalMessages, config);\n if ((finalMessage.tool_calls?.length ?? 0) > 0) {\n finalMessage.tool_calls = finalMessage.tool_calls?.filter(\n (tool_call: ToolCall) => !!tool_call.name\n );\n }\n return { messages: [finalMessage] };\n }\n }\n\n cleanupSignalListener(currentModel?: t.ChatModel): void {\n if (!this.signal) {\n return;\n }\n const model = this.overrideModel ?? currentModel;\n if (!model) {\n return;\n }\n const client = (model as ChatOpenAI | undefined)?.exposedClient;\n if (!client?.abortHandler) {\n return;\n }\n this.signal.removeEventListener('abort', client.abortHandler);\n client.abortHandler = undefined;\n }\n\n createCallModel(agentId = 'default') {\n return async (\n state: t.BaseGraphState,\n config?: RunnableConfig\n ): Promise<Partial<t.BaseGraphState>> => {\n /**\n * Get agent context - it must exist by this point\n */\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n if (!config) {\n throw new Error('No config provided');\n }\n\n let { messages } = state;\n\n // CACHE OPTIMIZATION: Inject dynamicContext as a HumanMessage at the start of conversation\n // This keeps the system message static (cacheable) while providing dynamic context\n // (timestamps, user info, tool context) as conversation content instead.\n // Only inject on the first turn when messages don't already have the context marker.\n if (\n agentContext.dynamicContext &&\n messages.length > 0 &&\n !messages.some(\n (m) =>\n m instanceof HumanMessage &&\n typeof m.content === 'string' &&\n m.content.startsWith('[SESSION_CONTEXT]')\n )\n ) {\n const dynamicContextMessage = new HumanMessage({\n content: `[SESSION_CONTEXT]\\n${agentContext.dynamicContext}`,\n });\n const ackMessage = new AIMessageChunk({\n content:\n 'Understood. I have noted the session context including the current date/time (CST) and will apply it appropriately.',\n });\n messages = [dynamicContextMessage, ackMessage, ...messages];\n }\n\n // Extract tool discoveries from current turn only (similar to formatArtifactPayload pattern)\n const discoveredNames = extractToolDiscoveries(messages);\n if (discoveredNames.length > 0) {\n agentContext.markToolsAsDiscovered(discoveredNames);\n }\n\n const toolsForBinding = agentContext.getToolsForBinding();\n let model =\n this.overrideModel ??\n this.initializeModel({\n tools: toolsForBinding,\n provider: agentContext.provider,\n clientOptions: agentContext.clientOptions,\n });\n\n if (agentContext.systemRunnable) {\n model = agentContext.systemRunnable.pipe(model as Runnable);\n }\n\n if (agentContext.tokenCalculationPromise) {\n await agentContext.tokenCalculationPromise;\n }\n if (!config.signal) {\n config.signal = this.signal;\n }\n this.config = config;\n\n let messagesToUse = messages;\n\n if (\n !agentContext.pruneMessages &&\n agentContext.tokenCounter &&\n agentContext.maxContextTokens != null &&\n agentContext.indexTokenCountMap[0] != null\n ) {\n const isAnthropicWithThinking =\n (agentContext.provider === Providers.ANTHROPIC &&\n (agentContext.clientOptions as t.AnthropicClientOptions).thinking !=\n null) ||\n (agentContext.provider === Providers.BEDROCK &&\n (agentContext.clientOptions as t.BedrockAnthropicInput)\n .additionalModelRequestFields?.['thinking'] != null) ||\n (agentContext.provider === Providers.OPENAI &&\n (\n (agentContext.clientOptions as t.OpenAIClientOptions).modelKwargs\n ?.thinking as t.AnthropicClientOptions['thinking']\n )?.type === 'enabled');\n\n agentContext.pruneMessages = createPruneMessages({\n startIndex: this.startIndex,\n provider: agentContext.provider,\n tokenCounter: agentContext.tokenCounter,\n maxTokens: agentContext.maxContextTokens,\n thinkingEnabled: isAnthropicWithThinking,\n indexTokenCountMap: agentContext.indexTokenCountMap,\n });\n }\n\n if (agentContext.pruneMessages) {\n const { context, indexTokenCountMap } = agentContext.pruneMessages({\n messages,\n usageMetadata: agentContext.currentUsage,\n // startOnMessageType: 'human',\n });\n agentContext.indexTokenCountMap = indexTokenCountMap;\n messagesToUse = context;\n }\n\n let finalMessages = messagesToUse;\n if (agentContext.useLegacyContent) {\n finalMessages = formatContentStrings(finalMessages);\n }\n\n const lastMessageX =\n finalMessages.length >= 2\n ? finalMessages[finalMessages.length - 2]\n : null;\n const lastMessageY =\n finalMessages.length >= 1\n ? finalMessages[finalMessages.length - 1]\n : null;\n\n if (\n agentContext.provider === Providers.BEDROCK &&\n lastMessageX instanceof AIMessageChunk &&\n lastMessageY?.getType() === MessageTypes.TOOL &&\n typeof lastMessageX.content === 'string'\n ) {\n finalMessages[finalMessages.length - 2].content = '';\n }\n\n // Use getType() instead of instanceof to avoid module mismatch issues\n const isLatestToolMessage = lastMessageY?.getType() === MessageTypes.TOOL;\n\n if (\n isLatestToolMessage &&\n agentContext.provider === Providers.ANTHROPIC\n ) {\n formatAnthropicArtifactContent(finalMessages);\n } else if (\n isLatestToolMessage &&\n ((isOpenAILike(agentContext.provider) &&\n agentContext.provider !== Providers.DEEPSEEK) ||\n isGoogleLike(agentContext.provider))\n ) {\n formatArtifactPayload(finalMessages);\n }\n\n /**\n * Handle edge case: when switching from a non-thinking agent to a thinking-enabled agent,\n * convert AI messages with tool calls to HumanMessages to avoid thinking block requirements.\n * This is required by Anthropic/Bedrock when thinking is enabled.\n *\n * IMPORTANT: This MUST happen BEFORE cache control is applied.\n * If we add cachePoint to an AI message first, then convert that AI message to a HumanMessage,\n * the cachePoint is lost. By converting first, we ensure cache control is applied to the\n * final message structure that will be sent to the API.\n */\n const isAnthropicWithThinking =\n (agentContext.provider === Providers.ANTHROPIC &&\n (agentContext.clientOptions as t.AnthropicClientOptions).thinking !=\n null) ||\n (agentContext.provider === Providers.BEDROCK &&\n (agentContext.clientOptions as t.BedrockAnthropicInput)\n .additionalModelRequestFields?.['thinking'] != null);\n\n if (isAnthropicWithThinking) {\n finalMessages = ensureThinkingBlockInMessages(\n finalMessages,\n agentContext.provider\n );\n }\n\n // Apply cache control AFTER thinking block handling to ensure cachePoints aren't lost\n // when AI messages are converted to HumanMessages\n if (agentContext.provider === Providers.ANTHROPIC) {\n const anthropicOptions = agentContext.clientOptions as\n | t.AnthropicClientOptions\n | undefined;\n const defaultHeaders = anthropicOptions?.clientOptions\n ?.defaultHeaders as Record<string, string> | undefined;\n const anthropicBeta = defaultHeaders?.['anthropic-beta'];\n\n if (\n typeof anthropicBeta === 'string' &&\n anthropicBeta.includes('prompt-caching')\n ) {\n finalMessages = addCacheControl<BaseMessage>(finalMessages);\n }\n } else if (agentContext.provider === Providers.BEDROCK) {\n const bedrockOptions = agentContext.clientOptions as\n | t.BedrockAnthropicClientOptions\n | undefined;\n // Both Claude and Nova models support cachePoint in system and messages\n // (Llama, Titan, and other models do NOT support cachePoint)\n const modelId = bedrockOptions?.model?.toLowerCase() ?? '';\n const supportsCaching =\n modelId.includes('claude') ||\n modelId.includes('anthropic') ||\n modelId.includes('nova');\n if (bedrockOptions?.promptCache === true && supportsCaching) {\n finalMessages = addBedrockCacheControl<BaseMessage>(finalMessages);\n }\n }\n\n if (\n agentContext.lastStreamCall != null &&\n agentContext.streamBuffer != null\n ) {\n const timeSinceLastCall = Date.now() - agentContext.lastStreamCall;\n if (timeSinceLastCall < agentContext.streamBuffer) {\n const timeToWait =\n Math.ceil((agentContext.streamBuffer - timeSinceLastCall) / 1000) *\n 1000;\n await sleep(timeToWait);\n }\n }\n\n agentContext.lastStreamCall = Date.now();\n\n let result: Partial<t.BaseGraphState> | undefined;\n const fallbacks =\n (agentContext.clientOptions as t.LLMConfig | undefined)?.fallbacks ??\n [];\n\n if (finalMessages.length === 0) {\n throw new Error(\n JSON.stringify({\n type: 'empty_messages',\n info: 'Message pruning removed all messages as none fit in the context window. Please increase the context window size or make your message shorter.',\n })\n );\n }\n\n // Get model info for analytics\n const bedrockOpts = agentContext.clientOptions as\n | t.BedrockAnthropicClientOptions\n | undefined;\n const modelId =\n bedrockOpts?.model ||\n (agentContext.clientOptions as t.AnthropicClientOptions | undefined)\n ?.modelName;\n const thinkingConfig =\n bedrockOpts?.additionalModelRequestFields?.['thinking'] ||\n (agentContext.clientOptions as t.AnthropicClientOptions | undefined)\n ?.thinking;\n\n // Build and emit context analytics for traces\n const contextAnalytics = buildContextAnalytics(finalMessages, {\n tokenCounter: agentContext.tokenCounter,\n maxContextTokens: agentContext.maxContextTokens,\n instructionTokens: agentContext.instructionTokens,\n indexTokenCountMap: agentContext.indexTokenCountMap,\n });\n\n // Store for retrieval via getContextAnalytics() after run completes\n this.lastContextAnalytics = contextAnalytics;\n\n await safeDispatchCustomEvent(\n GraphEvents.ON_CONTEXT_ANALYTICS,\n {\n provider: agentContext.provider,\n model: modelId,\n thinkingEnabled: thinkingConfig != null,\n cacheEnabled: bedrockOpts?.promptCache === true,\n analytics: contextAnalytics,\n },\n config\n );\n\n try {\n result = await this.attemptInvoke(\n {\n currentModel: model,\n finalMessages,\n provider: agentContext.provider,\n tools: agentContext.tools,\n },\n config\n );\n } catch (primaryError) {\n // Check if this is a \"input too long\" error from Bedrock/Anthropic\n const errorMessage =\n (primaryError as Error).message.toLowerCase() ?? '';\n const isInputTooLongError =\n errorMessage.includes('too long') ||\n errorMessage.includes('input is too long') ||\n errorMessage.includes('context length') ||\n errorMessage.includes('maximum context') ||\n errorMessage.includes('validationexception') ||\n errorMessage.includes('prompt is too long');\n\n // Log when we detect the error\n if (isInputTooLongError) {\n console.warn(\n '[Graph] Detected input too long error:',\n errorMessage.substring(0, 200)\n );\n console.warn('[Graph] Checking emergency pruning conditions:', {\n hasPruneMessages: !!agentContext.pruneMessages,\n hasTokenCounter: !!agentContext.tokenCounter,\n maxContextTokens: agentContext.maxContextTokens,\n indexTokenMapKeys: Object.keys(agentContext.indexTokenCountMap)\n .length,\n });\n }\n\n // If input too long and we have pruning capability OR tokenCounter, retry with progressively more aggressive pruning\n // Note: We can create emergency pruneMessages dynamically if we have tokenCounter and maxContextTokens\n const canPrune =\n agentContext.tokenCounter && agentContext.maxContextTokens;\n if (isInputTooLongError && canPrune) {\n // Progressive reduction: 50% -> 25% -> 10% of original context\n const reductionLevels = [0.5, 0.25, 0.1];\n\n for (const reductionFactor of reductionLevels) {\n if (result) break; // Exit if we got a result\n\n const reducedMaxTokens = Math.floor(\n agentContext.maxContextTokens! * reductionFactor\n );\n console.warn(\n `[Graph] Input too long. Retrying with ${reductionFactor * 100}% context (${reducedMaxTokens} tokens)...`\n );\n\n // Build fresh indexTokenCountMap if missing/incomplete\n // This is needed when messages were dynamically added without updating the token map\n let tokenMapForPruning = agentContext.indexTokenCountMap;\n if (Object.keys(tokenMapForPruning).length < messages.length) {\n console.warn(\n '[Graph] Building fresh token count map for emergency pruning...'\n );\n tokenMapForPruning = {};\n for (let i = 0; i < messages.length; i++) {\n tokenMapForPruning[i] = agentContext.tokenCounter!(messages[i]);\n }\n }\n\n const emergencyPrune = createPruneMessages({\n startIndex: this.startIndex,\n provider: agentContext.provider,\n tokenCounter: agentContext.tokenCounter!,\n maxTokens: reducedMaxTokens,\n thinkingEnabled: false, // Disable thinking for emergency prune\n indexTokenCountMap: tokenMapForPruning,\n });\n\n const { context: reducedMessages } = emergencyPrune({\n messages,\n usageMetadata: agentContext.currentUsage,\n });\n\n // Skip if we can't fit any messages\n if (reducedMessages.length === 0) {\n console.warn(\n `[Graph] Cannot fit any messages at ${reductionFactor * 100}% reduction, trying next level...`\n );\n continue;\n }\n\n // Calculate how many messages were pruned and estimate context timeframe\n const prunedCount = finalMessages.length - reducedMessages.length;\n const remainingCount = reducedMessages.length;\n const estimatedContextDescription =\n this.getContextTimeframeDescription(remainingCount);\n\n // Inject a personalized context message to inform the agent about pruning\n const pruneNoticeMessage = new HumanMessage({\n content: `[CONTEXT NOTICE]\nOur conversation has grown quite long, so I've focused on ${estimatedContextDescription} of our chat (${remainingCount} recent messages). ${prunedCount} earlier messages are no longer in my immediate memory.\n\nIf I seem to be missing something we discussed earlier, just give me a quick reminder and I'll pick right back up! I'm still fully engaged and ready to help with whatever you need.`,\n });\n\n // Insert the notice after the system message (if any) but before conversation\n const hasSystemMessage = reducedMessages[0]?.getType() === 'system';\n const insertIndex = hasSystemMessage ? 1 : 0;\n\n // Create new array with the pruning notice\n const messagesWithNotice = [\n ...reducedMessages.slice(0, insertIndex),\n pruneNoticeMessage,\n ...reducedMessages.slice(insertIndex),\n ];\n\n let retryMessages = agentContext.useLegacyContent\n ? formatContentStrings(messagesWithNotice)\n : messagesWithNotice;\n\n // Apply thinking block handling first (before cache control)\n // This ensures AI+Tool sequences are converted to HumanMessages\n // before we add cache points that could be lost in the conversion\n if (isAnthropicWithThinking) {\n retryMessages = ensureThinkingBlockInMessages(\n retryMessages,\n agentContext.provider\n );\n }\n\n // Apply Bedrock cache control if needed (after thinking block handling)\n if (agentContext.provider === Providers.BEDROCK) {\n const bedrockOptions = agentContext.clientOptions as\n | t.BedrockAnthropicClientOptions\n | undefined;\n const modelId = bedrockOptions?.model?.toLowerCase() ?? '';\n const supportsCaching =\n modelId.includes('claude') ||\n modelId.includes('anthropic') ||\n modelId.includes('nova');\n if (bedrockOptions?.promptCache === true && supportsCaching) {\n retryMessages =\n addBedrockCacheControl<BaseMessage>(retryMessages);\n }\n }\n\n try {\n result = await this.attemptInvoke(\n {\n currentModel: model,\n finalMessages: retryMessages,\n provider: agentContext.provider,\n tools: agentContext.tools,\n },\n config\n );\n // Success with reduced context\n console.info(\n `[Graph] ✅ Retry successful at ${reductionFactor * 100}% with ${reducedMessages.length} messages (reduced from ${finalMessages.length})`\n );\n } catch (retryError) {\n const retryErrorMsg =\n (retryError as Error).message.toLowerCase() ?? '';\n const stillTooLong =\n retryErrorMsg.includes('too long') ||\n retryErrorMsg.includes('context length') ||\n retryErrorMsg.includes('validationexception');\n\n if (stillTooLong && reductionFactor > 0.1) {\n console.warn(\n `[Graph] Still too long at ${reductionFactor * 100}%, trying more aggressive pruning...`\n );\n } else {\n console.error(\n `[Graph] Retry at ${reductionFactor * 100}% failed:`,\n (retryError as Error).message\n );\n }\n }\n }\n }\n\n // If we got a result from retry, skip fallbacks\n if (result) {\n // result already set from retry\n } else {\n let lastError: unknown = primaryError;\n for (const fb of fallbacks) {\n try {\n let model = this.getNewModel({\n provider: fb.provider,\n clientOptions: fb.clientOptions,\n });\n const bindableTools = agentContext.tools;\n model = (\n !bindableTools || bindableTools.length === 0\n ? model\n : model.bindTools(bindableTools)\n ) as t.ChatModelInstance;\n result = await this.attemptInvoke(\n {\n currentModel: model,\n finalMessages,\n provider: fb.provider,\n tools: agentContext.tools,\n },\n config\n );\n lastError = undefined;\n break;\n } catch (e) {\n lastError = e;\n continue;\n }\n }\n if (lastError !== undefined) {\n throw lastError;\n }\n }\n }\n\n if (!result) {\n throw new Error('No result after model invocation');\n }\n agentContext.currentUsage = this.getUsageMetadata(result.messages?.[0]);\n this.cleanupSignalListener();\n return result;\n };\n }\n\n createAgentNode(agentId: string): t.CompiledAgentWorfklow {\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n const agentNode = `${AGENT}${agentId}` as const;\n const toolNode = `${TOOLS}${agentId}` as const;\n\n const routeMessage = (\n state: t.BaseGraphState,\n config?: RunnableConfig\n ): string => {\n this.config = config;\n return toolsCondition(state, toolNode, this.invokedToolIds);\n };\n\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: messagesStateReducer,\n default: () => [],\n }),\n });\n\n const workflow = new StateGraph(StateAnnotation)\n .addNode(agentNode, this.createCallModel(agentId))\n .addNode(\n toolNode,\n this.initializeTools({\n currentTools: agentContext.tools,\n currentToolMap: agentContext.toolMap,\n agentContext,\n })\n )\n .addEdge(START, agentNode)\n .addConditionalEdges(agentNode, routeMessage)\n .addEdge(toolNode, agentContext.toolEnd ? END : agentNode);\n\n // Cast to unknown to avoid tight coupling to external types; options are opt-in\n return workflow.compile(this.compileOptions as unknown as never);\n }\n\n createWorkflow(): t.CompiledStateWorkflow {\n /** Use the default (first) agent for now */\n const agentNode = this.createAgentNode(this.defaultAgentId);\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: (a, b) => {\n if (!a.length) {\n this.startIndex = a.length + b.length;\n }\n const result = messagesStateReducer(a, b);\n this.messages = result;\n return result;\n },\n default: () => [],\n }),\n });\n const workflow = new StateGraph(StateAnnotation)\n .addNode(this.defaultAgentId, agentNode, { ends: [END] })\n .addEdge(START, this.defaultAgentId)\n .compile();\n\n return workflow;\n }\n\n /* Dispatchers */\n\n /**\n * Dispatches a run step to the client, returns the step ID\n */\n async dispatchRunStep(\n stepKey: string,\n stepDetails: t.StepDetails,\n metadata?: Record<string, unknown>\n ): Promise<string> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n const [stepId, stepIndex] = this.generateStepId(stepKey);\n if (stepDetails.type === StepTypes.TOOL_CALLS && stepDetails.tool_calls) {\n for (const tool_call of stepDetails.tool_calls) {\n const toolCallId = tool_call.id ?? '';\n if (!toolCallId || this.toolCallStepIds.has(toolCallId)) {\n continue;\n }\n this.toolCallStepIds.set(toolCallId, stepId);\n }\n }\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: stepDetails.type,\n index: this.contentData.length,\n stepDetails,\n usage: null,\n };\n\n const runId = this.runId ?? '';\n if (runId) {\n runStep.runId = runId;\n }\n\n /**\n * Extract and store agentId from metadata\n */\n if (metadata) {\n try {\n const agentContext = this.getAgentContext(metadata);\n if (agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\n }\n } catch (_e) {\n /** If we can't get agent context, that's okay - agentId remains undefined */\n }\n }\n\n this.contentData.push(runStep);\n this.contentIndexMap.set(stepId, runStep.index);\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP,\n runStep,\n this.config\n );\n return stepId;\n }\n\n async handleToolCallCompleted(\n data: t.ToolEndData,\n metadata?: Record<string, unknown>,\n omitOutput?: boolean\n ): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n if (!data.output) {\n return;\n }\n\n const { input, output: _output } = data;\n if ((_output as Command | undefined)?.lg_name === 'Command') {\n return;\n }\n const output = _output as ToolMessage;\n const { tool_call_id } = output;\n const stepId = this.toolCallStepIds.get(tool_call_id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${tool_call_id}`);\n }\n\n const runStep = this.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const dispatchedOutput =\n typeof output.content === 'string'\n ? output.content\n : JSON.stringify(output.content);\n\n const args = typeof input === 'string' ? input : input.input;\n const tool_call = {\n args: typeof args === 'string' ? args : JSON.stringify(args),\n name: output.name ?? '',\n id: output.tool_call_id,\n output: omitOutput === true ? '' : dispatchedOutput,\n progress: 1,\n };\n\n await this.handlerRegistry\n ?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)\n ?.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: runStep.index,\n type: 'tool_call',\n tool_call,\n } as t.ToolCompleteEvent,\n },\n metadata,\n this\n );\n }\n /**\n * Static version of handleToolCallError to avoid creating strong references\n * that prevent garbage collection\n */\n static async handleToolCallErrorStatic(\n graph: StandardGraph,\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n if (!graph.config) {\n throw new Error('No config provided');\n }\n\n if (!data.id) {\n console.warn('No Tool ID provided for Tool Error');\n return;\n }\n\n const stepId = graph.toolCallStepIds.get(data.id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${data.id}`);\n }\n\n const { name, input: args, error } = data;\n\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const tool_call: t.ProcessedToolCall = {\n id: data.id,\n name: name || '',\n args: typeof args === 'string' ? args : JSON.stringify(args),\n output: `Error processing tool${error?.message != null ? `: ${error.message}` : ''}`,\n progress: 1,\n };\n\n await graph.handlerRegistry\n ?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)\n ?.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: runStep.index,\n type: 'tool_call',\n tool_call,\n } as t.ToolCompleteEvent,\n },\n metadata,\n graph\n );\n }\n\n /**\n * Instance method that delegates to the static method\n * Kept for backward compatibility\n */\n async handleToolCallError(\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n await StandardGraph.handleToolCallErrorStatic(this, data, metadata);\n }\n\n async dispatchRunStepDelta(\n id: string,\n delta: t.ToolCallDelta\n ): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n } else if (!id) {\n throw new Error('No step ID found');\n }\n const runStepDelta: t.RunStepDeltaEvent = {\n id,\n delta,\n };\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_DELTA,\n runStepDelta,\n this.config\n );\n }\n\n async dispatchMessageDelta(id: string, delta: t.MessageDelta): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const messageDelta: t.MessageDeltaEvent = {\n id,\n delta,\n };\n await safeDispatchCustomEvent(\n GraphEvents.ON_MESSAGE_DELTA,\n messageDelta,\n this.config\n );\n }\n\n dispatchReasoningDelta = async (\n stepId: string,\n delta: t.ReasoningDelta\n ): Promise<void> => {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n await safeDispatchCustomEvent(\n GraphEvents.ON_REASONING_DELTA,\n reasoningDelta,\n this.config\n );\n };\n}\n"],"names":["CustomToolNode"],"mappings":"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"}
1
+ {"version":3,"file":"Graph.mjs","sources":["../../../src/graphs/Graph.ts"],"sourcesContent":["/* eslint-disable no-console */\n// src/graphs/Graph.ts\nimport { nanoid } from 'nanoid';\nimport { concat } from '@langchain/core/utils/stream';\nimport { ToolNode } from '@langchain/langgraph/prebuilt';\nimport { ChatVertexAI } from '@langchain/google-vertexai';\nimport {\n START,\n END,\n Command,\n StateGraph,\n Annotation,\n messagesStateReducer,\n} from '@langchain/langgraph';\nimport {\n Runnable,\n RunnableConfig,\n RunnableLambda,\n} from '@langchain/core/runnables';\nimport {\n ToolMessage,\n SystemMessage,\n AIMessageChunk,\n HumanMessage,\n} from '@langchain/core/messages';\nimport type {\n BaseMessageFields,\n UsageMetadata,\n BaseMessage,\n} from '@langchain/core/messages';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type * as t from '@/types';\nimport {\n GraphNodeKeys,\n ContentTypes,\n GraphEvents,\n Providers,\n StepTypes,\n MessageTypes,\n} from '@/common';\nimport {\n formatAnthropicArtifactContent,\n ensureThinkingBlockInMessages,\n convertMessagesToContent,\n addBedrockCacheControl,\n modifyDeltaProperties,\n formatArtifactPayload,\n formatContentStrings,\n createPruneMessages,\n addCacheControl,\n extractToolDiscoveries,\n} from '@/messages';\nimport {\n resetIfNotEmpty,\n isOpenAILike,\n isGoogleLike,\n joinKeys,\n sleep,\n} from '@/utils';\nimport {\n buildContextAnalytics,\n type ContextAnalytics,\n} from '@/utils/contextAnalytics';\nimport { getChatModelClass, manualToolStreamProviders } from '@/llm/providers';\nimport { ToolNode as CustomToolNode, toolsCondition } from '@/tools/ToolNode';\nimport { ChatOpenAI, AzureChatOpenAI } from '@/llm/openai';\nimport { safeDispatchCustomEvent } from '@/utils/events';\nimport { AgentContext } from '@/agents/AgentContext';\nimport { createFakeStreamingLLM } from '@/llm/fake';\nimport { HandlerRegistry } from '@/events';\n\nconst { AGENT, TOOLS } = GraphNodeKeys;\n\nexport abstract class Graph<\n T extends t.BaseGraphState = t.BaseGraphState,\n _TNodeName extends string = string,\n> {\n abstract resetValues(): void;\n abstract initializeTools({\n currentTools,\n currentToolMap,\n }: {\n currentTools?: t.GraphTools;\n currentToolMap?: t.ToolMap;\n }): CustomToolNode<T> | ToolNode<T>;\n abstract initializeModel({\n currentModel,\n tools,\n clientOptions,\n }: {\n currentModel?: t.ChatModel;\n tools?: t.GraphTools;\n clientOptions?: t.ClientOptions;\n }): Runnable;\n abstract getRunMessages(): BaseMessage[] | undefined;\n abstract getContentParts(): t.MessageContentComplex[] | undefined;\n abstract generateStepId(stepKey: string): [string, number];\n abstract getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[];\n abstract getStepKey(metadata: Record<string, unknown> | undefined): string;\n abstract checkKeyList(keyList: (string | number | undefined)[]): boolean;\n abstract getStepIdByKey(stepKey: string, index?: number): string;\n abstract getRunStep(stepId: string): t.RunStep | undefined;\n abstract dispatchRunStep(\n stepKey: string,\n stepDetails: t.StepDetails,\n metadata?: Record<string, unknown>\n ): Promise<string>;\n abstract dispatchRunStepDelta(\n id: string,\n delta: t.ToolCallDelta\n ): Promise<void>;\n abstract dispatchMessageDelta(\n id: string,\n delta: t.MessageDelta\n ): Promise<void>;\n abstract dispatchReasoningDelta(\n stepId: string,\n delta: t.ReasoningDelta\n ): Promise<void>;\n abstract handleToolCallCompleted(\n data: t.ToolEndData,\n metadata?: Record<string, unknown>,\n omitOutput?: boolean\n ): Promise<void>;\n\n abstract createCallModel(\n agentId?: string,\n currentModel?: t.ChatModel\n ): (state: T, config?: RunnableConfig) => Promise<Partial<T>>;\n messageStepHasToolCalls: Map<string, boolean> = new Map();\n messageIdsByStepKey: Map<string, string> = new Map();\n prelimMessageIdsByStepKey: Map<string, string> = new Map();\n config: RunnableConfig | undefined;\n contentData: t.RunStep[] = [];\n stepKeyIds: Map<string, string[]> = new Map<string, string[]>();\n contentIndexMap: Map<string, number> = new Map();\n toolCallStepIds: Map<string, string> = new Map();\n signal?: AbortSignal;\n /** Set of invoked tool call IDs from non-message run steps completed mid-run, if any */\n invokedToolIds?: Set<string>;\n handlerRegistry: HandlerRegistry | undefined;\n}\n\nexport class StandardGraph extends Graph<t.BaseGraphState, t.GraphNode> {\n overrideModel?: t.ChatModel;\n /** Optional compile options passed into workflow.compile() */\n compileOptions?: t.CompileOptions | undefined;\n messages: BaseMessage[] = [];\n runId: string | undefined;\n startIndex: number = 0;\n signal?: AbortSignal;\n /** Map of agent contexts by agent ID */\n agentContexts: Map<string, AgentContext> = new Map();\n /** Default agent ID to use */\n defaultAgentId: string;\n\n constructor({\n // parent-level graph inputs\n runId,\n signal,\n agents,\n tokenCounter,\n indexTokenCountMap,\n }: t.StandardGraphInput) {\n super();\n this.runId = runId;\n this.signal = signal;\n\n if (agents.length === 0) {\n throw new Error('At least one agent configuration is required');\n }\n\n for (const agentConfig of agents) {\n const agentContext = AgentContext.fromConfig(\n agentConfig,\n tokenCounter,\n indexTokenCountMap\n );\n\n this.agentContexts.set(agentConfig.agentId, agentContext);\n }\n\n this.defaultAgentId = agents[0].agentId;\n }\n\n /* Init */\n\n resetValues(keepContent?: boolean): void {\n this.messages = [];\n this.config = resetIfNotEmpty(this.config, undefined);\n if (keepContent !== true) {\n this.contentData = resetIfNotEmpty(this.contentData, []);\n this.contentIndexMap = resetIfNotEmpty(this.contentIndexMap, new Map());\n }\n this.stepKeyIds = resetIfNotEmpty(this.stepKeyIds, new Map());\n this.toolCallStepIds = resetIfNotEmpty(this.toolCallStepIds, new Map());\n this.messageIdsByStepKey = resetIfNotEmpty(\n this.messageIdsByStepKey,\n new Map()\n );\n this.messageStepHasToolCalls = resetIfNotEmpty(\n this.messageStepHasToolCalls,\n new Map()\n );\n this.prelimMessageIdsByStepKey = resetIfNotEmpty(\n this.prelimMessageIdsByStepKey,\n new Map()\n );\n this.invokedToolIds = resetIfNotEmpty(this.invokedToolIds, undefined);\n for (const context of this.agentContexts.values()) {\n context.reset();\n }\n }\n\n /**\n * Estimates a human-friendly description of the conversation timeframe based on message count.\n * Uses rough heuristics to provide context about how much history is available.\n *\n * @param messageCount - Number of messages in the remaining context\n * @returns A friendly description like \"the last few minutes\", \"the past hour\", etc.\n */\n getContextTimeframeDescription(messageCount: number): string {\n // Rough heuristics based on typical conversation patterns:\n // - Very active chat: ~20-30 messages per hour\n // - Normal chat: ~10-15 messages per hour\n // - Slow/thoughtful chat: ~5-8 messages per hour\n // We use a middle estimate of ~12 messages per hour\n\n if (messageCount <= 5) {\n return 'just the last few exchanges';\n } else if (messageCount <= 15) {\n return 'the last several minutes';\n } else if (messageCount <= 30) {\n return 'roughly the past hour';\n } else if (messageCount <= 60) {\n return 'the past couple of hours';\n } else if (messageCount <= 150) {\n return 'the past few hours';\n } else if (messageCount <= 300) {\n return 'roughly a day\\'s worth';\n } else if (messageCount <= 700) {\n return 'the past few days';\n } else {\n return 'about a week or more';\n }\n }\n\n /* Run Step Processing */\n\n getRunStep(stepId: string): t.RunStep | undefined {\n const index = this.contentIndexMap.get(stepId);\n if (index !== undefined) {\n return this.contentData[index];\n }\n return undefined;\n }\n\n getAgentContext(metadata: Record<string, unknown> | undefined): AgentContext {\n if (!metadata) {\n throw new Error('No metadata provided to retrieve agent context');\n }\n\n const currentNode = metadata.langgraph_node as string;\n if (!currentNode) {\n throw new Error(\n 'No langgraph_node in metadata to retrieve agent context'\n );\n }\n\n let agentId: string | undefined;\n if (currentNode.startsWith(AGENT)) {\n agentId = currentNode.substring(AGENT.length);\n } else if (currentNode.startsWith(TOOLS)) {\n agentId = currentNode.substring(TOOLS.length);\n }\n\n const agentContext = this.agentContexts.get(agentId ?? '');\n if (!agentContext) {\n throw new Error(`No agent context found for agent ID ${agentId}`);\n }\n\n return agentContext;\n }\n\n getStepKey(metadata: Record<string, unknown> | undefined): string {\n if (!metadata) return '';\n\n const keyList = this.getKeyList(metadata);\n if (this.checkKeyList(keyList)) {\n throw new Error('Missing metadata');\n }\n\n return joinKeys(keyList);\n }\n\n getStepIdByKey(stepKey: string, index?: number): string {\n const stepIds = this.stepKeyIds.get(stepKey);\n if (!stepIds) {\n throw new Error(`No step IDs found for stepKey ${stepKey}`);\n }\n\n if (index === undefined) {\n return stepIds[stepIds.length - 1];\n }\n\n return stepIds[index];\n }\n\n generateStepId(stepKey: string): [string, number] {\n const stepIds = this.stepKeyIds.get(stepKey);\n let newStepId: string | undefined;\n let stepIndex = 0;\n if (stepIds) {\n stepIndex = stepIds.length;\n newStepId = `step_${nanoid()}`;\n stepIds.push(newStepId);\n this.stepKeyIds.set(stepKey, stepIds);\n } else {\n newStepId = `step_${nanoid()}`;\n this.stepKeyIds.set(stepKey, [newStepId]);\n }\n\n return [newStepId, stepIndex];\n }\n\n getKeyList(\n metadata: Record<string, unknown> | undefined\n ): (string | number | undefined)[] {\n if (!metadata) return [];\n\n const keyList = [\n metadata.run_id as string,\n metadata.thread_id as string,\n metadata.langgraph_node as string,\n metadata.langgraph_step as number,\n metadata.checkpoint_ns as string,\n ];\n\n const agentContext = this.getAgentContext(metadata);\n if (\n agentContext.currentTokenType === ContentTypes.THINK ||\n agentContext.currentTokenType === 'think_and_text'\n ) {\n keyList.push('reasoning');\n } else if (agentContext.tokenTypeSwitch === 'content') {\n keyList.push('post-reasoning');\n }\n\n if (this.invokedToolIds != null && this.invokedToolIds.size > 0) {\n keyList.push(this.invokedToolIds.size + '');\n }\n\n return keyList;\n }\n\n checkKeyList(keyList: (string | number | undefined)[]): boolean {\n return keyList.some((key) => key === undefined);\n }\n\n /* Misc.*/\n\n getRunMessages(): BaseMessage[] | undefined {\n return this.messages.slice(this.startIndex);\n }\n\n getContentParts(): t.MessageContentComplex[] | undefined {\n return convertMessagesToContent(this.messages.slice(this.startIndex));\n }\n\n /**\n * Get all run steps, optionally filtered by agent ID\n */\n getRunSteps(agentId?: string): t.RunStep[] {\n if (agentId == null || agentId === '') {\n return [...this.contentData];\n }\n return this.contentData.filter((step) => step.agentId === agentId);\n }\n\n /**\n * Get run steps grouped by agent ID\n */\n getRunStepsByAgent(): Map<string, t.RunStep[]> {\n const stepsByAgent = new Map<string, t.RunStep[]>();\n\n for (const step of this.contentData) {\n if (step.agentId == null || step.agentId === '') continue;\n\n const steps = stepsByAgent.get(step.agentId) ?? [];\n steps.push(step);\n stepsByAgent.set(step.agentId, steps);\n }\n\n return stepsByAgent;\n }\n\n /**\n * Get agent IDs that participated in this run\n */\n getActiveAgentIds(): string[] {\n const agentIds = new Set<string>();\n for (const step of this.contentData) {\n if (step.agentId != null && step.agentId !== '') {\n agentIds.add(step.agentId);\n }\n }\n return Array.from(agentIds);\n }\n\n /**\n * Maps contentPart indices to agent IDs for post-run analysis\n * Returns a map where key is the contentPart index and value is the agentId\n */\n getContentPartAgentMap(): Map<number, string> {\n const contentPartAgentMap = new Map<number, string>();\n\n for (const step of this.contentData) {\n if (\n step.agentId != null &&\n step.agentId !== '' &&\n Number.isFinite(step.index)\n ) {\n contentPartAgentMap.set(step.index, step.agentId);\n }\n }\n\n return contentPartAgentMap;\n }\n\n /**\n * Get the context breakdown from the primary agent for admin token tracking.\n * Returns detailed token counts for instructions, tools, etc.\n */\n getContextBreakdown(): {\n instructions: number;\n artifacts: number;\n tools: number;\n toolCount: number;\n toolContext: number;\n total: number;\n toolsDetail: Array<{ name: string; tokens: number }>;\n toolContextDetail: Array<{ name: string; tokens: number }>;\n } | null {\n const primaryContext = this.agentContexts.get(this.defaultAgentId);\n if (!primaryContext) {\n return null;\n }\n return primaryContext.getContextBreakdown();\n }\n\n /**\n * Get the latest context analytics from the graph.\n * Returns metrics like utilization %, TOON stats, message breakdown.\n */\n getContextAnalytics(): ContextAnalytics | null {\n return this.lastContextAnalytics ?? null;\n }\n\n /** Store the latest context analytics for retrieval after run */\n private lastContextAnalytics: ContextAnalytics | null = null;\n\n /* Graph */\n\n createSystemRunnable({\n provider,\n clientOptions,\n instructions,\n additional_instructions,\n }: {\n provider?: Providers;\n clientOptions?: t.ClientOptions;\n instructions?: string;\n additional_instructions?: string;\n }): t.SystemRunnable | undefined {\n let finalInstructions: string | BaseMessageFields | undefined =\n instructions;\n if (additional_instructions != null && additional_instructions !== '') {\n finalInstructions =\n finalInstructions != null && finalInstructions\n ? `${finalInstructions}\\n\\n${additional_instructions}`\n : additional_instructions;\n }\n\n if (\n finalInstructions != null &&\n finalInstructions &&\n provider === Providers.ANTHROPIC &&\n ((\n (clientOptions as t.AnthropicClientOptions).clientOptions\n ?.defaultHeaders as Record<string, string> | undefined\n )?.['anthropic-beta']?.includes('prompt-caching') ??\n false)\n ) {\n finalInstructions = {\n content: [\n {\n type: 'text',\n text: instructions,\n cache_control: { type: 'ephemeral' },\n },\n ],\n };\n }\n\n if (finalInstructions != null && finalInstructions !== '') {\n const systemMessage = new SystemMessage(finalInstructions);\n return RunnableLambda.from((messages: BaseMessage[]) => {\n return [systemMessage, ...messages];\n }).withConfig({ runName: 'prompt' });\n }\n }\n\n initializeTools({\n currentTools,\n currentToolMap,\n agentContext,\n }: {\n currentTools?: t.GraphTools;\n currentToolMap?: t.ToolMap;\n agentContext?: AgentContext;\n }): CustomToolNode<t.BaseGraphState> | ToolNode<t.BaseGraphState> {\n return new CustomToolNode<t.BaseGraphState>({\n tools: (currentTools as t.GenericTool[] | undefined) ?? [],\n toolMap: currentToolMap,\n toolCallStepIds: this.toolCallStepIds,\n errorHandler: (data, metadata) =>\n StandardGraph.handleToolCallErrorStatic(this, data, metadata),\n toolRegistry: agentContext?.toolRegistry,\n });\n }\n\n initializeModel({\n provider,\n tools,\n clientOptions,\n }: {\n provider: Providers;\n tools?: t.GraphTools;\n clientOptions?: t.ClientOptions;\n }): Runnable {\n const ChatModelClass = getChatModelClass(provider);\n const model = new ChatModelClass(clientOptions ?? {});\n\n if (\n isOpenAILike(provider) &&\n (model instanceof ChatOpenAI || model instanceof AzureChatOpenAI)\n ) {\n model.temperature = (clientOptions as t.OpenAIClientOptions)\n .temperature as number;\n model.topP = (clientOptions as t.OpenAIClientOptions).topP as number;\n model.frequencyPenalty = (clientOptions as t.OpenAIClientOptions)\n .frequencyPenalty as number;\n model.presencePenalty = (clientOptions as t.OpenAIClientOptions)\n .presencePenalty as number;\n model.n = (clientOptions as t.OpenAIClientOptions).n as number;\n } else if (\n provider === Providers.VERTEXAI &&\n model instanceof ChatVertexAI\n ) {\n model.temperature = (clientOptions as t.VertexAIClientOptions)\n .temperature as number;\n model.topP = (clientOptions as t.VertexAIClientOptions).topP as number;\n model.topK = (clientOptions as t.VertexAIClientOptions).topK as number;\n model.topLogprobs = (clientOptions as t.VertexAIClientOptions)\n .topLogprobs as number;\n model.frequencyPenalty = (clientOptions as t.VertexAIClientOptions)\n .frequencyPenalty as number;\n model.presencePenalty = (clientOptions as t.VertexAIClientOptions)\n .presencePenalty as number;\n model.maxOutputTokens = (clientOptions as t.VertexAIClientOptions)\n .maxOutputTokens as number;\n }\n\n if (!tools || tools.length === 0) {\n return model as unknown as Runnable;\n }\n\n return (model as t.ModelWithTools).bindTools(tools);\n }\n\n overrideTestModel(\n responses: string[],\n sleep?: number,\n toolCalls?: ToolCall[]\n ): void {\n this.overrideModel = createFakeStreamingLLM({\n responses,\n sleep,\n toolCalls,\n });\n }\n\n getNewModel({\n provider,\n clientOptions,\n }: {\n provider: Providers;\n clientOptions?: t.ClientOptions;\n }): t.ChatModelInstance {\n const ChatModelClass = getChatModelClass(provider);\n return new ChatModelClass(clientOptions ?? {});\n }\n\n getUsageMetadata(\n finalMessage?: BaseMessage\n ): Partial<UsageMetadata> | undefined {\n if (\n finalMessage &&\n 'usage_metadata' in finalMessage &&\n finalMessage.usage_metadata != null\n ) {\n return finalMessage.usage_metadata as Partial<UsageMetadata>;\n }\n }\n\n /** Execute model invocation with streaming support */\n private async attemptInvoke(\n {\n currentModel,\n finalMessages,\n provider,\n tools,\n }: {\n currentModel?: t.ChatModel;\n finalMessages: BaseMessage[];\n provider: Providers;\n tools?: t.GraphTools;\n },\n config?: RunnableConfig\n ): Promise<Partial<t.BaseGraphState>> {\n const model = this.overrideModel ?? currentModel;\n if (!model) {\n throw new Error('No model found');\n }\n\n if ((tools?.length ?? 0) > 0 && manualToolStreamProviders.has(provider)) {\n if (!model.stream) {\n throw new Error('Model does not support stream');\n }\n const stream = await model.stream(finalMessages, config);\n let finalChunk: AIMessageChunk | undefined;\n for await (const chunk of stream) {\n await safeDispatchCustomEvent(\n GraphEvents.CHAT_MODEL_STREAM,\n { chunk, emitted: true },\n config\n );\n finalChunk = finalChunk ? concat(finalChunk, chunk) : chunk;\n }\n finalChunk = modifyDeltaProperties(provider, finalChunk);\n return { messages: [finalChunk as AIMessageChunk] };\n } else {\n const finalMessage = await model.invoke(finalMessages, config);\n if ((finalMessage.tool_calls?.length ?? 0) > 0) {\n finalMessage.tool_calls = finalMessage.tool_calls?.filter(\n (tool_call: ToolCall) => !!tool_call.name\n );\n }\n return { messages: [finalMessage] };\n }\n }\n\n cleanupSignalListener(currentModel?: t.ChatModel): void {\n if (!this.signal) {\n return;\n }\n const model = this.overrideModel ?? currentModel;\n if (!model) {\n return;\n }\n const client = (model as ChatOpenAI | undefined)?.exposedClient;\n if (!client?.abortHandler) {\n return;\n }\n this.signal.removeEventListener('abort', client.abortHandler);\n client.abortHandler = undefined;\n }\n\n createCallModel(agentId = 'default') {\n return async (\n state: t.BaseGraphState,\n config?: RunnableConfig\n ): Promise<Partial<t.BaseGraphState>> => {\n /**\n * Get agent context - it must exist by this point\n */\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n if (!config) {\n throw new Error('No config provided');\n }\n\n let { messages } = state;\n\n // CACHE OPTIMIZATION: Inject dynamicContext as a HumanMessage at the start of conversation\n // This keeps the system message static (cacheable) while providing dynamic context\n // (timestamps, user info, tool context) as conversation content instead.\n // Only inject on the first turn when messages don't already have the context marker.\n if (\n agentContext.dynamicContext &&\n messages.length > 0 &&\n !messages.some(\n (m) =>\n m instanceof HumanMessage &&\n typeof m.content === 'string' &&\n m.content.startsWith('[SESSION_CONTEXT]')\n )\n ) {\n const dynamicContextMessage = new HumanMessage({\n content: `[SESSION_CONTEXT]\\n${agentContext.dynamicContext}`,\n });\n const ackMessage = new AIMessageChunk({\n content:\n 'Understood. I have noted the session context including the current date/time (CST) and will apply it appropriately.',\n });\n messages = [dynamicContextMessage, ackMessage, ...messages];\n }\n\n // Extract tool discoveries from current turn only (similar to formatArtifactPayload pattern)\n const discoveredNames = extractToolDiscoveries(messages);\n if (discoveredNames.length > 0) {\n agentContext.markToolsAsDiscovered(discoveredNames);\n }\n\n const toolsForBinding = agentContext.getToolsForBinding();\n let model =\n this.overrideModel ??\n this.initializeModel({\n tools: toolsForBinding,\n provider: agentContext.provider,\n clientOptions: agentContext.clientOptions,\n });\n\n if (agentContext.systemRunnable) {\n model = agentContext.systemRunnable.pipe(model as Runnable);\n }\n\n if (agentContext.tokenCalculationPromise) {\n await agentContext.tokenCalculationPromise;\n }\n if (!config.signal) {\n config.signal = this.signal;\n }\n this.config = config;\n\n let messagesToUse = messages;\n\n if (\n !agentContext.pruneMessages &&\n agentContext.tokenCounter &&\n agentContext.maxContextTokens != null &&\n agentContext.indexTokenCountMap[0] != null\n ) {\n const isAnthropicWithThinking =\n (agentContext.provider === Providers.ANTHROPIC &&\n (agentContext.clientOptions as t.AnthropicClientOptions).thinking !=\n null) ||\n (agentContext.provider === Providers.BEDROCK &&\n (agentContext.clientOptions as t.BedrockAnthropicInput)\n .additionalModelRequestFields?.['thinking'] != null) ||\n (agentContext.provider === Providers.OPENAI &&\n (\n (agentContext.clientOptions as t.OpenAIClientOptions).modelKwargs\n ?.thinking as t.AnthropicClientOptions['thinking']\n )?.type === 'enabled');\n\n agentContext.pruneMessages = createPruneMessages({\n startIndex: this.startIndex,\n provider: agentContext.provider,\n tokenCounter: agentContext.tokenCounter,\n maxTokens: agentContext.maxContextTokens,\n thinkingEnabled: isAnthropicWithThinking,\n indexTokenCountMap: agentContext.indexTokenCountMap,\n });\n }\n\n if (agentContext.pruneMessages) {\n const { context, indexTokenCountMap } = agentContext.pruneMessages({\n messages,\n usageMetadata: agentContext.currentUsage,\n // startOnMessageType: 'human',\n });\n agentContext.indexTokenCountMap = indexTokenCountMap;\n messagesToUse = context;\n }\n\n let finalMessages = messagesToUse;\n if (agentContext.useLegacyContent) {\n finalMessages = formatContentStrings(finalMessages);\n }\n\n const lastMessageX =\n finalMessages.length >= 2\n ? finalMessages[finalMessages.length - 2]\n : null;\n const lastMessageY =\n finalMessages.length >= 1\n ? finalMessages[finalMessages.length - 1]\n : null;\n\n if (\n agentContext.provider === Providers.BEDROCK &&\n lastMessageX instanceof AIMessageChunk &&\n lastMessageY?.getType() === MessageTypes.TOOL &&\n typeof lastMessageX.content === 'string'\n ) {\n finalMessages[finalMessages.length - 2].content = '';\n }\n\n // Use getType() instead of instanceof to avoid module mismatch issues\n const isLatestToolMessage = lastMessageY?.getType() === MessageTypes.TOOL;\n\n if (\n isLatestToolMessage &&\n agentContext.provider === Providers.ANTHROPIC\n ) {\n formatAnthropicArtifactContent(finalMessages);\n } else if (\n isLatestToolMessage &&\n ((isOpenAILike(agentContext.provider) &&\n agentContext.provider !== Providers.DEEPSEEK) ||\n isGoogleLike(agentContext.provider))\n ) {\n formatArtifactPayload(finalMessages);\n }\n\n /**\n * Handle edge case: when switching from a non-thinking agent to a thinking-enabled agent,\n * convert AI messages with tool calls to HumanMessages to avoid thinking block requirements.\n * This is required by Anthropic/Bedrock when thinking is enabled.\n *\n * IMPORTANT: This MUST happen BEFORE cache control is applied.\n * If we add cachePoint to an AI message first, then convert that AI message to a HumanMessage,\n * the cachePoint is lost. By converting first, we ensure cache control is applied to the\n * final message structure that will be sent to the API.\n */\n const isAnthropicWithThinking =\n (agentContext.provider === Providers.ANTHROPIC &&\n (agentContext.clientOptions as t.AnthropicClientOptions).thinking !=\n null) ||\n (agentContext.provider === Providers.BEDROCK &&\n (agentContext.clientOptions as t.BedrockAnthropicInput)\n .additionalModelRequestFields?.['thinking'] != null);\n\n if (isAnthropicWithThinking) {\n finalMessages = ensureThinkingBlockInMessages(\n finalMessages,\n agentContext.provider\n );\n }\n\n // Apply cache control AFTER thinking block handling to ensure cachePoints aren't lost\n // when AI messages are converted to HumanMessages\n if (agentContext.provider === Providers.ANTHROPIC) {\n const anthropicOptions = agentContext.clientOptions as\n | t.AnthropicClientOptions\n | undefined;\n const defaultHeaders = anthropicOptions?.clientOptions\n ?.defaultHeaders as Record<string, string> | undefined;\n const anthropicBeta = defaultHeaders?.['anthropic-beta'];\n\n if (\n typeof anthropicBeta === 'string' &&\n anthropicBeta.includes('prompt-caching')\n ) {\n finalMessages = addCacheControl<BaseMessage>(finalMessages);\n }\n } else if (agentContext.provider === Providers.BEDROCK) {\n const bedrockOptions = agentContext.clientOptions as\n | t.BedrockAnthropicClientOptions\n | undefined;\n // Both Claude and Nova models support cachePoint in system and messages\n // (Llama, Titan, and other models do NOT support cachePoint)\n const modelId = bedrockOptions?.model?.toLowerCase() ?? '';\n const supportsCaching =\n modelId.includes('claude') ||\n modelId.includes('anthropic') ||\n modelId.includes('nova');\n if (bedrockOptions?.promptCache === true && supportsCaching) {\n finalMessages = addBedrockCacheControl<BaseMessage>(finalMessages);\n }\n }\n\n if (\n agentContext.lastStreamCall != null &&\n agentContext.streamBuffer != null\n ) {\n const timeSinceLastCall = Date.now() - agentContext.lastStreamCall;\n if (timeSinceLastCall < agentContext.streamBuffer) {\n const timeToWait =\n Math.ceil((agentContext.streamBuffer - timeSinceLastCall) / 1000) *\n 1000;\n await sleep(timeToWait);\n }\n }\n\n agentContext.lastStreamCall = Date.now();\n\n let result: Partial<t.BaseGraphState> | undefined;\n const fallbacks =\n (agentContext.clientOptions as t.LLMConfig | undefined)?.fallbacks ??\n [];\n\n if (finalMessages.length === 0) {\n throw new Error(\n JSON.stringify({\n type: 'empty_messages',\n info: 'Message pruning removed all messages as none fit in the context window. Please increase the context window size or make your message shorter.',\n })\n );\n }\n\n // Get model info for analytics\n const bedrockOpts = agentContext.clientOptions as\n | t.BedrockAnthropicClientOptions\n | undefined;\n const modelId =\n bedrockOpts?.model ||\n (agentContext.clientOptions as t.AnthropicClientOptions | undefined)\n ?.modelName;\n const thinkingConfig =\n bedrockOpts?.additionalModelRequestFields?.['thinking'] ||\n (agentContext.clientOptions as t.AnthropicClientOptions | undefined)\n ?.thinking;\n\n // Build and emit context analytics for traces\n const contextAnalytics = buildContextAnalytics(finalMessages, {\n tokenCounter: agentContext.tokenCounter,\n maxContextTokens: agentContext.maxContextTokens,\n instructionTokens: agentContext.instructionTokens,\n indexTokenCountMap: agentContext.indexTokenCountMap,\n });\n\n // Store for retrieval via getContextAnalytics() after run completes\n this.lastContextAnalytics = contextAnalytics;\n\n await safeDispatchCustomEvent(\n GraphEvents.ON_CONTEXT_ANALYTICS,\n {\n provider: agentContext.provider,\n model: modelId,\n thinkingEnabled: thinkingConfig != null,\n cacheEnabled: bedrockOpts?.promptCache === true,\n analytics: contextAnalytics,\n },\n config\n );\n\n try {\n result = await this.attemptInvoke(\n {\n currentModel: model,\n finalMessages,\n provider: agentContext.provider,\n tools: agentContext.tools,\n },\n config\n );\n } catch (primaryError) {\n // Check if this is a \"input too long\" error from Bedrock/Anthropic\n const errorMessage =\n (primaryError as Error).message.toLowerCase() ?? '';\n const isInputTooLongError =\n errorMessage.includes('too long') ||\n errorMessage.includes('input is too long') ||\n errorMessage.includes('context length') ||\n errorMessage.includes('maximum context') ||\n errorMessage.includes('validationexception') ||\n errorMessage.includes('prompt is too long');\n\n // Log when we detect the error\n if (isInputTooLongError) {\n console.warn(\n '[Graph] Detected input too long error:',\n errorMessage.substring(0, 200)\n );\n console.warn('[Graph] Checking emergency pruning conditions:', {\n hasPruneMessages: !!agentContext.pruneMessages,\n hasTokenCounter: !!agentContext.tokenCounter,\n maxContextTokens: agentContext.maxContextTokens,\n indexTokenMapKeys: Object.keys(agentContext.indexTokenCountMap)\n .length,\n });\n }\n\n // If input too long and we have pruning capability OR tokenCounter, retry with progressively more aggressive pruning\n // Note: We can create emergency pruneMessages dynamically if we have tokenCounter and maxContextTokens\n const canPrune =\n agentContext.tokenCounter && agentContext.maxContextTokens;\n if (isInputTooLongError && canPrune) {\n // Progressive reduction: 50% -> 25% -> 10% of original context\n const reductionLevels = [0.5, 0.25, 0.1];\n\n for (const reductionFactor of reductionLevels) {\n if (result) break; // Exit if we got a result\n\n const reducedMaxTokens = Math.floor(\n agentContext.maxContextTokens! * reductionFactor\n );\n console.warn(\n `[Graph] Input too long. Retrying with ${reductionFactor * 100}% context (${reducedMaxTokens} tokens)...`\n );\n\n // Build fresh indexTokenCountMap if missing/incomplete\n // This is needed when messages were dynamically added without updating the token map\n let tokenMapForPruning = agentContext.indexTokenCountMap;\n if (Object.keys(tokenMapForPruning).length < messages.length) {\n console.warn(\n '[Graph] Building fresh token count map for emergency pruning...'\n );\n tokenMapForPruning = {};\n for (let i = 0; i < messages.length; i++) {\n tokenMapForPruning[i] = agentContext.tokenCounter!(messages[i]);\n }\n }\n\n const emergencyPrune = createPruneMessages({\n startIndex: this.startIndex,\n provider: agentContext.provider,\n tokenCounter: agentContext.tokenCounter!,\n maxTokens: reducedMaxTokens,\n thinkingEnabled: false, // Disable thinking for emergency prune\n indexTokenCountMap: tokenMapForPruning,\n });\n\n const { context: reducedMessages } = emergencyPrune({\n messages,\n usageMetadata: agentContext.currentUsage,\n });\n\n // Skip if we can't fit any messages\n if (reducedMessages.length === 0) {\n console.warn(\n `[Graph] Cannot fit any messages at ${reductionFactor * 100}% reduction, trying next level...`\n );\n continue;\n }\n\n // Calculate how many messages were pruned and estimate context timeframe\n const prunedCount = finalMessages.length - reducedMessages.length;\n const remainingCount = reducedMessages.length;\n const estimatedContextDescription =\n this.getContextTimeframeDescription(remainingCount);\n\n // Inject a personalized context message to inform the agent about pruning\n const pruneNoticeMessage = new HumanMessage({\n content: `[CONTEXT NOTICE]\nOur conversation has grown quite long, so I've focused on ${estimatedContextDescription} of our chat (${remainingCount} recent messages). ${prunedCount} earlier messages are no longer in my immediate memory.\n\nIf I seem to be missing something we discussed earlier, just give me a quick reminder and I'll pick right back up! I'm still fully engaged and ready to help with whatever you need.`,\n });\n\n // Insert the notice after the system message (if any) but before conversation\n const hasSystemMessage = reducedMessages[0]?.getType() === 'system';\n const insertIndex = hasSystemMessage ? 1 : 0;\n\n // Create new array with the pruning notice\n const messagesWithNotice = [\n ...reducedMessages.slice(0, insertIndex),\n pruneNoticeMessage,\n ...reducedMessages.slice(insertIndex),\n ];\n\n let retryMessages = agentContext.useLegacyContent\n ? formatContentStrings(messagesWithNotice)\n : messagesWithNotice;\n\n // Apply thinking block handling first (before cache control)\n // This ensures AI+Tool sequences are converted to HumanMessages\n // before we add cache points that could be lost in the conversion\n if (isAnthropicWithThinking) {\n retryMessages = ensureThinkingBlockInMessages(\n retryMessages,\n agentContext.provider\n );\n }\n\n // Apply Bedrock cache control if needed (after thinking block handling)\n if (agentContext.provider === Providers.BEDROCK) {\n const bedrockOptions = agentContext.clientOptions as\n | t.BedrockAnthropicClientOptions\n | undefined;\n const modelId = bedrockOptions?.model?.toLowerCase() ?? '';\n const supportsCaching =\n modelId.includes('claude') ||\n modelId.includes('anthropic') ||\n modelId.includes('nova');\n if (bedrockOptions?.promptCache === true && supportsCaching) {\n retryMessages =\n addBedrockCacheControl<BaseMessage>(retryMessages);\n }\n }\n\n try {\n result = await this.attemptInvoke(\n {\n currentModel: model,\n finalMessages: retryMessages,\n provider: agentContext.provider,\n tools: agentContext.tools,\n },\n config\n );\n // Success with reduced context\n console.info(\n `[Graph] ✅ Retry successful at ${reductionFactor * 100}% with ${reducedMessages.length} messages (reduced from ${finalMessages.length})`\n );\n } catch (retryError) {\n const retryErrorMsg =\n (retryError as Error).message.toLowerCase() ?? '';\n const stillTooLong =\n retryErrorMsg.includes('too long') ||\n retryErrorMsg.includes('context length') ||\n retryErrorMsg.includes('validationexception');\n\n if (stillTooLong && reductionFactor > 0.1) {\n console.warn(\n `[Graph] Still too long at ${reductionFactor * 100}%, trying more aggressive pruning...`\n );\n } else {\n console.error(\n `[Graph] Retry at ${reductionFactor * 100}% failed:`,\n (retryError as Error).message\n );\n }\n }\n }\n }\n\n // If we got a result from retry, skip fallbacks\n if (result) {\n // result already set from retry\n } else {\n let lastError: unknown = primaryError;\n for (const fb of fallbacks) {\n try {\n let model = this.getNewModel({\n provider: fb.provider,\n clientOptions: fb.clientOptions,\n });\n const bindableTools = agentContext.tools;\n model = (\n !bindableTools || bindableTools.length === 0\n ? model\n : model.bindTools(bindableTools)\n ) as t.ChatModelInstance;\n result = await this.attemptInvoke(\n {\n currentModel: model,\n finalMessages,\n provider: fb.provider,\n tools: agentContext.tools,\n },\n config\n );\n lastError = undefined;\n break;\n } catch (e) {\n lastError = e;\n continue;\n }\n }\n if (lastError !== undefined) {\n throw lastError;\n }\n }\n }\n\n if (!result) {\n throw new Error('No result after model invocation');\n }\n agentContext.currentUsage = this.getUsageMetadata(result.messages?.[0]);\n this.cleanupSignalListener();\n return result;\n };\n }\n\n createAgentNode(agentId: string): t.CompiledAgentWorfklow {\n const agentContext = this.agentContexts.get(agentId);\n if (!agentContext) {\n throw new Error(`Agent context not found for agentId: ${agentId}`);\n }\n\n const agentNode = `${AGENT}${agentId}` as const;\n const toolNode = `${TOOLS}${agentId}` as const;\n\n const routeMessage = (\n state: t.BaseGraphState,\n config?: RunnableConfig\n ): string => {\n this.config = config;\n return toolsCondition(state, toolNode, this.invokedToolIds);\n };\n\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: messagesStateReducer,\n default: () => [],\n }),\n });\n\n const workflow = new StateGraph(StateAnnotation)\n .addNode(agentNode, this.createCallModel(agentId))\n .addNode(\n toolNode,\n this.initializeTools({\n currentTools: agentContext.tools,\n currentToolMap: agentContext.toolMap,\n agentContext,\n })\n )\n .addEdge(START, agentNode)\n .addConditionalEdges(agentNode, routeMessage)\n .addEdge(toolNode, agentContext.toolEnd ? END : agentNode);\n\n // Cast to unknown to avoid tight coupling to external types; options are opt-in\n return workflow.compile(this.compileOptions as unknown as never);\n }\n\n createWorkflow(): t.CompiledStateWorkflow {\n /** Use the default (first) agent for now */\n const agentNode = this.createAgentNode(this.defaultAgentId);\n const StateAnnotation = Annotation.Root({\n messages: Annotation<BaseMessage[]>({\n reducer: (a, b) => {\n if (!a.length) {\n this.startIndex = a.length + b.length;\n }\n const result = messagesStateReducer(a, b);\n this.messages = result;\n return result;\n },\n default: () => [],\n }),\n });\n const workflow = new StateGraph(StateAnnotation)\n .addNode(this.defaultAgentId, agentNode, { ends: [END] })\n .addEdge(START, this.defaultAgentId);\n\n // Pass compileOptions (e.g., checkpointer for browser interrupt support)\n return workflow.compile(this.compileOptions as unknown as never);\n }\n\n /* Dispatchers */\n\n /**\n * Dispatches a run step to the client, returns the step ID\n */\n async dispatchRunStep(\n stepKey: string,\n stepDetails: t.StepDetails,\n metadata?: Record<string, unknown>\n ): Promise<string> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n const [stepId, stepIndex] = this.generateStepId(stepKey);\n if (stepDetails.type === StepTypes.TOOL_CALLS && stepDetails.tool_calls) {\n for (const tool_call of stepDetails.tool_calls) {\n const toolCallId = tool_call.id ?? '';\n if (!toolCallId || this.toolCallStepIds.has(toolCallId)) {\n continue;\n }\n this.toolCallStepIds.set(toolCallId, stepId);\n }\n }\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: stepDetails.type,\n index: this.contentData.length,\n stepDetails,\n usage: null,\n };\n\n const runId = this.runId ?? '';\n if (runId) {\n runStep.runId = runId;\n }\n\n /**\n * Extract and store agentId from metadata\n */\n if (metadata) {\n try {\n const agentContext = this.getAgentContext(metadata);\n if (agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\n }\n } catch (_e) {\n /** If we can't get agent context, that's okay - agentId remains undefined */\n }\n }\n\n this.contentData.push(runStep);\n this.contentIndexMap.set(stepId, runStep.index);\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP,\n runStep,\n this.config\n );\n return stepId;\n }\n\n async handleToolCallCompleted(\n data: t.ToolEndData,\n metadata?: Record<string, unknown>,\n omitOutput?: boolean\n ): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n\n if (!data.output) {\n return;\n }\n\n const { input, output: _output } = data;\n if ((_output as Command | undefined)?.lg_name === 'Command') {\n return;\n }\n const output = _output as ToolMessage;\n const { tool_call_id } = output;\n const stepId = this.toolCallStepIds.get(tool_call_id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${tool_call_id}`);\n }\n\n const runStep = this.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const dispatchedOutput =\n typeof output.content === 'string'\n ? output.content\n : JSON.stringify(output.content);\n\n const args = typeof input === 'string' ? input : input.input;\n const tool_call = {\n args: typeof args === 'string' ? args : JSON.stringify(args),\n name: output.name ?? '',\n id: output.tool_call_id,\n output: omitOutput === true ? '' : dispatchedOutput,\n progress: 1,\n };\n\n await this.handlerRegistry\n ?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)\n ?.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: runStep.index,\n type: 'tool_call',\n tool_call,\n } as t.ToolCompleteEvent,\n },\n metadata,\n this\n );\n }\n /**\n * Static version of handleToolCallError to avoid creating strong references\n * that prevent garbage collection\n */\n static async handleToolCallErrorStatic(\n graph: StandardGraph,\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n if (!graph.config) {\n throw new Error('No config provided');\n }\n\n if (!data.id) {\n console.warn('No Tool ID provided for Tool Error');\n return;\n }\n\n const stepId = graph.toolCallStepIds.get(data.id) ?? '';\n if (!stepId) {\n throw new Error(`No stepId found for tool_call_id ${data.id}`);\n }\n\n const { name, input: args, error } = data;\n\n const runStep = graph.getRunStep(stepId);\n if (!runStep) {\n throw new Error(`No run step found for stepId ${stepId}`);\n }\n\n const tool_call: t.ProcessedToolCall = {\n id: data.id,\n name: name || '',\n args: typeof args === 'string' ? args : JSON.stringify(args),\n output: `Error processing tool${error?.message != null ? `: ${error.message}` : ''}`,\n progress: 1,\n };\n\n await graph.handlerRegistry\n ?.getHandler(GraphEvents.ON_RUN_STEP_COMPLETED)\n ?.handle(\n GraphEvents.ON_RUN_STEP_COMPLETED,\n {\n result: {\n id: stepId,\n index: runStep.index,\n type: 'tool_call',\n tool_call,\n } as t.ToolCompleteEvent,\n },\n metadata,\n graph\n );\n }\n\n /**\n * Instance method that delegates to the static method\n * Kept for backward compatibility\n */\n async handleToolCallError(\n data: t.ToolErrorData,\n metadata?: Record<string, unknown>\n ): Promise<void> {\n await StandardGraph.handleToolCallErrorStatic(this, data, metadata);\n }\n\n async dispatchRunStepDelta(\n id: string,\n delta: t.ToolCallDelta\n ): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n } else if (!id) {\n throw new Error('No step ID found');\n }\n const runStepDelta: t.RunStepDeltaEvent = {\n id,\n delta,\n };\n await safeDispatchCustomEvent(\n GraphEvents.ON_RUN_STEP_DELTA,\n runStepDelta,\n this.config\n );\n }\n\n async dispatchMessageDelta(id: string, delta: t.MessageDelta): Promise<void> {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const messageDelta: t.MessageDeltaEvent = {\n id,\n delta,\n };\n await safeDispatchCustomEvent(\n GraphEvents.ON_MESSAGE_DELTA,\n messageDelta,\n this.config\n );\n }\n\n dispatchReasoningDelta = async (\n stepId: string,\n delta: t.ReasoningDelta\n ): Promise<void> => {\n if (!this.config) {\n throw new Error('No config provided');\n }\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n await safeDispatchCustomEvent(\n GraphEvents.ON_REASONING_DELTA,\n reasoningDelta,\n this.config\n );\n };\n}\n"],"names":["CustomToolNode"],"mappings":"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"}
package/dist/esm/main.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { Run, defaultOmitOptions } from './run.mjs';
1
+ export { Run, cleanupBrowserCheckpointer, defaultOmitOptions, getBrowserCheckpointer } from './run.mjs';
2
2
  export { ChatModelStreamHandler, createContentAggregator, getChunkContent } from './stream.mjs';
3
3
  export { SEPARATORS, SplitStreamHandler } from './splitStream.mjs';
4
4
  export { HandlerRegistry, LLMStreamHandler, ModelEndHandler, TestChatStreamHandler, TestLLMStreamHandler, ToolEndHandler, createMetadataAggregator } from './events.mjs';
@@ -15,7 +15,8 @@ export { Calculator } from './tools/Calculator.mjs';
15
15
  export { createCodeExecutionTool, getCodeBaseURL, imageExtRegex } from './tools/CodeExecutor.mjs';
16
16
  export { createProgrammaticToolCallingTool, executeTools, extractUsedToolNames, fetchSessionFiles, filterToolsByUsage, formatCompletedResponse, makeRequest, normalizeToPythonIdentifier, unwrapToolResponse } from './tools/ProgrammaticToolCalling.mjs';
17
17
  export { countNestedGroups, createToolSearchRegexTool, escapeRegexSpecialChars, hasNestedQuantifiers, isDangerousPattern, sanitizeRegex } from './tools/ToolSearchRegex.mjs';
18
- export { BROWSER_TOOL_NAMES, EBrowserTools, createBrowserClickTool, createBrowserExtractTool, createBrowserGoBackTool, createBrowserHoverTool, createBrowserNavigateTool, createBrowserScreenshotTool, createBrowserScrollTool, createBrowserTools, createBrowserTypeTool, createBrowserWaitTool, hasBrowserCapability, isBrowserToolCall } from './tools/BrowserTools.mjs';
18
+ export { BROWSER_TOOL_NAMES, EBrowserTools, createBrowserClickTool, createBrowserExtractTool, createBrowserGetPageStateTool, createBrowserGoBackTool, createBrowserHoverTool, createBrowserNavigateTool, createBrowserScreenshotTool, createBrowserScrollTool, createBrowserTools, createBrowserTypeTool, createBrowserWaitTool, hasBrowserCapability, isBrowserToolCall } from './tools/BrowserTools.mjs';
19
+ export { BROWSER_INTERRUPT_TOOL_NAMES, EBrowserInterruptTools, createBrowserClickInterruptTool, createBrowserExtractInterruptTool, createBrowserGetPageStateInterruptTool, createBrowserGoBackInterruptTool, createBrowserHoverInterruptTool, createBrowserInterruptTools, createBrowserNavigateInterruptTool, createBrowserScreenshotInterruptTool, createBrowserScrollInterruptTool, createBrowserTypeInterruptTool, createBrowserWaitInterruptTool, isBrowserInterrupt, isBrowserInterruptToolCall } from './tools/BrowserInterruptTools.mjs';
19
20
  export { handleServerToolResult, handleToolCallChunks, handleToolCalls, toolResultTypes } from './tools/handlers.mjs';
20
21
  export { createSearchTool } from './tools/search/tool.mjs';
21
22
  export { Callback, CommonEvents, Constants, ContentTypes, EnvVar, GraphEvents, GraphNodeActions, GraphNodeKeys, MessageTypes, Providers, StepTypes, TitleMethod, ToolCallTypes } from './common/enum.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"main.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"main.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}