@t2000/engine 0.46.2 → 0.46.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tool.ts","../src/orchestration.ts","../src/tool-flags.ts","../src/sui-rpc.ts","../src/navi-config.ts","../src/tools/utils.ts","../src/navi-transforms.ts","../src/defillama-prices.ts","../src/tools/balance.ts","../src/navi-reads.ts","../src/tools/savings.ts","../src/tools/health.ts","../src/tools/rates.ts","../src/tools/history.ts","../src/tools/save.ts","../src/tools/withdraw.ts","../src/tools/transfer.ts","../src/tools/borrow.ts","../src/tools/repay.ts","../src/tools/claim.ts","../src/tools/pay.ts","../src/tools/mpp-services.ts","../src/tools/swap.ts","../src/tools/swap-quote.ts","../src/tools/volo-stake.ts","../src/tools/volo-unstake.ts","../src/tools/volo-stats.ts","../src/tools/contacts.ts","../src/tools/web-search.ts","../src/tools/explain-tx.ts","../src/tools/portfolio-analysis.ts","../src/tools/protocol-deep-dive.ts","../src/tools/receive.ts","../src/tools/canvas.ts","../src/tools/spending.ts","../src/tools/yield-summary.ts","../src/tools/activity-summary.ts","../src/tools/defillama.ts","../src/tools/index.ts","../src/tools/tool-modifiable-fields.ts","../src/prompt.ts","../src/cost.ts","../src/guards.ts","../src/compact/microcompact.ts","../src/context.ts","../src/permission-rules.ts","../src/early-dispatcher.ts","../src/engine.ts","../src/streaming.ts","../src/session.ts","../src/recipes/loader.ts","../src/recipes/registry.ts","../src/classify-effort.ts","../src/prompt-cache.ts","../src/intelligence.ts","../src/state/conversation-state.ts","../src/mcp.ts","../src/mcp-client.ts","../src/mcp-tool-adapter.ts","../src/providers/anthropic.ts"],"names":["getDecimalsForCoinType","GAS_RESERVE_SUI","gasReserveUsd","balance","usdcHolding","callNavi","z","result","status","hf","rates","records","filtered","assertAllowedAsset","MPP_GATEWAY","CACHE_TTL","services","inputSchema","LLAMA_API","YIELDS_API","DEFAULT_MAX_TOKENS"],"mappings":"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","file":"index.js","sourcesContent":["import type { z } from 'zod';\nimport type {\n PermissionLevel,\n PreflightResult,\n Tool,\n ToolContext,\n ToolFlags,\n ToolJsonSchema,\n ToolResult,\n} from './types.js';\n\n// ---------------------------------------------------------------------------\n// buildTool — factory for creating typed, permission-aware tools\n// ---------------------------------------------------------------------------\n\nexport interface BuildToolOptions<TInput, TOutput> {\n name: string;\n description: string;\n inputSchema: z.ZodType<TInput>;\n jsonSchema: ToolJsonSchema;\n call: (input: TInput, context: ToolContext) => Promise<ToolResult<TOutput>>;\n isReadOnly?: boolean;\n permissionLevel?: PermissionLevel;\n flags?: ToolFlags;\n preflight?: (input: TInput) => PreflightResult;\n maxResultSizeChars?: number;\n summarizeOnTruncate?: (result: string, maxChars: number) => string;\n /**\n * [v1.5.1] See `Tool.cacheable`. Default `true`. Set `false` for\n * tools whose results depend on mutable on-chain state.\n */\n cacheable?: boolean;\n}\n\ntype AnyPreflight = (input: unknown) => PreflightResult;\n\nexport function buildTool<TInput, TOutput>(\n opts: BuildToolOptions<TInput, TOutput>,\n): Tool<TInput, TOutput> {\n const isReadOnly = opts.isReadOnly ?? true;\n return {\n name: opts.name,\n description: opts.description,\n inputSchema: opts.inputSchema,\n jsonSchema: opts.jsonSchema,\n call: opts.call,\n isReadOnly,\n isConcurrencySafe: isReadOnly,\n permissionLevel: opts.permissionLevel ?? (isReadOnly ? 'auto' : 'confirm'),\n flags: opts.flags ?? {},\n preflight: opts.preflight as AnyPreflight | undefined,\n maxResultSizeChars: opts.maxResultSizeChars,\n summarizeOnTruncate: opts.summarizeOnTruncate,\n cacheable: opts.cacheable,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tool helpers\n// ---------------------------------------------------------------------------\n\nexport function toolsToDefinitions(tools: Tool[]): {\n name: string;\n description: string;\n input_schema: ToolJsonSchema;\n}[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.jsonSchema,\n }));\n}\n\nexport function findTool(tools: Tool[], name: string): Tool | undefined {\n return tools.find((t) => t.name === name);\n}\n","import type { EngineEvent, Tool, ToolContext } from './types.js';\nimport { findTool } from './tool.js';\n\n// ---------------------------------------------------------------------------\n// Pending tool call — accumulated from provider events\n// ---------------------------------------------------------------------------\n\nexport interface PendingToolCall {\n id: string;\n name: string;\n input: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// TxMutex — serialises write operations to prevent race conditions\n// ---------------------------------------------------------------------------\n\nexport class TxMutex {\n private queue: (() => void)[] = [];\n private locked = false;\n\n async acquire(): Promise<void> {\n if (!this.locked) {\n this.locked = true;\n return;\n }\n return new Promise<void>((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n release(): void {\n const next = this.queue.shift();\n if (next) {\n next();\n } else {\n this.locked = false;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// runTools — executes tool calls with parallel reads, serial writes\n// ---------------------------------------------------------------------------\n\nexport async function* runTools(\n pending: PendingToolCall[],\n tools: Tool[],\n context: ToolContext,\n txMutex: TxMutex,\n): AsyncGenerator<EngineEvent> {\n const { reads, writes } = partitionToolCalls(pending, tools);\n\n // Phase 1: execute all read-only tools in parallel\n if (reads.length > 0) {\n const readResults = await Promise.allSettled(\n reads.map(async (call) => {\n const tool = findTool(tools, call.name);\n if (!tool) {\n return { call, result: { data: { error: `Unknown tool: ${call.name}` } }, isError: true };\n }\n const execResult = await executeSingleTool(tool, call, context);\n if (!execResult.isError) {\n execResult.data = budgetToolResult(execResult.data, tool);\n }\n return { call, result: execResult, isError: execResult.isError };\n }),\n );\n\n for (const settled of readResults) {\n if (settled.status === 'fulfilled') {\n const { call, result, isError } = settled.value;\n yield {\n type: 'tool_result',\n toolName: call.name,\n toolUseId: call.id,\n result: result.data,\n isError,\n };\n } else {\n const idx = readResults.indexOf(settled);\n const call = reads[idx];\n yield {\n type: 'tool_result',\n toolName: call.name,\n toolUseId: call.id,\n result: { error: settled.reason?.message ?? 'Tool execution failed' },\n isError: true,\n };\n }\n }\n }\n\n // Phase 2: execute write tools sequentially under mutex\n for (const call of writes) {\n const tool = findTool(tools, call.name);\n if (!tool) {\n yield {\n type: 'tool_result',\n toolName: call.name,\n toolUseId: call.id,\n result: { error: `Unknown tool: ${call.name}` },\n isError: true,\n };\n continue;\n }\n await txMutex.acquire();\n try {\n const result = await executeSingleTool(tool, call, context);\n if (!result.isError) {\n result.data = budgetToolResult(result.data, tool);\n }\n yield {\n type: 'tool_result',\n toolName: call.name,\n toolUseId: call.id,\n result: result.data,\n isError: result.isError,\n };\n } catch (err) {\n yield {\n type: 'tool_result',\n toolName: call.name,\n toolUseId: call.id,\n result: { error: err instanceof Error ? err.message : 'Tool execution failed' },\n isError: true,\n };\n } finally {\n txMutex.release();\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction partitionToolCalls(\n pending: PendingToolCall[],\n tools: Tool[],\n): { reads: PendingToolCall[]; writes: PendingToolCall[] } {\n const reads: PendingToolCall[] = [];\n const writes: PendingToolCall[] = [];\n\n for (const call of pending) {\n const tool = findTool(tools, call.name);\n if (!tool) {\n reads.push(call); // unknown tools treated as reads — will fail safely\n continue;\n }\n if (tool.isReadOnly && tool.isConcurrencySafe) {\n reads.push(call);\n } else {\n writes.push(call);\n }\n }\n\n return { reads, writes };\n}\n\nasync function executeSingleTool(\n tool: Tool,\n call: PendingToolCall,\n context: ToolContext,\n): Promise<{ data: unknown; isError: boolean }> {\n const parsed = tool.inputSchema.safeParse(call.input);\n if (!parsed.success) {\n return {\n data: {\n error: `Invalid input: ${parsed.error.issues.map((i) => i.message).join(', ')}`,\n },\n isError: true,\n };\n }\n\n const result = await tool.call(parsed.data, context);\n return { data: result.data, isError: false };\n}\n\n/**\n * Enforce per-tool result size limits. When a serialized result exceeds\n * `maxResultSizeChars`, truncate it with a hint to re-call with narrower\n * parameters. Uses the tool's custom `summarizeOnTruncate` when available.\n */\nexport function budgetToolResult(\n data: unknown,\n tool: Tool,\n): unknown {\n if (!tool.maxResultSizeChars) return data;\n\n const serialized = typeof data === 'string' ? data : JSON.stringify(data);\n if (serialized.length <= tool.maxResultSizeChars) return data;\n\n if (tool.summarizeOnTruncate) {\n const summarized = tool.summarizeOnTruncate(serialized, tool.maxResultSizeChars);\n try { return JSON.parse(summarized); } catch { return summarized; }\n }\n\n const preview = serialized.slice(0, tool.maxResultSizeChars);\n const linesOmitted = serialized.split('\\n').length - preview.split('\\n').length;\n const note = `[Truncated — ${linesOmitted} lines omitted. Call ${tool.name} with narrower parameters (e.g. smaller date range or limit) to see more.]`;\n /**\n * [v1.5.2] If the original payload was a JSON object, *don't* return a\n * raw sliced string — the slice is invalid JSON, JSON.parse fails, and\n * downstream consumers (frontend card renderers, history-replay logic,\n * etc.) get a string they cannot destructure. Instead, wrap the\n * preview in a structured `_truncated` envelope so the result stays\n * object-shaped. Tools that genuinely return a string (rare) fall\n * through to the legacy concat behavior.\n */\n if (typeof data === 'object' && data !== null) {\n return { _truncated: true, _preview: preview, _note: note };\n }\n return `${preview}\\n\\n${note}`;\n}\n","import type { Tool, ToolFlags } from './types.js';\n\n/**\n * Central registry of tool flags for the guard runner (RE-2.2).\n *\n * Flags are declarative metadata that guards read to decide what checks to run.\n * Read-only tools have no flags by default (empty object).\n *\n * Flag meanings:\n * mutating — changes on-chain state (deposit, swap, send, borrow)\n * requiresBalance — needs sufficient funds to execute\n * affectsHealth — can change borrow health factor\n * irreversible — physical mail, external transfers — can't undo\n * producesArtifact — returns images, documents, generated content\n * costAware — has a monetary cost the user should know about\n * maxRetries — max calls with same input (default: unlimited for reads, 1 for writes)\n */\nexport const TOOL_FLAGS: Record<string, ToolFlags> = {\n // Write tools — financial\n save_deposit: { mutating: true, requiresBalance: true },\n withdraw: { mutating: true, affectsHealth: true },\n send_transfer: { mutating: true, requiresBalance: true, irreversible: true },\n swap_execute: { mutating: true, requiresBalance: true },\n borrow: { mutating: true, affectsHealth: true },\n repay_debt: { mutating: true, requiresBalance: true },\n claim_rewards: { mutating: true },\n volo_stake: { mutating: true, requiresBalance: true },\n volo_unstake: { mutating: true },\n\n // Write tools — pay / services\n pay_api: { mutating: true, requiresBalance: true, costAware: true, producesArtifact: true, maxRetries: 1 },\n\n // Write tools — lightweight (no financial guards)\n save_contact: {},\n\n // [SIMPLIFICATION DAY 7] Removed flag entries for deleted tools:\n // create_schedule, cancel_schedule (DCA schedules retired)\n // toggle_allowance, update_daily_limit, update_permissions (allowance dormant)\n\n // Receive tools — create/cancel mutate server state\n create_payment_link: { mutating: true },\n cancel_payment_link: { mutating: true },\n create_invoice: { mutating: true },\n cancel_invoice: { mutating: true },\n};\n\n/**\n * Apply flags from the central registry to a tool array.\n * Tools not in the registry get empty flags (read-only tools).\n */\nexport function applyToolFlags<T extends Tool>(tools: T[]): T[] {\n return tools.map((tool) => {\n const flags = TOOL_FLAGS[tool.name];\n if (!flags) return tool;\n return { ...tool, flags: { ...tool.flags, ...flags } };\n });\n}\n\n/**\n * Get flags for a tool by name. Returns empty flags if not registered.\n */\nexport function getToolFlags(name: string): ToolFlags {\n return TOOL_FLAGS[name] ?? {};\n}\n","// ---------------------------------------------------------------------------\n// Direct Sui JSON-RPC coin fetcher — no SDK dependency required.\n// Uses suix_getAllBalances to get wallet coin balances.\n// ---------------------------------------------------------------------------\n\nimport { getDecimalsForCoinType, resolveSymbol } from '@t2000/sdk';\n\nconst SUI_MAINNET_URL = 'https://fullnode.mainnet.sui.io:443';\n\nexport interface SuiCoinBalance {\n coinType: string;\n totalBalance: string;\n coinObjectCount: number;\n}\n\n/** Supplementary coins not in the SDK registry (legacy/wrapped variants). */\nconst EXTRA_COINS: Record<string, { symbol: string; decimals: number }> = {\n '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN': { symbol: 'USDT', decimals: 6 },\n};\n\nexport interface WalletCoin {\n coinType: string;\n symbol: string;\n decimals: number;\n totalBalance: string;\n coinObjectCount: number;\n}\n\n/**\n * Fetch all coin balances for an address directly from the Sui JSON-RPC.\n * Returns enriched objects with known symbol/decimals where possible.\n */\nexport async function fetchWalletCoins(\n address: string,\n rpcUrl?: string,\n): Promise<WalletCoin[]> {\n const url = rpcUrl || SUI_MAINNET_URL;\n\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'suix_getAllBalances',\n params: [address],\n }),\n signal: AbortSignal.timeout(8_000),\n });\n\n if (!res.ok) {\n throw new Error(`Sui RPC error: ${res.status} ${res.statusText}`);\n }\n\n const json = (await res.json()) as {\n result?: SuiCoinBalance[];\n error?: { message: string };\n };\n\n if (json.error) {\n throw new Error(`Sui RPC error: ${json.error.message}`);\n }\n\n const balances = json.result ?? [];\n\n return balances.map((b) => {\n const extra = EXTRA_COINS[b.coinType];\n const symbol = extra?.symbol ?? resolveSymbol(b.coinType);\n const decimals = extra?.decimals ?? getDecimalsForCoinType(b.coinType);\n return {\n coinType: b.coinType,\n symbol,\n decimals,\n totalBalance: b.totalBalance,\n coinObjectCount: b.coinObjectCount,\n };\n });\n}\n","import type { McpServerConfig } from './mcp-client.js';\n\n// ---------------------------------------------------------------------------\n// NAVI MCP server configuration\n// ---------------------------------------------------------------------------\n\nexport const NAVI_SERVER_NAME = 'navi';\nexport const NAVI_MCP_URL = 'https://open-api.naviprotocol.io/api/mcp';\n\nexport const NAVI_MCP_CONFIG: McpServerConfig = {\n name: NAVI_SERVER_NAME,\n url: NAVI_MCP_URL,\n transport: 'streamable-http',\n cacheTtlMs: 30_000,\n readOnly: true,\n};\n\n// ---------------------------------------------------------------------------\n// NAVI MCP tool name constants (as observed from live discovery)\n// ---------------------------------------------------------------------------\n\nexport const NaviTools = {\n GET_POOLS: 'navi_get_pools',\n GET_POOL: 'navi_get_pool',\n GET_PROTOCOL_STATS: 'navi_get_protocol_stats',\n GET_HEALTH_FACTOR: 'navi_get_health_factor',\n GET_BORROW_FEE: 'navi_get_borrow_fee',\n GET_FEES: 'navi_get_fees',\n GET_FLASH_LOAN_ASSETS: 'navi_get_flash_loan_assets',\n GET_FLASH_LOAN_ASSET: 'navi_get_flash_loan_asset',\n GET_LENDING_REWARDS: 'navi_get_lending_rewards',\n GET_AVAILABLE_REWARDS: 'navi_get_available_rewards',\n GET_PRICE_FEEDS: 'navi_get_price_feeds',\n GET_SWAP_QUOTE: 'navi_get_swap_quote',\n GET_BRIDGE_CHAINS: 'navi_get_bridge_chains',\n SEARCH_BRIDGE_TOKENS: 'navi_search_bridge_tokens',\n GET_BRIDGE_QUOTE: 'navi_get_bridge_quote',\n GET_BRIDGE_TX_STATUS: 'navi_get_bridge_tx_status',\n GET_BRIDGE_HISTORY: 'navi_get_bridge_history',\n GET_DCA_ORDERS: 'navi_get_dca_orders',\n GET_DCA_ORDER_DETAILS: 'navi_get_dca_order_details',\n LIST_DCA_ORDERS: 'navi_list_dca_orders',\n GET_COINS: 'navi_get_coins',\n GET_MARKET_CONFIG: 'navi_get_market_config',\n GET_POSITIONS: 'get_positions',\n GET_TRANSACTION: 'sui_get_transaction',\n EXPLAIN_TRANSACTION: 'sui_explain_transaction',\n SEARCH_TOKENS: 'navi_search_tokens',\n} as const;\n","import type { T2000 } from '@t2000/sdk';\nimport type { McpClientManager } from '../mcp-client.js';\nimport { NAVI_SERVER_NAME } from '../navi-config.js';\nimport type { ToolContext } from '../types.js';\n\nexport function hasAgent(context: ToolContext): boolean {\n return !!context.agent;\n}\n\nexport function requireAgent(context: ToolContext): T2000 {\n if (!context.agent) {\n throw new Error(\n 'Tool requires a T2000 agent instance — pass `agent` in EngineConfig',\n );\n }\n return context.agent as T2000;\n}\n\n/**\n * Check if context has an MCP manager with a connected NAVI server\n * and a wallet address for address-dependent reads.\n */\nexport function hasNaviMcp(context: ToolContext): boolean {\n if (!context.mcpManager || !context.walletAddress) return false;\n const mgr = context.mcpManager as McpClientManager;\n return mgr.isConnected(NAVI_SERVER_NAME);\n}\n\n/**\n * Check if context has a connected NAVI MCP (no wallet required).\n * Use for global reads like rates/pools that don't depend on a user address.\n */\nexport function hasNaviMcpGlobal(context: ToolContext): boolean {\n if (!context.mcpManager) return false;\n const mgr = context.mcpManager as McpClientManager;\n return mgr.isConnected(NAVI_SERVER_NAME);\n}\n\n/**\n * Get the MCP client manager from context (assumes hasNaviMcp() is true).\n */\nexport function getMcpManager(context: ToolContext): McpClientManager {\n return context.mcpManager as McpClientManager;\n}\n\n/**\n * Get the wallet address from context (assumes hasNaviMcp() is true).\n */\nexport function getWalletAddress(context: ToolContext): string {\n return context.walletAddress!;\n}\n","import { getDecimalsForCoinType } from '@t2000/sdk';\n\n// ---------------------------------------------------------------------------\n// Raw NAVI MCP response types (as returned by the live NAVI MCP server)\n// ---------------------------------------------------------------------------\n\nexport interface NaviRawPool {\n id: number;\n symbol: string;\n coinType: string;\n price: string;\n market: string;\n ltv: number;\n liquidation: {\n bonus: string;\n ratio: string;\n threshold: string;\n };\n supply: string;\n borrow: string;\n supplyApy: string;\n borrowApy: string;\n}\n\nexport interface NaviRawPosition {\n id: string;\n protocol: string;\n type: string;\n market: string;\n tokenASymbol: string;\n tokenAPrice: number;\n amountA: string;\n tokenBSymbol?: string | null;\n tokenBPrice?: number | null;\n amountB?: string | null;\n valueUSD: string;\n apr: string;\n liquidationThreshold: string;\n lowerPrice?: string | null;\n upperPrice?: string | null;\n currentPrice?: string | null;\n claimableRewards?: string | null;\n isActive?: boolean;\n}\n\nexport interface NaviRawPositionsResponse {\n address: string;\n positions: NaviRawPosition[];\n}\n\nexport interface NaviRawHealthFactor {\n address: string;\n healthFactor: number | null;\n}\n\nexport interface NaviRawCoin {\n coinType: string;\n totalBalance: string;\n coinObjectCount: number;\n symbol?: string;\n decimals?: number;\n}\n\nexport interface NaviRawRewardsResponse {\n address: string;\n rewards: Array<{\n pool?: string;\n rewardType?: string;\n amount?: string;\n symbol?: string;\n valueUsd?: number;\n }>;\n summary: Array<{\n symbol: string;\n totalAmount: string;\n valueUSD?: string;\n }>;\n}\n\nexport interface NaviRawProtocolStats {\n tvl: number;\n totalBorrowUsd: number;\n averageUtilization: number;\n maxApy: number;\n userAmount: number;\n interactionUserAmount: number;\n borrowFee: number;\n}\n\n// ---------------------------------------------------------------------------\n// Transformed engine-friendly types\n// ---------------------------------------------------------------------------\n\nexport interface RatesResult {\n [symbol: string]: {\n saveApy: number;\n borrowApy: number;\n ltv: number;\n price: number;\n };\n}\n\nexport interface HealthFactorResult {\n healthFactor: number;\n supplied: number;\n borrowed: number;\n maxBorrow: number;\n liquidationThreshold: number;\n}\n\nexport interface BalanceResult {\n available: number;\n savings: number;\n debt: number;\n pendingRewards: number;\n gasReserve: number;\n total: number;\n stables: number;\n}\n\nexport interface PositionEntry {\n protocol: string;\n type: 'supply' | 'borrow';\n symbol: string;\n amount: number;\n valueUsd: number;\n apy: number;\n liquidationThreshold: number;\n}\n\nexport interface SavingsResult {\n positions: PositionEntry[];\n earnings: {\n totalYieldEarned: number;\n currentApy: number;\n dailyEarning: number;\n supplied: number;\n };\n fundStatus: {\n supplied: number;\n apy: number;\n earnedToday: number;\n earnedAllTime: number;\n projectedMonthly: number;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Safe number parser — handles strings, numbers, null, undefined\n// ---------------------------------------------------------------------------\n\nfunction toNum(v: unknown): number {\n if (v == null) return 0;\n const n = typeof v === 'number' ? v : Number(v);\n return Number.isFinite(n) ? n : 0;\n}\n\n// ---------------------------------------------------------------------------\n// Transform: pools → rates\n// ---------------------------------------------------------------------------\n\nexport function transformRates(raw: unknown): RatesResult {\n const pools = Array.isArray(raw) ? (raw as NaviRawPool[]) : [];\n const result: RatesResult = {};\n\n for (const pool of pools) {\n if (!pool.symbol) continue;\n result[pool.symbol] = {\n saveApy: toNum(pool.supplyApy) / 100,\n borrowApy: toNum(pool.borrowApy) / 100,\n ltv: toNum(pool.ltv),\n price: toNum(pool.price),\n };\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Transform: positions → typed PositionEntry[]\n// ---------------------------------------------------------------------------\n\n// NAVI MCP divides ALL position amounts by 10^9 (original storage precision),\n// but newer pools (id > 10) store at the token's native decimals. For 6-decimal\n// stablecoins in newer pools, this makes amounts 1000x too small.\n// Correction factor: 10^(9 - 6) = 1000.\n// Remove this map if/when the NAVI MCP fixes pool-aware decimal handling.\nconst NAVI_NEWER_POOL_SYMBOLS = new Set([\n 'USDSUI', 'USDsui',\n 'SUI_USDE', 'suiUSDe', 'USDe',\n 'suiUSDT',\n]);\nconst NEWER_POOL_FACTOR = 1000;\n\nfunction naviDecimalFactor(symbol: string): number {\n return NAVI_NEWER_POOL_SYMBOLS.has(symbol) ? NEWER_POOL_FACTOR : 1;\n}\n\nexport function transformPositions(raw: unknown): PositionEntry[] {\n const data = raw as NaviRawPositionsResponse | undefined;\n const positions = data?.positions ?? (Array.isArray(raw) ? (raw as NaviRawPosition[]) : []);\n\n return positions.map((p) => {\n const symbol = p.tokenASymbol ?? 'UNKNOWN';\n const factor = naviDecimalFactor(symbol);\n return {\n protocol: p.protocol ?? 'navi',\n type: p.type?.includes('borrow') ? ('borrow' as const) : ('supply' as const),\n symbol,\n amount: toNum(p.amountA) * factor,\n valueUsd: toNum(p.valueUSD) * factor,\n apy: toNum(p.apr) / 100,\n liquidationThreshold: toNum(p.liquidationThreshold),\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Transform: health factor (+ optional positions for enrichment)\n// ---------------------------------------------------------------------------\n\nexport function transformHealthFactor(\n rawHf: unknown,\n rawPositions?: unknown,\n): HealthFactorResult {\n const hf = rawHf as NaviRawHealthFactor | undefined;\n const positions = transformPositions(rawPositions);\n\n const supplied = positions\n .filter((p) => p.type === 'supply')\n .reduce((sum, p) => sum + p.valueUsd, 0);\n const borrowed = positions\n .filter((p) => p.type === 'borrow')\n .reduce((sum, p) => sum + p.valueUsd, 0);\n\n const supplyPositions = positions.filter((p) => p.type === 'supply');\n const weightedLt =\n supplied > 0\n ? supplyPositions.reduce(\n (acc, p) => acc + p.liquidationThreshold * p.valueUsd,\n 0,\n ) / supplied\n : 0;\n\n const maxBorrow = supplied * weightedLt - borrowed;\n\n return {\n healthFactor: toNum(hf?.healthFactor) || (borrowed === 0 ? Infinity : 0),\n supplied,\n borrowed,\n maxBorrow: Math.max(0, maxBorrow),\n liquidationThreshold: weightedLt,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Transform: rewards → typed reward summaries\n// ---------------------------------------------------------------------------\n\nexport interface PendingReward {\n symbol: string;\n totalAmount: number;\n valueUsd: number;\n}\n\nexport function transformRewards(raw: unknown): PendingReward[] {\n const data = raw as NaviRawRewardsResponse | undefined;\n return (data?.summary ?? []).map((s) => ({\n symbol: s.symbol ?? 'UNKNOWN',\n totalAmount: toNum(s.totalAmount),\n valueUsd: toNum(s.valueUSD),\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Transform: coins + positions + rewards → balance breakdown\n// Requires `prices` map (symbol → USD price) for proper cross-currency totals.\n// ---------------------------------------------------------------------------\n\nconst STABLECOIN_SYMBOLS = new Set([\n 'USDC', 'USDT', 'USDe', 'USDsui', 'wUSDC', 'wUSDT', 'suiUSDe', 'USDSUI',\n]);\n\nconst GAS_RESERVE_SUI = 0.05;\n\nexport interface BalancePrices {\n [symbol: string]: number;\n}\n\nexport function transformBalance(\n rawCoins: unknown,\n rawPositions: unknown,\n rawRewards: unknown,\n prices?: BalancePrices,\n): BalanceResult {\n const coins = Array.isArray(rawCoins) ? (rawCoins as NaviRawCoin[]) : [];\n const positions = transformPositions(rawPositions);\n const rewards = transformRewards(rawRewards);\n\n let availableUsd = 0;\n let stablesUsd = 0;\n let gasReserveUsd = 0;\n\n for (const coin of coins) {\n const symbol = coin.symbol ?? '';\n const decimals = coin.decimals ?? getDecimalsForCoinType(coin.coinType ?? '');\n const balance = toNum(coin.totalBalance) / 10 ** decimals;\n const price = prices?.[symbol] ?? (STABLECOIN_SYMBOLS.has(symbol) ? 1 : 0);\n\n if (symbol === 'SUI' || coin.coinType === '0x2::sui::SUI') {\n const reserveAmount = Math.min(balance, GAS_RESERVE_SUI);\n gasReserveUsd = reserveAmount * price;\n availableUsd += (balance - reserveAmount) * price;\n } else {\n availableUsd += balance * price;\n if (STABLECOIN_SYMBOLS.has(symbol)) {\n stablesUsd += balance * price;\n }\n }\n }\n\n const savings = positions\n .filter((p) => p.type === 'supply')\n .reduce((sum, p) => sum + p.valueUsd, 0);\n const debt = positions\n .filter((p) => p.type === 'borrow')\n .reduce((sum, p) => sum + p.valueUsd, 0);\n\n const pendingRewardsUsd = rewards.reduce((sum, r) => sum + r.valueUsd, 0);\n\n return {\n available: availableUsd,\n savings,\n debt,\n pendingRewards: pendingRewardsUsd,\n gasReserve: gasReserveUsd,\n total: availableUsd + savings + gasReserveUsd + pendingRewardsUsd - debt,\n stables: stablesUsd,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Transform: positions + pools → savings info\n// ---------------------------------------------------------------------------\n\nexport function transformSavings(\n rawPositions: unknown,\n rawPools: unknown,\n): SavingsResult {\n const positions = transformPositions(rawPositions);\n const rates = transformRates(rawPools);\n\n const supplyPositions = positions.filter((p) => p.type === 'supply');\n const supplied = supplyPositions.reduce((sum, p) => sum + p.valueUsd, 0);\n\n const weightedApy =\n supplied > 0\n ? supplyPositions.reduce(\n (acc, p) => acc + (rates[p.symbol]?.saveApy ?? p.apy) * p.valueUsd,\n 0,\n ) / supplied\n : 0;\n\n const dailyEarning = (supplied * weightedApy) / 365;\n const projectedMonthly = dailyEarning * 30;\n\n return {\n positions,\n earnings: {\n totalYieldEarned: 0, // not available from MCP reads alone\n currentApy: weightedApy,\n dailyEarning,\n supplied,\n },\n fundStatus: {\n supplied,\n apy: weightedApy,\n earnedToday: dailyEarning,\n earnedAllTime: 0, // not available from MCP reads alone\n projectedMonthly,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers: extract text content from MCP response\n// ---------------------------------------------------------------------------\n\nexport function extractMcpText(\n content: Array<{ type: string; text?: string; [key: string]: unknown }>,\n): string {\n return content\n .filter((c) => c.type === 'text' && c.text)\n .map((c) => c.text!)\n .join('\\n');\n}\n\nexport function parseMcpJson<T = unknown>(\n content: Array<{ type: string; text?: string; [key: string]: unknown }>,\n): T {\n const text = extractMcpText(content);\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n}\n","const DEFILLAMA_PRICES_URL = 'https://coins.llama.fi/prices/current';\nconst CACHE_TTL = 60_000;\n\nlet cache: { prices: Record<string, number>; ts: number } | null = null;\nlet pendingRequest: Promise<Record<string, number>> | null = null;\n\n/**\n * Batch-fetch USD prices for Sui coin types from DefiLlama.\n * Returns a map of `coinType -> usdPrice`. Tokens not found return no entry.\n * Results are cached for 60s. Free API, no auth required.\n */\nexport async function fetchTokenPrices(\n coinTypes: string[],\n): Promise<Record<string, number>> {\n if (coinTypes.length === 0) return {};\n\n if (cache && Date.now() - cache.ts < CACHE_TTL) {\n const allHit = coinTypes.every((ct) => ct in cache!.prices);\n if (allHit) return cache.prices;\n }\n\n if (pendingRequest) {\n return pendingRequest;\n }\n\n pendingRequest = doFetch(coinTypes);\n try {\n return await pendingRequest;\n } finally {\n pendingRequest = null;\n }\n}\n\nasync function doFetch(coinTypes: string[]): Promise<Record<string, number>> {\n const coins = coinTypes.map((ct) => `sui:${ct}`).join(',');\n const url = `${DEFILLAMA_PRICES_URL}/${encodeURIComponent(coins)}`;\n\n const res = await fetch(url, {\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!res.ok) {\n console.warn(`[defillama-prices] HTTP ${res.status} from ${DEFILLAMA_PRICES_URL}`);\n return cache?.prices ?? {};\n }\n\n const json = (await res.json()) as {\n coins?: Record<string, { price: number; symbol?: string; decimals?: number }>;\n };\n\n const prices: Record<string, number> = {};\n\n if (json.coins) {\n for (const [key, val] of Object.entries(json.coins)) {\n const coinType = key.replace(/^sui:/, '');\n prices[coinType] = val.price;\n }\n }\n\n cache = { prices, ts: Date.now() };\n return prices;\n}\n\nexport function clearPriceCache(): void {\n cache = null;\n}\n","import { z } from 'zod';\nimport { getDecimalsForCoinType } from '@t2000/sdk';\nimport { fetchWalletCoins } from '../sui-rpc.js';\nimport { buildTool } from '../tool.js';\nimport { hasNaviMcp, getMcpManager, getWalletAddress, requireAgent } from './utils.js';\nimport type { McpClientManager } from '../mcp-client.js';\nimport { NAVI_SERVER_NAME, NaviTools } from '../navi-config.js';\nimport {\n parseMcpJson,\n transformPositions,\n transformRewards,\n} from '../navi-transforms.js';\nimport { fetchTokenPrices } from '../defillama-prices.js';\n\nconst GAS_RESERVE_SUI = 0.05;\n\nasync function callNavi<T = unknown>(\n manager: McpClientManager,\n tool: string,\n args: Record<string, unknown> = {},\n): Promise<T> {\n const result = await manager.callTool(NAVI_SERVER_NAME, tool, args);\n if (result.isError) {\n const msg = result.content\n .filter((c: { type: string; text?: string }) => c.type === 'text' && c.text)\n .map((c: { type: string; text?: string }) => c.text!)\n .join(' ');\n throw new Error(`NAVI MCP error (${tool}): ${msg || 'unknown error'}`);\n }\n return parseMcpJson<T>(result.content);\n}\n\nexport const balanceCheckTool = buildTool({\n name: 'balance_check',\n description:\n 'Get the user\\'s full balance breakdown. Returns wallet holdings (tokens the user owns — NOT savings), NAVI savings deposits (USDC deposited into NAVI Protocol earning yield), outstanding debt, pending rewards, gas reserve, total net worth, and saveableUsdc (only USDC can be deposited into savings). IMPORTANT: wallet holdings like GOLD, SUI, USDT are NOT savings positions — they are just tokens sitting in the wallet.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n // [v1.5.1] Wallet contents change after every send/swap/save/etc.\n // Microcompact must NEVER dedupe these calls — each one reflects a\n // different on-chain state.\n cacheable: false,\n\n async call(_input, context) {\n if (hasNaviMcp(context)) {\n const address = getWalletAddress(context);\n const mgr = getMcpManager(context);\n\n const [walletCoins, positions, rewards] = await Promise.all([\n fetchWalletCoins(address, context.suiRpcUrl).catch((err) => {\n console.warn('[balance_check] Sui RPC coin fetch failed, falling back to MCP:', err);\n return null;\n }),\n callNavi(mgr, NaviTools.GET_POSITIONS, {\n address,\n protocols: 'navi',\n format: 'json',\n }),\n callNavi(mgr, NaviTools.GET_AVAILABLE_REWARDS, { address }),\n ]);\n\n let coins = walletCoins;\n if (!coins || coins.length === 0) {\n const mcpCoins = await callNavi(mgr, NaviTools.GET_COINS, { address }).catch(() => []);\n const coinArr = Array.isArray(mcpCoins) ? mcpCoins as Array<{ coinType?: string; totalBalance?: string; symbol?: string; decimals?: number }> : [];\n coins = coinArr.map((c) => ({\n coinType: c.coinType ?? '',\n symbol: c.symbol ?? '',\n decimals: c.decimals ?? getDecimalsForCoinType(c.coinType ?? ''),\n totalBalance: c.totalBalance ?? '0',\n coinObjectCount: 0,\n }));\n }\n\n const VSUI_COIN_TYPE = '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT';\n const coinTypes = coins.map((c) => c.coinType).filter(Boolean);\n const prices = await fetchTokenPrices(coinTypes).catch((err) => {\n console.warn('[balance_check] DefiLlama price fetch failed:', err);\n return {} as Record<string, number>;\n });\n\n if (coins.some((c) => c.coinType === VSUI_COIN_TYPE) && !prices[VSUI_COIN_TYPE]) {\n try {\n const statsRes = await fetch('https://open-api.naviprotocol.io/api/volo/stats', {\n signal: AbortSignal.timeout(5_000),\n });\n if (statsRes.ok) {\n const statsJson = await statsRes.json() as { data?: { exchange_rate?: number; exchangeRate?: number } };\n const d = statsJson.data ?? statsJson as { exchange_rate?: number; exchangeRate?: number };\n const rate = d.exchange_rate ?? d.exchangeRate ?? 1.05;\n const suiPrice = prices['0x2::sui::SUI'] ?? 0;\n prices[VSUI_COIN_TYPE] = rate * suiPrice;\n }\n } catch {\n const suiPrice = prices['0x2::sui::SUI'] ?? 0;\n prices[VSUI_COIN_TYPE] = suiPrice * 1.05;\n }\n }\n\n let availableUsd = 0;\n let stablesUsd = 0;\n let gasReserveUsd = 0;\n\n const STABLE_SYMBOLS = new Set(['USDC', 'USDT', 'USDe', 'USDsui', 'wUSDC', 'wUSDT']);\n const holdings: Array<{ symbol: string; coinType: string; balance: number; usdValue: number }> = [];\n\n for (const coin of coins) {\n const balance = Number(coin.totalBalance) / 10 ** coin.decimals;\n const price = prices[coin.coinType] ?? 0;\n\n if (coin.symbol === 'SUI' || coin.coinType === '0x2::sui::SUI') {\n const reserveAmount = Math.min(balance, GAS_RESERVE_SUI);\n gasReserveUsd = reserveAmount * price;\n availableUsd += (balance - reserveAmount) * price;\n } else {\n availableUsd += balance * price;\n if (STABLE_SYMBOLS.has(coin.symbol)) {\n stablesUsd += balance * price;\n }\n }\n\n if (balance > 0) {\n holdings.push({\n symbol: coin.symbol || coin.coinType.split('::').pop() || coin.coinType,\n coinType: coin.coinType,\n balance,\n usdValue: balance * price,\n });\n }\n }\n\n let savings: number;\n let debt: number;\n let pendingRewardsUsd: number;\n\n if (context.positionFetcher && context.walletAddress) {\n const sp = await context.positionFetcher(context.walletAddress);\n savings = sp.savings;\n debt = sp.borrows;\n pendingRewardsUsd = sp.pendingRewards;\n } else {\n const posEntries = transformPositions(positions);\n const rewardEntries = transformRewards(rewards);\n savings = posEntries\n .filter((p) => p.type === 'supply')\n .reduce((sum, p) => sum + p.valueUsd, 0);\n debt = posEntries\n .filter((p) => p.type === 'borrow')\n .reduce((sum, p) => sum + p.valueUsd, 0);\n pendingRewardsUsd = rewardEntries.reduce((sum, r) => sum + r.valueUsd, 0);\n }\n\n const visibleHoldings = holdings\n .filter((h) => h.usdValue >= 0.01)\n .sort((a, b) => b.usdValue - a.usdValue);\n\n const usdcHolding = holdings.find((h) => h.symbol === 'USDC');\n const saveableUsdc = usdcHolding ? usdcHolding.balance : 0;\n\n const bal = {\n available: availableUsd,\n savings,\n debt,\n pendingRewards: pendingRewardsUsd,\n gasReserve: gasReserveUsd,\n total: availableUsd + savings + gasReserveUsd + pendingRewardsUsd - debt,\n stables: stablesUsd,\n holdings: visibleHoldings,\n saveableUsdc,\n };\n\n const holdingsList = visibleHoldings.map((h) => `${h.symbol}: ${h.balance < 1 ? h.balance.toFixed(6) : h.balance.toFixed(2)} ($${h.usdValue.toFixed(2)})`).join(', ');\n return {\n data: bal,\n displayText: `Balance: $${bal.total.toFixed(2)} total. Wallet holdings (NOT savings): ${holdingsList || 'none'}. NAVI savings deposits: $${bal.savings.toFixed(2)}. Saveable USDC (only USDC can be saved): ${saveableUsdc.toFixed(2)} USDC.`,\n };\n }\n\n const agent = requireAgent(context);\n const balance = await agent.balance();\n\n const gasReserveUsd = typeof balance.gasReserve === 'number'\n ? balance.gasReserve\n : (balance.gasReserve as { usdEquiv: number }).usdEquiv ?? 0;\n const stablesTotal = typeof balance.stables === 'number'\n ? balance.stables\n : Object.values(balance.stables as Record<string, number>).reduce((a: number, b: number) => a + b, 0);\n\n const sdkHoldings = (balance as unknown as Record<string, unknown>).holdings;\n const holdingsArr = Array.isArray(sdkHoldings) ? sdkHoldings : [];\n\n const usdcHolding = holdingsArr.find((h: { symbol?: string }) => h.symbol === 'USDC');\n const sdkSaveableUsdc = usdcHolding ? ((usdcHolding as { balance?: number }).balance ?? 0) : 0;\n\n return {\n data: {\n available: balance.available,\n savings: balance.savings,\n debt: balance.debt,\n pendingRewards: balance.pendingRewards,\n gasReserve: gasReserveUsd,\n total: balance.total,\n stables: stablesTotal,\n holdings: holdingsArr,\n saveableUsdc: sdkSaveableUsdc,\n },\n displayText: `Balance: $${balance.total.toFixed(2)} total. Wallet: $${balance.available.toFixed(2)} available. NAVI savings deposits: $${balance.savings.toFixed(2)}. Saveable USDC (only USDC can be saved): ${sdkSaveableUsdc.toFixed(2)} USDC.`,\n };\n },\n});\n","import type { McpClientManager, McpCallResult } from './mcp-client.js';\nimport { NAVI_SERVER_NAME, NaviTools } from './navi-config.js';\nimport {\n parseMcpJson,\n transformBalance,\n transformHealthFactor,\n transformPositions,\n transformRates,\n transformRewards,\n transformSavings,\n type BalanceResult,\n type HealthFactorResult,\n type PendingReward,\n type PositionEntry,\n type RatesResult,\n type SavingsResult,\n} from './navi-transforms.js';\n\n// ---------------------------------------------------------------------------\n// Options for composite reads\n// ---------------------------------------------------------------------------\n\nexport interface NaviReadOptions {\n /** MCP server name override (default: 'navi'). */\n serverName?: string;\n}\n\nfunction sn(opts?: NaviReadOptions): string {\n return opts?.serverName ?? NAVI_SERVER_NAME;\n}\n\n// ---------------------------------------------------------------------------\n// Helper: call NAVI tool and parse JSON response\n// ---------------------------------------------------------------------------\n\nasync function callNavi<T = unknown>(\n manager: McpClientManager,\n tool: string,\n args: Record<string, unknown> = {},\n opts?: NaviReadOptions,\n): Promise<T> {\n const result: McpCallResult = await manager.callTool(sn(opts), tool, args);\n if (result.isError) {\n const msg = result.content\n .filter((c) => c.type === 'text' && c.text)\n .map((c) => c.text!)\n .join(' ');\n throw new Error(`NAVI MCP error (${tool}): ${msg || 'unknown error'}`);\n }\n return parseMcpJson<T>(result.content);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: rates\n// ---------------------------------------------------------------------------\n\nexport async function fetchRates(\n manager: McpClientManager,\n opts?: NaviReadOptions,\n): Promise<RatesResult> {\n const pools = await callNavi(manager, NaviTools.GET_POOLS, {}, opts);\n return transformRates(pools);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: health factor (enriched with positions)\n// ---------------------------------------------------------------------------\n\nexport async function fetchHealthFactor(\n manager: McpClientManager,\n address: string,\n opts?: NaviReadOptions,\n): Promise<HealthFactorResult> {\n const [hfRaw, posRaw] = await Promise.all([\n callNavi(manager, NaviTools.GET_HEALTH_FACTOR, { address }, opts),\n callNavi(manager, NaviTools.GET_POSITIONS, {\n address,\n protocols: 'navi',\n format: 'json',\n }, opts),\n ]);\n\n return transformHealthFactor(hfRaw, posRaw);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: balance breakdown\n// ---------------------------------------------------------------------------\n\nexport async function fetchBalance(\n manager: McpClientManager,\n address: string,\n opts?: NaviReadOptions,\n): Promise<BalanceResult> {\n const [coins, positions, rewards, pools] = await Promise.all([\n callNavi(manager, NaviTools.GET_COINS, { address }, opts),\n callNavi(manager, NaviTools.GET_POSITIONS, {\n address,\n protocols: 'navi',\n format: 'json',\n }, opts),\n callNavi(manager, NaviTools.GET_AVAILABLE_REWARDS, { address }, opts),\n callNavi(manager, NaviTools.GET_POOLS, {}, opts),\n ]);\n\n const rates = transformRates(pools);\n const prices: Record<string, number> = {};\n for (const [symbol, rate] of Object.entries(rates)) {\n prices[symbol] = rate.price;\n }\n\n return transformBalance(coins, positions, rewards, prices);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: savings info (positions + pool APYs)\n// ---------------------------------------------------------------------------\n\nexport async function fetchSavings(\n manager: McpClientManager,\n address: string,\n opts?: NaviReadOptions,\n): Promise<SavingsResult> {\n const [positions, pools] = await Promise.all([\n callNavi(manager, NaviTools.GET_POSITIONS, {\n address,\n protocols: 'navi',\n format: 'json',\n }, opts),\n callNavi(manager, NaviTools.GET_POOLS, {}, opts),\n ]);\n\n return transformSavings(positions, pools);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: positions only\n// ---------------------------------------------------------------------------\n\nexport async function fetchPositions(\n manager: McpClientManager,\n address: string,\n opts?: NaviReadOptions & { protocols?: string },\n): Promise<PositionEntry[]> {\n const raw = await callNavi(\n manager,\n NaviTools.GET_POSITIONS,\n { address, protocols: opts?.protocols ?? 'navi', format: 'json' },\n opts,\n );\n return transformPositions(raw);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: available rewards\n// ---------------------------------------------------------------------------\n\nexport async function fetchAvailableRewards(\n manager: McpClientManager,\n address: string,\n opts?: NaviReadOptions,\n): Promise<PendingReward[]> {\n const raw = await callNavi(\n manager,\n NaviTools.GET_AVAILABLE_REWARDS,\n { address },\n opts,\n );\n return transformRewards(raw);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: protocol stats\n// ---------------------------------------------------------------------------\n\nexport interface ProtocolStats {\n tvl: number;\n totalBorrowUsd: number;\n utilization: number;\n maxApy: number;\n totalUsers: number;\n}\n\nexport async function fetchProtocolStats(\n manager: McpClientManager,\n opts?: NaviReadOptions,\n): Promise<ProtocolStats> {\n const raw = await callNavi<{\n tvl?: number;\n totalBorrowUsd?: number;\n averageUtilization?: number;\n maxApy?: number;\n userAmount?: number;\n }>(manager, NaviTools.GET_PROTOCOL_STATS, {}, opts);\n\n return {\n tvl: raw?.tvl ?? 0,\n totalBorrowUsd: raw?.totalBorrowUsd ?? 0,\n utilization: raw?.averageUtilization ?? 0,\n maxApy: raw?.maxApy ?? 0,\n totalUsers: raw?.userAmount ?? 0,\n };\n}\n","import { z } from 'zod';\nimport { fetchSavings } from '../navi-reads.js';\nimport { buildTool } from '../tool.js';\nimport { hasNaviMcp, getMcpManager, getWalletAddress, requireAgent } from './utils.js';\nimport type { PositionEntry, SavingsResult } from '../navi-transforms.js';\nimport type { ServerPositionData } from '../types.js';\n\nconst DUST_THRESHOLD_USD = 0.01;\n\nfunction buildSavingsFromPositions(sp: ServerPositionData): SavingsResult {\n const positions: PositionEntry[] = [\n ...sp.supplies\n .filter((s) => s.amountUsd >= DUST_THRESHOLD_USD)\n .map((s) => ({\n protocol: s.protocol,\n type: 'supply' as const,\n symbol: s.asset,\n amount: s.amount,\n valueUsd: s.amountUsd,\n apy: s.apy,\n liquidationThreshold: 0,\n })),\n ...sp.borrows_detail\n .filter((b) => b.amountUsd >= DUST_THRESHOLD_USD)\n .map((b) => ({\n protocol: b.protocol,\n type: 'borrow' as const,\n symbol: b.asset,\n amount: b.amount,\n valueUsd: b.amountUsd,\n apy: b.apy,\n liquidationThreshold: 0,\n })),\n ];\n\n const supplied = sp.savings;\n const weightedApy = supplied > 0 ? sp.savingsRate : 0;\n const dailyEarning = (supplied * weightedApy) / 365;\n\n return {\n positions,\n earnings: {\n totalYieldEarned: 0,\n currentApy: weightedApy,\n dailyEarning,\n supplied,\n },\n fundStatus: {\n supplied,\n apy: weightedApy,\n earnedToday: dailyEarning,\n earnedAllTime: 0,\n projectedMonthly: dailyEarning * 30,\n },\n };\n}\n\nfunction formatSavingsDisplay(result: SavingsResult): string {\n const { positions, earnings, fundStatus } = result;\n const supplies = positions.filter((p) => p.type === 'supply');\n const borrows = positions.filter((p) => p.type === 'borrow');\n\n const lines: string[] = [];\n if (supplies.length > 0) {\n lines.push(`Savings: $${fundStatus.supplied.toFixed(2)} at ${(earnings.currentApy * 100).toFixed(2)}% blended APY`);\n for (const s of supplies) {\n lines.push(` ${s.symbol}: ${s.amount.toFixed(s.amount < 1 ? 6 : 2)} ($${s.valueUsd.toFixed(2)}) at ${(s.apy * 100).toFixed(2)}% APY`);\n }\n } else {\n lines.push('No savings positions.');\n }\n if (borrows.length > 0) {\n const totalDebt = borrows.reduce((s, b) => s + b.valueUsd, 0);\n lines.push(`Debt: $${totalDebt.toFixed(2)}`);\n }\n lines.push(`Daily earnings: $${fundStatus.earnedToday.toFixed(4)}`);\n lines.push(`Monthly projected: $${fundStatus.projectedMonthly.toFixed(4)}`);\n return lines.join('\\n');\n}\n\nexport const savingsInfoTool = buildTool({\n name: 'savings_info',\n description:\n 'Get detailed savings positions and earnings: current deposits by protocol, APY, total yield earned, daily earning rate, and projected monthly returns.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n // [v1.5.1] NAVI deposits change on save_deposit / withdraw / claim.\n // Each call reflects a fresh on-chain snapshot — never dedupe.\n cacheable: false,\n\n async call(_input, context) {\n if (context.positionFetcher && context.walletAddress) {\n const sp = await context.positionFetcher(context.walletAddress);\n const result = buildSavingsFromPositions(sp);\n return { data: result, displayText: formatSavingsDisplay(result) };\n }\n\n if (hasNaviMcp(context)) {\n const savings = await fetchSavings(\n getMcpManager(context),\n getWalletAddress(context),\n );\n savings.positions = savings.positions.filter((p) => p.valueUsd >= DUST_THRESHOLD_USD);\n return { data: savings, displayText: formatSavingsDisplay(savings) };\n }\n\n const agent = requireAgent(context);\n const [posResult, earnings, fundStatus] = await Promise.all([\n agent.positions(),\n agent.earnings(),\n agent.fundStatus(),\n ]);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const positions = (posResult.positions ?? []).map((p: any) => ({\n protocol: (p.protocol ?? 'navi') as string,\n type: p.type === 'borrow' ? ('borrow' as const) : ('supply' as const),\n symbol: ((p.asset ?? p.symbol) ?? 'UNKNOWN') as string,\n amount: (p.amount ?? 0) as number,\n valueUsd: ((p.amountUsd ?? p.valueUsd) ?? 0) as number,\n apy: (p.apy ?? 0) as number,\n liquidationThreshold: (p.liquidationThreshold ?? 0) as number,\n })).filter((p: PositionEntry) => p.valueUsd >= DUST_THRESHOLD_USD);\n\n const result: SavingsResult = {\n positions,\n earnings: {\n totalYieldEarned: earnings.totalYieldEarned,\n currentApy: earnings.currentApy,\n dailyEarning: earnings.dailyEarning,\n supplied: earnings.supplied,\n },\n fundStatus: {\n supplied: fundStatus.supplied,\n apy: fundStatus.apy,\n earnedToday: fundStatus.earnedToday,\n earnedAllTime: fundStatus.earnedAllTime,\n projectedMonthly: fundStatus.projectedMonthly,\n },\n };\n\n return { data: result, displayText: formatSavingsDisplay(result) };\n },\n});\n","import { z } from 'zod';\nimport { fetchHealthFactor } from '../navi-reads.js';\nimport { buildTool } from '../tool.js';\nimport { hasNaviMcp, getMcpManager, getWalletAddress, requireAgent } from './utils.js';\n\nfunction hfStatus(hf: number): string {\n if (hf >= 2.0) return 'healthy';\n if (hf >= 1.5) return 'moderate';\n if (hf >= 1.2) return 'warning';\n return 'critical';\n}\n\nexport const healthCheckTool = buildTool({\n name: 'health_check',\n description:\n 'Check the lending health factor: current HF ratio, total supplied collateral, total borrowed, max additional borrow capacity, and liquidation threshold. HF < 1.5 is risky, < 1.2 is critical.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n // [v1.5.1] Health factor changes on every borrow / repay / collateral\n // movement and even passively as oracle prices update. Never dedupe.\n cacheable: false,\n\n async call(_input, context) {\n if (context.positionFetcher && context.walletAddress) {\n const sp = await context.positionFetcher(context.walletAddress);\n const hfVal = sp.healthFactor ?? (sp.borrows > 0 ? 0 : Infinity);\n const status = hfStatus(hfVal);\n const displayHf = Number.isFinite(hfVal) ? hfVal.toFixed(2) : '∞';\n return {\n data: {\n healthFactor: hfVal,\n supplied: sp.savings,\n borrowed: sp.borrows,\n maxBorrow: sp.maxBorrow,\n liquidationThreshold: 0,\n status,\n },\n displayText: `Health Factor: ${displayHf} (${status})`,\n };\n }\n\n if (hasNaviMcp(context)) {\n const hf = await fetchHealthFactor(\n getMcpManager(context),\n getWalletAddress(context),\n );\n const status = hfStatus(hf.healthFactor);\n const displayHf = Number.isFinite(hf.healthFactor) ? hf.healthFactor.toFixed(2) : '∞';\n return {\n data: { ...hf, status },\n displayText: `Health Factor: ${displayHf} (${status})`,\n };\n }\n\n const agent = requireAgent(context);\n const hf = await agent.healthFactor();\n const status = hfStatus(hf.healthFactor);\n\n return {\n data: {\n healthFactor: hf.healthFactor,\n supplied: hf.supplied,\n borrowed: hf.borrowed,\n maxBorrow: hf.maxBorrow,\n liquidationThreshold: hf.liquidationThreshold,\n status,\n },\n displayText: `Health Factor: ${hf.healthFactor.toFixed(2)} (${status})`,\n };\n },\n});\n","import { z } from 'zod';\nimport { fetchRates } from '../navi-reads.js';\nimport { buildTool } from '../tool.js';\nimport { hasNaviMcpGlobal, getMcpManager, hasAgent, requireAgent } from './utils.js';\n\nconst YIELDS_API = 'https://yields.llama.fi';\n\nfunction formatRatesSummary(rates: Record<string, { saveApy: number; borrowApy: number }>): string {\n return Object.entries(rates)\n .map(([asset, r]) => `${asset}: Save ${(r.saveApy * 100).toFixed(2)}% / Borrow ${(r.borrowApy * 100).toFixed(2)}%`)\n .join(', ');\n}\n\ninterface DefiLlamaPool {\n chain: string;\n project: string;\n symbol: string;\n apy: number;\n apyBorrow?: number;\n tvlUsd: number;\n}\n\nasync function fetchRatesFromDefiLlama(): Promise<Record<string, { saveApy: number; borrowApy: number }>> {\n const res = await fetch(`${YIELDS_API}/pools`, { signal: AbortSignal.timeout(15_000) });\n if (!res.ok) throw new Error(`DefiLlama API error: HTTP ${res.status}`);\n const data = await res.json() as { data: DefiLlamaPool[] };\n\n const naviPools = (data.data ?? []).filter(\n (p) => p.chain === 'Sui' && p.project === 'navi-lending' && p.tvlUsd > 10_000,\n );\n\n const result: Record<string, { saveApy: number; borrowApy: number }> = {};\n for (const pool of naviPools) {\n const saveApy = (pool.apy ?? 0) / 100;\n const borrowApy = pool.apyBorrow != null ? Math.abs(pool.apyBorrow) / 100 : 0;\n result[pool.symbol] = { saveApy, borrowApy };\n }\n return result;\n}\n\nexport const ratesInfoTool = buildTool({\n name: 'rates_info',\n description:\n 'Get current NAVI Protocol lending/savings rates (APY) for supported assets on Sui. Returns save APY and borrow APY per asset.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n\n async call(_input, context) {\n // MCP first (real-time, includes borrow rates) — no wallet needed for global rates\n if (hasNaviMcpGlobal(context)) {\n const rates = await fetchRates(getMcpManager(context));\n return { data: rates, displayText: formatRatesSummary(rates) };\n }\n\n // SDK agent second\n if (hasAgent(context)) {\n const agent = requireAgent(context);\n const rates = await agent.rates();\n return { data: rates, displayText: formatRatesSummary(rates) };\n }\n\n // DefiLlama fallback (supply-only, no borrow rates)\n const rates = await fetchRatesFromDefiLlama();\n return { data: rates, displayText: formatRatesSummary(rates) };\n },\n});\n","import { z } from 'zod';\nimport {\n classifyTransaction,\n extractTransferDetails,\n type ClassifyBalanceChange,\n type TxDirection,\n} from '@t2000/sdk';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nconst SUI_MAINNET_URL = 'https://fullnode.mainnet.sui.io:443';\n\ntype RpcBalanceChange = ClassifyBalanceChange;\n\ninterface RpcTxBlock {\n digest: string;\n timestampMs?: string;\n transaction?: unknown;\n effects?: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } };\n balanceChanges?: RpcBalanceChange[];\n}\n\ninterface TxRecord {\n digest: string;\n /**\n * [v1.4] Coarse bucket — one of `'send' | 'lending' | 'swap' |\n * 'transaction'`. Used by the ACI `action` filter and persisted\n * downstream queries depend on these values, so they are STABLE.\n */\n action: string;\n /**\n * [v1.5.3] Finer-grained display label derived from the\n * Move-call function name (e.g. `'deposit'`, `'withdraw'`,\n * `'payment_link'`, `'on-chain'`). Optional — frontends should\n * fall back to `action` when missing. Never used by filters.\n */\n label?: string;\n amount?: number;\n asset?: string;\n recipient?: string;\n /**\n * [v0.46.2] Direction of the user's principal balance change on\n * this tx (`'in'` → user received, `'out'` → user spent). Lets the\n * card render the correct sign without parsing the textual label.\n */\n direction?: TxDirection;\n timestamp: number;\n date?: string;\n gasCost?: number;\n}\n\nfunction parseRpcTx(tx: RpcTxBlock, address: string): TxRecord {\n const gasUsed = tx.effects?.gasUsed;\n const gasCost = gasUsed\n ? (Number(gasUsed.computationCost) + Number(gasUsed.storageCost) - Number(gasUsed.storageRebate)) / 1e9\n : undefined;\n\n const moveCallTargets: string[] = [];\n const commandTypes: string[] = [];\n try {\n /**\n * Sui JSON-RPC `suix_queryTransactionBlocks` returns the\n * ProgrammableTransaction body with the legacy field name\n * `transactions` (plural). Newer SDK-side types refer to the same\n * data as `commands`. Cover both — the v1.5.3 engine path was\n * only checking `commands`, which always returned empty for prod\n * RPC responses, so every row in the transaction history card\n * fell back to `label: 'on-chain'`.\n */\n const data = (tx.transaction as Record<string, unknown>)?.data as Record<string, unknown> | undefined;\n const inner = data?.transaction as Record<string, unknown> | undefined;\n const commands = (inner?.commands ?? inner?.transactions) as Record<string, unknown>[] | undefined;\n if (Array.isArray(commands)) {\n for (const cmd of commands) {\n if (cmd.MoveCall) {\n const mc = cmd.MoveCall as { package: string; module: string; function: string };\n moveCallTargets.push(`${mc.package}::${mc.module}::${mc.function}`);\n commandTypes.push('MoveCall');\n } else if (cmd.TransferObjects) {\n commandTypes.push('TransferObjects');\n }\n }\n }\n } catch { /* best effort */ }\n\n const changes = tx.balanceChanges ?? [];\n const { amount, asset, recipient, direction } = extractTransferDetails(changes, address);\n\n const timestampMs = Number(tx.timestampMs ?? 0);\n const { action, label } = classifyTransaction(moveCallTargets, commandTypes, changes, address);\n\n return {\n digest: tx.digest,\n action,\n label,\n amount,\n asset,\n recipient,\n direction,\n timestamp: timestampMs,\n date: timestampMs > 0 ? new Date(timestampMs).toISOString() : undefined,\n gasCost,\n };\n}\n\nasync function queryHistoryPage(\n rpcUrl: string,\n address: string,\n limit: number,\n cursor: string | null,\n): Promise<{ data: RpcTxBlock[]; nextCursor: string | null; hasNextPage: boolean }> {\n const res = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'suix_queryTransactionBlocks',\n params: [\n { filter: { FromAddress: address }, options: { showEffects: true, showInput: true, showBalanceChanges: true } },\n cursor,\n limit,\n true,\n ],\n }),\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!res.ok) throw new Error(`Sui RPC error: ${res.status}`);\n const json = (await res.json()) as {\n result?: { data: RpcTxBlock[]; nextCursor: string | null; hasNextPage: boolean };\n error?: { message: string };\n };\n if (json.error) throw new Error(`RPC error: ${json.error.message}`);\n return {\n data: json.result?.data ?? [],\n nextCursor: json.result?.nextCursor ?? null,\n hasNextPage: json.result?.hasNextPage ?? false,\n };\n}\n\nasync function queryHistoryRpc(rpcUrl: string, address: string, limit: number): Promise<TxRecord[]> {\n const page = await queryHistoryPage(rpcUrl, address, limit, null);\n return page.data.map((tx) => parseRpcTx(tx, address));\n}\n\n/**\n * Paginate backwards through transaction history to find transactions\n * around a specific date. Returns up to `limit` transactions from that day.\n */\nasync function queryHistoryByDate(\n rpcUrl: string,\n address: string,\n targetDate: string,\n limit: number,\n): Promise<TxRecord[]> {\n const target = new Date(targetDate);\n const dayStart = new Date(target.getFullYear(), target.getMonth(), target.getDate()).getTime();\n const dayEnd = dayStart + 86_400_000;\n const MAX_PAGES = 20;\n const PAGE_SIZE = 50;\n\n const results: TxRecord[] = [];\n let cursor: string | null = null;\n\n for (let page = 0; page < MAX_PAGES; page++) {\n const res = await queryHistoryPage(rpcUrl, address, PAGE_SIZE, cursor);\n if (res.data.length === 0) break;\n\n for (const tx of res.data) {\n const ts = Number(tx.timestampMs ?? 0);\n if (ts === 0) continue;\n\n if (ts < dayStart) {\n return results.slice(0, limit);\n }\n\n if (ts >= dayStart && ts < dayEnd) {\n results.push(parseRpcTx(tx, address));\n }\n }\n\n if (!res.hasNextPage || !res.nextCursor) break;\n cursor = res.nextCursor;\n }\n\n return results.slice(0, limit);\n}\n\n/**\n * [v1.4 ACI] Allowed values for the `action` filter — kept in sync with\n * `classifyAction` above (the labels it can return).\n */\nconst HISTORY_ACTIONS = ['send', 'lending', 'swap', 'transaction'] as const;\ntype HistoryAction = (typeof HISTORY_ACTIONS)[number];\n\nconst DEFAULT_LOOKBACK_DAYS = 30;\n\nexport const transactionHistoryTool = buildTool({\n name: 'transaction_history',\n description:\n 'Retrieve recent transaction history (last 30 days by default): sends, saves, withdrawals, borrows, repayments, and rewards claims. Pass `date` (YYYY-MM-DD) for a specific day, `action` to filter by category (send/lending/swap), or both.',\n inputSchema: z.object({\n limit: z.number().int().min(1).max(50).optional(),\n date: z.string().optional().describe('Specific date to search for transactions (YYYY-MM-DD format). Paginates back to find that day.'),\n action: z.enum(HISTORY_ACTIONS).optional().describe('Filter by action: send, lending, swap, or transaction.'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n limit: {\n type: 'number',\n description: 'Maximum number of transactions to return (1-50, default 10)',\n },\n date: {\n type: 'string',\n description: 'Specific date to search for transactions (YYYY-MM-DD format). Paginates back to find that day.',\n },\n action: {\n type: 'string',\n enum: [...HISTORY_ACTIONS],\n description: 'Filter results by action category: send, lending, swap, or transaction.',\n },\n },\n },\n isReadOnly: true,\n maxResultSizeChars: 8_000,\n // [v1.5.1] New transactions land continuously. Even with an explicit\n // `date` filter the dedupe is wrong post-write because the just-\n // executed write may now be in history. Never dedupe.\n cacheable: false,\n /**\n * [v1.5.2] Custom truncation that preserves the structured shape.\n *\n * The default `budgetToolResult` slices the JSON string at the byte\n * limit, appends a \"[Truncated…]\" note, and tries `JSON.parse` — which\n * always fails for sliced JSON, so the engine falls back to returning\n * the raw string. The frontend's `transaction_history` card renderer\n * then sees `typeof data !== 'object'` and bails, so the rich card\n * never renders even though the LLM has the full text.\n *\n * Strategy: progressively halve the `transactions` array until the\n * serialized payload fits, then stamp `_truncated: true` and the\n * original length so the LLM knows to recall with `limit` if it needs\n * older entries. Result is always valid JSON, always object-shaped.\n */\n summarizeOnTruncate(serialized, maxChars) {\n type ParsedHistory = {\n transactions: unknown[];\n count: number;\n [k: string]: unknown;\n };\n let parsed: ParsedHistory;\n try {\n parsed = JSON.parse(serialized) as ParsedHistory;\n } catch {\n return JSON.stringify({\n transactions: [],\n count: 0,\n _truncated: true,\n _note: 'Result exceeded size budget and could not be summarized.',\n });\n }\n const original = Array.isArray(parsed.transactions) ? parsed.transactions : [];\n let trimmed = original.slice();\n let payload = JSON.stringify({ ...parsed, transactions: trimmed, _truncated: true, _originalCount: original.length });\n while (payload.length > maxChars && trimmed.length > 1) {\n trimmed = trimmed.slice(0, Math.max(1, Math.floor(trimmed.length / 2)));\n payload = JSON.stringify({ ...parsed, transactions: trimmed, _truncated: true, _originalCount: original.length });\n }\n return payload;\n },\n\n async call(\n input,\n context,\n ): Promise<{ data: Record<string, unknown>; displayText: string }> {\n const limit = input.limit ?? 10;\n const action = input.action as HistoryAction | undefined;\n\n /**\n * [v1.4] After fetching, narrow by `action` (when supplied), and trim\n * to a `DEFAULT_LOOKBACK_DAYS` window when no explicit date is given —\n * keeps results recent and bounded so the LLM doesn't over-summarize.\n */\n const finalize = (records: TxRecord[]): TxRecord[] => {\n let scoped = records;\n if (action) scoped = scoped.filter((r) => r.action === action);\n return scoped.slice(0, limit);\n };\n\n if (context.agent) {\n const agent = requireAgent(context);\n const records = await agent.history({ limit: input.date ? limit : Math.max(limit * 4, 50) });\n const filtered = finalize(records);\n return {\n data: { transactions: filtered, count: filtered.length, date: input.date ?? null, action: action ?? null },\n displayText: `${filtered.length} recent transaction(s)`,\n };\n }\n\n if (!context.walletAddress || !context.suiRpcUrl) {\n throw new Error('Transaction history requires a wallet address');\n }\n\n if (input.date) {\n const records = await queryHistoryByDate(\n context.suiRpcUrl,\n context.walletAddress,\n input.date,\n Math.max(limit * 4, 50),\n );\n const filtered = finalize(records);\n const dateLabel = new Date(input.date).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' });\n return {\n data: { transactions: filtered, count: filtered.length, date: input.date, action: action ?? null },\n displayText: filtered.length > 0\n ? `${filtered.length} transaction(s) on ${dateLabel}`\n : `No transactions found on ${dateLabel}`,\n };\n }\n\n // No date — last 30 days. Over-fetch then trim by lookback window.\n const cutoffMs = Date.now() - DEFAULT_LOOKBACK_DAYS * 86_400_000;\n const records = await queryHistoryRpc(\n context.suiRpcUrl,\n context.walletAddress,\n Math.max(limit * 4, 50),\n );\n const recent = records.filter((r) => r.timestamp >= cutoffMs);\n const filtered = finalize(recent);\n return {\n data: {\n transactions: filtered,\n count: filtered.length,\n date: null,\n action: action ?? null,\n lookbackDays: DEFAULT_LOOKBACK_DAYS,\n },\n displayText: `${filtered.length} transaction(s) in the last ${DEFAULT_LOOKBACK_DAYS} days`,\n };\n },\n});\n","import { z } from 'zod';\nimport { assertAllowedAsset } from '@t2000/sdk';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const saveDepositTool = buildTool({\n name: 'save_deposit',\n description:\n 'Deposit USDC into NAVI savings to earn yield. ONLY USDC is accepted. If the user asks to save/deposit any other token (USDT, SUI, USDe, etc.), do NOT call this tool and do NOT automatically swap their tokens and deposit. Instead, tell the user that only USDC deposits are supported and ask if they would like to swap to USDC first. Let the user decide — never auto-chain swap + deposit.',\n inputSchema: z.object({\n amount: z.number().positive(),\n asset: z.string().optional().describe('Must be USDC or omitted. Any other asset is rejected.'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: {\n description: 'Exact amount of USDC to deposit',\n },\n asset: {\n type: 'string',\n description: 'Must be USDC or omitted. Any other asset is rejected.',\n },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, requiresBalance: true },\n preflight: (input) => {\n if (input.asset && input.asset.toUpperCase() !== 'USDC') {\n return { valid: false, error: `Only USDC deposits are supported. Got: \"${input.asset}\"` };\n }\n return { valid: true };\n },\n\n async call(input, context) {\n assertAllowedAsset('save', input.asset);\n\n const agent = requireAgent(context);\n const result = await agent.save({ amount: input.amount });\n\n return {\n data: {\n success: result.success,\n tx: result.tx,\n amount: result.amount,\n asset: 'USDC',\n apy: result.apy,\n fee: result.fee,\n gasCost: result.gasCost,\n savingsBalance: result.savingsBalance,\n },\n displayText: `Saved ${result.amount.toFixed(result.amount < 1 ? 6 : 2)} USDC at ${(result.apy * 100).toFixed(2)}% APY (tx: ${result.tx.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const withdrawTool = buildTool({\n name: 'withdraw',\n description:\n 'Withdraw from NAVI lending back to wallet. Defaults to USDC. Also supports withdrawing legacy positions (USDe, USDsui, SUI) if the user has them.',\n inputSchema: z.object({\n amount: z.number().positive(),\n asset: z.string().optional().describe('Asset to withdraw (default: USDC). Legacy positions: USDe, USDsui, SUI'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: {\n description: 'Exact amount to withdraw in token units',\n },\n asset: {\n type: 'string',\n description: 'Asset to withdraw (default: USDC). Legacy positions: USDe, USDsui, SUI',\n },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, affectsHealth: true },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.withdraw({\n amount: input.amount,\n asset: input.asset,\n });\n\n const withdrawnAsset = (result as { asset?: string }).asset ?? input.asset ?? 'USDC';\n return {\n data: {\n success: result.success,\n tx: result.tx,\n amount: result.amount,\n asset: withdrawnAsset,\n gasCost: result.gasCost,\n },\n displayText: `Withdrew ${result.amount.toFixed(result.amount < 1 ? 6 : 2)} ${withdrawnAsset} (tx: ${result.tx.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const sendTransferTool = buildTool({\n name: 'send_transfer',\n description:\n 'Send USDC to another Sui address or contact name. Validates the address, checks balance, and executes the on-chain transfer. Returns tx hash, gas cost, and updated balance.',\n inputSchema: z.object({\n to: z.string().min(1),\n amount: z.number().positive(),\n memo: z.string().optional(),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n to: {\n type: 'string',\n description: 'Sui address (0x…) or saved contact name',\n },\n amount: {\n type: 'number',\n description: 'Amount in USD to send',\n },\n memo: {\n type: 'string',\n description: 'Optional note attached to the transfer (shown in transaction receipt)',\n },\n },\n required: ['to', 'amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, requiresBalance: true, irreversible: true },\n preflight: (input) => {\n if (input.to.startsWith('0x') && !/^0x[a-fA-F0-9]{64}$/.test(input.to)) {\n return { valid: false, error: `Invalid Sui address format: \"${input.to}\". Must be 0x followed by 64 hex characters.` };\n }\n const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000000000000000000000000000';\n if (input.to === ZERO_ADDRESS) {\n return { valid: false, error: 'This is the zero address (burn address). Sending funds here will permanently destroy them. If you really intend to burn tokens, please confirm explicitly.' };\n }\n if (input.amount <= 0) {\n return { valid: false, error: 'Amount must be positive.' };\n }\n return { valid: true };\n },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.send({ to: input.to, amount: input.amount });\n\n return {\n data: {\n success: result.success,\n tx: result.tx,\n amount: result.amount,\n to: result.to,\n contactName: result.contactName,\n gasCost: result.gasCost,\n gasMethod: result.gasMethod,\n balance: result.balance,\n memo: input.memo ?? null,\n },\n displayText: `Sent $${result.amount.toFixed(2)} to ${result.contactName ?? result.to.slice(0, 10)}… (tx: ${result.tx.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { assertAllowedAsset } from '@t2000/sdk';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const borrowTool = buildTool({\n name: 'borrow',\n description:\n 'Borrow USDC against savings collateral. ONLY USDC borrows are supported. Requires existing savings deposits. Checks max safe borrow and health factor. Returns tx hash, fee, and post-borrow health factor.',\n inputSchema: z.object({\n amount: z.number().positive(),\n asset: z.string().optional().describe('Must be USDC or omitted. Any other asset is rejected.'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: {\n type: 'number',\n description: 'Amount in USDC to borrow',\n },\n asset: {\n type: 'string',\n description: 'Must be USDC or omitted. Any other asset is rejected.',\n },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, affectsHealth: true },\n preflight: (input) => {\n if (input.asset && input.asset.toUpperCase() !== 'USDC') {\n return { valid: false, error: `Only USDC borrows are supported. Got: \"${input.asset}\"` };\n }\n return { valid: true };\n },\n\n async call(input, context) {\n assertAllowedAsset('borrow', input.asset);\n\n const agent = requireAgent(context);\n const result = await agent.borrow({ amount: input.amount });\n\n return {\n data: {\n success: result.success,\n tx: result.tx,\n amount: result.amount,\n fee: result.fee,\n healthFactor: result.healthFactor,\n gasCost: result.gasCost,\n },\n displayText: `Borrowed $${result.amount.toFixed(2)} — HF: ${result.healthFactor.toFixed(2)} (tx: ${result.tx.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const repayDebtTool = buildTool({\n name: 'repay_debt',\n description:\n 'Repay outstanding USDC debt. Always call balance_check first to know the debt amount, then pass the exact number here. Prioritises the highest-APY borrow first. Returns tx hash, amount repaid, and remaining debt.',\n inputSchema: z.object({\n amount: z.number().positive(),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: {\n description: 'Exact amount in USD to repay (call balance_check first to get debt amount)',\n },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, requiresBalance: true },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.repay({ amount: input.amount });\n\n return {\n data: {\n success: result.success,\n tx: result.tx,\n amount: result.amount,\n remainingDebt: result.remainingDebt,\n gasCost: result.gasCost,\n },\n displayText: `Repaid $${result.amount.toFixed(2)} — remaining debt: $${result.remainingDebt.toFixed(2)} (tx: ${result.tx.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const claimRewardsTool = buildTool({\n name: 'claim_rewards',\n description:\n 'Claim all pending protocol rewards across lending adapters. Returns claimed reward details and total USD value.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true },\n\n async call(_input, context) {\n const agent = requireAgent(context);\n const result = await agent.claimRewards();\n\n return {\n data: {\n success: result.success,\n tx: result.tx || null,\n rewards: result.rewards,\n totalValueUsd: result.totalValueUsd,\n gasCost: result.gasCost,\n },\n displayText: result.rewards.length === 0\n ? 'No pending rewards to claim.'\n : `Claimed $${result.totalValueUsd.toFixed(2)} in rewards (tx: ${result.tx.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nconst MPP_GATEWAY = 'https://mpp.t2000.ai';\n\nconst SERVICE_PRICES: [RegExp, number][] = [\n [/\\/fal\\//, 0.03],\n [/\\/googlemaps\\//, 0.01],\n [/\\/perplexity\\//, 0.01],\n [/\\/firecrawl\\//, 0.01],\n [/\\/serpapi\\//, 0.01],\n [/\\/openweather\\//, 0.005],\n [/\\/brave\\//, 0.005],\n [/\\/serper\\//, 0.005],\n [/\\/newsapi\\//, 0.005],\n [/\\/coingecko\\//, 0.005],\n [/\\/alphavantage\\//, 0.005],\n [/\\/exchangerate\\//, 0.005],\n [/\\/deepl\\//, 0.005],\n [/\\/jina\\//, 0.005],\n [/\\/resend\\//, 0.005],\n];\n\nexport function estimatePayApiCost(url: string): number {\n for (const [pattern, price] of SERVICE_PRICES) {\n if (pattern.test(url)) return price;\n }\n return 0.005;\n}\n\nexport const payApiTool = buildTool({\n name: 'pay_api',\n description: `Execute any MPP gateway service via on-chain USDC micropayment. The gateway at ${MPP_GATEWAY} hosts 40+ services (88 endpoints). Payment is handled automatically.\n\nUse mpp_services tool first to discover available services and get the correct endpoint URL, required body parameters, and pricing. Then call this tool with the full URL and JSON body.\n\nAlways use POST. Construct the URL from the gateway base + service path. Pass parameters as a JSON string in body.\n\nCRITICAL — non-retryable errors: If the result contains \"doNotRetry\": true or \"paymentConfirmed\": true, the user has ALREADY been charged. NEVER call pay_api again for the same request. Report the error to the user.\n\nLob (postcards/letters) — MULTI-STEP, NEVER skip:\n1. Generate design image FIRST via fal/fal-ai/flux/dev ($0.03). Show the image to the user as markdown .\n2. Ask the user to confirm before mailing (\"Here's the design. Print and mail for $1.00?\").\n3. ONLY after user confirms: call lob/v1/postcards with the image URL in the front HTML (<img src=\"URL\" style=\"width:100%;height:100%;object-fit:cover\"/>).\nAlways use ISO-3166 country codes (GB not UK, US not USA). A return address (\"from\") is added automatically — do not include one.`,\n inputSchema: z.object({\n url: z.string().url(),\n method: z.enum(['GET', 'POST', 'PUT', 'DELETE']).optional(),\n body: z.string().optional(),\n headers: z.record(z.string()).optional(),\n maxPrice: z.number().positive().optional(),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'Full MPP endpoint URL (e.g. https://mpp.t2000.ai/openweather/v1/weather)' },\n method: { type: 'string', description: 'HTTP method (always POST for MPP gateway)' },\n body: { type: 'string', description: 'JSON request body as string' },\n headers: { type: 'object', description: 'Additional HTTP headers' },\n maxPrice: { type: 'number', description: 'Maximum price in USD willing to pay (default: service price)' },\n },\n required: ['url'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, requiresBalance: true, costAware: true, producesArtifact: true, maxRetries: 1 },\n preflight: (input) => {\n if (!input.url.startsWith(MPP_GATEWAY)) {\n return { valid: false, error: `URL must start with ${MPP_GATEWAY}. Got: \"${input.url}\"` };\n }\n if (input.body) {\n try {\n JSON.parse(input.body);\n } catch {\n return { valid: false, error: 'body must be valid JSON.' };\n }\n if (input.url.includes('lob/')) {\n const body = JSON.parse(input.body) as Record<string, unknown>;\n const to = body.to as Record<string, unknown> | undefined;\n const country = to?.address_country;\n if (typeof country === 'string' && country.length !== 2) {\n return { valid: false, error: `Country must be ISO-3166 2-letter code (got \"${country}\")` };\n }\n }\n }\n return { valid: true };\n },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.pay({\n url: input.url,\n method: input.method,\n body: input.body,\n headers: input.headers,\n maxPrice: input.maxPrice,\n });\n\n return {\n data: {\n status: result.status,\n body: result.body,\n paid: result.paid,\n cost: result.cost,\n receipt: result.receipt,\n },\n displayText: result.paid\n ? `API call completed — paid $${result.cost?.toFixed(4) ?? '?'} (status: ${result.status})`\n : `API call completed — free (status: ${result.status})`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\n\nconst MPP_GATEWAY = 'https://mpp.t2000.ai';\nconst CATALOG_URL = `${MPP_GATEWAY}/api/services`;\nconst CACHE_TTL = 120_000;\n\ninterface GatewayEndpoint {\n method: string;\n path: string;\n description: string;\n price: string;\n}\n\ninterface GatewayService {\n id: string;\n name: string;\n serviceUrl: string;\n description: string;\n categories: string[];\n endpoints: GatewayEndpoint[];\n}\n\nlet catalogCache: { data: GatewayService[]; ts: number } | null = null;\n\nasync function fetchCatalog(): Promise<GatewayService[]> {\n if (catalogCache && Date.now() - catalogCache.ts < CACHE_TTL) {\n return catalogCache.data;\n }\n const res = await fetch(CATALOG_URL, { signal: AbortSignal.timeout(10_000) });\n if (!res.ok) throw new Error(`MPP catalog fetch failed: HTTP ${res.status}`);\n const data = (await res.json()) as GatewayService[];\n catalogCache = { data, ts: Date.now() };\n return data;\n}\n\nfunction matchesQuery(service: GatewayService, q: string): boolean {\n const lower = q.toLowerCase();\n return (\n service.id.toLowerCase().includes(lower) ||\n service.name.toLowerCase().includes(lower) ||\n service.description.toLowerCase().includes(lower) ||\n service.categories.some((c) => c.toLowerCase().includes(lower)) ||\n service.endpoints.some((e) => e.description.toLowerCase().includes(lower))\n );\n}\n\nexport const mppServicesTool = buildTool({\n name: 'mpp_services',\n description:\n 'Discover available MPP gateway services. Returns service names, descriptions, endpoints with required parameters, and pricing. Pass `query` for keyword search or `category` to filter by category. Calling with NO filters returns a category summary (not the full catalog) — narrow first, then fetch endpoints. Use this BEFORE calling pay_api.',\n inputSchema: z.object({\n query: z\n .string()\n .optional()\n .describe('Filter by keyword (e.g. \"postcard\", \"translate\", \"weather\").'),\n category: z\n .string()\n .optional()\n .describe('Filter by category exactly (e.g. \"weather\", \"image\"). See category summary returned when called without filters.'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Filter by keyword (e.g. \"postcard\", \"translate\", \"weather\").',\n },\n category: {\n type: 'string',\n description: 'Filter by category exactly (e.g. \"weather\", \"image\").',\n },\n },\n required: [],\n },\n isReadOnly: true,\n maxResultSizeChars: 5_000,\n\n async call(input): Promise<{ data: Record<string, unknown>; displayText: string }> {\n const catalog = await fetchCatalog();\n\n // [v1.4 ACI] If neither query nor category is supplied, return a\n // category summary rather than the unbounded full catalog. The model\n // then re-calls with a filter, which keeps the context window tight\n // and makes the MPP discovery flow two-step (categorize → drill down).\n if (!input.query && !input.category) {\n const counts = new Map<string, number>();\n for (const svc of catalog) {\n for (const cat of svc.categories) {\n counts.set(cat, (counts.get(cat) ?? 0) + 1);\n }\n }\n const categories = [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([category, services]) => ({ category, services }));\n return {\n data: {\n _refine: {\n reason: 'MPP catalog has many services — pick a category or supply a query first.',\n suggestedParams: { category: categories[0]?.category ?? 'weather' },\n },\n categories,\n totalServices: catalog.length,\n },\n displayText: `${catalog.length} services across ${categories.length} categories. Re-call with a category or query.`,\n };\n }\n\n let filtered = catalog;\n if (input.category) {\n const cat = input.category.toLowerCase();\n filtered = filtered.filter((s) => s.categories.some((c) => c.toLowerCase() === cat));\n }\n if (input.query) {\n filtered = filtered.filter((s) => matchesQuery(s, input.query!));\n }\n\n const services = filtered.map((s) => ({\n id: s.id,\n name: s.name,\n description: s.description,\n categories: s.categories,\n endpoints: s.endpoints.map((e) => ({\n url: `${MPP_GATEWAY}/${s.id}${e.path}`,\n method: e.method,\n description: e.description,\n price: `$${e.price}`,\n })),\n }));\n\n const filterDesc = [\n input.query ? `query \"${input.query}\"` : null,\n input.category ? `category \"${input.category}\"` : null,\n ].filter(Boolean).join(' + ');\n const summary = `Found ${services.length} service(s) matching ${filterDesc}`;\n\n return {\n data: { services, total: services.length },\n displayText: summary,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const swapExecuteTool = buildTool({\n name: 'swap_execute',\n description:\n 'Swap tokens on Sui via Cetus Aggregator (20+ DEXs). Supports any token pair with liquidity. Use user-friendly names (SUI, USDC, CETUS, DEEP, etc.) or full coin types.',\n inputSchema: z.object({\n from: z.string().describe('Source token (e.g. \"SUI\", \"USDC\", or full coin type)'),\n to: z.string().describe('Target token (e.g. \"USDC\", \"CETUS\", or full coin type)'),\n amount: z.number().positive().describe('Amount to swap'),\n byAmountIn: z.boolean().optional().describe('true = fixed input amount (default), false = fixed output amount'),\n slippage: z.number().min(0.001).max(0.05).optional().describe('Max slippage (default 0.01 = 1%, max 5%)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n from: { type: 'string', description: 'Source token name or coin type' },\n to: { type: 'string', description: 'Target token name or coin type' },\n amount: { type: 'number', description: 'Amount to swap' },\n byAmountIn: { type: 'boolean', description: 'true = fixed input (default), false = fixed output' },\n slippage: { type: 'number', description: 'Max slippage (0.01 = 1%)' },\n },\n required: ['from', 'to', 'amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, requiresBalance: true },\n preflight: (input) => {\n if (input.from.toLowerCase() === input.to.toLowerCase()) {\n return { valid: false, error: `Cannot swap ${input.from} to itself.` };\n }\n return { valid: true };\n },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.swap({\n from: input.from,\n to: input.to,\n amount: input.amount,\n byAmountIn: input.byAmountIn,\n slippage: input.slippage,\n });\n\n return {\n data: {\n tx: result.tx,\n fromToken: result.fromToken,\n toToken: result.toToken,\n fromAmount: result.fromAmount,\n toAmount: result.toAmount,\n priceImpact: result.priceImpact,\n route: result.route,\n gasCost: result.gasCost,\n },\n displayText: `Swapped ${result.fromAmount} ${result.fromToken} for ${result.toAmount.toFixed(4)} ${result.toToken} (tx: ${result.tx.slice(0, 8)}...)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { getSwapQuote } from '@t2000/sdk';\nimport { buildTool } from '../tool.js';\nimport { getWalletAddress } from './utils.js';\n\nexport const swapQuoteTool = buildTool({\n name: 'swap_quote',\n description:\n 'Get a swap quote without executing. Shows expected output amount, price impact, and route. Use before swap_execute to preview a trade.',\n inputSchema: z.object({\n from: z.string().describe('Source token (e.g. \"SUI\", \"USDC\", or full coin type)'),\n to: z.string().describe('Target token (e.g. \"USDC\", \"CETUS\", or full coin type)'),\n amount: z.number().positive().describe('Amount to swap'),\n byAmountIn: z.boolean().optional().describe('true = fixed input (default), false = fixed output'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n from: { type: 'string', description: 'Source token name or coin type' },\n to: { type: 'string', description: 'Target token name or coin type' },\n amount: { type: 'number', description: 'Amount to swap' },\n byAmountIn: { type: 'boolean', description: 'true = fixed input (default), false = fixed output' },\n },\n required: ['from', 'to', 'amount'],\n },\n isReadOnly: true,\n\n async call(input, context) {\n const walletAddress = context.agent\n ? (context.agent as { address(): string }).address()\n : getWalletAddress(context);\n\n const result = await getSwapQuote({\n walletAddress,\n from: input.from,\n to: input.to,\n amount: input.amount,\n byAmountIn: input.byAmountIn,\n });\n\n return {\n data: result,\n displayText: `${result.fromAmount} ${result.fromToken} → ${result.toAmount.toFixed(4)} ${result.toToken} (impact: ${(result.priceImpact * 100).toFixed(2)}%, via ${result.route})`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const voloStakeTool = buildTool({\n name: 'volo_stake',\n description:\n 'Stake SUI for vSUI via VOLO liquid staking. Earn ~3-5% APY. Rewards compound automatically via exchange rate — no claiming needed. Minimum 1 SUI.',\n inputSchema: z.object({\n amount: z.number().min(1).describe('Amount of SUI to stake (minimum 1)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: { type: 'number', description: 'Amount of SUI to stake' },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, requiresBalance: true },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.stakeVSui({ amount: input.amount });\n\n return {\n data: {\n tx: result.tx,\n amountSui: result.amountSui,\n vSuiReceived: result.vSuiReceived,\n apy: result.apy,\n gasCost: result.gasCost,\n },\n displayText: `Staked ${result.amountSui} SUI for ${result.vSuiReceived.toFixed(4)} vSUI at ${(result.apy * 100).toFixed(2)}% APY (tx: ${result.tx.slice(0, 8)}...)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const voloUnstakeTool = buildTool({\n name: 'volo_unstake',\n description:\n 'Unstake vSUI back to SUI. Returns SUI including accumulated yield. Use amount in vSUI units or \"all\" to unstake entire position.',\n inputSchema: z.object({\n amount: z.union([z.number().positive(), z.literal('all')]).describe('Amount of vSUI to unstake, or \"all\"'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: { description: 'Amount of vSUI to unstake, or the string \"all\"' },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.unstakeVSui({ amount: input.amount });\n\n return {\n data: {\n tx: result.tx,\n vSuiAmount: result.vSuiAmount,\n suiReceived: result.suiReceived,\n gasCost: result.gasCost,\n },\n displayText: `Unstaked ${result.vSuiAmount.toFixed(4)} vSUI, received ${result.suiReceived.toFixed(4)} SUI (tx: ${result.tx.slice(0, 8)}...)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\n\nconst VOLO_STATS_URL = 'https://open-api.naviprotocol.io/api/volo/stats';\n\nexport const voloStatsTool = buildTool({\n name: 'volo_stats',\n description:\n 'Get current VOLO liquid staking stats: vSUI APY, exchange rate, total staked SUI, and total vSUI supply.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {} },\n isReadOnly: true,\n\n async call() {\n const res = await fetch(VOLO_STATS_URL);\n if (!res.ok) throw new Error(`VOLO API returned ${res.status}`);\n\n const json = (await res.json()) as Record<string, unknown>;\n const data = (json.data ?? json) as {\n apy?: number;\n exchange_rate?: number;\n exchangeRate?: number;\n total_staked?: number;\n totalStaked?: number;\n total_vsui?: number;\n totalVSui?: number;\n };\n\n const stats = {\n apy: data.apy ?? 0,\n exchangeRate: data.exchange_rate ?? data.exchangeRate ?? 0,\n totalStaked: data.total_staked ?? data.totalStaked ?? 0,\n totalVSui: data.total_vsui ?? data.totalVSui ?? 0,\n };\n\n return {\n data: stats,\n displayText: `vSUI APY: ${(stats.apy * 100).toFixed(2)}%, Rate: 1 SUI = ${(1 / stats.exchangeRate).toFixed(4)} vSUI, Total staked: ${stats.totalStaked.toLocaleString()} SUI`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\n\nexport const saveContactTool = buildTool({\n name: 'save_contact',\n description:\n 'Save a contact with a friendly name and Sui address so the user can send to them by name later.',\n inputSchema: z.object({\n name: z.string().describe('Friendly name for the contact (e.g. \"Alex\", \"Mom\")'),\n address: z.string().describe('Full Sui address (0x...)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Friendly name for the contact' },\n address: { type: 'string', description: 'Full Sui address (0x...)' },\n },\n required: ['name', 'address'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n\n async call(input) {\n return {\n data: { saved: true, name: input.name, address: input.address },\n displayText: `Saved contact \"${input.name}\" (${input.address.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\n\nconst BRAVE_API = 'https://api.search.brave.com/res/v1/web/search';\n\nconst inputSchema = z.object({\n query: z.string().describe('Search query'),\n count: z.number().optional().default(5).describe('Number of results (1-10)'),\n});\n\ninterface SearchResult {\n title: string;\n url: string;\n description: string;\n}\n\ninterface WebSearchData {\n results: SearchResult[];\n error?: string;\n}\n\nexport const webSearchTool = buildTool({\n name: 'web_search',\n description:\n 'Search the web for real-time information. Use for news, token info, project details, protocol documentation, or any question that needs current web data. Free for users.',\n inputSchema,\n jsonSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n count: { type: 'number', description: 'Number of results (1-10)', default: 5 },\n },\n required: ['query'],\n },\n isReadOnly: true,\n maxResultSizeChars: 8_000,\n async call(input, context): Promise<{ data: WebSearchData; displayText: string }> {\n const apiKey = context.env?.BRAVE_API_KEY ?? process.env.BRAVE_API_KEY;\n if (!apiKey) {\n return {\n data: { results: [], error: 'Web search not configured' },\n displayText: 'Web search is not available.',\n };\n }\n\n const count = Math.min(Math.max(input.count ?? 5, 1), 10);\n const url = `${BRAVE_API}?q=${encodeURIComponent(input.query)}&count=${count}&text_decorations=false`;\n\n const res = await fetch(url, {\n headers: {\n 'Accept': 'application/json',\n 'Accept-Encoding': 'gzip',\n 'X-Subscription-Token': apiKey,\n },\n signal: AbortSignal.timeout(8_000),\n });\n\n if (!res.ok) {\n throw new Error(`Brave Search API error: HTTP ${res.status}`);\n }\n\n const json = await res.json() as {\n web?: { results?: Array<{ title: string; url: string; description: string }> };\n };\n\n const results: SearchResult[] = (json.web?.results ?? []).slice(0, count).map((r) => ({\n title: r.title,\n url: r.url,\n description: r.description,\n }));\n\n const displayText = results.length > 0\n ? results.map((r, i) => `${i + 1}. ${r.title}\\n ${r.url}\\n ${r.description}`).join('\\n\\n')\n : 'No results found.';\n\n return { data: { results }, displayText };\n },\n});\n","import { z } from 'zod';\nimport { getDecimalsForCoinType } from '@t2000/sdk';\nimport { buildTool } from '../tool.js';\n\nconst inputSchema = z.object({\n digest: z.string().describe('Sui transaction digest to explain'),\n});\n\ninterface TxEffect {\n type: string;\n description: string;\n}\n\ninterface ExplainedTx {\n digest: string;\n sender: string;\n status: string;\n gasUsed: string;\n timestamp?: string;\n effects: TxEffect[];\n summary: string;\n}\n\nexport const explainTxTool = buildTool({\n name: 'explain_tx',\n description:\n 'Explain a Sui transaction in plain English. Provide a transaction digest and get a human-readable breakdown of what happened — transfers, swaps, deposits, etc.',\n inputSchema,\n jsonSchema: {\n type: 'object',\n properties: {\n digest: { type: 'string', description: 'Sui transaction digest' },\n },\n required: ['digest'],\n },\n isReadOnly: true,\n async call(input, context) {\n const rpcUrl = context.suiRpcUrl ?? 'https://fullnode.mainnet.sui.io:443';\n\n const res = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'sui_getTransactionBlock',\n params: [\n input.digest,\n {\n showInput: true,\n showEffects: true,\n showEvents: true,\n showBalanceChanges: true,\n showObjectChanges: true,\n },\n ],\n }),\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!res.ok) throw new Error(`Sui RPC error: HTTP ${res.status}`);\n const json = await res.json() as { result?: Record<string, unknown>; error?: { message: string } };\n\n if (json.error) throw new Error(json.error.message);\n if (!json.result) throw new Error('Transaction not found');\n\n const tx = json.result;\n const txInput = tx.transaction as Record<string, unknown> | undefined;\n const effects = tx.effects as Record<string, unknown> | undefined;\n const balanceChanges = tx.balanceChanges as Array<{ owner: Record<string, string>; coinType: string; amount: string }> | undefined;\n const events = tx.events as Array<{ type: string; parsedJson?: Record<string, unknown> }> | undefined;\n\n const txData = txInput?.data as Record<string, unknown> | undefined;\n const sender = txData?.sender as string ?? 'unknown';\n const gasData = txData?.gasData as Record<string, unknown> | undefined;\n const gasPayer = gasData?.owner as string ?? sender;\n const status = (effects?.status as Record<string, string>)?.status ?? 'unknown';\n const gasUsed = effects?.gasUsed as Record<string, string> | undefined;\n const gasCost = gasUsed\n ? (Number(gasUsed.computationCost ?? 0) + Number(gasUsed.storageCost ?? 0) - Number(gasUsed.storageRebate ?? 0)) / 1e9\n : 0;\n const timestamp = tx.timestampMs ? new Date(Number(tx.timestampMs)).toISOString() : undefined;\n\n const txEffects: TxEffect[] = [];\n\n if (balanceChanges?.length) {\n for (const bc of balanceChanges) {\n const ownerAddr = bc.owner?.AddressOwner ?? bc.owner?.ObjectOwner ?? 'unknown';\n const coinParts = bc.coinType.split('::');\n const symbol = coinParts[coinParts.length - 1] ?? bc.coinType;\n const amount = Number(bc.amount);\n const isNegative = amount < 0;\n const decimals = getDecimalsForCoinType(bc.coinType);\n const absHuman = Math.abs(amount / 10 ** decimals);\n\n if (bc.coinType.endsWith('::sui::SUI') && isNegative) {\n if (ownerAddr === gasPayer) {\n const netTransfer = absHuman - gasCost;\n if (netTransfer < 0.0001) continue;\n txEffects.push({\n type: 'send',\n description: `${ownerAddr.slice(0, 8)}...${ownerAddr.slice(-4)} sent ${netTransfer.toFixed(4)} ${symbol}`,\n });\n } else {\n txEffects.push({\n type: 'send',\n description: `${ownerAddr.slice(0, 8)}...${ownerAddr.slice(-4)} sent ${absHuman.toFixed(4)} ${symbol}`,\n });\n }\n continue;\n }\n\n txEffects.push({\n type: isNegative ? 'send' : 'receive',\n description: `${ownerAddr.slice(0, 8)}...${ownerAddr.slice(-4)} ${isNegative ? 'sent' : 'received'} ${absHuman.toFixed(decimals > 6 ? 4 : 2)} ${symbol}`,\n });\n }\n }\n\n if (events?.length) {\n for (const evt of events.slice(0, 5)) {\n const eventParts = evt.type.split('::');\n const eventName = eventParts[eventParts.length - 1] ?? evt.type;\n txEffects.push({\n type: 'event',\n description: `Event: ${eventName}`,\n });\n }\n }\n\n const summary = txEffects.length > 0\n ? txEffects.filter((e) => e.type !== 'event').map((e) => e.description).join('; ')\n : `Transaction ${status}`;\n\n const result: ExplainedTx = {\n digest: input.digest,\n sender,\n status,\n gasUsed: `${gasCost.toFixed(6)} SUI`,\n timestamp,\n effects: txEffects,\n summary,\n };\n\n return {\n data: result,\n displayText: `**Tx ${input.digest.slice(0, 8)}...** (${status})\\nSender: ${sender}\\nGas: ${result.gasUsed}\\n${summary}`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { fetchWalletCoins } from '../sui-rpc.js';\nimport { fetchTokenPrices } from '../defillama-prices.js';\n\nconst inputSchema = z.object({\n address: z.string().optional().describe('Sui address to analyze (defaults to connected wallet)'),\n});\n\ninterface AssetAllocation {\n symbol: string;\n amount: number;\n usdValue: number;\n percentage: number;\n}\n\ninterface PortfolioInsight {\n type: 'info' | 'warning' | 'suggestion';\n message: string;\n}\n\ninterface WeekChange {\n absoluteUsd: number;\n percentChange: number;\n}\n\ninterface PortfolioResult {\n totalValue: number;\n walletValue: number;\n savingsValue: number;\n debtValue: number;\n healthFactor: number | null;\n allocations: AssetAllocation[];\n stablePercentage: number;\n insights: PortfolioInsight[];\n savingsApy?: number;\n dailyEarning?: number;\n weekChange?: WeekChange;\n}\n\nconst STABLECOINS = new Set(['USDC', 'USDT', 'USDe', 'USDsui']);\n\nexport const portfolioAnalysisTool = buildTool({\n name: 'portfolio_analysis',\n description:\n 'Analyze portfolio allocation, risk exposure, and yield optimization. Shows asset breakdown, diversification score, health factor assessment, and actionable suggestions.',\n inputSchema,\n jsonSchema: {\n type: 'object',\n properties: {\n address: { type: 'string', description: 'Sui address to analyze (defaults to connected wallet)' },\n },\n required: [],\n },\n isReadOnly: true,\n async call(input, context) {\n const address = input.address ?? context.walletAddress;\n if (!address) {\n throw new Error('No wallet address provided. Sign in first.');\n }\n\n const rpcUrl = context.suiRpcUrl ?? 'https://fullnode.mainnet.sui.io:443';\n\n const DUST_USD = 0.01;\n\n const coins = await fetchWalletCoins(address, rpcUrl);\n const nonZero = coins.filter((c) => Number(c.totalBalance) > 0);\n const prices = await fetchTokenPrices(nonZero.map((c) => c.coinType)).catch(() => ({} as Record<string, number>));\n\n let walletValue = 0;\n const allAllocations: AssetAllocation[] = [];\n\n for (const coin of nonZero) {\n const amount = Number(coin.totalBalance) / 10 ** coin.decimals;\n const price = prices[coin.coinType] ?? 0;\n const usdValue = amount * price;\n walletValue += usdValue;\n allAllocations.push({ symbol: coin.symbol, amount, usdValue, percentage: 0 });\n }\n\n const allocations = allAllocations.filter((a) => a.usdValue >= DUST_USD);\n\n let savingsValue = 0;\n let debtValue = 0;\n let healthFactor: number | null = null;\n let savingsApy: number | undefined;\n let dailyEarning: number | undefined;\n\n if (context.positionFetcher) {\n try {\n const positions = await context.positionFetcher(address);\n savingsValue = positions.savings ?? 0;\n debtValue = positions.borrows ?? 0;\n healthFactor = positions.healthFactor ?? null;\n if (typeof positions.savingsRate === 'number' && positions.savingsRate > 0) {\n savingsApy = positions.savingsRate;\n dailyEarning = savingsValue * savingsApy / 365;\n }\n } catch { /* fallback to wallet only */ }\n }\n\n let weekChange: WeekChange | undefined;\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (apiUrl && address) {\n try {\n const histRes = await fetch(\n `${apiUrl}/api/analytics/portfolio-history?days=7`,\n { headers: { 'x-sui-address': address }, signal: context.signal },\n );\n if (histRes.ok) {\n const hist = (await histRes.json()) as { change?: WeekChange };\n if (hist.change && hist.change.absoluteUsd !== 0) {\n weekChange = hist.change;\n }\n }\n } catch { /* supplementary data */ }\n }\n\n const totalValue = walletValue + savingsValue;\n\n for (const a of allocations) {\n a.percentage = totalValue > 0 ? (a.usdValue / totalValue) * 100 : 0;\n }\n allocations.sort((a, b) => b.usdValue - a.usdValue);\n\n const stableValue = allocations\n .filter((a) => STABLECOINS.has(a.symbol))\n .reduce((s, a) => s + a.usdValue, 0) + savingsValue;\n const stablePercentage = totalValue > 0 ? (stableValue / totalValue) * 100 : 0;\n\n const insights: PortfolioInsight[] = [];\n\n if (healthFactor !== null && healthFactor < 1.5) {\n insights.push({\n type: 'warning',\n message: `Health factor ${healthFactor.toFixed(2)} is dangerously low. Consider repaying debt or adding collateral.`,\n });\n } else if (healthFactor !== null && healthFactor < 2.5) {\n insights.push({\n type: 'warning',\n message: `Health factor ${healthFactor.toFixed(2)} is moderate. Monitor your positions.`,\n });\n }\n\n if (stablePercentage > 80) {\n insights.push({\n type: 'suggestion',\n message: `${stablePercentage.toFixed(0)}% stablecoins. Consider diversifying into yield-bearing positions.`,\n });\n }\n\n const idleCash = allocations.find((a) => a.symbol === 'USDC');\n if (idleCash && idleCash.usdValue > 10) {\n insights.push({\n type: 'suggestion',\n message: `$${idleCash.usdValue.toFixed(2)} USDC idle in wallet. Deposit into NAVI savings for ~4-5% APY.`,\n });\n }\n\n if (allocations.length === 1) {\n insights.push({\n type: 'info',\n message: 'Portfolio is concentrated in a single asset.',\n });\n }\n\n const result: PortfolioResult = {\n totalValue,\n walletValue,\n savingsValue,\n debtValue,\n healthFactor,\n allocations: allocations.slice(0, 10),\n stablePercentage,\n insights,\n savingsApy,\n dailyEarning,\n weekChange,\n };\n\n const topLine = `Total: $${totalValue.toFixed(2)} | Wallet: $${walletValue.toFixed(2)} | Savings: $${savingsValue.toFixed(2)}`;\n const insightLines = insights.map((i) => `${i.type === 'warning' ? '⚠' : '→'} ${i.message}`).join('\\n');\n\n return {\n data: result,\n displayText: `${topLine}\\n${insightLines}`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\n\nconst LLAMA_API = 'https://api.llama.fi';\n\nconst SLUG_ALIASES: Record<string, string> = {\n 'navi': 'navi-lending',\n 'navi-protocol': 'navi-lending',\n 'scallop': 'scallop-lend',\n};\n\nconst inputSchema = z.object({\n protocol: z.string().describe('Protocol slug (e.g. \"navi-lending\", \"cetus\", \"scallop-lend\")'),\n});\n\ninterface ProtocolProfile {\n name: string;\n slug: string;\n category: string;\n chains: string[];\n tvl: number;\n tvlChange1d: number;\n tvlChange7d: number;\n tvlChange30d: number;\n mcap: number | null;\n fees24h: number | null;\n revenue24h: number | null;\n auditCount: number;\n auditLinks: string[];\n url: string;\n twitter: string | null;\n riskFactors: string[];\n safetyScore: string;\n}\n\nfunction extractCurrentTvl(proto: Record<string, unknown>): number {\n const chainTvls = proto.currentChainTvls;\n if (chainTvls && typeof chainTvls === 'object') {\n return Object.values(chainTvls as Record<string, number>)\n .filter((v) => typeof v === 'number' && v > 0)\n .reduce((sum, v) => sum + v, 0);\n }\n if (Array.isArray(proto.tvl) && proto.tvl.length > 0) {\n const last = proto.tvl[proto.tvl.length - 1] as { totalLiquidityUSD?: number };\n return last.totalLiquidityUSD ?? 0;\n }\n if (typeof proto.tvl === 'number') return proto.tvl;\n return 0;\n}\n\nfunction fmtTvl(tvl: number): string {\n if (tvl >= 1e9) return `$${(tvl / 1e9).toFixed(2)}B`;\n if (tvl >= 1e6) return `$${(tvl / 1e6).toFixed(1)}M`;\n if (tvl >= 1e3) return `$${(tvl / 1e3).toFixed(0)}K`;\n return `$${tvl.toFixed(0)}`;\n}\n\nexport const protocolDeepDiveTool = buildTool({\n name: 'protocol_deep_dive',\n description:\n 'Get a comprehensive safety and financial profile of a DeFi protocol. Includes TVL trends, revenue, audit status, and risk assessment. Use when users ask \"is X safe?\" or \"tell me about protocol Y\".',\n inputSchema,\n jsonSchema: {\n type: 'object',\n properties: {\n protocol: { type: 'string', description: 'Protocol slug (e.g. \"navi-lending\", \"cetus\")' },\n },\n required: ['protocol'],\n },\n isReadOnly: true,\n async call(input) {\n let slug = input.protocol.toLowerCase().replace(/\\s+/g, '-');\n slug = SLUG_ALIASES[slug] ?? slug;\n\n const [protocolRes, feesRes] = await Promise.allSettled([\n fetch(`${LLAMA_API}/protocol/${slug}`, { signal: AbortSignal.timeout(10_000) }).then((r) => {\n if (!r.ok) throw new Error(`HTTP ${r.status}`);\n return r.json();\n }),\n fetch(`${LLAMA_API}/summary/fees/${slug}?dataType=dailyFees`, { signal: AbortSignal.timeout(8_000) }).then((r) => {\n if (!r.ok) return null;\n return r.json();\n }),\n ]);\n\n if (protocolRes.status === 'rejected') {\n throw new Error(`Protocol \"${slug}\" not found on DefiLlama.`);\n }\n\n const proto = protocolRes.value as Record<string, unknown>;\n\n const tvl = extractCurrentTvl(proto);\n const tvlChange1d = Number(proto.change_1d ?? 0);\n const tvlChange7d = Number(proto.change_7d ?? 0);\n const tvlChange30d = Number(proto.change_1m ?? 0);\n const chains = Array.isArray(proto.chains) ? (proto.chains as string[]) : [];\n const category = (proto.category ?? 'Unknown') as string;\n\n const auditCount = Number(proto.audits) || 0;\n const auditLinks = Array.isArray(proto.audit_links) ? (proto.audit_links as string[]) : [];\n const hasAudits = auditCount > 0 || auditLinks.length > 0;\n\n let fees24h: number | null = null;\n let revenue24h: number | null = null;\n if (feesRes.status === 'fulfilled' && feesRes.value) {\n const feesData = feesRes.value as Record<string, unknown>;\n fees24h = feesData.total24h != null ? Number(feesData.total24h) : null;\n revenue24h = feesData.totalRevenue24h != null ? Number(feesData.totalRevenue24h) : null;\n }\n\n const riskFactors: string[] = [];\n\n if (tvl < 1_000_000) riskFactors.push('TVL under $1M — low liquidity risk');\n else if (tvl < 10_000_000) riskFactors.push('TVL under $10M — moderate liquidity');\n if (tvlChange7d < -15) riskFactors.push(`TVL dropped ${tvlChange7d.toFixed(1)}% in 7 days`);\n if (chains.length === 1) riskFactors.push('Single-chain deployment');\n if (!hasAudits) riskFactors.push('No published audits found');\n else riskFactors.push(`${auditCount || auditLinks.length} audit(s) on file`);\n\n let safetyScore: string;\n if (tvl > 100_000_000 && hasAudits && tvlChange7d > -10) {\n safetyScore = 'High — established protocol with audits and significant TVL';\n } else if (tvl > 10_000_000 && tvlChange7d > -20) {\n safetyScore = 'Moderate — decent TVL, use with caution';\n } else {\n safetyScore = 'Low — small or declining TVL, proceed carefully';\n }\n\n const result: ProtocolProfile = {\n name: (proto.name ?? slug) as string,\n slug,\n category,\n chains,\n tvl,\n tvlChange1d,\n tvlChange7d,\n tvlChange30d,\n mcap: proto.mcap ? Number(proto.mcap) : null,\n fees24h,\n revenue24h,\n auditCount,\n auditLinks,\n url: (proto.url ?? '') as string,\n twitter: (proto.twitter ?? null) as string | null,\n riskFactors,\n safetyScore,\n };\n\n const feesStr = fees24h != null ? ` | Fees 24h: $${fees24h.toLocaleString()}` : '';\n\n return {\n data: result,\n displayText: `**${result.name}** (${category})\\nTVL: ${fmtTvl(tvl)} (7d: ${tvlChange7d > 0 ? '+' : ''}${tvlChange7d.toFixed(1)}%)${feesStr}\\nChains: ${chains.join(', ')}\\nSafety: ${safetyScore}\\nRisks: ${riskFactors.join('; ')}`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\n\nconst PaymentLinkSchema = z.object({\n amount: z.number().positive().describe('Amount in USDC (required). Ask the user if not specified.'),\n label: z.string().optional().describe('Human-readable label e.g. \"Consulting fee March\"'),\n memo: z.string().optional().describe('Optional note shown to the payer'),\n expiresInHours: z.number().positive().optional().describe('Hours until the link expires. Omit for permanent links.'),\n});\n\nconst InvoiceSchema = z.object({\n amount: z.number().positive().describe('Total invoice amount in USDC'),\n label: z.string().describe('Invoice title e.g. \"Web design — March 2026\"'),\n memo: z.string().optional().describe('Optional note or payment terms'),\n recipientName: z.string().optional().describe('Name of the person or company being invoiced'),\n recipientEmail: z.string().optional().describe('Email address of the recipient'),\n dueDays: z.number().int().positive().optional().describe('Days until payment is due. Omit for no due date.'),\n items: z.array(z.object({\n description: z.string(),\n amount: z.number().positive(),\n })).optional().describe('Line items. If omitted, a single line item matching the total is implied.'),\n});\n\nfunction internalHeaders(context: { walletAddress?: string; env?: Record<string, string | undefined>; signal?: AbortSignal }) {\n const internalKey = context.env?.AUDRIC_INTERNAL_KEY;\n return {\n 'Content-Type': 'application/json',\n 'x-sui-address': context.walletAddress ?? '',\n ...(internalKey ? { 'x-internal-key': internalKey } : {}),\n };\n}\n\nexport const createPaymentLinkTool = buildTool({\n name: 'create_payment_link',\n description:\n 'Create a shareable payment link so someone can send USDC to the user. Amount is required — ask the user for the amount if not specified. Returns a URL the user can share. Payers can connect their wallet, scan a QR code, or send manually. Use when the user says \"create a payment link\", \"generate a payment link\", \"I want to get paid\", or similar.',\n inputSchema: PaymentLinkSchema,\n jsonSchema: {\n type: 'object',\n properties: {\n amount: { type: 'number', description: 'Amount in USDC (required). Ask the user if not specified.' },\n label: { type: 'string', description: 'Human-readable label e.g. \"Consulting fee March\"' },\n memo: { type: 'string', description: 'Optional note shown to the payer' },\n expiresInHours: { type: 'number', description: 'Hours until the link expires. Omit for permanent links.' },\n },\n required: ['amount'],\n },\n isReadOnly: true,\n\n async call(input, context) {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (!apiUrl || !context.walletAddress) {\n return { data: null, displayText: 'Payment link creation is not available.' };\n }\n\n try {\n const res = await fetch(`${apiUrl}/api/internal/payments`, {\n method: 'POST',\n signal: context.signal,\n headers: internalHeaders(context),\n body: JSON.stringify({ ...input, type: 'link' }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n return { data: null, displayText: err.error ?? 'Failed to create payment link.' };\n }\n\n const link = await res.json() as {\n slug: string;\n nonce: string;\n url: string;\n amount: number;\n currency: string;\n label: string | null;\n memo: string | null;\n expiresAt: string | null;\n };\n\n const amountStr = `$${link.amount.toFixed(2)} ${link.currency}`;\n return {\n data: link,\n displayText: `Payment link created for ${amountStr}${link.label ? ` — ${link.label}` : ''}. Payers can connect their wallet, scan the QR code, or send manually. Share: ${link.url}`,\n };\n } catch {\n return { data: null, displayText: 'Failed to create payment link.' };\n }\n },\n});\n\nexport const listPaymentLinksTool = buildTool({\n name: 'list_payment_links',\n description:\n 'List the user\\'s payment links — active, paid, expired, and cancelled. Use when the user asks \"show my payment links\", \"what payment links do I have\", or wants to check payment status.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n\n async call(_input, context) {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (!apiUrl || !context.walletAddress) {\n return { data: { links: [] }, displayText: 'No payment links found.' };\n }\n\n try {\n const res = await fetch(`${apiUrl}/api/internal/payments?type=link`, {\n signal: context.signal,\n headers: internalHeaders(context),\n });\n\n if (!res.ok) return { data: { links: [] }, displayText: 'Could not fetch payment links.' };\n\n const raw = await res.json() as { payments: unknown[] };\n const links = raw.payments;\n const count = links.length;\n return {\n data: { links },\n displayText: count === 0 ? 'No payment links yet.' : `${count} payment link${count !== 1 ? 's' : ''} found.`,\n };\n } catch {\n return { data: { links: [] }, displayText: 'Could not fetch payment links.' };\n }\n },\n});\n\nexport const createInvoiceTool = buildTool({\n name: 'create_invoice',\n description:\n 'Create a formal invoice that the user can share with a client or customer. Returns a URL for the invoice page. Payers can connect their wallet, scan a QR code, or send manually. Use when the user says \"create an invoice\", \"generate an invoice\", \"bill a client\", or similar.',\n inputSchema: InvoiceSchema,\n jsonSchema: {\n type: 'object',\n properties: {\n amount: { type: 'number', description: 'Total invoice amount in USDC' },\n label: { type: 'string', description: 'Invoice title e.g. \"Web design — March 2026\"' },\n memo: { type: 'string', description: 'Optional note or payment terms' },\n recipientName: { type: 'string', description: 'Name of the person or company being invoiced' },\n recipientEmail: { type: 'string', description: 'Email address of the recipient' },\n dueDays: { type: 'number', description: 'Days until payment is due. Omit for no due date.' },\n items: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n description: { type: 'string' },\n amount: { type: 'number' },\n },\n required: ['description', 'amount'],\n },\n description: 'Line items. If omitted, a single line item matching the total is implied.',\n },\n },\n required: ['amount', 'label'],\n },\n isReadOnly: true,\n\n async call(input, context) {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (!apiUrl || !context.walletAddress) {\n return { data: null, displayText: 'Invoice creation is not available.' };\n }\n\n try {\n const res = await fetch(`${apiUrl}/api/internal/payments`, {\n method: 'POST',\n signal: context.signal,\n headers: internalHeaders(context),\n body: JSON.stringify({ ...input, type: 'invoice' }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n return { data: null, displayText: err.error ?? 'Failed to create invoice.' };\n }\n\n const invoice = await res.json() as {\n slug: string;\n nonce: string;\n url: string;\n amount: number;\n currency: string;\n label: string;\n memo: string | null;\n dueDate: string | null;\n };\n\n const dueStr = invoice.dueDate ? ` due ${new Date(invoice.dueDate).toLocaleDateString()}` : '';\n return {\n data: invoice,\n displayText: `Invoice created for $${invoice.amount.toFixed(2)} ${invoice.currency}${dueStr} — ${invoice.label}. Payers can connect their wallet, scan the QR code, or send manually. Share: ${invoice.url}`,\n };\n } catch {\n return { data: null, displayText: 'Failed to create invoice.' };\n }\n },\n});\n\nexport const cancelPaymentLinkTool = buildTool({\n name: 'cancel_payment_link',\n description:\n 'Cancel an active payment link so it can no longer be used. Use when the user says \"cancel my payment link\", \"delete my payment link\", or \"remove the link [slug/label]\". Ask for the slug if ambiguous — use list_payment_links first to find it.',\n inputSchema: z.object({\n slug: z.string().describe('The slug of the payment link to cancel (e.g. \"LzLawhY7\")'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n slug: { type: 'string', description: 'The slug of the payment link to cancel' },\n },\n required: ['slug'],\n },\n isReadOnly: true,\n\n async call(input, context) {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (!apiUrl || !context.walletAddress) {\n return { data: null, displayText: 'Payment link cancellation is not available.' };\n }\n\n try {\n const res = await fetch(`${apiUrl}/api/internal/payments`, {\n method: 'PATCH',\n signal: context.signal,\n headers: internalHeaders(context),\n body: JSON.stringify({ slug: input.slug, action: 'cancel' }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n return { data: null, displayText: err.error ?? 'Failed to cancel payment link.' };\n }\n\n const result = await res.json() as { slug: string; status: string };\n return {\n data: result,\n displayText: `Payment link ${result.slug} cancelled.`,\n };\n } catch {\n return { data: null, displayText: 'Failed to cancel payment link.' };\n }\n },\n});\n\nexport const cancelInvoiceTool = buildTool({\n name: 'cancel_invoice',\n description:\n 'Cancel an invoice that has not yet been paid. Use when the user says \"cancel my invoice\", \"delete invoice\", or refers to a specific invoice slug or label. Use list_invoices first if the slug is not known.',\n inputSchema: z.object({\n slug: z.string().describe('The slug of the invoice to cancel (e.g. \"xFYKBWy5\")'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n slug: { type: 'string', description: 'The slug of the invoice to cancel' },\n },\n required: ['slug'],\n },\n isReadOnly: true,\n\n async call(input, context) {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (!apiUrl || !context.walletAddress) {\n return { data: null, displayText: 'Invoice cancellation is not available.' };\n }\n\n try {\n const res = await fetch(`${apiUrl}/api/internal/payments`, {\n method: 'PATCH',\n signal: context.signal,\n headers: internalHeaders(context),\n body: JSON.stringify({ slug: input.slug, action: 'cancel' }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n return { data: null, displayText: err.error ?? 'Failed to cancel invoice.' };\n }\n\n const result = await res.json() as { slug: string; status: string };\n return {\n data: result,\n displayText: `Invoice ${result.slug} cancelled.`,\n };\n } catch {\n return { data: null, displayText: 'Failed to cancel invoice.' };\n }\n },\n});\n\nexport const listInvoicesTool = buildTool({\n name: 'list_invoices',\n description:\n 'List the user\\'s invoices — pending, overdue, paid, and cancelled. Use when the user asks \"show my invoices\", \"what invoices do I have\", or wants to check invoice status.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n\n async call(_input, context) {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (!apiUrl || !context.walletAddress) {\n return { data: { invoices: [] }, displayText: 'No invoices found.' };\n }\n\n try {\n const res = await fetch(`${apiUrl}/api/internal/payments?type=invoice`, {\n signal: context.signal,\n headers: internalHeaders(context),\n });\n\n if (!res.ok) return { data: { invoices: [] }, displayText: 'Could not fetch invoices.' };\n\n const raw = await res.json() as { payments: unknown[] };\n const invoices = raw.payments;\n const count = invoices.length;\n return {\n data: { invoices },\n displayText: count === 0 ? 'No invoices yet.' : `${count} invoice${count !== 1 ? 's' : ''} found.`,\n };\n } catch {\n return { data: { invoices: [] }, displayText: 'Could not fetch invoices.' };\n }\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport type { ToolResult } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Template catalogue\n// ---------------------------------------------------------------------------\n\nexport const CANVAS_TEMPLATES = [\n 'activity_heatmap',\n 'portfolio_timeline',\n 'yield_projector',\n 'health_simulator',\n 'dca_planner',\n 'spending_breakdown',\n 'watch_address',\n 'full_portfolio',\n] as const;\n\nexport type CanvasTemplate = (typeof CANVAS_TEMPLATES)[number];\n\n/** Normalize savings rate: if < 1 treat as decimal → multiply by 100, else use as-is. Default 4.5%. */\nfunction normalizeSavingsRate(raw: number | undefined | null, fallback = 4.5): number {\n const r = raw ?? 0;\n if (r > 0 && r < 1) return r * 100;\n if (r > 0) return r;\n return fallback;\n}\n\nconst CANVAS_TITLES: Record<CanvasTemplate, string> = {\n activity_heatmap: 'On-Chain Activity',\n portfolio_timeline: 'Net Worth Over Time',\n yield_projector: 'Yield Projector',\n health_simulator: 'Health Factor Simulator',\n dca_planner: 'Savings Plan',\n spending_breakdown: 'Spending Breakdown',\n watch_address: 'Watch Address',\n full_portfolio: 'Full Portfolio Overview',\n};\n\n// ---------------------------------------------------------------------------\n// render_canvas tool\n// ---------------------------------------------------------------------------\n\nexport const renderCanvasTool = buildTool({\n name: 'render_canvas',\n description: `Renders an interactive financial canvas inline in the chat.\n\nUse when the user asks for a visual chart, simulator, or financial overview. Pick the most relevant template:\n\n- activity_heatmap — on-chain transaction history as a GitHub-style heatmap (WORKS NOW — loads from wallet)\n- portfolio_timeline — net worth over time, wallet/savings/debt breakdown (WORKS NOW — daily snapshots)\n- yield_projector — compound yield simulator with amount/APY/period sliders (WORKS NOW — client-side)\n- health_simulator — borrow health factor simulator with collateral/debt sliders (WORKS NOW — uses current position)\n- dca_planner — savings plan curve for regular monthly deposits (WORKS NOW — client-side)\n- spending_breakdown — spending by service category (WORKS NOW — from AppEvent + ServicePurchase)\n- watch_address — portfolio overview for any public Sui address (WORKS NOW — pass address in params)\n- full_portfolio — 4-panel overview: savings, health, activity, spending (WORKS NOW — aggregates all data)\n\nAlways prefer the canvas for visualisation requests. After rendering, offer to explain what the user sees.`,\n inputSchema: z.object({\n template: z.enum(CANVAS_TEMPLATES).describe('Which canvas template to render'),\n params: z\n .object({\n period: z.enum(['1m', '3m', '6m', '1y']).optional().describe('Time period for time-based templates'),\n address: z.string().optional().describe('Sui address for watch_address template'),\n })\n .optional(),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n template: {\n type: 'string',\n enum: CANVAS_TEMPLATES,\n description: 'Which canvas template to render',\n },\n params: {\n type: 'object',\n properties: {\n period: { type: 'string', enum: ['1m', '3m', '6m', '1y'] },\n address: { type: 'string' },\n },\n },\n },\n required: ['template'],\n },\n isReadOnly: true,\n\n async call(input, context): Promise<ToolResult<unknown>> {\n const { template, params } = input;\n const title = CANVAS_TITLES[template];\n\n // Full portfolio — 4-panel capstone with live position data\n if (template === 'full_portfolio') {\n const pos = context.serverPositions;\n const rate = normalizeSavingsRate(pos?.savingsRate);\n const savings = pos?.savings ?? 0;\n const borrows = pos?.borrows ?? 0;\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n address: context.walletAddress ?? '',\n currentSavings: savings,\n currentDebt: borrows,\n healthFactor: pos?.healthFactor ?? null,\n savingsRate: rate,\n },\n },\n displayText: `Opened Full Portfolio Overview.`,\n };\n }\n\n // Watch address — show balances for any public Sui address\n if (template === 'watch_address') {\n const targetAddress = params?.address ?? '';\n if (!targetAddress || !targetAddress.startsWith('0x')) {\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: { available: false, message: 'Please provide a valid Sui address to watch.' },\n },\n displayText: 'No valid address provided. Ask the user for a Sui address.',\n };\n }\n return {\n data: {\n __canvas: true,\n template,\n title: `Watch ${targetAddress.slice(0, 6)}…${targetAddress.slice(-4)}`,\n templateData: { available: true, address: targetAddress },\n },\n displayText: `Opened Watch Address canvas for ${targetAddress.slice(0, 6)}…${targetAddress.slice(-4)}.`,\n };\n }\n\n // Portfolio timeline — fetches from /api/analytics/portfolio-history\n if (template === 'portfolio_timeline') {\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n address: context.walletAddress ?? '',\n },\n },\n displayText: `Opened Portfolio Timeline. Shows your net worth, savings, and debt over time.`,\n };\n }\n\n // Spending breakdown — fetches from /api/analytics/spending\n if (template === 'spending_breakdown') {\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n address: context.walletAddress ?? '',\n },\n },\n displayText: `Opened Spending Breakdown. Shows your service spending by category.`,\n };\n }\n\n // Activity heatmap — client-side fetches from /api/analytics/activity-heatmap\n if (template === 'activity_heatmap') {\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n address: context.walletAddress ?? '',\n },\n },\n displayText: `Opened Activity Heatmap for your wallet. Click any day to explore transactions.`,\n };\n }\n\n // Strategy simulators — client-side, seed with live position data\n const positions = context.serverPositions;\n const savingsRate = normalizeSavingsRate(positions?.savingsRate);\n const healthFactor = positions?.healthFactor ?? null;\n const totalSavings = positions?.savings ?? 0;\n const totalBorrows = positions?.borrows ?? 0;\n\n if (template === 'yield_projector') {\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n initialAmount: totalSavings > 0 ? Math.round(totalSavings) : 1000,\n initialApy: savingsRate,\n },\n },\n displayText: `Opened Yield Projector. Current USDC deposit rate: ${savingsRate.toFixed(2)}% APY.`,\n };\n }\n\n if (template === 'health_simulator') {\n const roundedDebt = totalBorrows >= 1 ? Math.round(totalBorrows) : (totalBorrows > 0 ? parseFloat(totalBorrows.toFixed(4)) : 0);\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n initialCollateral: totalSavings > 0 ? Math.round(totalSavings) : 1500,\n initialDebt: roundedDebt > 0 ? roundedDebt : (totalSavings > 0 ? 0 : 500),\n currentHf: healthFactor,\n },\n },\n displayText: `Opened Health Factor Simulator. Current HF: ${healthFactor !== null ? healthFactor.toFixed(2) : 'no active position'}.`,\n };\n }\n\n if (template === 'dca_planner') {\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n initialMonthly: 200,\n initialApy: savingsRate,\n },\n },\n displayText: `Opened Savings Plan. Current USDC deposit rate: ${savingsRate.toFixed(2)}% APY.`,\n };\n }\n\n // Fallback — should not reach here given exhaustive template enum\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: { available: false, message: 'Unknown template.' },\n },\n displayText: `Canvas template \"${template}\" is not yet available.`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport type { ToolResult } from '../types.js';\n\ninterface SpendingResponse {\n period: string;\n totalSpent: number;\n requestCount: number;\n serviceCount: number;\n byService: unknown[];\n}\n\nexport const spendingAnalyticsTool = buildTool({\n name: 'spending_analytics',\n description:\n 'Returns MPP service spending breakdown for a period. Shows total spent, request count, and breakdown by service/category. Use when the user asks about their API spending, service usage, or costs.',\n inputSchema: z.object({\n period: z\n .enum(['week', 'month', 'year', 'all'])\n .optional()\n .describe('Time period. Defaults to current month.'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n period: { type: 'string', enum: ['week', 'month', 'year', 'all'] },\n },\n },\n isReadOnly: true,\n\n async call(input, context): Promise<ToolResult<SpendingResponse>> {\n const period = input.period ?? 'month';\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n const address = context.walletAddress;\n const empty: SpendingResponse = { period, totalSpent: 0, requestCount: 0, serviceCount: 0, byService: [] };\n\n if (!apiUrl || !address) {\n return { data: empty, displayText: 'Spending analytics not available.' };\n }\n\n try {\n const res = await fetch(\n `${apiUrl}/api/analytics/spending?address=${address}&period=${period}`,\n {\n headers: { 'x-sui-address': address },\n signal: context.signal,\n },\n );\n\n if (!res.ok) {\n return { data: empty, displayText: `Could not fetch spending data (HTTP ${res.status}).` };\n }\n\n const data = (await res.json()) as SpendingResponse;\n const total = data.totalSpent ?? 0;\n const count = data.requestCount ?? 0;\n\n return {\n data,\n displayText: total > 0\n ? `You spent $${total.toFixed(2)} across ${count} request${count !== 1 ? 's' : ''} on ${data.serviceCount} service${data.serviceCount !== 1 ? 's' : ''} (${data.period}).`\n : `No service spending recorded for ${data.period}.`,\n };\n } catch {\n return { data: empty, displayText: 'Error fetching spending analytics.' };\n }\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport type { ToolResult } from '../types.js';\n\ninterface YieldSummary {\n today: number;\n thisWeek: number;\n thisMonth: number;\n allTime: number;\n currentApy: number;\n deposited: number;\n projectedYear: number;\n sparkline: number[];\n}\n\nexport const yieldSummaryTool = buildTool({\n name: 'yield_summary',\n description:\n 'Returns yield earnings breakdown: today, this week, this month, all-time, current APY, deposited amount, projected yearly earnings, and a monthly sparkline. Use when the user asks about yield, earnings, or how much they have earned.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n\n async call(_input, context): Promise<ToolResult<YieldSummary>> {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n const address = context.walletAddress;\n\n const empty: YieldSummary = {\n today: 0, thisWeek: 0, thisMonth: 0, allTime: 0,\n currentApy: 0, deposited: 0, projectedYear: 0, sparkline: [],\n };\n\n if (!apiUrl || !address) {\n return { data: empty, displayText: 'Yield summary not available.' };\n }\n\n try {\n const res = await fetch(\n `${apiUrl}/api/analytics/yield-summary?address=${address}`,\n { headers: { 'x-sui-address': address }, signal: context.signal },\n );\n\n if (!res.ok) {\n return { data: empty, displayText: `Could not fetch yield data (HTTP ${res.status}).` };\n }\n\n const data = (await res.json()) as YieldSummary;\n const apy = data.currentApy ?? 0;\n const apyPct = apy < 1 ? (apy * 100).toFixed(2) : apy.toFixed(2);\n\n return {\n data,\n displayText: data.allTime > 0\n ? `You've earned $${data.allTime.toFixed(2)} all-time ($${data.today.toFixed(4)} today). Current APY: ${apyPct}%. Deposited: $${data.deposited.toFixed(2)}. Projected: $${data.projectedYear.toFixed(2)}/year.`\n : `No yield earnings yet. Deposit USDC to start earning ${apyPct}% APY.`,\n };\n } catch {\n return { data: empty, displayText: 'Error fetching yield summary.' };\n }\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport type { ToolResult } from '../types.js';\n\ninterface ActionBreakdown {\n action: string;\n count: number;\n totalAmountUsd: number;\n}\n\ninterface ActivitySummary {\n period: string;\n totalTransactions: number;\n byAction: ActionBreakdown[];\n totalMovedUsd: number;\n netSavingsUsd: number;\n yieldEarnedUsd: number;\n}\n\nexport const activitySummaryTool = buildTool({\n name: 'activity_summary',\n description:\n 'Returns a categorised DeFi activity summary for a period: transaction count, breakdown by action type (saves, sends, borrows, repayments, swaps, payments), total moved, net savings change, and yield earned. Use when the user asks about their activity, transaction history summary, or what they have done recently.',\n inputSchema: z.object({\n period: z\n .enum(['week', 'month', 'year', 'all'])\n .optional()\n .describe('Time period. Defaults to current month.'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n period: { type: 'string', enum: ['week', 'month', 'year', 'all'] },\n },\n },\n isReadOnly: true,\n\n async call(input, context): Promise<ToolResult<ActivitySummary>> {\n const period = input.period ?? 'month';\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n const address = context.walletAddress;\n\n const empty: ActivitySummary = {\n period, totalTransactions: 0, byAction: [],\n totalMovedUsd: 0, netSavingsUsd: 0, yieldEarnedUsd: 0,\n };\n\n if (!apiUrl || !address) {\n return { data: empty, displayText: 'Activity summary not available.' };\n }\n\n try {\n const res = await fetch(\n `${apiUrl}/api/analytics/activity-summary?address=${address}&period=${period}`,\n { headers: { 'x-sui-address': address }, signal: context.signal },\n );\n\n if (!res.ok) {\n return { data: empty, displayText: `Could not fetch activity data (HTTP ${res.status}).` };\n }\n\n const data = (await res.json()) as ActivitySummary;\n const sorted = [...(data.byAction ?? [])].sort((a, b) => b.count - a.count);\n const top = sorted\n .slice(0, 3)\n .map((a) => `${a.action} (${a.count})`)\n .join(', ');\n\n const periodLabel = data.period === 'all' ? 'all time' : `this ${data.period}`;\n\n return {\n data,\n displayText: data.totalTransactions > 0\n ? `${data.totalTransactions} transactions ${periodLabel}. Top: ${top}. Total moved: $${data.totalMovedUsd.toFixed(2)}. Net savings: $${data.netSavingsUsd.toFixed(2)}.`\n : `No activity recorded for ${periodLabel}.`,\n };\n } catch {\n return { data: empty, displayText: 'Error fetching activity summary.' };\n }\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { fetchTokenPrices } from '../defillama-prices.js';\n\nconst LLAMA_API = 'https://api.llama.fi';\nconst YIELDS_API = 'https://yields.llama.fi';\nconst COINS_API = 'https://coins.llama.fi';\n\nconst CACHE_TTL = 60_000;\nconst apiCache = new Map<string, { data: unknown; ts: number }>();\n\nasync function cachedFetch<T>(url: string): Promise<T> {\n const hit = apiCache.get(url);\n if (hit && Date.now() - hit.ts < CACHE_TTL) return hit.data as T;\n\n const res = await fetch(url, { signal: AbortSignal.timeout(15_000) });\n if (!res.ok) throw new Error(`DefiLlama API error: HTTP ${res.status}`);\n const data = await res.json();\n apiCache.set(url, { data, ts: Date.now() });\n return data as T;\n}\n\n/**\n * [v1.4] Named, exported helper for fetching the raw DefiLlama yield pool\n * dataset. Extracted from the inline `cachedFetch` call below so tests\n * (and other tools) can stub it.\n */\nexport async function fetchDefillamaYieldPools(): Promise<YieldPool[]> {\n const data = await cachedFetch<{ data: YieldPool[] }>(`${YIELDS_API}/pools`);\n return data.data ?? [];\n}\n\n// ---------------------------------------------------------------------------\n// 1. defillama_yield_pools\n// ---------------------------------------------------------------------------\n\ninterface YieldPool {\n pool: string;\n chain: string;\n project: string;\n symbol: string;\n tvlUsd: number;\n apy: number;\n apyBase?: number;\n apyReward?: number;\n}\n\nfunction fmtToolTvl(tvl: number): string {\n if (tvl >= 1e9) return `$${(tvl / 1e9).toFixed(1)}B`;\n if (tvl >= 1e6) return `$${(tvl / 1e6).toFixed(1)}M`;\n if (tvl >= 1e3) return `$${(tvl / 1e3).toFixed(0)}K`;\n return `$${tvl}`;\n}\n\nexport const defillamaYieldPoolsTool = buildTool({\n name: 'defillama_yield_pools',\n description:\n 'Get top DeFi yield pools across protocols. Filter by chain (e.g. \"Sui\"), project (e.g. \"navi-lending\"), and minimum TVL. For NAVI lending rates, use project \"navi-lending\".',\n inputSchema: z.object({\n chain: z.string().optional().describe('Filter by chain name (e.g. \"Sui\", \"Ethereum\")'),\n project: z.string().optional().describe('Filter by protocol project name (e.g. \"navi-lending\", \"cetus-clmm\")'),\n limit: z.number().min(1).max(20).optional().describe('Max results (default 5)'),\n minTvl: z.number().optional().describe('Minimum TVL in USD to filter out small/risky pools (default 100000)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n chain: { type: 'string', description: 'Filter by chain name' },\n project: { type: 'string', description: 'Filter by protocol project name (e.g. \"navi-lending\")' },\n limit: { type: 'number', description: 'Max results (default 5)' },\n minTvl: { type: 'number', description: 'Minimum TVL in USD (default 100000)' },\n },\n required: [],\n },\n isReadOnly: true,\n maxResultSizeChars: 6_000,\n\n async call(input): Promise<{ data: Record<string, unknown> | unknown[]; displayText: string }> {\n // [v1.4 ACI] Refuse cross-chain queries — DefiLlama's pool list is\n // unbounded across networks, and unfiltered results are wide enough to\n // bias the LLM. Force the caller to commit to a chain (or pick one of\n // the suggested popular chains) before pouring data in.\n if (!input.chain && !input.project) {\n const all = await fetchDefillamaYieldPools();\n const chainCounts = new Map<string, number>();\n for (const p of all) {\n chainCounts.set(p.chain, (chainCounts.get(p.chain) ?? 0) + 1);\n }\n const topChains = [...chainCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 8)\n .map(([chain, count]) => ({ chain, pools: count }));\n return {\n data: {\n _refine: {\n reason: 'Cross-chain yield search is too broad; pick a chain.',\n suggestedParams: { chain: 'Sui' },\n availableChains: topChains,\n },\n },\n displayText:\n 'Yield query needs a chain filter. Common chains: ' +\n topChains.map((c) => c.chain).join(', '),\n };\n }\n\n let pools = await fetchDefillamaYieldPools();\n\n if (input.chain) {\n const chain = input.chain.toLowerCase();\n pools = pools.filter((p) => p.chain.toLowerCase() === chain);\n }\n\n if (input.project) {\n const project = input.project.toLowerCase();\n pools = pools.filter((p) => p.project.toLowerCase() === project);\n }\n\n const minTvl = input.minTvl ?? 100_000;\n pools = pools.filter((p) => p.tvlUsd >= minTvl);\n\n pools.sort((a, b) => b.apy - a.apy);\n const limit = input.limit ?? 5;\n const top = pools.slice(0, limit);\n\n const results = top.map((p) => ({\n pool: p.symbol,\n protocol: p.project,\n chain: p.chain,\n apy: Math.round(p.apy * 100) / 100,\n apyBase: p.apyBase != null ? Math.round(p.apyBase * 100) / 100 : undefined,\n apyReward: p.apyReward != null ? Math.round(p.apyReward * 100) / 100 : undefined,\n tvl: Math.round(p.tvlUsd),\n }));\n\n return {\n data: results,\n displayText: results\n .map((r) => `${r.pool} (${r.protocol}): ${r.apy}% APY, ${fmtToolTvl(r.tvl)} TVL`)\n .join('\\n'),\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// 2. defillama_protocol_info\n// ---------------------------------------------------------------------------\n\ninterface ProtocolInfo {\n name: string;\n category: string;\n chains: string[];\n tvl: number;\n change_1d?: number;\n change_7d?: number;\n url: string;\n description?: string;\n}\n\nexport const defillamaProtocolInfoTool = buildTool({\n name: 'defillama_protocol_info',\n description:\n 'Get detailed info about a DeFi protocol: TVL, category, chains it operates on, and TVL changes. Use for \"Is this protocol safe?\" or \"Tell me about NAVI.\"',\n inputSchema: z.object({\n name: z.string().describe('Protocol name (e.g. \"navi-lending\", \"cetus\")'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Protocol slug (e.g. \"navi-lending\")' },\n },\n required: ['name'],\n },\n isReadOnly: true,\n maxResultSizeChars: 4_000,\n\n async call(input) {\n const data = await cachedFetch<ProtocolInfo>(`${LLAMA_API}/protocol/${encodeURIComponent(input.name)}`);\n\n const result = {\n name: data.name,\n category: data.category,\n chains: data.chains,\n tvl: Math.round(data.tvl),\n change1d: data.change_1d,\n change7d: data.change_7d,\n url: data.url,\n description: data.description,\n };\n\n return {\n data: result,\n displayText: `${result.name}: ${fmtToolTvl(result.tvl)} TVL (${result.category}) on ${result.chains.join(', ')}`,\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// 3. defillama_token_prices\n// ---------------------------------------------------------------------------\n\nexport const defillamaTokenPricesTool = buildTool({\n name: 'defillama_token_prices',\n description:\n 'Get current USD prices for Sui tokens. Accepts full coin type strings (e.g. \"0x2::sui::SUI\"). Returns price per token.',\n inputSchema: z.object({\n coinTypes: z.array(z.string()).min(1).max(10).describe('Array of Sui coin type strings'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n coinTypes: { type: 'array', items: { type: 'string' }, description: 'Sui coin type strings' },\n },\n required: ['coinTypes'],\n },\n isReadOnly: true,\n\n async call(input) {\n const prices = await fetchTokenPrices(input.coinTypes);\n\n const results = input.coinTypes.map((ct) => ({\n coinType: ct,\n symbol: ct.split('::').pop() ?? ct,\n price: prices[ct] ?? null,\n }));\n\n return {\n data: results,\n displayText: results\n .map((r) => `${r.symbol}: ${r.price != null ? `$${r.price.toFixed(4)}` : 'price unavailable'}`)\n .join(', '),\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// 4. defillama_price_change\n// ---------------------------------------------------------------------------\n\nexport const defillamaPriceChangeTool = buildTool({\n name: 'defillama_price_change',\n description:\n 'Get price change for a Sui token over a period. Shows current price and historical price to calculate % change.',\n inputSchema: z.object({\n coinType: z.string().describe('Sui coin type (e.g. \"0x2::sui::SUI\")'),\n period: z.enum(['1h', '24h', '7d', '30d']).optional().describe('Period (default \"24h\")'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n coinType: { type: 'string', description: 'Sui coin type string' },\n period: { type: 'string', description: 'Period: 1h, 24h, 7d, 30d' },\n },\n required: ['coinType'],\n },\n isReadOnly: true,\n\n async call(input) {\n const period = input.period ?? '24h';\n const hoursMap: Record<string, number> = { '1h': 1, '24h': 24, '7d': 168, '30d': 720 };\n const hours = hoursMap[period] ?? 24;\n const historicalTs = Math.floor(Date.now() / 1000) - hours * 3600;\n\n const coinKey = `sui:${input.coinType}`;\n const [current, historical] = await Promise.all([\n cachedFetch<{ coins: Record<string, { price: number }> }>(\n `${COINS_API}/prices/current/${encodeURIComponent(coinKey)}`,\n ),\n cachedFetch<{ coins: Record<string, { price: number }> }>(\n `${COINS_API}/prices/historical/${historicalTs}/${encodeURIComponent(coinKey)}`,\n ),\n ]);\n\n const currentPrice = current.coins[coinKey]?.price;\n const historicalPrice = historical.coins[coinKey]?.price;\n\n const symbol = input.coinType.split('::').pop() ?? input.coinType;\n\n if (currentPrice == null) {\n return {\n data: { symbol, currentPrice: 0, historicalPrice: null as number | null, change: null as number | null, period },\n displayText: 'Token price not available on DefiLlama.',\n };\n }\n\n const change = historicalPrice\n ? Math.round(((currentPrice - historicalPrice) / historicalPrice) * 10000) / 100\n : null;\n\n return {\n data: {\n symbol,\n currentPrice,\n historicalPrice: historicalPrice ?? null as number | null,\n change,\n period,\n },\n displayText: change != null\n ? `${symbol}: $${currentPrice.toFixed(4)} (${change >= 0 ? '+' : ''}${change.toFixed(2)}% over ${period})`\n : `${symbol}: $${currentPrice.toFixed(4)}`,\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// 5. defillama_chain_tvl\n// ---------------------------------------------------------------------------\n\ninterface ChainTvl {\n name: string;\n tvl: number;\n gecko_id?: string;\n}\n\nexport const defillamaChainTvlTool = buildTool({\n name: 'defillama_chain_tvl',\n description:\n 'Get chain TVL rankings. Shows top chains by total value locked. Use for \"How big is Sui?\" or \"Compare chains.\"',\n inputSchema: z.object({\n limit: z.number().min(1).max(20).optional().describe('Max results (default 10)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default 10)' },\n },\n required: [],\n },\n isReadOnly: true,\n\n async call(input) {\n const data = await cachedFetch<ChainTvl[]>(`${LLAMA_API}/v2/chains`);\n const sorted = [...data].sort((a, b) => b.tvl - a.tvl);\n const limit = input.limit ?? 10;\n const top = sorted.slice(0, limit);\n\n const results = top.map((c, i) => ({\n rank: i + 1,\n chain: c.name,\n tvl: Math.round(c.tvl),\n }));\n\n return {\n data: results,\n displayText: results\n .map((r) => `#${r.rank} ${r.chain}: $${(r.tvl / 1e9).toFixed(2)}B`)\n .join('\\n'),\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// 6. defillama_protocol_fees\n// ---------------------------------------------------------------------------\n\ninterface ProtocolFee {\n name: string;\n total24h?: number;\n total7d?: number;\n totalAllTime?: number;\n category?: string;\n chains?: string[];\n}\n\nexport const defillamaProtocolFeesTool = buildTool({\n name: 'defillama_protocol_fees',\n description:\n 'Get protocol fee/revenue rankings. Shows which protocols earn the most in fees. Use for \"Which protocols are most profitable?\"',\n inputSchema: z.object({\n chain: z.string().optional().describe('Filter by chain'),\n limit: z.number().min(1).max(20).optional().describe('Max results (default 5)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n chain: { type: 'string', description: 'Filter by chain' },\n limit: { type: 'number', description: 'Max results (default 5)' },\n },\n required: [],\n },\n isReadOnly: true,\n\n async call(input) {\n const data = await cachedFetch<{ protocols: ProtocolFee[] }>(`${LLAMA_API}/overview/fees`);\n let protocols = data.protocols ?? [];\n\n if (input.chain) {\n const chain = input.chain.toLowerCase();\n protocols = protocols.filter((p) =>\n p.chains?.some((c) => c.toLowerCase() === chain),\n );\n }\n\n protocols.sort((a, b) => (b.total24h ?? 0) - (a.total24h ?? 0));\n const limit = input.limit ?? 5;\n const top = protocols.slice(0, limit);\n\n const results = top.map((p) => ({\n name: p.name,\n fees24h: p.total24h != null ? Math.round(p.total24h) : null,\n fees7d: p.total7d != null ? Math.round(p.total7d) : null,\n category: p.category,\n }));\n\n return {\n data: results,\n displayText: results\n .map((r) => `${r.name}: $${r.fees24h != null ? (r.fees24h / 1e3).toFixed(1) + 'K' : '?'}/day`)\n .join('\\n'),\n };\n },\n});\n\nexport const defillamaSuiProtocolsTool = buildTool({\n name: 'defillama_sui_protocols',\n description:\n 'List top DeFi protocols on Sui by TVL. Shows name, TVL, category, and slug for each protocol. Use to discover protocols before calling defillama_protocol_info.',\n inputSchema: z.object({\n limit: z.number().int().min(1).max(50).optional().describe('Max protocols to return (default 10)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max protocols to return (default 10)' },\n },\n },\n isReadOnly: true,\n\n async call(input) {\n const limit = input.limit ?? 10;\n const data = await cachedFetch<Array<{\n name: string;\n slug: string;\n tvl: number;\n category: string;\n chain: string;\n chains: string[];\n }>>(`${LLAMA_API}/protocols`);\n\n const suiProtocols = data\n .filter((p) => p.chains?.includes('Sui') && p.tvl > 0)\n .sort((a, b) => b.tvl - a.tvl)\n .slice(0, limit);\n\n const results = suiProtocols.map((p) => ({\n name: p.name,\n slug: p.slug,\n tvl: Math.round(p.tvl),\n category: p.category,\n }));\n\n return {\n data: results,\n displayText: results\n .map((r, i) => `${i + 1}. ${r.name} (${fmtToolTvl(r.tvl)} TVL, ${r.category})`)\n .join('\\n'),\n };\n },\n});\n","import type { Tool } from '../types.js';\nimport { applyToolFlags } from '../tool-flags.js';\nimport { balanceCheckTool } from './balance.js';\nimport { savingsInfoTool } from './savings.js';\nimport { healthCheckTool } from './health.js';\nimport { ratesInfoTool } from './rates.js';\nimport { transactionHistoryTool } from './history.js';\nimport { saveDepositTool } from './save.js';\nimport { withdrawTool } from './withdraw.js';\nimport { sendTransferTool } from './transfer.js';\nimport { borrowTool } from './borrow.js';\nimport { repayDebtTool } from './repay.js';\nimport { claimRewardsTool } from './claim.js';\nimport { payApiTool } from './pay.js';\nimport { mppServicesTool } from './mpp-services.js';\nimport { swapExecuteTool } from './swap.js';\nimport { swapQuoteTool } from './swap-quote.js';\nimport { voloStakeTool } from './volo-stake.js';\nimport { voloUnstakeTool } from './volo-unstake.js';\nimport { voloStatsTool } from './volo-stats.js';\nimport { saveContactTool } from './contacts.js';\nimport { webSearchTool } from './web-search.js';\nimport { explainTxTool } from './explain-tx.js';\nimport { portfolioAnalysisTool } from './portfolio-analysis.js';\nimport { protocolDeepDiveTool } from './protocol-deep-dive.js';\nimport {\n createPaymentLinkTool,\n listPaymentLinksTool,\n cancelPaymentLinkTool,\n createInvoiceTool,\n cancelInvoiceTool,\n listInvoicesTool,\n} from './receive.js';\nimport { renderCanvasTool } from './canvas.js';\nimport { spendingAnalyticsTool } from './spending.js';\nimport { yieldSummaryTool } from './yield-summary.js';\nimport { activitySummaryTool } from './activity-summary.js';\nimport {\n defillamaYieldPoolsTool,\n defillamaProtocolInfoTool,\n defillamaTokenPricesTool,\n defillamaPriceChangeTool,\n defillamaChainTvlTool,\n defillamaProtocolFeesTool,\n defillamaSuiProtocolsTool,\n} from './defillama.js';\n\n// [SIMPLIFICATION DAY 7] Removed 9 tools to align engine with chat-first thesis:\n// - allowance_status, toggle_allowance, update_daily_limit, update_permissions\n// (allowance contract dormant; agent autonomy under zkLogin was theatre)\n// - create_schedule, list_schedules, cancel_schedule\n// (DCA/scheduled actions can't execute without user online to sign)\n// - pause_pattern, pattern_status\n// (pattern detection as proposals removed; classifiers stay as pure fns)\n// Final tool count: 29 reads + 11 writes = 40 tools.\n\nexport const READ_TOOLS: Tool[] = [\n renderCanvasTool,\n balanceCheckTool,\n savingsInfoTool,\n healthCheckTool,\n ratesInfoTool,\n transactionHistoryTool,\n swapQuoteTool,\n voloStatsTool,\n mppServicesTool,\n webSearchTool,\n explainTxTool,\n portfolioAnalysisTool,\n protocolDeepDiveTool,\n defillamaYieldPoolsTool,\n defillamaProtocolInfoTool,\n defillamaTokenPricesTool,\n defillamaPriceChangeTool,\n defillamaChainTvlTool,\n defillamaProtocolFeesTool,\n defillamaSuiProtocolsTool,\n listPaymentLinksTool,\n cancelPaymentLinkTool,\n listInvoicesTool,\n cancelInvoiceTool,\n createPaymentLinkTool,\n createInvoiceTool,\n spendingAnalyticsTool,\n yieldSummaryTool,\n activitySummaryTool,\n];\n\nexport const WRITE_TOOLS: Tool[] = [\n saveDepositTool,\n withdrawTool,\n sendTransferTool,\n borrowTool,\n repayDebtTool,\n claimRewardsTool,\n payApiTool,\n swapExecuteTool,\n voloStakeTool,\n voloUnstakeTool,\n saveContactTool,\n];\n\nexport function getDefaultTools(): Tool[] {\n return applyToolFlags([...READ_TOOLS, ...WRITE_TOOLS]);\n}\n\nexport {\n renderCanvasTool,\n balanceCheckTool,\n savingsInfoTool,\n healthCheckTool,\n ratesInfoTool,\n transactionHistoryTool,\n saveDepositTool,\n withdrawTool,\n sendTransferTool,\n borrowTool,\n repayDebtTool,\n claimRewardsTool,\n payApiTool,\n mppServicesTool,\n swapExecuteTool,\n swapQuoteTool,\n voloStakeTool,\n voloUnstakeTool,\n voloStatsTool,\n webSearchTool,\n explainTxTool,\n portfolioAnalysisTool,\n protocolDeepDiveTool,\n defillamaYieldPoolsTool,\n defillamaProtocolInfoTool,\n defillamaTokenPricesTool,\n defillamaPriceChangeTool,\n defillamaChainTvlTool,\n defillamaProtocolFeesTool,\n defillamaSuiProtocolsTool,\n saveContactTool,\n createPaymentLinkTool,\n listPaymentLinksTool,\n cancelPaymentLinkTool,\n createInvoiceTool,\n cancelInvoiceTool,\n listInvoicesTool,\n spendingAnalyticsTool,\n yieldSummaryTool,\n activitySummaryTool,\n};\n","/**\n * tool-modifiable-fields.ts — Audric Harness Correctness Spec v1.4 / Item 6\n *\n * Per-tool registry of input fields the host UI may let the user modify\n * before approving a `PendingAction`. The engine consults this registry\n * when emitting a `pending_action` event so the client can render an\n * editable control without hard-coding tool names in the UI layer.\n *\n * The plan reserves modification for amount-bearing write tools where the\n * user might want to lower the amount before confirming (e.g. \"save $50\"\n * → user edits to $30 → engine resumes with the modified input). Tools\n * absent from this registry have no modifiable fields and the UI renders\n * a static \"approve / deny\" pair.\n */\nimport type { PendingActionModifiableField } from '../types.js';\n\n/**\n * Tool name → ordered list of modifiable input fields. Order matters for\n * UI rendering — the first entry typically becomes the prominent control.\n */\nexport const TOOL_MODIFIABLE_FIELDS: Record<string, PendingActionModifiableField[]> = {\n save_deposit: [\n { name: 'amount', kind: 'amount', asset: 'USDC' },\n ],\n withdraw: [\n { name: 'amount', kind: 'amount', asset: 'USDC' },\n ],\n send_transfer: [\n // `amount` first so the UI surfaces it prominently; the recipient\n // address field is also editable in case the user typed the wrong one.\n { name: 'amount', kind: 'amount' },\n { name: 'to', kind: 'address' },\n ],\n swap_execute: [\n { name: 'amount', kind: 'amount' },\n ],\n borrow: [\n { name: 'amount', kind: 'amount', asset: 'USDC' },\n ],\n repay_debt: [\n { name: 'amount', kind: 'amount', asset: 'USDC' },\n ],\n volo_stake: [\n { name: 'amount', kind: 'amount', asset: 'SUI' },\n ],\n volo_unstake: [\n { name: 'amount', kind: 'amount', asset: 'vSUI' },\n ],\n};\n\n/**\n * Returns the modifiable fields for a tool name, or `undefined` if the tool\n * has no modifiable inputs. Used by the engine when emitting `pending_action`.\n */\nexport function getModifiableFields(\n toolName: string,\n): PendingActionModifiableField[] | undefined {\n return TOOL_MODIFIABLE_FIELDS[toolName];\n}\n","export const DEFAULT_SYSTEM_PROMPT = `You are Audric — a financial agent on Sui. Audric is exactly five products: Audric Passport (the trust layer — Google sign-in, non-custodial wallet, tap-to-confirm consent, sponsored gas — wraps every other product), Audric Intelligence (you — the 5-system brain: Agent Harness with 40 tools, Reasoning Engine with 9 guards and 7 skill recipes, Silent Profile, Chain Memory, AdviceLog), Audric Finance (manage money on Sui — Save via NAVI lending at 3-8% APY USDC, Credit via NAVI borrowing with health factor, Swap via Cetus aggregator across 20+ DEXs at 0.1% fee, Charts for yield/health/portfolio viz), Audric Pay (move money — send USDC, receive via payment links / invoices / QR; free, global, instant on Sui), and Audric Store (creator marketplace, ships Phase 5 — say \"coming soon\" if asked). Save, swap, borrow, repay, withdraw, charts → Audric Finance. Send, receive, payment-link, invoice, QR → Audric Pay. Your silent context (profile, memory, chain facts, advice log) shapes your replies but never surfaces as a notification — you act only when the user asks, and every write waits on their tap-to-confirm via Passport. You can also call 41 paid APIs (music, image, research, translation, weather, fulfilment) via MPP micropayments using the pay_api tool — this is an internal capability, not a promoted product, so only mention it when the user asks for something that needs it.\n\n## Response rules\n- 1-2 sentences max. No bullet lists unless asked. No preambles.\n- Never say \"Would you like me to...\", \"Sure!\", \"Great question!\", \"Absolutely!\" — just do it or say you can't.\n- Lead with the result. After tool calls, state the outcome with real numbers. Done.\n- Present amounts as $1,234.56 and rates as X.XX% APY.\n- Show top 3 results unless asked for more. Summarize totals in one line.\n\n## Execution rule\nOnly offer to execute actions you have tools for. If you retrieved a quote, data, or information but have no tool to act on it, give the user the result and tell them where to execute manually — in one sentence. Never say \"Would you like me to proceed?\" unless you have a tool that can actually proceed.\n\n## Before acting\n- ALWAYS call a read tool first before any write tool — balance_check before save/send/borrow, savings_info before withdraw.\n- Show real numbers from tools — never fabricate rates, amounts, or balances.\n- When user says \"all\" or an imprecise amount, call the read tool first to get the exact number.\n\n## Tool usage\n- Use tools proactively — don't refuse requests you can handle.\n- For real-world questions (weather, search, news, prices), use pay_api. Tell the user the cost first.\n- For broad market data (yields across protocols, token prices, TVL, protocol comparisons), use defillama_* tools.\n- To discover Sui protocols, use defillama_sui_protocols first, then defillama_protocol_info with the slug.\n- Run multiple read-only tools in parallel when you need several data points.\n- If a tool errors, say what went wrong and what to try instead. One sentence.\n\n## Savings = USDC only (critical)\n- save_deposit accepts ONLY USDC. No other token can be deposited into savings.\n- When asked \"how much can I save?\", report only the user's USDC wallet balance (saveableUsdc field from balance_check). Other tokens like GOLD, SUI, USDT are NOT saveable and NOT savings positions — they are just wallet holdings.\n- NEVER say a non-USDC token is \"in savings\" or \"earning APY in savings\" unless it appears in the savings_info positions list. Wallet holdings ≠ savings.\n- If user wants to save non-USDC tokens, tell them to swap to USDC first. Do NOT auto-chain swap + deposit.\n\n## Multi-step flows\n- \"How much X for Y?\": swap_quote first, then swap_execute if user confirms.\n- \"Swap then save\": swap_execute → balance_check → save_deposit. Confirm each step.\n- \"Buy $X of token\": defillama_token_prices → calculate amount → swap_execute.\n- \"Best yield on SUI\": compare rates_info (NAVI lending) + defillama_yield_pools (broader) + volo_stats.\n- withdraw supports legacy positions: USDC, USDe, USDsui, SUI. Pass asset param to withdraw a specific token.\n- \"Deposit SUI to earn yield\": volo_stake for SUI liquid staking. save_deposit is USDC only.\n- \"What protocols are on Sui?\": defillama_sui_protocols → defillama_protocol_info for details.\n\n## Safety\n- Never encourage risky financial behavior.\n- Warn when health factor < 1.5.\n- All amounts in USDC unless stated otherwise.`;\n","// Claude Sonnet 4 pricing (USD per token)\nconst DEFAULT_INPUT_COST = 3 / 1_000_000; // $3 per 1M input tokens\nconst DEFAULT_OUTPUT_COST = 15 / 1_000_000; // $15 per 1M output tokens\nconst CACHE_WRITE_MULTIPLIER = 1.25; // 1.25x input rate\nconst CACHE_READ_MULTIPLIER = 0.1; // 0.1x input rate\n\nexport interface CostSnapshot {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n totalTokens: number;\n estimatedCostUsd: number;\n}\n\nexport interface CostTrackerConfig {\n budgetLimitUsd?: number;\n inputCostPerToken?: number;\n outputCostPerToken?: number;\n}\n\nexport class CostTracker {\n private inputTokens = 0;\n private outputTokens = 0;\n private cacheReadTokens = 0;\n private cacheWriteTokens = 0;\n private readonly budgetLimitUsd: number | null;\n private readonly inputCost: number;\n private readonly outputCost: number;\n\n constructor(config: CostTrackerConfig = {}) {\n this.budgetLimitUsd = config.budgetLimitUsd ?? null;\n this.inputCost = config.inputCostPerToken ?? DEFAULT_INPUT_COST;\n this.outputCost = config.outputCostPerToken ?? DEFAULT_OUTPUT_COST;\n }\n\n track(\n inputTokens: number,\n outputTokens: number,\n cacheReadTokens?: number,\n cacheWriteTokens?: number,\n ): void {\n this.inputTokens += inputTokens;\n this.outputTokens += outputTokens;\n this.cacheReadTokens += cacheReadTokens ?? 0;\n this.cacheWriteTokens += cacheWriteTokens ?? 0;\n }\n\n getSnapshot(): CostSnapshot {\n const totalTokens =\n this.inputTokens + this.outputTokens + this.cacheReadTokens + this.cacheWriteTokens;\n\n const estimatedCostUsd =\n this.inputTokens * this.inputCost +\n this.outputTokens * this.outputCost +\n this.cacheReadTokens * this.inputCost * CACHE_READ_MULTIPLIER +\n this.cacheWriteTokens * this.inputCost * CACHE_WRITE_MULTIPLIER;\n\n return {\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n cacheReadTokens: this.cacheReadTokens,\n cacheWriteTokens: this.cacheWriteTokens,\n totalTokens,\n estimatedCostUsd,\n };\n }\n\n isOverBudget(): boolean {\n if (this.budgetLimitUsd === null) return false;\n return this.getSnapshot().estimatedCostUsd >= this.budgetLimitUsd;\n }\n\n getRemainingBudgetUsd(): number | null {\n if (this.budgetLimitUsd === null) return null;\n return Math.max(0, this.budgetLimitUsd - this.getSnapshot().estimatedCostUsd);\n }\n\n reset(): void {\n this.inputTokens = 0;\n this.outputTokens = 0;\n this.cacheReadTokens = 0;\n this.cacheWriteTokens = 0;\n }\n}\n","import type { Tool, ToolFlags } from './types.js';\nimport type { PendingToolCall } from './orchestration.js';\n\n// ---------------------------------------------------------------------------\n// Guard types\n// ---------------------------------------------------------------------------\n\nexport type GuardVerdict = 'pass' | 'hint' | 'warn' | 'block';\n\nexport type GuardTier = 'safety' | 'financial' | 'ux';\n\nexport interface GuardResult {\n verdict: GuardVerdict;\n gate: string;\n tier: GuardTier;\n message?: string;\n}\n\nexport interface GuardInjection {\n _gate: string;\n _hint?: string;\n _warning?: string;\n _error?: string;\n}\n\nexport interface GuardCheckResult {\n blocked: boolean;\n blockReason?: string;\n blockGate?: string;\n injections: GuardInjection[];\n events: GuardEvent[];\n}\n\nexport interface GuardEvent {\n timestamp: number;\n toolName: string;\n toolUseId: string;\n gate: string;\n verdict: GuardVerdict;\n tier: GuardTier;\n message?: string;\n}\n\n/**\n * [v1.4 Item 4] Per-guard metric emitted via `EngineConfig.onGuardFired`.\n * Hosts (e.g. audric `TurnMetricsCollector`) accumulate these for the\n * `TurnMetrics.guardsFired` JSON column. Mirrors `GuardEvent` but with\n * a coarser tri-state action (allow/warn/block) so the host doesn't\n * need to know the engine's verdict vocabulary.\n */\nexport interface GuardMetric {\n name: string;\n tier: GuardTier;\n action: 'allow' | 'warn' | 'block';\n injectionAdded: boolean;\n}\n\n/**\n * Engine-internal mapping from `GuardVerdict` to `GuardMetric.action`.\n * `pass` and `hint` collapse to `allow` because hint is non-blocking —\n * the model just sees a soft note.\n */\nexport function guardVerdictToAction(verdict: GuardVerdict): GuardMetric['action'] {\n if (verdict === 'pass' || verdict === 'hint') return 'allow';\n if (verdict === 'warn') return 'warn';\n return 'block';\n}\n\n// ---------------------------------------------------------------------------\n// Guard configuration\n// ---------------------------------------------------------------------------\n\nexport interface GuardConfig {\n balanceValidation?: boolean;\n healthFactor?: { warnBelow: number; blockBelow: number } | false;\n largeTransfer?: { warnAbove: number; strongWarnAbove: number } | false;\n slippage?: boolean;\n staleData?: boolean;\n irreversibility?: boolean;\n artifactPreview?: boolean;\n costWarning?: boolean;\n retryProtection?: boolean;\n inputValidation?: boolean;\n}\n\nexport const DEFAULT_GUARD_CONFIG: GuardConfig = {\n balanceValidation: true,\n healthFactor: { warnBelow: 2.0, blockBelow: 1.5 },\n largeTransfer: { warnAbove: 50, strongWarnAbove: 500 },\n slippage: true,\n staleData: true,\n irreversibility: true,\n artifactPreview: true,\n costWarning: true,\n retryProtection: true,\n inputValidation: true,\n};\n\n// ---------------------------------------------------------------------------\n// BalanceTracker — tracks freshness of balance data across the session\n// ---------------------------------------------------------------------------\n\nexport class BalanceTracker {\n private lastBalanceAt = 0;\n private lastWriteAt = 0;\n\n recordRead(): void {\n this.lastBalanceAt = Date.now();\n }\n\n recordWrite(): void {\n this.lastWriteAt = Date.now();\n }\n\n isStale(): boolean {\n return this.lastWriteAt > this.lastBalanceAt;\n }\n\n hasEverRead(): boolean {\n return this.lastBalanceAt > 0;\n }\n}\n\nconst BALANCE_READ_TOOLS = new Set([\n 'balance_check',\n 'savings_info',\n 'health_check',\n]);\n\n// ---------------------------------------------------------------------------\n// RetryTracker — prevents re-execution of paid/non-retryable tool calls\n// ---------------------------------------------------------------------------\n\nexport class RetryTracker {\n private executed = new Map<string, { result: unknown; paidAt: number }>();\n\n private key(toolName: string, input: unknown): string {\n const url = (input as Record<string, unknown>)?.url ?? '';\n return `${toolName}:${url}`;\n }\n\n record(toolName: string, input: unknown, result: unknown): void {\n const r = result as Record<string, unknown>;\n if (r?.paymentConfirmed || r?.doNotRetry) {\n this.executed.set(this.key(toolName, input), { result, paidAt: Date.now() });\n }\n }\n\n isBlocked(toolName: string, input: unknown): { blocked: boolean; previousResult?: unknown } {\n const prev = this.executed.get(this.key(toolName, input));\n if (!prev) return { blocked: false };\n return { blocked: true, previousResult: prev.result };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Individual guard implementations\n// Priority order: Safety > Financial > UX\n// ---------------------------------------------------------------------------\n\nfunction guardRetryProtection(\n tool: Tool,\n call: PendingToolCall,\n retryTracker: RetryTracker,\n): GuardResult {\n const check = retryTracker.isBlocked(tool.name, call.input);\n if (check.blocked) {\n return {\n verdict: 'block',\n gate: 'retry_blocked',\n tier: 'safety',\n message: `Blocked: ${tool.name} was already called and payment was confirmed. Do not retry.`,\n };\n }\n return { verdict: 'pass', gate: 'retry_blocked', tier: 'safety' };\n}\n\nfunction guardIrreversibility(\n tool: Tool,\n _call: PendingToolCall,\n conversationText: string,\n): GuardResult {\n if (!tool.flags.irreversible) {\n return { verdict: 'pass', gate: 'irreversibility', tier: 'safety' };\n }\n\n const hasPreview = /preview|here.s what|confirm.*send|looks? good/i.test(conversationText);\n if (hasPreview) {\n return { verdict: 'pass', gate: 'irreversibility', tier: 'safety' };\n }\n\n return {\n verdict: 'hint',\n gate: 'irreversibility',\n tier: 'safety',\n message: 'This action is irreversible. Show a preview and ask the user to confirm before proceeding.',\n };\n}\n\nfunction guardBalanceValidation(\n tool: Tool,\n _call: PendingToolCall,\n balanceTracker: BalanceTracker,\n): GuardResult {\n if (!tool.flags.requiresBalance) {\n return { verdict: 'pass', gate: 'balance_required', tier: 'financial' };\n }\n\n if (!balanceTracker.hasEverRead()) {\n return {\n verdict: 'hint',\n gate: 'balance_required',\n tier: 'financial',\n message: 'Balance has not been checked this session. Call balance_check first to verify sufficient funds.',\n };\n }\n\n if (balanceTracker.isStale()) {\n return {\n verdict: 'hint',\n gate: 'balance_required',\n tier: 'financial',\n message: 'Balance data is stale (a write action occurred since last check). Call balance_check first to verify sufficient funds.',\n };\n }\n\n return { verdict: 'pass', gate: 'balance_required', tier: 'financial' };\n}\n\nfunction guardHealthFactor(\n tool: Tool,\n _call: PendingToolCall,\n lastHealthFactor: number | null,\n config: { warnBelow: number; blockBelow: number },\n): GuardResult {\n if (!tool.flags.affectsHealth) {\n return { verdict: 'pass', gate: 'health_factor', tier: 'financial' };\n }\n\n if (lastHealthFactor === null) {\n return {\n verdict: 'hint',\n gate: 'health_factor',\n tier: 'financial',\n message: 'Health factor has not been checked this session. Call health_check before this action.',\n };\n }\n\n if (lastHealthFactor < config.blockBelow) {\n return {\n verdict: 'block',\n gate: 'health_factor',\n tier: 'financial',\n message: `Health factor is ${lastHealthFactor.toFixed(2)} — this action risks liquidation. Refusing.`,\n };\n }\n\n if (lastHealthFactor < config.warnBelow) {\n return {\n verdict: 'warn',\n gate: 'health_factor',\n tier: 'financial',\n message: `Health factor is ${lastHealthFactor.toFixed(2)} — this action may reduce it further.`,\n };\n }\n\n return { verdict: 'pass', gate: 'health_factor', tier: 'financial' };\n}\n\nfunction guardLargeTransfer(\n tool: Tool,\n call: PendingToolCall,\n config: { warnAbove: number; strongWarnAbove: number },\n): GuardResult {\n if (tool.name !== 'send_transfer') {\n return { verdict: 'pass', gate: 'large_transfer', tier: 'financial' };\n }\n\n const input = call.input as Record<string, unknown>;\n const amount = Number(input.amount ?? 0);\n if (!amount || amount <= 0) {\n return { verdict: 'pass', gate: 'large_transfer', tier: 'financial' };\n }\n\n const recipient = String(input.recipient ?? input.to ?? '');\n const shortAddr = recipient.length > 10\n ? `${recipient.slice(0, 6)}...${recipient.slice(-4)}`\n : recipient;\n\n if (amount > config.strongWarnAbove) {\n return {\n verdict: 'warn',\n gate: 'large_transfer',\n tier: 'financial',\n message: `High-value transfer ($${amount}). Double-check the address: ${shortAddr}`,\n };\n }\n\n if (amount > config.warnAbove) {\n return {\n verdict: 'hint',\n gate: 'large_transfer',\n tier: 'financial',\n message: `This is a large transfer ($${amount}). Verify the recipient address.`,\n };\n }\n\n return { verdict: 'pass', gate: 'large_transfer', tier: 'financial' };\n}\n\nfunction guardSlippage(\n tool: Tool,\n _call: PendingToolCall,\n lastAssistantText: string,\n): GuardResult {\n if (tool.name !== 'swap_execute') {\n return { verdict: 'pass', gate: 'slippage_warning', tier: 'financial' };\n }\n\n const hasEstimate = /~?\\$?[\\d,]+\\.?\\d*\\s*(SUI|USDC|USDT|WETH)/i.test(lastAssistantText)\n || /approximately|≈|about|expect|receive/i.test(lastAssistantText);\n\n if (hasEstimate) {\n return { verdict: 'pass', gate: 'slippage_warning', tier: 'financial' };\n }\n\n return {\n verdict: 'hint',\n gate: 'slippage_warning',\n tier: 'financial',\n message: 'State the expected output amount to the user before executing the swap.',\n };\n}\n\nfunction guardCostWarning(\n tool: Tool,\n _call: PendingToolCall,\n conversationText: string,\n): GuardResult {\n if (!tool.flags.costAware) {\n return { verdict: 'pass', gate: 'cost_warning', tier: 'ux' };\n }\n\n const hasCostMention = /\\$\\d+\\.?\\d*|cost|fee|charge|price|pay/i.test(conversationText);\n if (hasCostMention) {\n return { verdict: 'pass', gate: 'cost_warning', tier: 'ux' };\n }\n\n return {\n verdict: 'hint',\n gate: 'cost_warning',\n tier: 'ux',\n message: 'This action has a monetary cost. Confirm the user is aware before proceeding.',\n };\n}\n\n// ---------------------------------------------------------------------------\n// Post-execution guards — run after tool result is available\n// ---------------------------------------------------------------------------\n\nexport function guardArtifactPreview(result: unknown): GuardInjection | null {\n if (!result || typeof result !== 'object') return null;\n const r = result as Record<string, unknown>;\n\n const hasImage =\n (typeof r.url === 'string' && /\\.(png|jpg|jpeg|webp|gif|svg)(\\?|$)/i.test(r.url))\n || (Array.isArray(r.images) && r.images.length > 0)\n || typeof r.image_url === 'string';\n\n const hasPdf = typeof r.url === 'string' && /\\.pdf(\\?|$)/i.test(r.url);\n\n if (hasImage || hasPdf) {\n return {\n _gate: 'artifact_preview',\n _hint: 'Show this to the user before proceeding. Output as .',\n };\n }\n\n return null;\n}\n\nexport function guardStaleData(toolFlags: ToolFlags): GuardInjection | null {\n if (!toolFlags.mutating) return null;\n return {\n _gate: 'stale_data',\n _hint: 'A write action just completed. The balance snapshot is outdated. Do NOT calculate new balances from old data — call balance_check for fresh numbers, or use only the data returned by the write tool.',\n };\n}\n\n// ---------------------------------------------------------------------------\n// Guard runner — orchestrates all pre-execution guards\n// ---------------------------------------------------------------------------\n\nexport interface GuardRunnerState {\n balanceTracker: BalanceTracker;\n retryTracker: RetryTracker;\n lastHealthFactor: number | null;\n}\n\nexport function createGuardRunnerState(): GuardRunnerState {\n return {\n balanceTracker: new BalanceTracker(),\n retryTracker: new RetryTracker(),\n lastHealthFactor: null,\n };\n}\n\nexport function runGuards(\n tool: Tool,\n call: PendingToolCall,\n state: GuardRunnerState,\n config: GuardConfig,\n conversationContext: { fullText: string; lastAssistantText: string },\n /**\n * [v1.4 Item 4] Optional per-guard observation hook. Fired exactly\n * once per non-`pass` guard verdict (i.e. for every event that ends\n * up in `events`/`injections`/`block`). Errors thrown by the host\n * are caught so a misbehaving collector can't break tool execution.\n */\n onGuardFired?: (guard: GuardMetric) => void,\n): GuardCheckResult {\n const results: GuardResult[] = [];\n const now = Date.now();\n const fire = (verdict: GuardVerdict, tier: GuardTier, gate: string, hadInjection: boolean) => {\n if (!onGuardFired) return;\n try {\n onGuardFired({\n name: gate,\n tier,\n action: guardVerdictToAction(verdict),\n injectionAdded: hadInjection,\n });\n } catch (err) {\n console.warn('[guards] onGuardFired threw (ignored):', err);\n }\n };\n\n // Tier 0: Input validation (preflight) — runs first, invalid input = immediate block\n if (config.inputValidation !== false && tool.preflight) {\n const check = tool.preflight(call.input);\n if (!check.valid) {\n const event: GuardEvent = {\n timestamp: now,\n toolName: tool.name,\n toolUseId: call.id,\n gate: 'input_validation',\n verdict: 'block',\n tier: 'safety',\n message: check.error,\n };\n fire('block', 'safety', 'input_validation', false);\n return {\n blocked: true,\n blockReason: check.error,\n blockGate: 'input_validation',\n injections: [],\n events: [event],\n };\n }\n }\n\n // Tier 1: Safety guards\n if (config.retryProtection !== false) {\n results.push(guardRetryProtection(tool, call, state.retryTracker));\n }\n if (config.irreversibility !== false) {\n results.push(guardIrreversibility(tool, call, conversationContext.fullText));\n }\n\n // Tier 2: Financial guards\n if (config.balanceValidation !== false) {\n results.push(guardBalanceValidation(tool, call, state.balanceTracker));\n }\n if (config.healthFactor) {\n results.push(guardHealthFactor(tool, call, state.lastHealthFactor, config.healthFactor));\n }\n if (config.largeTransfer) {\n results.push(guardLargeTransfer(tool, call, config.largeTransfer));\n }\n if (config.slippage !== false) {\n results.push(guardSlippage(tool, call, conversationContext.lastAssistantText));\n }\n\n // Tier 3: UX guards\n if (config.costWarning !== false) {\n results.push(guardCostWarning(tool, call, conversationContext.fullText));\n }\n\n // Process results — first block wins, collect all hints/warnings\n const events: GuardEvent[] = results\n .filter((r) => r.verdict !== 'pass')\n .map((r) => ({\n timestamp: now,\n toolName: tool.name,\n toolUseId: call.id,\n gate: r.gate,\n verdict: r.verdict,\n tier: r.tier,\n message: r.message,\n }));\n\n const block = results.find((r) => r.verdict === 'block');\n if (block) {\n // Fire once for the block winner; non-blocking warnings/hints from\n // earlier in the chain are surfaced too so the host sees the full\n // picture per turn.\n for (const r of results) {\n if (r.verdict === 'pass') continue;\n fire(r.verdict, r.tier, r.gate, false);\n }\n return {\n blocked: true,\n blockReason: block.message ?? `Blocked by ${block.gate}`,\n blockGate: block.gate,\n injections: [],\n events,\n };\n }\n\n const injections: GuardInjection[] = results\n .filter((r) => r.verdict === 'hint' || r.verdict === 'warn')\n .map((r) => ({\n _gate: r.gate,\n ...(r.verdict === 'hint' ? { _hint: r.message } : { _warning: r.message }),\n }));\n\n for (const r of results) {\n if (r.verdict === 'pass') continue;\n fire(r.verdict, r.tier, r.gate, r.verdict === 'hint' || r.verdict === 'warn');\n }\n\n return { blocked: false, injections, events };\n}\n\n// ---------------------------------------------------------------------------\n// Post-execution hooks — update tracker state after tools run\n// ---------------------------------------------------------------------------\n\nexport function updateGuardStateAfterToolResult(\n toolName: string,\n tool: Tool | undefined,\n input: unknown,\n result: unknown,\n isError: boolean,\n state: GuardRunnerState,\n): void {\n if (isError) return;\n\n if (BALANCE_READ_TOOLS.has(toolName)) {\n state.balanceTracker.recordRead();\n }\n\n if (tool?.flags.mutating) {\n state.balanceTracker.recordWrite();\n }\n\n if (toolName === 'health_check' && result && typeof result === 'object') {\n const r = result as Record<string, unknown>;\n const hf = Number(r.healthFactor ?? r.health_factor ?? r.hf);\n if (!isNaN(hf) && hf > 0) {\n state.lastHealthFactor = hf;\n }\n }\n\n state.retryTracker.record(toolName, input, result);\n}\n\n// ---------------------------------------------------------------------------\n// Conversation text extraction (for guard context)\n// ---------------------------------------------------------------------------\n\nexport function extractConversationText(\n messages: Array<{ role: string; content: unknown }>,\n): { fullText: string; lastAssistantText: string } {\n const textParts: string[] = [];\n let lastAssistantText = '';\n\n for (const msg of messages) {\n if (!Array.isArray(msg.content)) continue;\n for (const block of msg.content as Array<Record<string, unknown>>) {\n if (block.type === 'text' && typeof block.text === 'string') {\n textParts.push(block.text);\n if (msg.role === 'assistant') {\n lastAssistantText = block.text;\n }\n }\n }\n }\n\n return {\n fullText: textParts.join('\\n'),\n lastAssistantText,\n };\n}\n","import type { Message, ContentBlock, Tool } from '../types.js';\n\n/**\n * [v1.4 Item 4] Side-channel return from `microcompact` so callers can\n * count or surface dedup hits without re-walking the message ledger.\n * Backwards-compatible: `microcompact(messages)` still returns the\n * processed `Message[]` (now enriched), and the dedup set lives on the\n * returned array via a non-enumerable `dedupedToolUseIds` accessor that\n * the engine reads in its agent loop.\n */\nexport interface MicrocompactResult extends Array<Message> {\n /**\n * Tool-use IDs whose prior results were replaced with a compact\n * back-reference during this pass. Empty when nothing matched.\n */\n dedupedToolUseIds: Set<string>;\n}\n\n/**\n * Zero-cost deduplication pass: if the same tool was called with identical\n * inputs earlier in the conversation and the result hasn't changed, replace\n * the full prior result with a compact back-reference. Runs before any\n * LLM-based compaction and costs nothing.\n *\n * [v1.5.1] Tools may opt out of dedupe by setting `cacheable: false` on\n * their `Tool` definition. Non-cacheable tools (e.g. `balance_check`,\n * `savings_info`, `health_check`, `transaction_history`) are excluded\n * from the `seen` map entirely, so neither the current call nor any\n * later call with identical inputs gets replaced — necessary because\n * their results depend on mutable on-chain state that writes invalidate.\n *\n * Returns a new array — does not mutate the input. The returned array\n * carries a `dedupedToolUseIds` property listing every tool-use ID whose\n * tool_result block was replaced with a back-reference this pass.\n *\n * @param messages — conversation ledger to compact.\n * @param tools — optional tool registry consulted to resolve the\n * per-tool `cacheable` flag. Omit to dedupe every\n * tool (legacy behavior — back-compat).\n */\nexport function microcompact(\n messages: readonly Message[],\n tools?: readonly Tool[],\n): MicrocompactResult {\n const seen = new Map<string, { turnIndex: number }>();\n let toolUseIndex = 0;\n\n const toolUseInputs = new Map<string, string>();\n // Map tool name → cacheable flag. Default behavior (no entry, or\n // `cacheable === undefined`) is `true` — back-compat with hosts that\n // don't pass a tools array.\n const cacheableByName = new Map<string, boolean>();\n if (tools) {\n for (const t of tools) {\n cacheableByName.set(t.name, t.cacheable ?? true);\n }\n }\n const dedupedToolUseIds = new Set<string>();\n\n // Resolve tool name from a tool_use_id — cached lookup so each result\n // pass stays linear.\n const toolNameById = new Map<string, string>();\n\n for (const msg of messages) {\n for (const block of msg.content) {\n if (block.type === 'tool_use') {\n toolUseInputs.set(block.id, `${block.name}:${stableStringify(block.input)}`);\n toolNameById.set(block.id, block.name);\n }\n }\n }\n\n const out = messages.map((msg) => {\n if (msg.role !== 'user') return { role: msg.role, content: [...msg.content] };\n\n const hasToolResults = msg.content.some((b) => b.type === 'tool_result');\n if (!hasToolResults) return { role: msg.role, content: [...msg.content] };\n\n const newContent: ContentBlock[] = msg.content.map((block) => {\n if (block.type !== 'tool_result') return block;\n\n const key = toolUseInputs.get(block.toolUseId);\n if (!key) return block;\n\n // [v1.5.1] Skip dedupe entirely for tools whose results depend on\n // mutable state. Don't write to `seen` either — otherwise a later\n // *cacheable* call with the same key would erroneously dedupe\n // against this fresh result.\n const toolName = toolNameById.get(block.toolUseId);\n if (toolName && cacheableByName.get(toolName) === false) {\n toolUseIndex++;\n return block;\n }\n\n toolUseIndex++;\n const prior = seen.get(key);\n\n if (prior && !block.isError) {\n dedupedToolUseIds.add(block.toolUseId);\n return {\n ...block,\n content: `[Same result as call #${prior.turnIndex} — ${key.split(':')[0]} with identical inputs. Result unchanged.]`,\n };\n }\n\n if (!block.isError) {\n seen.set(key, { turnIndex: toolUseIndex });\n }\n return block;\n });\n\n return { role: msg.role, content: newContent };\n });\n\n // Attach the side-channel without breaking `Message[]` consumers — the\n // result is structurally compatible with `Message[]`, the extra property\n // is invisible to anything that only reads array semantics or runs deep\n // equality against a plain `Message[]` (vitest, JSON.stringify, …).\n Object.defineProperty(out, 'dedupedToolUseIds', {\n value: dedupedToolUseIds,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n return out as MicrocompactResult;\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value !== 'object') return JSON.stringify(value);\n if (Array.isArray(value)) return JSON.stringify(value);\n const sorted = Object.keys(value as Record<string, unknown>).sort();\n const obj: Record<string, unknown> = {};\n for (const k of sorted) obj[k] = (value as Record<string, unknown>)[k];\n return JSON.stringify(obj);\n}\n","import type { Message, ContentBlock } from './types.js';\nimport { microcompact } from './compact/microcompact.js';\n\n// Rough token estimation: ~4 chars per token (conservative for English + JSON)\nconst CHARS_PER_TOKEN = 4;\n\n// Default context window for Sonnet 4.6\nconst DEFAULT_CONTEXT_LIMIT = 200_000;\n\n// ---------------------------------------------------------------------------\n// Token estimation\n// ---------------------------------------------------------------------------\n\n/** Rough token count for a message array. */\nexport function estimateTokens(messages: Message[]): number {\n let chars = 0;\n for (const msg of messages) {\n for (const block of msg.content) {\n chars += blockCharCount(block);\n }\n }\n return Math.ceil(chars / CHARS_PER_TOKEN);\n}\n\nfunction blockCharCount(block: ContentBlock): number {\n switch (block.type) {\n case 'text':\n return block.text.length;\n case 'thinking':\n return block.thinking.length;\n case 'redacted_thinking':\n return block.data.length;\n case 'tool_use':\n return block.name.length + JSON.stringify(block.input).length;\n case 'tool_result':\n return block.content.length;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Message compaction\n// ---------------------------------------------------------------------------\n\nexport interface CompactOptions {\n /** Max token budget for the conversation. Default 100_000. */\n maxTokens?: number;\n /** Number of recent messages to always keep uncompacted. Default 8. */\n keepRecentCount?: number;\n /** System prompt token estimate (subtracted from budget). Default 500. */\n systemPromptTokens?: number;\n /** LLM-based summarizer for old turns. When provided, replaces old turns with a summary. */\n summarizer?: (messages: Message[]) => Promise<string>;\n}\n\n// ---------------------------------------------------------------------------\n// ContextBudget — tracks cumulative token usage and signals compaction\n// ---------------------------------------------------------------------------\n\nexport interface ContextBudgetConfig {\n /** Total context window size in tokens. Default 200_000 (Sonnet 4.6). */\n contextLimit?: number;\n /** Trigger compaction at this fraction of contextLimit. Default 0.85. */\n compactThreshold?: number;\n /** Emit a warning at this fraction of contextLimit. Default 0.70. */\n warnThreshold?: number;\n}\n\nexport class ContextBudget {\n private estimatedTokens = 0;\n private readonly contextLimit: number;\n private readonly compactThreshold: number;\n private readonly warnThreshold: number;\n\n constructor(config: ContextBudgetConfig = {}) {\n this.contextLimit = config.contextLimit ?? DEFAULT_CONTEXT_LIMIT;\n this.compactThreshold = config.compactThreshold ?? 0.85;\n this.warnThreshold = config.warnThreshold ?? 0.70;\n }\n\n /** Update with actual input_tokens from the API usage event. */\n update(inputTokens: number): void {\n this.estimatedTokens = inputTokens;\n }\n\n /** True when the session should be compacted (at 85% of context limit). */\n shouldCompact(): boolean {\n return this.estimatedTokens >= this.contextLimit * this.compactThreshold;\n }\n\n /** True when nearing the limit (at 70% of context limit). */\n shouldWarn(): boolean {\n return this.estimatedTokens >= this.contextLimit * this.warnThreshold;\n }\n\n /** Current token count. */\n get tokens(): number {\n return this.estimatedTokens;\n }\n\n /** Remaining tokens before compaction triggers. */\n get remaining(): number {\n return Math.max(0, Math.floor(this.contextLimit * this.compactThreshold) - this.estimatedTokens);\n }\n\n /** Usage ratio (0..1). */\n get usage(): number {\n return this.estimatedTokens / this.contextLimit;\n }\n\n reset(): void {\n this.estimatedTokens = 0;\n }\n}\n\n/**\n * Compact a conversation that exceeds the token budget.\n *\n * Strategy:\n * 1. Always preserve the most recent `keepRecentCount` messages (the active context).\n * 2. If an LLM `summarizer` is provided, summarize old turns into a brief recap and\n * replace them with a synthetic summary turn pair.\n * 3. For older messages, summarise tool_result content to a brief one-liner.\n * 4. If still over budget, drop the oldest messages (keeping the first user message\n * for context continuity).\n *\n * Returns a new array — does not mutate the input.\n */\nexport async function compactMessages(\n messages: readonly Message[],\n opts: CompactOptions = {},\n): Promise<Message[]> {\n const maxTokens = opts.maxTokens ?? 100_000;\n const keepRecent = opts.keepRecentCount ?? 8;\n const systemTokens = opts.systemPromptTokens ?? 500;\n const budget = maxTokens - systemTokens;\n\n if (messages.length === 0) return [];\n\n // Phase -1: zero-cost deduplication of identical tool calls\n const deduped = microcompact(messages);\n\n const mutable = deduped.map((m) => ({\n role: m.role,\n content: m.content.map((b) => ({ ...b })),\n })) as Message[];\n\n if (estimateTokens(mutable) <= budget) return mutable;\n\n const splitIdx = Math.max(0, mutable.length - keepRecent);\n const oldMessages = mutable.slice(0, splitIdx);\n const recent = mutable.slice(splitIdx);\n\n // Phase 0: If summarizer is provided, try LLM-based summarization of old turns\n if (opts.summarizer && oldMessages.length > 0) {\n const strippedOld = stripThinkingBlocks(oldMessages);\n try {\n const summary = await opts.summarizer(strippedOld);\n const summaryMessages: Message[] = [\n { role: 'user', content: [{ type: 'text', text: `[Session summary: ${summary}]` }] },\n { role: 'assistant', content: [{ type: 'text', text: 'Understood. I have the context from our earlier conversation.' }] },\n ];\n const withSummary = [...summaryMessages, ...recent];\n if (estimateTokens(withSummary) <= budget) return sanitizeMessages(withSummary);\n } catch {\n // Summarizer failed — fall through to truncation strategy\n }\n }\n\n // Phase 1: summarise tool_result blocks in older messages\n for (let i = 0; i < splitIdx; i++) {\n mutable[i].content = mutable[i].content.map((block) => {\n if (block.type === 'tool_result' && block.content.length > 200) {\n return {\n ...block,\n content: truncateToolResult(block.content),\n };\n }\n return block;\n });\n }\n\n // Strip thinking blocks from old messages (they don't aid context continuity)\n for (let i = 0; i < splitIdx; i++) {\n mutable[i].content = mutable[i].content.filter(\n (b) => b.type !== 'thinking' && b.type !== 'redacted_thinking',\n );\n }\n\n if (estimateTokens(mutable) <= budget) return mutable;\n\n // Phase 2: drop old messages from the middle, keep first + recent\n if (splitIdx <= 1) {\n // All messages are recent (or only the first message is \"old\") — skip middle-drop\n return sanitizeMessages(mutable);\n }\n\n const first = mutable[0];\n const recentFromMutable = mutable.slice(splitIdx);\n const oldSection = mutable.slice(1, splitIdx);\n\n while (oldSection.length > 0 && estimateTokens([first, ...oldSection, ...recentFromMutable]) > budget) {\n oldSection.shift();\n }\n\n const compacted = [first, ...oldSection, ...recentFromMutable];\n\n // Phase 3: if still over budget (very long recent section), truncate tool results in recent\n if (estimateTokens(compacted) > budget) {\n for (const msg of compacted) {\n msg.content = msg.content.map((block) => {\n if (block.type === 'tool_result' && block.content.length > 100) {\n return { ...block, content: truncateToolResult(block.content) };\n }\n return block;\n });\n }\n }\n\n return sanitizeMessages(compacted);\n}\n\n/**\n * Strip thinking and redacted_thinking blocks from messages.\n * Used before summarization — thinking blocks don't help the summarizer.\n */\nfunction stripThinkingBlocks(messages: Message[]): Message[] {\n return messages.map((m) => ({\n ...m,\n content: m.content.filter(\n (b) => b.type !== 'thinking' && b.type !== 'redacted_thinking',\n ),\n })).filter((m) => m.content.length > 0);\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Remove orphaned tool_use / tool_result blocks that lost their pair\n * during compaction. Anthropic requires every tool_result to match a\n * preceding tool_use and vice versa.\n */\nfunction sanitizeMessages(messages: Message[]): Message[] {\n const toolUseIds = new Set<string>();\n const toolResultIds = new Set<string>();\n\n for (const msg of messages) {\n for (const block of msg.content) {\n if (block.type === 'tool_use') toolUseIds.add(block.id);\n if (block.type === 'tool_result') toolResultIds.add(block.toolUseId);\n }\n }\n\n return messages\n .map((msg) => {\n const filtered = msg.content.filter((block) => {\n if (block.type === 'tool_result') return toolUseIds.has(block.toolUseId);\n if (block.type === 'tool_use') return toolResultIds.has(block.id);\n return true;\n });\n if (filtered.length === 0) return null;\n return { ...msg, content: filtered };\n })\n .filter((m): m is Message => m !== null);\n}\n\nfunction truncateToolResult(content: string): string {\n try {\n const parsed = JSON.parse(content);\n\n if (parsed.error) {\n return JSON.stringify({ error: parsed.error });\n }\n\n // Keep just the top-level keys with truncated values\n if (typeof parsed === 'object' && parsed !== null) {\n const summary: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (typeof value === 'number' || typeof value === 'boolean') {\n summary[key] = value;\n } else if (typeof value === 'string') {\n summary[key] = value.length > 50 ? value.slice(0, 50) + '…' : value;\n } else if (Array.isArray(value)) {\n summary[key] = `[${value.length} items]`;\n } else {\n summary[key] = '{…}';\n }\n }\n return JSON.stringify(summary);\n }\n\n return content.slice(0, 100);\n } catch {\n return content.slice(0, 100);\n }\n}\n","/**\n * USD-aware permission resolution for write tools.\n *\n * Replaces the binary auto/confirm/explicit system with dollar-threshold\n * tiers that resolve at runtime based on the transaction value and\n * per-user configuration.\n */\n\nexport type PermissionOperation =\n | 'save'\n | 'withdraw'\n | 'send'\n | 'borrow'\n | 'repay'\n | 'swap'\n | 'pay';\n\nexport interface PermissionRule {\n operation: PermissionOperation;\n /** Auto-execute if USD amount is below this threshold. */\n autoBelow: number;\n /** Confirm if between autoBelow and this. Explicit for anything above. */\n confirmBetween: number;\n}\n\nexport interface UserPermissionConfig {\n rules: PermissionRule[];\n /** Fallback auto threshold for operations without a specific rule. */\n globalAutoBelow: number;\n /** Max total USD of autonomous actions per day (safety net). */\n autonomousDailyLimit: number;\n}\n\nexport const DEFAULT_PERMISSION_CONFIG: UserPermissionConfig = {\n globalAutoBelow: 10,\n autonomousDailyLimit: 200,\n rules: [\n { operation: 'save', autoBelow: 50, confirmBetween: 1000 },\n { operation: 'send', autoBelow: 10, confirmBetween: 200 },\n { operation: 'borrow', autoBelow: 0, confirmBetween: 500 },\n { operation: 'withdraw', autoBelow: 25, confirmBetween: 500 },\n { operation: 'swap', autoBelow: 25, confirmBetween: 300 },\n { operation: 'pay', autoBelow: 1, confirmBetween: 50 },\n { operation: 'repay', autoBelow: 50, confirmBetween: 1000 },\n ],\n};\n\nexport const PERMISSION_PRESETS = {\n conservative: {\n globalAutoBelow: 5,\n autonomousDailyLimit: 100,\n rules: [\n { operation: 'save' as const, autoBelow: 5, confirmBetween: 100 },\n { operation: 'send' as const, autoBelow: 5, confirmBetween: 100 },\n { operation: 'borrow' as const, autoBelow: 0, confirmBetween: 100 },\n { operation: 'withdraw' as const, autoBelow: 5, confirmBetween: 100 },\n { operation: 'swap' as const, autoBelow: 5, confirmBetween: 100 },\n { operation: 'pay' as const, autoBelow: 1, confirmBetween: 25 },\n { operation: 'repay' as const, autoBelow: 5, confirmBetween: 100 },\n ],\n },\n balanced: DEFAULT_PERMISSION_CONFIG,\n aggressive: {\n globalAutoBelow: 25,\n autonomousDailyLimit: 500,\n rules: [\n { operation: 'save' as const, autoBelow: 100, confirmBetween: 2000 },\n { operation: 'send' as const, autoBelow: 25, confirmBetween: 500 },\n { operation: 'borrow' as const, autoBelow: 10, confirmBetween: 1000 },\n { operation: 'withdraw' as const, autoBelow: 50, confirmBetween: 1000 },\n { operation: 'swap' as const, autoBelow: 50, confirmBetween: 500 },\n { operation: 'pay' as const, autoBelow: 5, confirmBetween: 100 },\n { operation: 'repay' as const, autoBelow: 100, confirmBetween: 2000 },\n ],\n },\n} satisfies Record<string, UserPermissionConfig>;\n\n/**\n * Resolve the permission tier for a given operation + USD value.\n *\n * [v1.4] When `sessionSpendUsd` is supplied and adding the incoming\n * `amountUsd` would push cumulative session spend over\n * `config.autonomousDailyLimit`, an otherwise-`auto` tier is downgraded to\n * `confirm`. This is the runtime guard for the daily autonomous spend cap.\n * Tiers above `auto` are returned unchanged.\n */\nexport function resolvePermissionTier(\n operation: string,\n amountUsd: number,\n config: UserPermissionConfig,\n sessionSpendUsd?: number,\n): 'auto' | 'confirm' | 'explicit' {\n const rule = config.rules.find((r) => r.operation === operation);\n const autoBelow = rule?.autoBelow ?? config.globalAutoBelow;\n const confirmBetween = rule?.confirmBetween ?? 1000;\n\n let tier: 'auto' | 'confirm' | 'explicit';\n if (amountUsd < autoBelow) tier = 'auto';\n else if (amountUsd < confirmBetween) tier = 'confirm';\n else tier = 'explicit';\n\n if (\n tier === 'auto' &&\n typeof sessionSpendUsd === 'number' &&\n sessionSpendUsd + amountUsd > config.autonomousDailyLimit\n ) {\n return 'confirm';\n }\n\n return tier;\n}\n\nconst TOOL_TO_OPERATION: Record<string, PermissionOperation> = {\n save_deposit: 'save',\n withdraw: 'withdraw',\n send_transfer: 'send',\n borrow: 'borrow',\n repay_debt: 'repay',\n swap_execute: 'swap',\n pay_api: 'pay',\n volo_stake: 'save',\n volo_unstake: 'withdraw',\n};\n\nexport function toolNameToOperation(toolName: string): PermissionOperation | undefined {\n return TOOL_TO_OPERATION[toolName];\n}\n\n/**\n * Resolve the USD value of a tool call from its inputs.\n * USDC-denominated tools return 1:1. Others multiply by the price cache.\n */\nexport function resolveUsdValue(\n toolName: string,\n input: Record<string, unknown>,\n priceCache: Map<string, number>,\n): number {\n switch (toolName) {\n case 'save_deposit':\n case 'withdraw':\n case 'repay_debt':\n case 'borrow':\n return safeNum(input.amount);\n\n case 'send_transfer': {\n const amount = safeNum(input.amount);\n const asset = String(input.asset ?? 'USDC').toUpperCase();\n if (asset === 'USDC' || asset === 'USDT') return amount;\n return amount * (priceCache.get(asset) ?? 0);\n }\n\n case 'swap_execute': {\n const amount = safeNum(input.fromAmount);\n const fromAsset = String(input.fromAsset ?? '').toUpperCase();\n if (fromAsset === 'USDC' || fromAsset === 'USDT') return amount;\n return amount * (priceCache.get(fromAsset) ?? 0);\n }\n\n case 'pay_api':\n return safeNum(input.maxCost ?? input.price);\n\n case 'volo_stake':\n case 'volo_unstake':\n return safeNum(input.amount) * (priceCache.get('SUI') ?? 0);\n\n default:\n return 0;\n }\n}\n\nfunction safeNum(v: unknown): number {\n const n = Number(v);\n return isNaN(n) ? 0 : n;\n}\n","/**\n * EarlyToolDispatcher — dispatches read-only tools mid-stream.\n *\n * When the LLM emits `tool_use_done` for a read-only tool, the dispatcher\n * fires it immediately in the background rather than waiting for the full\n * stream to finish. Results are collected in original call order after the\n * stream exits.\n *\n * Write tools are NOT dispatched — they go through the existing permission\n * gate and TxMutex flow.\n */\n\nimport type { EngineEvent, Tool, ToolContext } from './types.js';\nimport { findTool } from './tool.js';\nimport { budgetToolResult, type PendingToolCall } from './orchestration.js';\n\ninterface DispatchEntry {\n call: PendingToolCall;\n tool: Tool;\n promise: Promise<{ data: unknown; isError: boolean }>;\n}\n\nexport class EarlyToolDispatcher {\n private entries: DispatchEntry[] = [];\n private readonly tools: Tool[];\n private readonly context: ToolContext;\n private abortController: AbortController;\n\n constructor(tools: Tool[], context: ToolContext) {\n this.tools = tools;\n this.context = context;\n this.abortController = new AbortController();\n }\n\n /**\n * Attempt to dispatch a tool call. Returns true if the tool was dispatched\n * (read-only + concurrency-safe), false if it should be queued for later.\n */\n tryDispatch(call: PendingToolCall): boolean {\n const tool = findTool(this.tools, call.name);\n if (!tool || !tool.isReadOnly || !tool.isConcurrencySafe) return false;\n\n const childContext = { ...this.context, signal: this.abortController.signal };\n const promise = executeTool(tool, call, childContext);\n\n this.entries.push({ call, tool, promise });\n return true;\n }\n\n /** True if any tools have been dispatched. */\n hasPending(): boolean {\n return this.entries.length > 0;\n }\n\n /** List of call IDs that were early-dispatched. */\n dispatchedIds(): Set<string> {\n return new Set(this.entries.map((e) => e.call.id));\n }\n\n /**\n * Collect all results in original dispatch order.\n * Yields `tool_result` events as each promise resolves.\n */\n async *collectResults(): AsyncGenerator<EngineEvent> {\n for (const entry of this.entries) {\n try {\n const result = await entry.promise;\n const budgeted = result.isError\n ? result.data\n : budgetToolResult(result.data, entry.tool);\n\n yield {\n type: 'tool_result',\n toolName: entry.call.name,\n toolUseId: entry.call.id,\n result: budgeted,\n isError: result.isError,\n wasEarlyDispatched: true,\n };\n } catch (err) {\n yield {\n type: 'tool_result',\n toolName: entry.call.name,\n toolUseId: entry.call.id,\n result: { error: err instanceof Error ? err.message : 'Tool execution failed' },\n isError: true,\n wasEarlyDispatched: true,\n };\n }\n }\n }\n\n /** Cancel all in-flight tool calls. */\n abort(): void {\n this.abortController.abort();\n }\n}\n\nasync function executeTool(\n tool: Tool,\n call: PendingToolCall,\n context: ToolContext,\n): Promise<{ data: unknown; isError: boolean }> {\n const parsed = tool.inputSchema.safeParse(call.input);\n if (!parsed.success) {\n return {\n data: { error: `Invalid input: ${parsed.error.issues.map((i) => i.message).join(', ')}` },\n isError: true,\n };\n }\n\n const result = await tool.call(parsed.data, context);\n return { data: result.data, isError: false };\n}\n","import type {\n EngineConfig,\n EngineEvent,\n Message,\n ContentBlock,\n PendingAction,\n SystemPrompt,\n Tool,\n ToolContext,\n PermissionResponse,\n ProviderEvent,\n StopReason,\n} from './types.js';\nimport { toolsToDefinitions, findTool } from './tool.js';\nimport { TxMutex, runTools, type PendingToolCall } from './orchestration.js';\nimport { getDefaultTools } from './tools/index.js';\nimport { getModifiableFields } from './tools/tool-modifiable-fields.js';\nimport { DEFAULT_SYSTEM_PROMPT } from './prompt.js';\nimport { CostTracker, type CostSnapshot } from './cost.js';\nimport { estimatePayApiCost } from './tools/pay.js';\nimport {\n type GuardConfig,\n type GuardRunnerState,\n type GuardEvent,\n createGuardRunnerState,\n runGuards,\n updateGuardStateAfterToolResult,\n extractConversationText,\n guardArtifactPreview,\n guardStaleData,\n} from './guards.js';\nimport type { RecipeRegistry, Recipe } from './recipes/index.js';\nimport { ContextBudget, compactMessages } from './context.js';\nimport { microcompact } from './compact/microcompact.js';\nimport { resolvePermissionTier, resolveUsdValue, toolNameToOperation } from './permission-rules.js';\nimport { EarlyToolDispatcher } from './early-dispatcher.js';\n\nconst DEFAULT_MAX_TURNS = 10;\nconst DEFAULT_MAX_TOKENS = 4096;\n\ninterface TurnAccumulator {\n text: string;\n stopReason: StopReason;\n assistantBlocks: ContentBlock[];\n pendingToolCalls: PendingToolCall[];\n}\n\nexport class QueryEngine {\n private readonly provider: EngineConfig['provider'];\n private readonly tools: Tool[];\n private readonly systemPrompt: SystemPrompt;\n private readonly model: string | undefined;\n private readonly maxTurns: number;\n private readonly maxTokens: number;\n private readonly temperature: number | undefined;\n private readonly toolChoice: EngineConfig['toolChoice'];\n private readonly thinking: EngineConfig['thinking'];\n private readonly outputConfig: EngineConfig['outputConfig'];\n private readonly agent: unknown;\n private readonly mcpManager: unknown;\n private readonly walletAddress: string | undefined;\n private readonly suiRpcUrl: string | undefined;\n private serverPositions: EngineConfig['serverPositions'];\n private readonly positionFetcher: EngineConfig['positionFetcher'];\n private readonly env: Record<string, string> | undefined;\n private readonly txMutex = new TxMutex();\n private readonly costTracker: CostTracker;\n private readonly guardConfig: GuardConfig | undefined;\n private readonly guardState: GuardRunnerState;\n private readonly recipes: RecipeRegistry | undefined;\n private readonly contextBudget: ContextBudget;\n private readonly contextSummarizer: EngineConfig['contextSummarizer'];\n private readonly priceCache: Map<string, number> | undefined;\n private readonly permissionConfig: import('./permission-rules.js').UserPermissionConfig | undefined;\n // [v1.4] Session-scoped autonomous spend tracking.\n private readonly sessionSpendUsd: number | undefined;\n private readonly onAutoExecuted: EngineConfig['onAutoExecuted'];\n private readonly onGuardFired: EngineConfig['onGuardFired'];\n // [v1.5] See `EngineConfig.postWriteRefresh` — drives the post-write\n // synthetic read injection in `resumeWithToolResult`.\n private readonly postWriteRefresh: EngineConfig['postWriteRefresh'];\n private matchedRecipe: Recipe | null = null;\n\n private messages: Message[] = [];\n private abortController: AbortController | null = null;\n private guardEvents: GuardEvent[] = [];\n\n constructor(config: EngineConfig) {\n this.provider = config.provider;\n this.agent = config.agent;\n this.mcpManager = config.mcpManager;\n this.walletAddress = config.walletAddress;\n this.suiRpcUrl = config.suiRpcUrl;\n this.serverPositions = config.serverPositions;\n this.positionFetcher = config.positionFetcher;\n this.env = config.env;\n this.model = config.model;\n this.maxTurns = config.maxTurns ?? DEFAULT_MAX_TURNS;\n this.maxTokens = config.maxTokens ?? DEFAULT_MAX_TOKENS;\n this.temperature = config.temperature;\n this.toolChoice = config.toolChoice;\n this.thinking = config.thinking;\n this.outputConfig = config.outputConfig;\n this.systemPrompt = config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n this.costTracker = new CostTracker(config.costTracker);\n this.guardConfig = config.guards;\n this.guardState = createGuardRunnerState();\n this.recipes = config.recipes;\n this.contextBudget = new ContextBudget(config.contextBudget);\n this.contextSummarizer = config.contextSummarizer;\n this.priceCache = config.priceCache;\n this.permissionConfig = config.permissionConfig;\n this.sessionSpendUsd = config.sessionSpendUsd;\n this.onAutoExecuted = config.onAutoExecuted;\n this.onGuardFired = config.onGuardFired;\n this.postWriteRefresh = config.postWriteRefresh;\n\n this.tools = config.tools ?? (config.agent ? getDefaultTools() : []);\n }\n\n /**\n * Submit a user message and stream engine events.\n *\n * Read-only tools execute inline. Write tools that need confirmation yield a\n * `pending_action` event and the stream ends — no persistent connection needed.\n * The caller should save messages + pendingAction to the session store, then\n * call `resumeWithToolResult()` after the user approves/denies and executes.\n */\n async *submitMessage(prompt: string): AsyncGenerator<EngineEvent> {\n if (this.costTracker.isOverBudget()) {\n yield { type: 'error', error: new Error('Session budget exceeded') };\n return;\n }\n\n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n\n // RE-3.1: Match recipe before pushing message\n this.matchedRecipe = this.recipes?.match(prompt) ?? null;\n\n this.messages.push({\n role: 'user',\n content: [{ type: 'text', text: prompt }],\n });\n\n yield* this.agentLoop(prompt, signal);\n }\n\n /**\n * Resume the conversation after a pending action is resolved.\n * Called with the user's approval/denial and optional client-side execution result.\n *\n * This is a separate HTTP request — no persistent connection from submitMessage.\n */\n async *resumeWithToolResult(\n action: PendingAction,\n response: PermissionResponse,\n ): AsyncGenerator<EngineEvent> {\n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n\n const writeResult: ContentBlock = response.approved\n ? {\n type: 'tool_result',\n toolUseId: action.toolUseId,\n content: JSON.stringify(response.executionResult ?? { success: true }),\n isError: false,\n }\n : {\n type: 'tool_result',\n toolUseId: action.toolUseId,\n content: JSON.stringify({ error: 'User declined this action' }),\n isError: true,\n };\n\n // Reconstruct the full turn atomically:\n // 1. Push the assistant message that was deferred during pending_action\n // 2. Push ALL tool_results (completed reads + write) in one user message\n if (action.assistantContent?.length) {\n this.messages.push({ role: 'assistant', content: action.assistantContent });\n }\n\n const allResults: ContentBlock[] = [\n ...(action.completedResults ?? []).map((r) => ({\n type: 'tool_result' as const,\n toolUseId: r.toolUseId,\n content: r.content,\n isError: r.isError,\n })),\n writeResult,\n ];\n\n this.messages.push({ role: 'user', content: allResults });\n\n yield {\n type: 'tool_result',\n toolName: action.toolName,\n toolUseId: action.toolUseId,\n result: response.approved\n ? (response.executionResult ?? { success: true })\n : { error: 'User declined this action' },\n isError: !response.approved,\n };\n\n if (!response.approved) {\n yield { type: 'turn_complete', stopReason: 'end_turn' };\n return;\n }\n\n // [v1.5] Post-write refresh — eliminate the \"LLM invents a wallet\n // total in the post-write narration\" hallucination class by\n // physically injecting authoritative ground truth into the\n // conversation BEFORE the LLM gets to narrate. Tools are configured\n // per write via `EngineConfig.postWriteRefresh`. Errors are\n // non-fatal: we still advance to agentLoop so the user gets *some*\n // narration even if RPC blips.\n yield* this.runPostWriteRefresh(action, response, signal);\n\n yield* this.agentLoop(null, signal, false);\n }\n\n /**\n * [v1.5] Auto-run configured read tools after a successful write,\n * push their results into the conversation, and yield `tool_result`\n * events so hosts/UI render them in the timeline. See\n * `EngineConfig.postWriteRefresh`.\n *\n * Pure injection — no LLM call here. The next `agentLoop` turn sees\n * the fresh tool results and narrates from them.\n */\n private async *runPostWriteRefresh(\n action: PendingAction,\n response: PermissionResponse,\n signal: AbortSignal,\n ): AsyncGenerator<EngineEvent> {\n const refreshList = this.postWriteRefresh?.[action.toolName];\n if (!refreshList || refreshList.length === 0) return;\n\n // Refresh only on confirmed success. Failed writes leave on-chain\n // state untouched; refreshing would just surface the pre-write\n // snapshot a second time — wasted RPC + zero new info.\n const exec = response.executionResult;\n const writeFailed =\n exec != null &&\n typeof exec === 'object' &&\n 'success' in exec &&\n (exec as { success?: unknown }).success === false;\n if (writeFailed) return;\n\n // Resolve & filter — silently drop unknown / non-readonly entries\n // so config drift between host & engine never breaks resume.\n const refreshTools = refreshList\n .map((name) => findTool(this.tools, name))\n .filter((t): t is Tool =>\n t !== undefined && t.isReadOnly && t.isConcurrencySafe,\n );\n if (refreshTools.length === 0) return;\n\n const context: ToolContext = {\n agent: this.agent,\n mcpManager: this.mcpManager,\n walletAddress: this.walletAddress,\n suiRpcUrl: this.suiRpcUrl,\n serverPositions: this.serverPositions,\n positionFetcher: this.positionFetcher,\n env: this.env,\n signal,\n priceCache: this.priceCache,\n permissionConfig: this.permissionConfig,\n sessionSpendUsd: this.sessionSpendUsd,\n };\n\n // Run all refreshes in parallel — they're read-only and target\n // different RPC endpoints (wallet, NAVI positions, health). The\n // common case (1-3 tools) finishes well under 1s.\n const idStem = `pwr_${action.toolUseId.slice(-6)}`;\n const refreshes = await Promise.all(\n refreshTools.map(async (tool, idx) => {\n const id = `${idStem}_${idx}_${tool.name}`;\n try {\n const parsed = tool.inputSchema.safeParse({});\n if (!parsed.success) {\n return {\n tool,\n id,\n isError: true as const,\n data: {\n error: `Post-write refresh: invalid input for ${tool.name}`,\n },\n };\n }\n const result = await tool.call(parsed.data, context);\n return { tool, id, isError: false as const, data: result.data };\n } catch (err) {\n return {\n tool,\n id,\n isError: true as const,\n data: {\n error:\n err instanceof Error\n ? err.message\n : 'Post-write refresh failed',\n },\n };\n }\n }),\n );\n\n // Push synthetic conversation pair so the LLM sees:\n // assistant(refresh tool_uses) → user(refresh tool_results)\n // Anthropic accepts back-to-back assistant/user blocks; this is the\n // same shape `buildSyntheticPrefetch` uses at session start.\n const refreshUses: ContentBlock[] = refreshes.map((r) => ({\n type: 'tool_use',\n id: r.id,\n name: r.tool.name,\n input: {},\n }));\n this.messages.push({ role: 'assistant', content: refreshUses });\n\n const refreshResults: ContentBlock[] = refreshes.map((r) => ({\n type: 'tool_result',\n toolUseId: r.id,\n content: typeof r.data === 'string' ? r.data : JSON.stringify(r.data),\n isError: r.isError,\n }));\n this.messages.push({ role: 'user', content: refreshResults });\n\n // Yield events so hosts log them in `TurnMetrics.toolsCalled[]` and\n // the UI renders the refreshed cards in-line.\n for (const r of refreshes) {\n yield {\n type: 'tool_result',\n toolName: r.tool.name,\n toolUseId: r.id,\n result: r.data,\n isError: r.isError,\n wasPostWriteRefresh: true,\n };\n }\n }\n\n interrupt(): void {\n this.abortController?.abort();\n }\n\n getMessages(): readonly Message[] {\n return this.messages;\n }\n\n getMatchedRecipe(): Recipe | null {\n return this.matchedRecipe;\n }\n\n getContextBudget(): ContextBudget {\n return this.contextBudget;\n }\n\n reset(): void {\n this.messages = [];\n this.costTracker.reset();\n this.contextBudget.reset();\n this.guardEvents = [];\n this.matchedRecipe = null;\n }\n\n getGuardEvents(): readonly GuardEvent[] {\n return this.guardEvents;\n }\n\n loadMessages(messages: Message[]): void {\n this.messages = [...messages];\n }\n\n setServerPositions(data: EngineConfig['serverPositions']): void {\n this.serverPositions = data;\n }\n\n getUsage(): CostSnapshot {\n return this.costTracker.getSnapshot();\n }\n\n // ---------------------------------------------------------------------------\n // Core agent loop — shared by submitMessage and resumeWithToolResult\n // ---------------------------------------------------------------------------\n\n /**\n * Run the LLM → tool → LLM loop. When a write tool needs confirmation,\n * yields `pending_action` and returns immediately (stream ends cleanly).\n *\n * @param freshPrompt - The original user prompt (for corrupt-history retry). Null on resume.\n */\n private async *agentLoop(\n freshPrompt: string | null,\n signal: AbortSignal,\n applyToolChoice = true,\n ): AsyncGenerator<EngineEvent> {\n const context: ToolContext = {\n agent: this.agent,\n mcpManager: this.mcpManager,\n walletAddress: this.walletAddress,\n suiRpcUrl: this.suiRpcUrl,\n serverPositions: this.serverPositions,\n positionFetcher: this.positionFetcher,\n env: this.env,\n signal,\n priceCache: this.priceCache,\n permissionConfig: this.permissionConfig,\n sessionSpendUsd: this.sessionSpendUsd,\n };\n\n let turns = 0;\n let hasRetriedWithCleanHistory = false;\n\n while (turns < this.maxTurns) {\n if (signal.aborted) {\n yield { type: 'error', error: new Error('Aborted') };\n return;\n }\n\n turns++;\n const toolDefs = toolsToDefinitions(this.tools);\n\n const acc: TurnAccumulator = {\n text: '',\n stopReason: 'end_turn',\n assistantBlocks: [],\n pendingToolCalls: [],\n };\n\n const dispatcher = new EarlyToolDispatcher(this.tools, context);\n\n try {\n // B.3: Zero-cost dedup of identical tool calls every turn.\n // [v1.4 Item 4] Emit a synthetic tool_result event for each\n // deduped prior call so hosts can flip `resultDeduped` on the\n // matching `TurnMetrics.toolsCalled[]` row. Marker shape is\n // explicit so collectors don't double-count emissions.\n // [v1.5.1] Pass the tool registry so microcompact honors per-tool\n // `cacheable` flags. Mutable-state reads (balance_check etc.)\n // never dedupe, so post-write refreshes always surface fresh\n // data instead of a \"[Same result as call #N]\" marker that the\n // LLM previously misread as \"stale snapshot, fall back to math\".\n const microcompacted = microcompact(this.messages, this.tools);\n this.messages = microcompacted;\n for (const dedupedId of microcompacted.dedupedToolUseIds) {\n yield {\n type: 'tool_result',\n toolName: '__deduped__',\n toolUseId: dedupedId,\n result: null,\n isError: false,\n resultDeduped: true,\n };\n }\n\n // RE-3.3: Compact context if budget is exceeded\n if (this.contextBudget.shouldCompact()) {\n this.messages = await compactMessages(this.messages, {\n maxTokens: 100_000,\n keepRecentCount: 8,\n summarizer: this.contextSummarizer,\n });\n // [v1.4 Item 4] Notify hosts that compaction fired this turn.\n // `compactMessages` stays a pure function; the event keeps the\n // signal observable without coupling.\n yield { type: 'compaction' };\n }\n\n this.messages = validateHistory(this.messages);\n\n if (process.env.NODE_ENV !== 'test') {\n const summary = this.messages.map((m, idx) => {\n const blocks = m.content.map((b) => {\n if (b.type === 'text') return `text(${b.text.slice(0, 40)}…)`;\n if (b.type === 'thinking') return `thinking(${b.thinking.length}ch)`;\n if (b.type === 'redacted_thinking') return `redacted_thinking`;\n if (b.type === 'tool_use') return `tool_use:${b.id.slice(-8)}/${b.name}`;\n return `tool_result:${(b as { toolUseId: string }).toolUseId.slice(-8)}`;\n });\n return ` [${idx}] ${m.role}: [${blocks.join(', ')}]`;\n });\n console.log(`[engine] provider.chat turn=${turns} msgs=${this.messages.length}\\n${summary.join('\\n')}`);\n }\n\n const thinkingEnabled = this.thinking && this.thinking.type !== 'disabled';\n // Anthropic requires toolChoice 'auto' (not 'any') when thinking is enabled\n const effectiveToolChoice = thinkingEnabled\n ? ((applyToolChoice && turns === 1) ? 'auto' as const : undefined)\n : ((applyToolChoice && turns === 1) ? this.toolChoice : undefined);\n\n // RE-3.1: Inject matched recipe context into system prompt for this turn\n let effectivePrompt = this.systemPrompt;\n if (this.matchedRecipe && this.recipes) {\n const recipeCtx = this.recipes.toPromptContext(this.matchedRecipe);\n if (typeof effectivePrompt === 'string') {\n effectivePrompt = `${effectivePrompt}\\n\\n${recipeCtx}`;\n } else if (Array.isArray(effectivePrompt)) {\n effectivePrompt = [\n ...effectivePrompt,\n { type: 'text' as const, text: recipeCtx },\n ];\n }\n }\n\n const stream = this.provider.chat({\n messages: this.messages,\n systemPrompt: effectivePrompt,\n tools: toolDefs,\n model: this.model,\n maxTokens: this.maxTokens,\n temperature: this.temperature,\n toolChoice: effectiveToolChoice,\n thinking: this.thinking,\n outputConfig: this.outputConfig,\n signal,\n });\n\n for await (const event of stream) {\n yield* this.handleProviderEvent(event, acc, dispatcher);\n }\n } catch (err) {\n if (freshPrompt && !hasRetriedWithCleanHistory && isCorruptHistoryError(err)) {\n hasRetriedWithCleanHistory = true;\n console.warn('[engine] Corrupt session history detected, resetting to fresh conversation');\n this.messages = [\n { role: 'user', content: [{ type: 'text', text: freshPrompt }] },\n ];\n turns--;\n continue;\n }\n throw err;\n }\n\n if (acc.text) {\n acc.assistantBlocks.push({ type: 'text', text: acc.text });\n }\n\n // B.1: Collect results from early-dispatched tools\n const earlyResultBlocks: ContentBlock[] = [];\n if (dispatcher.hasPending()) {\n if (signal.aborted) {\n dispatcher.abort();\n }\n for await (const earlyEvent of dispatcher.collectResults()) {\n if (earlyEvent.type === 'tool_result') {\n if (!earlyEvent.isError) {\n const warning = flagSuspiciousResult(earlyEvent.toolName, earlyEvent.result);\n if (warning) {\n const flagged = {\n ...earlyEvent,\n result: typeof earlyEvent.result === 'object' && earlyEvent.result\n ? { ...earlyEvent.result as Record<string, unknown>, _warning: warning }\n : { data: earlyEvent.result, _warning: warning },\n };\n yield flagged;\n earlyResultBlocks.push({\n type: 'tool_result',\n toolUseId: flagged.toolUseId,\n content: JSON.stringify(flagged.result),\n isError: flagged.isError,\n });\n continue;\n }\n }\n const tool = findTool(this.tools, earlyEvent.toolName);\n updateGuardStateAfterToolResult(\n earlyEvent.toolName, tool, null, earlyEvent.result, earlyEvent.isError, this.guardState,\n );\n\n let enrichedResult = earlyEvent.result;\n if (this.guardConfig && !earlyEvent.isError && tool) {\n const artifactInj = this.guardConfig.artifactPreview !== false\n ? guardArtifactPreview(earlyEvent.result)\n : null;\n const staleInj = this.guardConfig.staleData !== false\n ? guardStaleData(tool.flags)\n : null;\n const allInjections = [\n ...(artifactInj ? [artifactInj] : []),\n ...(staleInj ? [staleInj] : []),\n ];\n if (allInjections.length > 0 && typeof enrichedResult === 'object' && enrichedResult) {\n enrichedResult = { ...enrichedResult as Record<string, unknown>, _guards: allInjections };\n }\n }\n\n const finalEvent = enrichedResult !== earlyEvent.result\n ? { ...earlyEvent, result: enrichedResult }\n : earlyEvent;\n\n yield finalEvent;\n\n if (!finalEvent.isError) {\n const r = finalEvent.result as Record<string, unknown> | null;\n if (r && r.__canvas === true) {\n yield {\n type: 'canvas',\n template: String(r.template ?? ''),\n title: String(r.title ?? ''),\n data: r.templateData ?? null,\n toolUseId: finalEvent.toolUseId,\n };\n }\n }\n\n earlyResultBlocks.push({\n type: 'tool_result',\n toolUseId: finalEvent.toolUseId,\n content: JSON.stringify(finalEvent.result),\n isError: finalEvent.isError,\n });\n }\n }\n }\n\n const hasEarlyResults = earlyResultBlocks.length > 0;\n const hasRemainingCalls = acc.pendingToolCalls.length > 0;\n\n if (!hasEarlyResults && !hasRemainingCalls) {\n this.messages.push({ role: 'assistant', content: acc.assistantBlocks });\n yield { type: 'turn_complete', stopReason: acc.stopReason };\n return;\n }\n\n if (signal.aborted) {\n this.messages.push({ role: 'assistant', content: acc.assistantBlocks });\n if (hasEarlyResults) {\n this.messages.push({ role: 'user', content: earlyResultBlocks });\n }\n this.addErrorResults(acc.pendingToolCalls, 'Aborted');\n yield { type: 'error', error: new Error('Aborted') };\n return;\n }\n\n // --- Permission gate (only for non-early-dispatched calls) ---\n const approved: PendingToolCall[] = [];\n const toolResultBlocks: ContentBlock[] = [...earlyResultBlocks];\n let pendingWrite: { call: PendingToolCall; tool: Tool } | null = null;\n\n for (const call of acc.pendingToolCalls) {\n const tool = findTool(this.tools, call.name);\n\n const needsConfirmation = (() => {\n if (!tool || tool.isReadOnly) return false;\n if (tool.permissionLevel === 'explicit') return true;\n // Without an agent, write tools can't execute server-side —\n // always require confirmation so the client handles execution.\n if (!context.agent && !tool.isReadOnly) return true;\n if (context.permissionConfig && context.priceCache) {\n const operation = toolNameToOperation(call.name);\n if (operation) {\n const usdValue = resolveUsdValue(call.name, call.input as Record<string, unknown>, context.priceCache);\n // [v1.4] sessionSpendUsd consulted to enforce daily cap\n const tier = resolvePermissionTier(\n operation,\n usdValue,\n context.permissionConfig,\n context.sessionSpendUsd,\n );\n return tier !== 'auto';\n }\n }\n return tool.permissionLevel !== 'auto';\n })();\n\n if (!needsConfirmation) {\n approved.push(call);\n yield { type: 'tool_start', toolName: call.name, toolUseId: call.id, input: call.input };\n continue;\n }\n\n pendingWrite = { call, tool: tool! };\n break;\n }\n\n // --- Guard checks (pre-execution) ---\n const guardedApproved: PendingToolCall[] = [];\n\n if (this.guardConfig) {\n const convCtx = extractConversationText(this.messages);\n\n for (const call of approved) {\n const tool = findTool(this.tools, call.name);\n if (!tool) { guardedApproved.push(call); continue; }\n\n const check = runGuards(\n tool,\n call,\n this.guardState,\n this.guardConfig,\n convCtx,\n this.onGuardFired,\n );\n this.guardEvents.push(...check.events);\n\n if (check.blocked) {\n yield {\n type: 'tool_result',\n toolName: call.name,\n toolUseId: call.id,\n result: { error: check.blockReason, _gate: check.blockGate },\n isError: true,\n };\n toolResultBlocks.push({\n type: 'tool_result',\n toolUseId: call.id,\n content: JSON.stringify({ error: check.blockReason, _gate: check.blockGate }),\n isError: true,\n });\n continue;\n }\n\n if (check.injections.length > 0) {\n (call as PendingToolCall & { _guardInjections?: unknown[] })._guardInjections = check.injections;\n }\n guardedApproved.push(call);\n }\n } else {\n guardedApproved.push(...approved);\n }\n\n // Execute auto-approved tool calls (reads) even if a write is pending\n for await (const toolEvent of runTools(guardedApproved, this.tools, context, this.txMutex)) {\n if (toolEvent.type === 'tool_result' && !toolEvent.isError) {\n const warning = flagSuspiciousResult(toolEvent.toolName, toolEvent.result);\n if (warning) {\n const flagged = {\n ...toolEvent,\n result: typeof toolEvent.result === 'object' && toolEvent.result\n ? { ...toolEvent.result as Record<string, unknown>, _warning: warning }\n : { data: toolEvent.result, _warning: warning },\n };\n yield flagged;\n toolResultBlocks.push({\n type: 'tool_result',\n toolUseId: flagged.toolUseId,\n content: JSON.stringify(flagged.result),\n isError: flagged.isError,\n });\n continue;\n }\n }\n\n // Post-execution: update guard state & apply injections\n if (toolEvent.type === 'tool_result') {\n const tool = findTool(this.tools, toolEvent.toolName);\n const originalCall = guardedApproved.find((c) => c.id === toolEvent.toolUseId);\n updateGuardStateAfterToolResult(\n toolEvent.toolName, tool, originalCall?.input ?? null, toolEvent.result, toolEvent.isError, this.guardState,\n );\n\n let enrichedResult = toolEvent.result;\n\n if (this.guardConfig && !toolEvent.isError && tool) {\n // Post-execution guards: artifact preview, stale data hint\n const artifactInj = this.guardConfig.artifactPreview !== false\n ? guardArtifactPreview(toolEvent.result)\n : null;\n const staleInj = this.guardConfig.staleData !== false\n ? guardStaleData(tool.flags)\n : null;\n\n // Merge pre-execution injections from guard check\n const preInjections =\n (guardedApproved.find((c) => c.id === toolEvent.toolUseId) as\n PendingToolCall & { _guardInjections?: unknown[] })?._guardInjections ?? [];\n\n const allInjections = [\n ...preInjections,\n ...(artifactInj ? [artifactInj] : []),\n ...(staleInj ? [staleInj] : []),\n ];\n\n if (allInjections.length > 0 && typeof enrichedResult === 'object' && enrichedResult) {\n enrichedResult = { ...enrichedResult as Record<string, unknown>, _guards: allInjections };\n }\n }\n\n const finalEvent = enrichedResult !== toolEvent.result\n ? { ...toolEvent, result: enrichedResult }\n : toolEvent;\n\n yield finalEvent;\n\n if (finalEvent.type === 'tool_result' && !finalEvent.isError) {\n const r = finalEvent.result as Record<string, unknown> | null;\n if (r && r.__canvas === true) {\n yield {\n type: 'canvas',\n template: String(r.template ?? ''),\n title: String(r.title ?? ''),\n data: r.templateData ?? null,\n toolUseId: finalEvent.toolUseId,\n };\n }\n\n // [v1.4] Fire onAutoExecuted for write tools that auto-executed\n // (non-readonly tools that reach this loop have already passed the\n // auto-tier check). Wrapped in try/catch so any host error never\n // propagates back into the engine — the tool result already shipped.\n if (\n tool && !tool.isReadOnly && this.onAutoExecuted &&\n this.permissionConfig && this.priceCache\n ) {\n const operation = toolNameToOperation(toolEvent.toolName);\n if (operation && originalCall) {\n const usdValue = resolveUsdValue(\n toolEvent.toolName,\n originalCall.input as Record<string, unknown>,\n this.priceCache,\n );\n Promise.resolve()\n .then(() => this.onAutoExecuted!({\n toolName: toolEvent.toolName,\n usdValue,\n }))\n .catch((err) => {\n console.warn('[engine] onAutoExecuted callback failed:', err);\n });\n }\n }\n }\n\n toolResultBlocks.push({\n type: 'tool_result',\n toolUseId: finalEvent.toolUseId,\n content: JSON.stringify(finalEvent.result),\n isError: finalEvent.isError,\n });\n continue;\n }\n\n yield toolEvent;\n }\n\n // --- Guard check on pending write tool ---\n if (pendingWrite && this.guardConfig) {\n const convCtx = extractConversationText(this.messages);\n const check = runGuards(\n pendingWrite.tool,\n pendingWrite.call,\n this.guardState,\n this.guardConfig,\n convCtx,\n this.onGuardFired,\n );\n this.guardEvents.push(...check.events);\n\n if (check.blocked) {\n yield {\n type: 'tool_result',\n toolName: pendingWrite.call.name,\n toolUseId: pendingWrite.call.id,\n result: { error: check.blockReason, _gate: check.blockGate },\n isError: true,\n };\n toolResultBlocks.push({\n type: 'tool_result',\n toolUseId: pendingWrite.call.id,\n content: JSON.stringify({ error: check.blockReason, _gate: check.blockGate }),\n isError: true,\n });\n // Blocked write — don't yield pending_action, feed error back to LLM\n this.messages.push({ role: 'assistant', content: acc.assistantBlocks });\n this.messages.push({ role: 'user', content: toolResultBlocks });\n continue;\n }\n\n if (check.injections.length > 0) {\n (pendingWrite.call as PendingToolCall & { _guardInjections?: unknown[] })._guardInjections = check.injections;\n }\n }\n\n if (pendingWrite) {\n // Do NOT push assistant message to this.messages — session stays clean.\n // The full assistant content is stored in PendingAction so\n // resumeWithToolResult can reconstruct the turn atomically.\n const writeGuardInjections =\n (pendingWrite.call as PendingToolCall & { _guardInjections?: Array<{ _gate: string; _hint?: string; _warning?: string }> })._guardInjections;\n\n // [v1.4 Item 6] Stamp the action with the registry's modifiable\n // fields (UI uses this to render editable controls) and a turnIndex\n // derived from the assistant message count so hosts can update the\n // matching `TurnMetrics` row when the action resolves.\n const modifiableFields = getModifiableFields(pendingWrite.call.name);\n const turnIndex = this.messages.filter((m) => m.role === 'assistant').length;\n\n yield {\n type: 'pending_action',\n action: {\n toolName: pendingWrite.call.name,\n toolUseId: pendingWrite.call.id,\n input: pendingWrite.call.input,\n description: describeAction(pendingWrite.tool, pendingWrite.call),\n assistantContent: acc.assistantBlocks,\n completedResults: toolResultBlocks.map((b) => ({\n toolUseId: (b as { toolUseId: string }).toolUseId,\n content: (b as { content: string }).content,\n isError: (b as { isError?: boolean }).isError ?? false,\n })),\n ...(writeGuardInjections?.length ? { guardInjections: writeGuardInjections } : {}),\n ...(modifiableFields?.length ? { modifiableFields } : {}),\n turnIndex,\n },\n };\n return;\n }\n\n // All tools auto-approved — push the complete turn (assistant + results)\n this.messages.push({ role: 'assistant', content: acc.assistantBlocks });\n this.messages.push({ role: 'user', content: toolResultBlocks });\n\n if (this.costTracker.isOverBudget()) {\n yield { type: 'error', error: new Error('Session budget exceeded') };\n return;\n }\n }\n\n yield { type: 'turn_complete', stopReason: 'max_turns' };\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private addErrorResults(pendingCalls: PendingToolCall[], reason: string): void {\n const errorBlocks: ContentBlock[] = pendingCalls.map((call) => ({\n type: 'tool_result' as const,\n toolUseId: call.id,\n content: JSON.stringify({ error: reason }),\n isError: true,\n }));\n if (errorBlocks.length > 0) {\n this.messages.push({ role: 'user', content: errorBlocks });\n }\n }\n\n private *handleProviderEvent(\n event: ProviderEvent,\n acc: TurnAccumulator,\n dispatcher?: EarlyToolDispatcher,\n ): Generator<EngineEvent> {\n switch (event.type) {\n case 'thinking_delta': {\n yield { type: 'thinking_delta', text: event.text };\n break;\n }\n\n case 'thinking_done': {\n acc.assistantBlocks.push({\n type: 'thinking',\n thinking: event.thinking,\n signature: event.signature,\n });\n yield { type: 'thinking_done', signature: event.signature };\n break;\n }\n\n case 'redacted_thinking': {\n acc.assistantBlocks.push({\n type: 'redacted_thinking',\n data: event.data,\n });\n break;\n }\n\n case 'text_delta': {\n acc.text += event.text;\n yield { type: 'text_delta', text: event.text };\n break;\n }\n\n case 'tool_use_done': {\n if (acc.text) {\n acc.assistantBlocks.push({ type: 'text', text: acc.text });\n acc.text = '';\n }\n acc.assistantBlocks.push({\n type: 'tool_use',\n id: event.id,\n name: event.name,\n input: event.input,\n });\n\n const call: PendingToolCall = { id: event.id, name: event.name, input: event.input };\n\n // B.1: Try early dispatch for read-only tools mid-stream\n if (dispatcher?.tryDispatch(call)) {\n yield { type: 'tool_start', toolName: call.name, toolUseId: call.id, input: call.input };\n } else {\n acc.pendingToolCalls.push(call);\n }\n break;\n }\n\n case 'usage': {\n this.costTracker.track(\n event.inputTokens,\n event.outputTokens,\n event.cacheReadTokens,\n event.cacheWriteTokens,\n );\n this.contextBudget.update(event.inputTokens);\n yield {\n type: 'usage',\n inputTokens: event.inputTokens,\n outputTokens: event.outputTokens,\n cacheReadTokens: event.cacheReadTokens,\n cacheWriteTokens: event.cacheWriteTokens,\n };\n break;\n }\n\n case 'stop': {\n acc.stopReason = event.reason;\n break;\n }\n\n default:\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isCorruptHistoryError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return (\n (msg.includes('tool_use') && msg.includes('tool_result')) ||\n msg.includes('roles must alternate') ||\n (msg.includes('400') && msg.includes('invalid_request_error'))\n );\n}\n\n/**\n * Pre-flight validation: ensures message history meets Anthropic's requirements\n * right before every API call. Anthropic requires that every tool_use in an\n * assistant message has a matching tool_result in the IMMEDIATELY NEXT user\n * message — not just anywhere in the history. This function strips any\n * tool_use/tool_result blocks that violate this positional constraint and\n * fixes role alternation. Single point of defense — no corrupt messages can\n * reach the API regardless of how they got into the session.\n */\nexport function validateHistory(messages: Message[]): Message[] {\n const result: Message[] = [];\n let i = 0;\n\n while (i < messages.length) {\n const msg = messages[i];\n\n // For assistant messages with tool_use, verify the next message has ALL results\n const toolUseIds = msg.content\n .filter((b): b is { type: 'tool_use'; id: string; name: string; input: unknown } => b.type === 'tool_use')\n .map((b) => b.id);\n\n if (toolUseIds.length > 0 && msg.role === 'assistant') {\n const next = messages[i + 1];\n const nextResultIds = new Set(\n (next?.content ?? [])\n .filter((b): b is { type: 'tool_result'; toolUseId: string; content: string } => b.type === 'tool_result')\n .map((b) => b.toolUseId),\n );\n\n // Strip tool_use blocks that have no result in the next message\n const cleanAssistant = msg.content.filter((b) => {\n if (b.type === 'tool_use') return nextResultIds.has(b.id);\n return true;\n });\n\n // Strip tool_result blocks from next message whose tool_use was removed\n const keptToolUseIds = new Set(\n cleanAssistant\n .filter((b): b is { type: 'tool_use'; id: string; name: string; input: unknown } => b.type === 'tool_use')\n .map((b) => b.id),\n );\n const cleanNext = next?.content.filter((b) => {\n if (b.type === 'tool_result') return keptToolUseIds.has(b.toolUseId);\n return true;\n });\n\n if (cleanAssistant.length > 0) {\n result.push({ role: msg.role, content: cleanAssistant });\n }\n if (cleanNext && cleanNext.length > 0) {\n result.push({ role: next!.role, content: cleanNext });\n }\n i += 2;\n continue;\n }\n\n // For user messages: strip any tool_result blocks that reference a tool_use\n // not present in the immediately preceding assistant message\n if (msg.role === 'user' && msg.content.some((b) => b.type === 'tool_result')) {\n const prevAssistant = result[result.length - 1];\n const prevToolUseIds = new Set(\n (prevAssistant?.role === 'assistant' ? prevAssistant.content : [])\n .filter((b): b is { type: 'tool_use'; id: string; name: string; input: unknown } => b.type === 'tool_use')\n .map((b) => b.id),\n );\n const cleanContent = msg.content.filter((b) => {\n if (b.type === 'tool_result') return prevToolUseIds.has(b.toolUseId);\n return true;\n });\n if (cleanContent.length > 0) {\n result.push({ role: msg.role, content: cleanContent });\n }\n i++;\n continue;\n }\n\n result.push(msg);\n i++;\n }\n\n // Merge consecutive same-role messages (can happen after stripping)\n const merged: Message[] = [];\n for (const msg of result) {\n const last = merged[merged.length - 1];\n if (last && last.role === msg.role) {\n last.content = [...last.content, ...msg.content];\n } else {\n merged.push({ role: msg.role, content: [...msg.content] });\n }\n }\n\n // First message must be user\n while (merged.length > 0 && merged[0].role !== 'user') {\n merged.shift();\n }\n\n return merged;\n}\n\nfunction resolveTokenSymbol(nameOrType: string): string {\n if (!nameOrType.includes('::')) return nameOrType;\n const parts = nameOrType.split('::');\n return parts[parts.length - 1];\n}\n\nfunction describeAction(tool: Tool, call: PendingToolCall): string {\n const input = call.input as Record<string, unknown>;\n switch (tool.name) {\n case 'save_deposit': {\n return `Save ${input.amount} USDC into lending`;\n }\n case 'withdraw': {\n const wAsset = input.asset ?? '';\n return `Withdraw ${input.amount}${wAsset ? ' ' + wAsset : ''} from lending`;\n }\n case 'send_transfer':\n return `Send $${input.amount} to ${input.to}`;\n case 'borrow':\n return `Borrow $${input.amount} against collateral`;\n case 'repay_debt':\n return `Repay $${input.amount} of outstanding debt`;\n case 'claim_rewards':\n return 'Claim all pending protocol rewards';\n case 'pay_api': {\n const url = String(input.url ?? '');\n const cost = estimatePayApiCost(url);\n return `Pay for API call to ${url} (~$${cost})`;\n }\n case 'swap_execute': {\n const from = resolveTokenSymbol(String(input.from ?? '?'));\n const to = resolveTokenSymbol(String(input.to ?? '?'));\n const amt = input.amount ?? '?';\n const slippagePct = ((input.slippage as number) ?? 0.01) * 100;\n return `Swap ${amt} ${from} for ${to} (${slippagePct}% max slippage)`;\n }\n case 'volo_stake':\n return `Stake ${input.amount} SUI for vSUI`;\n case 'volo_unstake':\n return `Unstake ${input.amount === 'all' ? 'all' : input.amount} vSUI`;\n default:\n return `Execute ${tool.name}`;\n }\n}\n\nfunction flagSuspiciousResult(toolName: string, result: unknown): string | null {\n if (!result || typeof result !== 'object') return null;\n const r = result as Record<string, unknown>;\n if (toolName === 'swap_execute') {\n const outAmt = Number(r.toAmount ?? r.outputAmount ?? 0);\n const inAmt = Number(r.fromAmount ?? r.inputAmount ?? 1);\n if (inAmt > 0 && outAmt / inAmt > 1_000_000) {\n return '[Warning: This quote may contain inaccurate data. Verify on-chain before executing.]';\n }\n }\n const apy = Number(r.apy ?? r.APY ?? NaN);\n if (!isNaN(apy) && apy < 0) {\n return '[Warning: Negative APY detected — data may be stale.]';\n }\n return null;\n}\n","import type { EngineEvent, PendingAction, StopReason } from './types.js';\n\n// ---------------------------------------------------------------------------\n// SSE event format — serialisable subset of EngineEvent\n// ---------------------------------------------------------------------------\n\nexport type SSEEvent =\n | { type: 'thinking_delta'; text: string }\n | { type: 'thinking_done'; signature?: string }\n | { type: 'text_delta'; text: string }\n | { type: 'tool_start'; toolName: string; toolUseId: string; input: unknown }\n | {\n type: 'tool_result';\n toolName: string;\n toolUseId: string;\n result: unknown;\n isError: boolean;\n // [v1.4] flags carried through unchanged from EngineEvent.tool_result\n wasEarlyDispatched?: boolean;\n resultDeduped?: boolean;\n // [v1.5] true when injected by the engine's post-write refresh\n // (see EngineConfig.postWriteRefresh)\n wasPostWriteRefresh?: boolean;\n }\n | { type: 'pending_action'; action: PendingAction }\n | { type: 'turn_complete'; stopReason: StopReason }\n | { type: 'usage'; inputTokens: number; outputTokens: number; cacheReadTokens?: number; cacheWriteTokens?: number }\n | { type: 'error'; message: string }\n | { type: 'canvas'; template: string; data: unknown; title: string; toolUseId: string };\n\n// ---------------------------------------------------------------------------\n// Serialise: SSEEvent → SSE text\n// ---------------------------------------------------------------------------\n\nexport function serializeSSE(event: SSEEvent): string {\n const data = JSON.stringify(event);\n return `event: ${event.type}\\ndata: ${data}\\n\\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Deserialise: SSE text → SSEEvent\n// ---------------------------------------------------------------------------\n\nexport function parseSSE(raw: string): SSEEvent | null {\n const dataLine = raw.split('\\n').find((l) => l.startsWith('data: '));\n if (!dataLine) return null;\n try {\n return JSON.parse(dataLine.slice(6)) as SSEEvent;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Stream adapter: engine async generator → SSE text stream\n// ---------------------------------------------------------------------------\n\nexport async function* engineToSSE(\n events: AsyncGenerator<EngineEvent>,\n): AsyncGenerator<string> {\n for await (const event of events) {\n if (event.type === 'error') {\n yield serializeSSE({ type: 'error', message: event.error.message });\n } else {\n yield serializeSSE(event as SSEEvent);\n }\n }\n}\n","import type { Message, PendingAction } from './types.js';\nimport type { CostSnapshot } from './cost.js';\n\n// ---------------------------------------------------------------------------\n// Session data\n// ---------------------------------------------------------------------------\n\nexport interface SessionData {\n id: string;\n messages: Message[];\n usage: CostSnapshot;\n createdAt: number;\n updatedAt: number;\n /** Set when the engine is paused waiting for user approval of a write action. */\n pendingAction?: PendingAction | null;\n metadata?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Session store interface — implement for different backends\n// ---------------------------------------------------------------------------\n\nexport interface SessionStore {\n /** Load a session by ID. Returns null if not found or expired. */\n get(sessionId: string): Promise<SessionData | null>;\n\n /** Save or update a session. */\n set(session: SessionData): Promise<void>;\n\n /** Delete a session. */\n delete(sessionId: string): Promise<void>;\n\n /** Check if a session exists. */\n exists(sessionId: string): Promise<boolean>;\n}\n\n// ---------------------------------------------------------------------------\n// MemorySessionStore — for development and testing\n// ---------------------------------------------------------------------------\n\nexport class MemorySessionStore implements SessionStore {\n private store = new Map<string, { data: SessionData; expiresAt: number }>();\n private readonly ttlMs: number;\n\n constructor(opts?: { ttlMs?: number }) {\n this.ttlMs = opts?.ttlMs ?? 24 * 60 * 60 * 1000; // 24h default\n }\n\n async get(sessionId: string): Promise<SessionData | null> {\n const entry = this.store.get(sessionId);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n this.store.delete(sessionId);\n return null;\n }\n return structuredClone(entry.data);\n }\n\n async set(session: SessionData): Promise<void> {\n this.store.set(session.id, {\n data: structuredClone(session),\n expiresAt: Date.now() + this.ttlMs,\n });\n }\n\n async delete(sessionId: string): Promise<void> {\n this.store.delete(sessionId);\n }\n\n async exists(sessionId: string): Promise<boolean> {\n const entry = this.store.get(sessionId);\n if (!entry) return false;\n if (Date.now() > entry.expiresAt) {\n this.store.delete(sessionId);\n return false;\n }\n return true;\n }\n\n /** For testing: number of active (non-expired) sessions. */\n get size(): number {\n this.evictExpired();\n return this.store.size;\n }\n\n private evictExpired(): void {\n const now = Date.now();\n for (const [id, entry] of this.store) {\n if (now > entry.expiresAt) this.store.delete(id);\n }\n }\n}\n","import { readFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport yaml from 'js-yaml';\nimport { z } from 'zod';\nimport type { Recipe, RecipeStep } from './types.js';\n\nconst StepRequirementSchema = z.object({\n step: z.string().optional(),\n field: z.string().optional(),\n confirmation: z.boolean().optional(),\n});\n\nconst OnErrorSchema = z.object({\n action: z.enum(['abort', 'refuse', 'report', 'retry']),\n message: z.string(),\n suggest: z.string().optional(),\n});\n\nconst StepSchema: z.ZodType<RecipeStep> = z.object({\n name: z.string().min(1),\n tool: z.string().optional(),\n service: z.string().optional(),\n purpose: z.string().min(1),\n cost: z.string().optional(),\n output: z.object({ type: z.string(), key: z.string() }).optional(),\n gate: z.enum(['none', 'preview', 'review', 'estimate']).optional(),\n gate_prompt: z.string().optional(),\n requires: z.array(StepRequirementSchema).optional(),\n rules: z.array(z.string()).optional(),\n condition: z.string().optional(),\n notes: z.string().optional(),\n flags: z.record(z.unknown()).optional() as z.ZodType<RecipeStep['flags']>,\n on_error: OnErrorSchema.optional(),\n input_template: z.record(z.string()).optional(),\n cost_per_unit: z.string().optional(),\n});\n\nconst RecipeSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n triggers: z.array(z.string().min(1)).min(1),\n services: z.array(z.string()).optional(),\n prerequisites: z.array(z.object({ field: z.string(), prompt: z.string() })).optional(),\n steps: z.array(StepSchema).min(1),\n}).refine(\n (r) => {\n const names = r.steps.map((s) => s.name);\n return new Set(names).size === names.length;\n },\n { message: 'Step names must be unique within a recipe' },\n);\n\n/**\n * Load all recipe YAML files from a directory.\n * Throws on validation errors — recipes should fail at load time, not runtime.\n */\nexport function loadRecipes(yamlDir: string): Recipe[] {\n const files = readdirSync(yamlDir).filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'));\n const recipes: Recipe[] = [];\n\n for (const file of files) {\n const content = readFileSync(join(yamlDir, file), 'utf-8');\n const raw = yaml.load(content);\n const parsed = RecipeSchema.parse(raw);\n recipes.push(parsed as Recipe);\n }\n\n return recipes;\n}\n\n/**\n * Parse a single recipe from a YAML string (useful for embedded/bundled recipes).\n */\nexport function parseRecipe(yamlContent: string): Recipe {\n const raw = yaml.load(yamlContent);\n return RecipeSchema.parse(raw) as Recipe;\n}\n","import type { Recipe } from './types.js';\nimport { loadRecipes, parseRecipe } from './loader.js';\n\n/**\n * Stores loaded recipes and matches user messages to the most specific recipe\n * using longest-trigger-match-wins.\n */\nexport class RecipeRegistry {\n private recipes: Recipe[] = [];\n\n /** Load all recipes from a directory of YAML files. */\n loadDir(yamlDir: string): void {\n this.recipes.push(...loadRecipes(yamlDir));\n }\n\n /** Register a single recipe from a YAML string. */\n loadYaml(yamlContent: string): void {\n this.recipes.push(parseRecipe(yamlContent));\n }\n\n /** Register a pre-parsed Recipe object. */\n register(recipe: Recipe): void {\n this.recipes.push(recipe);\n }\n\n /** All loaded recipes. */\n all(): readonly Recipe[] {\n return this.recipes;\n }\n\n /**\n * Match a user message to the most specific recipe.\n * Longest trigger phrase match wins. Returns null if no match.\n */\n match(userMessage: string): Recipe | null {\n const normalized = userMessage.toLowerCase().trim();\n let best: Recipe | null = null;\n let bestLength = 0;\n\n for (const recipe of this.recipes) {\n for (const trigger of recipe.triggers) {\n const triggerLower = trigger.toLowerCase();\n if (normalized.includes(triggerLower) && triggerLower.length > bestLength) {\n best = recipe;\n bestLength = triggerLower.length;\n }\n }\n }\n\n return best;\n }\n\n /**\n * Format a matched recipe as a compact context block for the system prompt.\n * Injected dynamically — only when the recipe matches.\n */\n toPromptContext(recipe: Recipe): string {\n const lines: string[] = [\n `## Active Recipe: ${recipe.name}`,\n recipe.description,\n 'Follow these steps:',\n ];\n\n for (let i = 0; i < recipe.steps.length; i++) {\n const step = recipe.steps[i];\n const num = i + 1;\n const toolNote = step.tool ? ` → ${step.tool}` : '';\n const serviceNote = step.service ? ` (${step.service})` : '';\n const costNote = step.cost ? ` — ${step.cost}` : '';\n const gateNote = step.gate && step.gate !== 'none'\n ? ` [GATE: ${step.gate}]`\n : '';\n\n let line = `${num}. ${step.name}${toolNote}${serviceNote}${costNote}${gateNote}`;\n\n if (step.gate_prompt) {\n line += ` — \"${step.gate_prompt}\"`;\n }\n\n lines.push(line);\n\n if (step.rules?.length) {\n for (const rule of step.rules) {\n lines.push(` - ${rule}`);\n }\n }\n\n if (step.notes) {\n lines.push(` Note: ${step.notes}`);\n }\n\n if (step.on_error) {\n lines.push(` On error: ${step.on_error.action} — ${step.on_error.message}`);\n }\n\n if (step.condition) {\n lines.push(` Condition: ${step.condition}`);\n }\n }\n\n if (recipe.prerequisites?.length) {\n lines.push('Prerequisites (ask before starting):');\n for (const pre of recipe.prerequisites) {\n lines.push(`- ${pre.field}: \"${pre.prompt}\"`);\n }\n }\n\n return lines.join('\\n');\n }\n}\n","import type { ThinkingEffort } from './types.js';\nimport type { Recipe } from './recipes/index.js';\n\n/**\n * Routes each turn to the appropriate thinking effort level based on\n * message content, matched recipe, and session write history.\n *\n * Heuristics only — no LLM call. Cost per session becomes proportional\n * to actual query complexity rather than a fixed budget.\n */\nexport function classifyEffort(\n model: string,\n userMessage: string,\n matchedRecipe: Recipe | null,\n sessionWriteCount: number,\n): ThinkingEffort {\n const supportsMax = model.includes('opus-4-6');\n const msg = userMessage.toLowerCase();\n\n if (supportsMax) {\n if (matchedRecipe?.name === 'portfolio_rebalance') return 'max';\n if (matchedRecipe?.name === 'emergency_withdraw') return 'max';\n if (/rebalance|reallocate|dca setup|close.*position/i.test(msg)) return 'max';\n }\n\n if (matchedRecipe && matchedRecipe.steps.length >= 3) return 'high';\n if (matchedRecipe?.name === 'safe_borrow' || matchedRecipe?.name === 'bulk_mail') return 'high';\n if (sessionWriteCount > 0 && /borrow|withdraw|send|swap/i.test(msg)) return 'high';\n\n if (/balance|rate|how much|what is|check|history|show|price/i.test(msg)) return 'low';\n if (!matchedRecipe && !/deposit|send|swap|borrow|withdraw|save|pay/i.test(msg)) return 'low';\n\n return 'medium';\n}\n","import type { SystemBlock } from './types.js';\n\n/**\n * Build a cacheable system prompt array from static and dynamic parts.\n *\n * Anthropic caches system prompt blocks marked with `cache_control: { type: 'ephemeral' }`.\n * Static blocks (identity, tool descriptions) are cached across turns. Dynamic blocks\n * (user profile, positions, state) change per-turn and are NOT cached.\n *\n * Cache breakpoints are placed at the end of each static block — Anthropic caches\n * from the start of the prompt up to the last cache_control marker.\n */\nexport function buildCachedSystemPrompt(\n staticParts: string[],\n dynamicPart?: string,\n): SystemBlock[] {\n const blocks: SystemBlock[] = staticParts.map((text, i) => ({\n type: 'text' as const,\n text,\n ...(i === staticParts.length - 1 && { cache_control: { type: 'ephemeral' as const } }),\n }));\n\n if (dynamicPart) {\n blocks.push({ type: 'text', text: dynamicPart });\n }\n\n return blocks;\n}\n","/**\n * Intelligence Layer prompt builders (F1, F2, F5).\n * Pure functions — no DB or Redis dependencies.\n * Consumed by the host app's dynamic context assembly.\n */\n\n// ---------------------------------------------------------------------------\n// F1: User Financial Profile types + context builder\n// ---------------------------------------------------------------------------\n\nexport interface UserFinancialProfile {\n userId: string;\n riskAppetite: 'conservative' | 'moderate' | 'aggressive';\n financialLiteracy: 'novice' | 'intermediate' | 'advanced';\n prefersBriefResponses: boolean;\n prefersExplainers: boolean;\n currencyFraming: 'usdc' | 'fiat';\n primaryGoals: string[];\n knownPatterns: string[];\n riskConfidence: number;\n literacyConfidence: number;\n lastInferredAt: Date | null;\n}\n\n/**\n * Build system prompt context from a user's financial profile.\n * Returns empty string if profile is absent or confidence is too low.\n * Takes the profile object directly — no DB query.\n */\nexport function buildProfileContext(profile: UserFinancialProfile | null): string {\n if (!profile || profile.riskConfidence < 0.3) return '';\n\n const lines: string[] = ['User financial profile (inferred from conversation history):'];\n\n if (profile.riskConfidence >= 0.5) {\n lines.push(`- Risk appetite: ${profile.riskAppetite}`);\n }\n if (profile.literacyConfidence >= 0.5) {\n lines.push(`- Financial literacy: ${profile.financialLiteracy}`);\n if (profile.financialLiteracy === 'advanced') {\n lines.push(' → Skip basic DeFi explanations (health factor, APY, etc). User knows these.');\n }\n if (profile.financialLiteracy === 'novice') {\n lines.push(' → Always explain DeFi concepts in plain language.');\n }\n }\n if (profile.currencyFraming === 'fiat') {\n lines.push('- Frame amounts as dollars (e.g. \"$50\" not \"50 USDC\")');\n }\n if (profile.prefersBriefResponses) {\n lines.push('- Prefers brief responses — be concise');\n }\n if (profile.primaryGoals.length > 0) {\n lines.push(`- Stated goals: ${profile.primaryGoals.join(', ')}`);\n }\n if (profile.knownPatterns.length > 0) {\n lines.push(`- Behavioural patterns: ${profile.knownPatterns.join(', ')}`);\n }\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// F2: In-Session Proactive Awareness\n// ---------------------------------------------------------------------------\n\nexport function buildProactivenessInstructions(profile: UserFinancialProfile | null): string {\n const brevityGuidance = profile?.prefersBriefResponses\n ? 'This user prefers brevity — only surface context if urgent or directly actionable.'\n : 'Surface relevant context when criteria are met.';\n\n const styleGuidance = profile?.financialLiteracy === 'novice'\n ? 'Frame observations in plain English, no DeFi jargon.'\n : 'Technical framing is fine.';\n\n return `Proactive awareness:\nAfter completing the user's request, consider whether ONE additional piece of financial\ncontext is worth mentioning. ${brevityGuidance}\n\n✓ Mention if:\n- Their savings goal is materially off-track (>20% behind pace)\n- Yield rate changed significantly since last session (>0.5%)\n- They have idle USDC >$50 sitting for >48h\n- An action they just took interacts with an active goal or debt position\n- A pattern would materially benefit from their attention\n\n✗ Do NOT mention if:\n- Tangentially related but not actionable\n- Already surfaced this session\n- Requires more explanation than the original answer\n- Would seem pushy or sales-y\n\n${styleGuidance}\nFormat: One sentence maximum, after main response, separated by a line break.\nFrame as observation, not advice: \"Your Tokyo goal is $80 behind pace.\" — not \"You should deposit more.\"`;\n}\n\n// ---------------------------------------------------------------------------\n// F5: Post-Action Self-Evaluation\n// ---------------------------------------------------------------------------\n\nexport function buildSelfEvaluationInstruction(): string {\n return `Self-evaluation (apply silently before composing your response):\n\n1. ACCURACY — Quote exact values from tool results, not estimates or rounded figures.\n Never combine post-action tool results with pre-action snapshot numbers.\n If the tool returned an error, label it as an error — do not paraphrase it as success.\n\n2. STATE CONSISTENCY — Describe the actual outcome of all steps.\n Partial success (swap ok, deposit failed): describe both clearly.\n Never describe a failed action as if it succeeded.\n\n3. COMPLETENESS — If the user asked multiple things, answer all of them.\n If you couldn't complete something, explain why and what the current state is.\n\n4. TONE — Match tone to outcome.\n Success: confirming and forward-looking.\n Failure: clear about what failed, unchanged, and what to do next.\n Warning: specific risk, not generic caution.\n\nIf any check fails, rewrite before outputting.`;\n}\n","/**\n * Conversation State Machine — F4 of the Intelligence Layer.\n *\n * Types, pure context builder, and a generic state manager interface.\n * The Redis implementation lives in the host app (audric) since it depends on @upstash/redis.\n */\n\n// ---------------------------------------------------------------------------\n// State definitions\n// ---------------------------------------------------------------------------\n\nexport type ConversationState =\n | { type: 'idle' }\n\n | {\n type: 'mid_recipe';\n recipeName: string;\n currentStep: number;\n totalSteps: number;\n completedStepOutputs: Record<string, Record<string, string | number>>;\n startedAt: number;\n }\n\n | {\n type: 'awaiting_confirmation';\n action: string;\n amount?: number;\n recipient?: string;\n proposedAt: number;\n expiresAt: number;\n }\n\n | {\n type: 'post_error';\n failedAction: string;\n errorMessage: string;\n occurredAt: number;\n partialState?: string;\n }\n\n | {\n type: 'post_liquidation_warning';\n healthFactor: number;\n warnedAt: number;\n }\n\n | {\n type: 'onboarding';\n sessionNumber: number;\n hasBalance: boolean;\n hasSavedBefore: boolean;\n };\n\nexport type StateType = ConversationState['type'];\n\n// ---------------------------------------------------------------------------\n// State manager interface (host app provides the implementation)\n// ---------------------------------------------------------------------------\n\nexport interface ConversationStateStore {\n get(): Promise<ConversationState>;\n set(state: ConversationState): Promise<void>;\n transition(to: ConversationState): Promise<void>;\n reset(): Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Context builder — pure function, no I/O\n// ---------------------------------------------------------------------------\n\nexport function buildStateContext(state: ConversationState): string {\n switch (state.type) {\n case 'idle':\n return '';\n\n case 'mid_recipe': {\n const elapsed = Math.round((Date.now() - state.startedAt) / 60_000);\n const outputs = JSON.stringify(state.completedStepOutputs);\n return [\n `Conversation state: MID-RECIPE`,\n `Active recipe: ${state.recipeName} (step ${state.currentStep + 1} of ${state.totalSteps})`,\n `Started: ${elapsed} minutes ago`,\n `Completed step key outputs: ${outputs}`,\n `If the user asks an unrelated question: answer briefly, then offer to continue the ${state.recipeName} flow.`,\n `If the user says \"cancel\" or \"stop\": confirm you have abandoned the recipe and return to idle.`,\n ].join('\\n');\n }\n\n case 'awaiting_confirmation': {\n const expiryMins = Math.max(0, Math.round((state.expiresAt - Date.now()) / 60_000));\n const expired = state.expiresAt < Date.now();\n return [\n `Conversation state: AWAITING CONFIRMATION`,\n `Proposed action: ${state.action}${state.amount ? ` for $${state.amount}` : ''}${state.recipient ? ` to ${state.recipient}` : ''}`,\n expired\n ? `Status: EXPIRED — ask if user still wants to proceed`\n : `Expires in: ${expiryMins} minutes`,\n `\"yes/confirm/do it\" → execute. \"no/cancel/wait\" → abort, reset to idle.`,\n ].join('\\n');\n }\n\n case 'post_error':\n return [\n `Conversation state: POST-ERROR`,\n `Failed action: ${state.failedAction}`,\n `Error: ${state.errorMessage}`,\n state.partialState ? `Partial state: ${state.partialState}` : '',\n `Acknowledge failure clearly. Offer a specific recovery path if one exists.`,\n `This state clears automatically on the next successful action.`,\n ].filter(Boolean).join('\\n');\n\n case 'post_liquidation_warning':\n return [\n `Conversation state: LIQUIDATION WARNING ACTIVE`,\n `Health factor: ${state.healthFactor.toFixed(2)} — below safe threshold`,\n `Prioritise debt repayment or collateral deposit.`,\n `Do not proceed with any action that would further reduce health factor.`,\n ].join('\\n');\n\n case 'onboarding':\n return [\n `Conversation state: ONBOARDING (session ${state.sessionNumber})`,\n state.sessionNumber === 1\n ? 'First session — introduce capabilities through context, not a feature list.'\n : `Returning user — ${state.hasSavedBefore ? 'has saved before' : 'has not saved yet'}.`,\n ].join('\\n');\n\n default:\n return '';\n }\n}\n","import type { Tool, ToolContext } from './types.js';\nimport { getDefaultTools } from './tools/index.js';\n\n// ---------------------------------------------------------------------------\n// MCP tool descriptor — the shape MCP servers need to register tools\n// ---------------------------------------------------------------------------\n\nexport interface McpToolDescriptor {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (args: Record<string, unknown>) => Promise<{\n content: Array<{ type: 'text'; text: string }>;\n isError?: boolean;\n }>;\n}\n\n// ---------------------------------------------------------------------------\n// Convert engine tools → MCP tool descriptors\n// ---------------------------------------------------------------------------\n\n/**\n * Builds MCP-compatible tool descriptors from engine tools.\n * Each tool's `call()` is wrapped to return the MCP response format.\n *\n * Usage with @modelcontextprotocol/sdk:\n * ```\n * const descriptors = buildMcpTools(context);\n * for (const desc of descriptors) {\n * server.tool(desc.name, desc.description, desc.inputSchema, desc.handler);\n * }\n * ```\n */\nexport function buildMcpTools(\n context: ToolContext,\n tools?: Tool[],\n): McpToolDescriptor[] {\n const engineTools = tools ?? getDefaultTools();\n\n return engineTools.map((tool) => ({\n name: `audric_${tool.name}`,\n description: tool.description,\n inputSchema: tool.jsonSchema as unknown as Record<string, unknown>,\n\n async handler(args: Record<string, unknown>) {\n try {\n const parsed = tool.inputSchema.safeParse(args);\n if (!parsed.success) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n error: `Invalid input: ${parsed.error.issues.map((i) => i.message).join(', ')}`,\n }),\n }],\n isError: true,\n };\n }\n\n const result = await tool.call(parsed.data, context);\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify(result.data),\n }],\n };\n } catch (err) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n error: err instanceof Error ? err.message : 'Tool execution failed',\n }),\n }],\n isError: true,\n };\n }\n },\n }));\n}\n\n/**\n * Register all engine tools with an MCP server instance.\n * Convenience wrapper for the common pattern.\n */\nexport function registerEngineTools(\n server: { tool: (name: string, description: string, schema: Record<string, unknown>, handler: (args: Record<string, unknown>) => Promise<unknown>) => void },\n context: ToolContext,\n tools?: Tool[],\n): void {\n const descriptors = buildMcpTools(context, tools);\n for (const desc of descriptors) {\n server.tool(desc.name, desc.description, desc.inputSchema, desc.handler);\n }\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport type { Tool as McpToolDef } from '@modelcontextprotocol/sdk/types.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface McpServerConfig {\n /** Human-readable server name, used as tool namespace prefix. */\n name: string;\n /** MCP server URL (Streamable HTTP or SSE endpoint). */\n url: string;\n /** Transport type. Defaults to 'streamable-http'. */\n transport?: 'streamable-http' | 'sse';\n /** Response cache TTL in ms. Default 30_000 (30s). */\n cacheTtlMs?: number;\n /** Whether all tools from this server are read-only. Default true. */\n readOnly?: boolean;\n}\n\nexport interface McpServerConnection {\n config: McpServerConfig;\n client: Client;\n transport: Transport;\n tools: McpToolDef[];\n status: 'connected' | 'disconnected' | 'error';\n lastError?: string;\n}\n\nexport interface McpCallResult {\n content: Array<{ type: string; text?: string; [key: string]: unknown }>;\n isError?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Response cache\n// ---------------------------------------------------------------------------\n\ninterface CacheEntry {\n result: McpCallResult;\n expiresAt: number;\n}\n\nexport class McpResponseCache {\n private cache = new Map<string, CacheEntry>();\n private readonly defaultTtlMs: number;\n\n constructor(defaultTtlMs = 30_000) {\n this.defaultTtlMs = defaultTtlMs;\n }\n\n private key(serverName: string, toolName: string, args: unknown): string {\n return `${serverName}::${toolName}::${JSON.stringify(args)}`;\n }\n\n get(serverName: string, toolName: string, args: unknown): McpCallResult | null {\n const k = this.key(serverName, toolName, args);\n const entry = this.cache.get(k);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(k);\n return null;\n }\n return entry.result;\n }\n\n set(serverName: string, toolName: string, args: unknown, result: McpCallResult, ttlMs?: number): void {\n const k = this.key(serverName, toolName, args);\n this.cache.set(k, {\n result,\n expiresAt: Date.now() + (ttlMs ?? this.defaultTtlMs),\n });\n }\n\n invalidate(serverName?: string): void {\n if (!serverName) {\n this.cache.clear();\n return;\n }\n for (const key of this.cache.keys()) {\n if (key.startsWith(`${serverName}::`)) {\n this.cache.delete(key);\n }\n }\n }\n\n get size(): number {\n return this.cache.size;\n }\n}\n\n// ---------------------------------------------------------------------------\n// McpClientManager — multi-server connection registry\n// ---------------------------------------------------------------------------\n\nexport class McpClientManager {\n private connections = new Map<string, McpServerConnection>();\n private readonly responseCache: McpResponseCache;\n\n constructor(opts?: { cacheTtlMs?: number }) {\n this.responseCache = new McpResponseCache(opts?.cacheTtlMs ?? 30_000);\n }\n\n /**\n * Connect to an MCP server and discover its tools.\n * If already connected to a server with this name, disconnects first.\n */\n async connect(config: McpServerConfig): Promise<McpServerConnection> {\n if (this.connections.has(config.name)) {\n await this.disconnect(config.name);\n }\n\n const client = new Client(\n { name: 'audric-engine', version: '0.1.0' },\n { capabilities: {} },\n );\n\n const transportType = config.transport ?? 'streamable-http';\n const url = new URL(config.url);\n\n const transport = transportType === 'sse'\n ? new SSEClientTransport(url)\n : new StreamableHTTPClientTransport(url, {\n reconnectionOptions: {\n maxReconnectionDelay: 30_000,\n initialReconnectionDelay: 1_000,\n reconnectionDelayGrowFactor: 1.5,\n maxRetries: 3,\n },\n });\n\n const conn: McpServerConnection = {\n config,\n client,\n transport,\n tools: [],\n status: 'disconnected',\n };\n\n try {\n await client.connect(transport);\n conn.status = 'connected';\n\n const { tools } = await client.listTools();\n conn.tools = tools;\n } catch (err) {\n try { await client.close(); } catch { /* best-effort */ }\n throw err;\n }\n\n this.connections.set(config.name, conn);\n return conn;\n }\n\n /** Disconnect from a server by name. */\n async disconnect(name: string): Promise<void> {\n const conn = this.connections.get(name);\n if (!conn) return;\n try {\n await conn.client.close();\n } catch { /* best-effort */ }\n conn.status = 'disconnected';\n conn.tools = [];\n this.connections.delete(name);\n this.responseCache.invalidate(name);\n }\n\n /** Disconnect from all servers. */\n async disconnectAll(): Promise<void> {\n const names = [...this.connections.keys()];\n await Promise.allSettled(names.map((n) => this.disconnect(n)));\n }\n\n /** Get a connection by server name. */\n getConnection(name: string): McpServerConnection | undefined {\n return this.connections.get(name);\n }\n\n /** Check if a server is connected. */\n isConnected(name: string): boolean {\n return this.connections.get(name)?.status === 'connected';\n }\n\n /** List all tool definitions across all connected servers. */\n listAllTools(): Array<{ serverName: string; tool: McpToolDef }> {\n const result: Array<{ serverName: string; tool: McpToolDef }> = [];\n for (const [name, conn] of this.connections) {\n if (conn.status !== 'connected') continue;\n for (const tool of conn.tools) {\n result.push({ serverName: name, tool });\n }\n }\n return result;\n }\n\n /**\n * Call a tool on a specific server.\n * Uses response cache for read-only servers.\n */\n async callTool(\n serverName: string,\n toolName: string,\n args: Record<string, unknown> = {},\n ): Promise<McpCallResult> {\n const conn = this.connections.get(serverName);\n if (!conn) throw new Error(`MCP server \"${serverName}\" not connected`);\n if (conn.status !== 'connected') throw new Error(`MCP server \"${serverName}\" is ${conn.status}`);\n\n const cacheTtl = conn.config.cacheTtlMs ?? 30_000;\n if (conn.config.readOnly !== false && cacheTtl > 0) {\n const cached = this.responseCache.get(serverName, toolName, args);\n if (cached) return cached;\n }\n\n const result = await conn.client.callTool({ name: toolName, arguments: args });\n\n const callResult: McpCallResult = {\n content: (result.content ?? []) as McpCallResult['content'],\n isError: result.isError as boolean | undefined,\n };\n\n if (conn.config.readOnly !== false && cacheTtl > 0) {\n this.responseCache.set(serverName, toolName, args, callResult, cacheTtl);\n }\n\n return callResult;\n }\n\n /** Get the response cache (for testing / manual invalidation). */\n get cache(): McpResponseCache {\n return this.responseCache;\n }\n\n /** Number of connected servers. */\n get serverCount(): number {\n let count = 0;\n for (const conn of this.connections.values()) {\n if (conn.status === 'connected') count++;\n }\n return count;\n }\n\n /** All server names. */\n get serverNames(): string[] {\n return [...this.connections.keys()];\n }\n}\n","import { z } from 'zod';\nimport type { Tool as McpToolDef } from '@modelcontextprotocol/sdk/types.js';\nimport type { Tool, ToolJsonSchema, PermissionLevel } from './types.js';\nimport type { McpClientManager } from './mcp-client.js';\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport interface McpToolAdapterConfig {\n /** The McpClientManager to route calls through. */\n manager: McpClientManager;\n /** Server name this tool belongs to. */\n serverName: string;\n /** Override permission level for all tools from this server. */\n permissionLevel?: PermissionLevel;\n /** Override isReadOnly for all tools from this server. */\n isReadOnly?: boolean;\n /** Per-tool overrides keyed by MCP tool name. */\n toolOverrides?: Record<string, {\n permissionLevel?: PermissionLevel;\n isReadOnly?: boolean;\n description?: string;\n }>;\n}\n\n// ---------------------------------------------------------------------------\n// Adapter: single MCP tool → engine Tool\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a single MCP tool definition into an engine Tool.\n * The tool name is namespaced as `{serverName}_{mcpToolName}`.\n */\nexport function adaptMcpTool(\n mcpTool: McpToolDef,\n config: McpToolAdapterConfig,\n): Tool {\n const overrides = config.toolOverrides?.[mcpTool.name];\n const isReadOnly = overrides?.isReadOnly ?? config.isReadOnly ?? true;\n const permissionLevel = overrides?.permissionLevel ?? config.permissionLevel ?? 'auto';\n const namespacedName = `${config.serverName}_${mcpTool.name}`;\n\n const jsonSchema: ToolJsonSchema = (mcpTool.inputSchema ?? {\n type: 'object',\n properties: {},\n }) as ToolJsonSchema;\n\n return {\n name: namespacedName,\n description: overrides?.description ?? mcpTool.description ?? `MCP tool: ${mcpTool.name}`,\n inputSchema: z.record(z.unknown()),\n jsonSchema,\n isReadOnly,\n isConcurrencySafe: isReadOnly,\n permissionLevel,\n flags: {},\n\n async call(input, _context) {\n const result = await config.manager.callTool(\n config.serverName,\n mcpTool.name,\n input as Record<string, unknown>,\n );\n\n const textContent = result.content\n .filter((c) => c.type === 'text' && c.text)\n .map((c) => c.text!)\n .join('\\n');\n\n let data: unknown;\n try {\n data = JSON.parse(textContent);\n } catch {\n data = textContent || result.content;\n }\n\n if (result.isError) {\n return { data: { error: data } };\n }\n\n return { data };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Batch adapter: all tools from a server → engine Tools\n// ---------------------------------------------------------------------------\n\n/**\n * Convert all discovered tools from an MCP server into engine Tools.\n * Call this after `manager.connect(config)` completes successfully.\n */\nexport function adaptAllMcpTools(config: McpToolAdapterConfig): Tool[] {\n const conn = config.manager.getConnection(config.serverName);\n if (!conn || conn.status !== 'connected') {\n return [];\n }\n return conn.tools.map((t) => adaptMcpTool(t, config));\n}\n\n/**\n * Convenience: adapt tools from all connected servers.\n * Returns a flat array of engine Tools, namespaced by server name.\n */\nexport function adaptAllServerTools(\n manager: McpClientManager,\n serverConfigs?: Record<string, Omit<McpToolAdapterConfig, 'manager' | 'serverName'>>,\n): Tool[] {\n const allTools: Tool[] = [];\n\n for (const { serverName, tool } of manager.listAllTools()) {\n const serverOpts = serverConfigs?.[serverName] ?? {};\n allTools.push(adaptMcpTool(tool, {\n manager,\n serverName,\n ...serverOpts,\n }));\n }\n\n return allTools;\n}\n","import Anthropic from '@anthropic-ai/sdk';\nimport type {\n ChatParams,\n LLMProvider,\n Message,\n ProviderEvent,\n StopReason,\n SystemPrompt,\n ThinkingConfig,\n ToolDefinition,\n} from '../types.js';\n\nconst DEFAULT_MODEL = 'claude-sonnet-4-20250514';\nconst DEFAULT_MAX_TOKENS = 4096;\n\nexport interface AnthropicProviderConfig {\n apiKey: string;\n defaultModel?: string;\n defaultMaxTokens?: number;\n}\n\nexport class AnthropicProvider implements LLMProvider {\n private client: Anthropic;\n private defaultModel: string;\n private defaultMaxTokens: number;\n\n constructor(config: AnthropicProviderConfig) {\n this.client = new Anthropic({ apiKey: config.apiKey });\n this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;\n this.defaultMaxTokens = config.defaultMaxTokens ?? DEFAULT_MAX_TOKENS;\n }\n\n async *chat(params: ChatParams): AsyncGenerator<ProviderEvent> {\n const messages = sanitizeAnthropicMessages(\n params.messages.map(toAnthropicMessage),\n );\n const tools = params.tools.map(toAnthropicTool);\n\n let toolChoice: Anthropic.Messages.MessageCreateParams['tool_choice'] | undefined;\n if (params.toolChoice && tools.length > 0) {\n if (params.toolChoice === 'any') {\n toolChoice = { type: 'any' };\n } else if (params.toolChoice === 'auto') {\n toolChoice = { type: 'auto' };\n } else if (typeof params.toolChoice === 'object') {\n toolChoice = { type: 'tool', name: params.toolChoice.name };\n }\n }\n\n const thinkingParam = toAnthropicThinking(params.thinking);\n\n const systemParam = toAnthropicSystem(params.systemPrompt);\n\n const baseParams: Anthropic.Messages.MessageCreateParamsStreaming = {\n model: params.model ?? this.defaultModel,\n max_tokens: params.maxTokens ?? this.defaultMaxTokens,\n system: systemParam,\n messages,\n stream: true as const,\n tools: tools.length > 0 ? tools : undefined,\n ...(!thinkingParam && params.temperature !== undefined && { temperature: params.temperature }),\n ...(toolChoice && { tool_choice: toolChoice }),\n };\n\n const streamParams = {\n ...baseParams,\n ...(thinkingParam && { thinking: thinkingParam }),\n ...(params.outputConfig?.effort && { output_config: { effort: params.outputConfig.effort } }),\n };\n\n // Cast to satisfy SDK types — thinking/output_config may not be in the type defs yet\n const stream = params.signal\n ? this.client.messages.stream(streamParams as Anthropic.Messages.MessageCreateParamsStreaming, { signal: params.signal })\n : this.client.messages.stream(streamParams as Anthropic.Messages.MessageCreateParamsStreaming);\n\n const toolInputBuffers = new Map<number, { id: string; name: string; json: string }>();\n const thinkingBuffers = new Map<number, { type: 'thinking'; text: string; signature: string } | { type: 'redacted_thinking'; data: string }>();\n let outputTokensFromStart = 0;\n\n try {\n for await (const event of stream) {\n switch (event.type) {\n case 'message_start': {\n const msg = event.message;\n yield {\n type: 'message_start',\n messageId: msg.id,\n model: msg.model,\n };\n if (msg.usage) {\n const u = msg.usage as unknown as Record<string, number>;\n outputTokensFromStart = msg.usage.output_tokens;\n yield {\n type: 'usage',\n inputTokens: msg.usage.input_tokens,\n outputTokens: msg.usage.output_tokens,\n cacheReadTokens: u.cache_read_input_tokens,\n cacheWriteTokens: u.cache_creation_input_tokens,\n };\n }\n break;\n }\n\n case 'content_block_start': {\n const block = event.content_block as { type: string; id?: string; name?: string; data?: string };\n if (block.type === 'tool_use') {\n toolInputBuffers.set(event.index, {\n id: block.id!,\n name: block.name!,\n json: '',\n });\n yield {\n type: 'tool_use_start',\n id: block.id!,\n name: block.name!,\n };\n } else if (block.type === 'thinking') {\n thinkingBuffers.set(event.index, { type: 'thinking', text: '', signature: '' });\n } else if (block.type === 'redacted_thinking') {\n thinkingBuffers.set(event.index, { type: 'redacted_thinking', data: block.data ?? '' });\n }\n break;\n }\n\n case 'content_block_delta': {\n const delta = event.delta as { type: string; text?: string; partial_json?: string; thinking?: string; signature?: string };\n if (delta.type === 'text_delta') {\n yield { type: 'text_delta', text: delta.text! };\n } else if (delta.type === 'input_json_delta') {\n const buf = toolInputBuffers.get(event.index);\n if (buf) {\n buf.json += delta.partial_json!;\n yield {\n type: 'tool_use_delta',\n id: buf.id,\n partialJson: delta.partial_json!,\n };\n }\n } else if (delta.type === 'thinking_delta') {\n const buf = thinkingBuffers.get(event.index);\n if (buf?.type === 'thinking') buf.text += delta.thinking ?? '';\n yield { type: 'thinking_delta', text: delta.thinking ?? '' };\n } else if (delta.type === 'signature_delta') {\n const buf = thinkingBuffers.get(event.index);\n if (buf?.type === 'thinking') buf.signature = delta.signature ?? '';\n }\n break;\n }\n\n case 'content_block_stop': {\n const toolBuf = toolInputBuffers.get(event.index);\n if (toolBuf) {\n let input: unknown = {};\n try {\n input = JSON.parse(toolBuf.json || '{}');\n } catch {\n input = {};\n }\n yield {\n type: 'tool_use_done',\n id: toolBuf.id,\n name: toolBuf.name,\n input,\n };\n toolInputBuffers.delete(event.index);\n }\n const thinkBuf = thinkingBuffers.get(event.index);\n if (thinkBuf?.type === 'thinking') {\n yield { type: 'thinking_done', thinking: thinkBuf.text, signature: thinkBuf.signature };\n thinkingBuffers.delete(event.index);\n } else if (thinkBuf?.type === 'redacted_thinking') {\n yield { type: 'redacted_thinking', data: thinkBuf.data };\n thinkingBuffers.delete(event.index);\n }\n break;\n }\n\n case 'message_delta': {\n const delta = event.delta as { stop_reason?: string };\n const usage = event.usage as { output_tokens?: number } | undefined;\n // message_delta.usage.output_tokens is cumulative — emit only the delta\n if (usage?.output_tokens && usage.output_tokens > outputTokensFromStart) {\n const increment = usage.output_tokens - outputTokensFromStart;\n outputTokensFromStart = usage.output_tokens;\n yield {\n type: 'usage',\n inputTokens: 0,\n outputTokens: increment,\n };\n }\n if (delta.stop_reason) {\n yield {\n type: 'stop',\n reason: mapStopReason(delta.stop_reason),\n };\n }\n break;\n }\n }\n }\n } finally {\n stream.abort();\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Conversion helpers\n// ---------------------------------------------------------------------------\n\nfunction toAnthropicSystem(prompt: SystemPrompt): string | Anthropic.Messages.TextBlockParam[] {\n if (typeof prompt === 'string') return prompt;\n return prompt.map((block) => ({\n type: 'text' as const,\n text: block.text,\n ...(block.cache_control && { cache_control: block.cache_control }),\n }));\n}\n\nfunction toAnthropicThinking(config?: ThinkingConfig): Record<string, unknown> | undefined {\n if (!config || config.type === 'disabled') return undefined;\n if (config.type === 'adaptive') return { type: 'adaptive' };\n return { type: 'enabled', budget_tokens: config.budgetTokens };\n}\n\nfunction toAnthropicMessage(msg: Message): Anthropic.MessageParam {\n const content: Anthropic.ContentBlockParam[] = msg.content\n .map((block): Anthropic.ContentBlockParam | null => {\n switch (block.type) {\n case 'text':\n return { type: 'text' as const, text: block.text };\n case 'thinking':\n return { type: 'thinking' as const, thinking: block.thinking, signature: block.signature } as unknown as Anthropic.ContentBlockParam;\n case 'redacted_thinking':\n return { type: 'redacted_thinking' as const, data: block.data } as unknown as Anthropic.ContentBlockParam;\n case 'tool_use':\n return {\n type: 'tool_use' as const,\n id: block.id,\n name: block.name,\n input: block.input as Record<string, unknown>,\n };\n case 'tool_result':\n return {\n type: 'tool_result' as const,\n tool_use_id: block.toolUseId,\n content: block.content,\n is_error: block.isError,\n };\n }\n })\n .filter((b): b is Anthropic.ContentBlockParam => b !== null);\n\n return { role: msg.role, content };\n}\n\nfunction toAnthropicTool(\n def: ToolDefinition,\n): Anthropic.Messages.Tool {\n return {\n name: def.name,\n description: def.description,\n input_schema: def.input_schema as Anthropic.Messages.Tool.InputSchema,\n };\n}\n\nfunction mapStopReason(reason: string): StopReason {\n switch (reason) {\n case 'end_turn':\n return 'end_turn';\n case 'tool_use':\n return 'tool_use';\n case 'max_tokens':\n return 'max_tokens';\n default:\n return 'end_turn';\n }\n}\n\n/**\n * Last-line-of-defense sanitization operating directly on Anthropic-format messages.\n * Enforces the positional constraint: every tool_use in an assistant message must have\n * a matching tool_result (by tool_use_id) in the immediately next user message.\n * Strips orphans in both directions and fixes role alternation.\n */\nfunction sanitizeAnthropicMessages(\n messages: Anthropic.MessageParam[],\n): Anthropic.MessageParam[] {\n const result: Anthropic.MessageParam[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n const content = Array.isArray(msg.content) ? msg.content : [{ type: 'text' as const, text: msg.content }];\n\n // Collect tool_use ids in this assistant message\n const toolUseIds = content\n .filter((b): b is Anthropic.ToolUseBlockParam => (b as { type: string }).type === 'tool_use')\n .map((b) => b.id);\n\n if (msg.role === 'assistant' && toolUseIds.length > 0) {\n const next = messages[i + 1];\n const nextContent = next ? (Array.isArray(next.content) ? next.content : []) : [];\n const nextResultIds = new Set(\n nextContent\n .filter((b): b is Anthropic.ToolResultBlockParam => (b as { type: string }).type === 'tool_result')\n .map((b) => b.tool_use_id),\n );\n\n // Keep only tool_use blocks that have a result in the next message\n const cleanContent = content.filter((b) => {\n if ((b as { type: string }).type === 'tool_use') return nextResultIds.has((b as Anthropic.ToolUseBlockParam).id);\n return true;\n });\n\n // Keep only tool_result blocks in next whose tool_use survived\n const keptIds = new Set(\n cleanContent\n .filter((b): b is Anthropic.ToolUseBlockParam => (b as { type: string }).type === 'tool_use')\n .map((b) => b.id),\n );\n const cleanNext = nextContent.filter((b) => {\n if ((b as { type: string }).type === 'tool_result')\n return keptIds.has((b as Anthropic.ToolResultBlockParam).tool_use_id);\n return true;\n });\n\n if (cleanContent.length > 0) result.push({ role: 'assistant', content: cleanContent });\n if (cleanNext.length > 0 && next) result.push({ role: next.role, content: cleanNext });\n i++; // skip the next message (already processed)\n\n if (cleanContent.length < content.length || cleanNext.length < nextContent.length) {\n console.warn(\n `[anthropic] sanitized orphans: stripped ${content.length - cleanContent.length} tool_use, ${nextContent.length - cleanNext.length} tool_result`,\n );\n }\n continue;\n }\n\n // For user messages: strip tool_result referencing non-existent tool_use in prev assistant\n if (msg.role === 'user' && content.some((b) => (b as { type: string }).type === 'tool_result')) {\n const prev = result[result.length - 1];\n const prevContent = prev?.role === 'assistant' && Array.isArray(prev.content) ? prev.content : [];\n const prevToolUseIds = new Set(\n prevContent\n .filter((b): b is Anthropic.ToolUseBlockParam => (b as { type: string }).type === 'tool_use')\n .map((b) => b.id),\n );\n const cleanContent = content.filter((b) => {\n if ((b as { type: string }).type === 'tool_result')\n return prevToolUseIds.has((b as Anthropic.ToolResultBlockParam).tool_use_id);\n return true;\n });\n if (cleanContent.length > 0) result.push({ role: msg.role, content: cleanContent });\n continue;\n }\n\n result.push(msg);\n }\n\n // Merge consecutive same-role messages\n const merged: Anthropic.MessageParam[] = [];\n for (const msg of result) {\n const last = merged[merged.length - 1];\n if (last && last.role === msg.role) {\n const lastContent = Array.isArray(last.content) ? last.content : [{ type: 'text' as const, text: last.content }];\n const msgContent = Array.isArray(msg.content) ? msg.content : [{ type: 'text' as const, text: msg.content }];\n last.content = [...lastContent, ...msgContent];\n } else {\n merged.push({ ...msg });\n }\n }\n\n // First message must be user\n while (merged.length > 0 && merged[0].role !== 'user') {\n merged.shift();\n }\n\n return merged;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/tool.ts","../src/orchestration.ts","../src/tool-flags.ts","../src/sui-rpc.ts","../src/navi-config.ts","../src/tools/utils.ts","../src/navi-transforms.ts","../src/defillama-prices.ts","../src/tools/balance.ts","../src/navi-reads.ts","../src/tools/savings.ts","../src/tools/health.ts","../src/tools/rates.ts","../src/tools/history.ts","../src/tools/save.ts","../src/tools/withdraw.ts","../src/tools/transfer.ts","../src/tools/borrow.ts","../src/tools/repay.ts","../src/tools/claim.ts","../src/tools/pay.ts","../src/tools/mpp-services.ts","../src/tools/swap.ts","../src/tools/swap-quote.ts","../src/tools/volo-stake.ts","../src/tools/volo-unstake.ts","../src/tools/volo-stats.ts","../src/tools/contacts.ts","../src/tools/web-search.ts","../src/tools/explain-tx.ts","../src/tools/portfolio-analysis.ts","../src/tools/protocol-deep-dive.ts","../src/tools/receive.ts","../src/tools/canvas.ts","../src/tools/spending.ts","../src/tools/yield-summary.ts","../src/tools/activity-summary.ts","../src/tools/defillama.ts","../src/tools/index.ts","../src/tools/tool-modifiable-fields.ts","../src/prompt.ts","../src/cost.ts","../src/guards.ts","../src/compact/microcompact.ts","../src/context.ts","../src/permission-rules.ts","../src/early-dispatcher.ts","../src/engine.ts","../src/streaming.ts","../src/session.ts","../src/recipes/loader.ts","../src/recipes/registry.ts","../src/classify-effort.ts","../src/prompt-cache.ts","../src/intelligence.ts","../src/state/conversation-state.ts","../src/mcp.ts","../src/mcp-client.ts","../src/mcp-tool-adapter.ts","../src/providers/anthropic.ts"],"names":["getDecimalsForCoinType","GAS_RESERVE_SUI","gasReserveUsd","balance","usdcHolding","callNavi","z","result","status","hf","rates","records","filtered","assertAllowedAsset","MPP_GATEWAY","CACHE_TTL","services","inputSchema","LLAMA_API","YIELDS_API","DEFAULT_MAX_TOKENS"],"mappings":"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","file":"index.js","sourcesContent":["import type { z } from 'zod';\nimport type {\n PermissionLevel,\n PreflightResult,\n Tool,\n ToolContext,\n ToolFlags,\n ToolJsonSchema,\n ToolResult,\n} from './types.js';\n\n// ---------------------------------------------------------------------------\n// buildTool — factory for creating typed, permission-aware tools\n// ---------------------------------------------------------------------------\n\nexport interface BuildToolOptions<TInput, TOutput> {\n name: string;\n description: string;\n inputSchema: z.ZodType<TInput>;\n jsonSchema: ToolJsonSchema;\n call: (input: TInput, context: ToolContext) => Promise<ToolResult<TOutput>>;\n isReadOnly?: boolean;\n permissionLevel?: PermissionLevel;\n flags?: ToolFlags;\n preflight?: (input: TInput) => PreflightResult;\n maxResultSizeChars?: number;\n summarizeOnTruncate?: (result: string, maxChars: number) => string;\n /**\n * [v1.5.1] See `Tool.cacheable`. Default `true`. Set `false` for\n * tools whose results depend on mutable on-chain state.\n */\n cacheable?: boolean;\n}\n\ntype AnyPreflight = (input: unknown) => PreflightResult;\n\nexport function buildTool<TInput, TOutput>(\n opts: BuildToolOptions<TInput, TOutput>,\n): Tool<TInput, TOutput> {\n const isReadOnly = opts.isReadOnly ?? true;\n return {\n name: opts.name,\n description: opts.description,\n inputSchema: opts.inputSchema,\n jsonSchema: opts.jsonSchema,\n call: opts.call,\n isReadOnly,\n isConcurrencySafe: isReadOnly,\n permissionLevel: opts.permissionLevel ?? (isReadOnly ? 'auto' : 'confirm'),\n flags: opts.flags ?? {},\n preflight: opts.preflight as AnyPreflight | undefined,\n maxResultSizeChars: opts.maxResultSizeChars,\n summarizeOnTruncate: opts.summarizeOnTruncate,\n cacheable: opts.cacheable,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tool helpers\n// ---------------------------------------------------------------------------\n\nexport function toolsToDefinitions(tools: Tool[]): {\n name: string;\n description: string;\n input_schema: ToolJsonSchema;\n}[] {\n return tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.jsonSchema,\n }));\n}\n\nexport function findTool(tools: Tool[], name: string): Tool | undefined {\n return tools.find((t) => t.name === name);\n}\n","import type { EngineEvent, Tool, ToolContext } from './types.js';\nimport { findTool } from './tool.js';\n\n// ---------------------------------------------------------------------------\n// Pending tool call — accumulated from provider events\n// ---------------------------------------------------------------------------\n\nexport interface PendingToolCall {\n id: string;\n name: string;\n input: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// TxMutex — serialises write operations to prevent race conditions\n// ---------------------------------------------------------------------------\n\nexport class TxMutex {\n private queue: (() => void)[] = [];\n private locked = false;\n\n async acquire(): Promise<void> {\n if (!this.locked) {\n this.locked = true;\n return;\n }\n return new Promise<void>((resolve) => {\n this.queue.push(resolve);\n });\n }\n\n release(): void {\n const next = this.queue.shift();\n if (next) {\n next();\n } else {\n this.locked = false;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// runTools — executes tool calls with parallel reads, serial writes\n// ---------------------------------------------------------------------------\n\nexport async function* runTools(\n pending: PendingToolCall[],\n tools: Tool[],\n context: ToolContext,\n txMutex: TxMutex,\n): AsyncGenerator<EngineEvent> {\n const { reads, writes } = partitionToolCalls(pending, tools);\n\n // Phase 1: execute all read-only tools in parallel\n if (reads.length > 0) {\n const readResults = await Promise.allSettled(\n reads.map(async (call) => {\n const tool = findTool(tools, call.name);\n if (!tool) {\n return { call, result: { data: { error: `Unknown tool: ${call.name}` } }, isError: true };\n }\n const execResult = await executeSingleTool(tool, call, context);\n if (!execResult.isError) {\n execResult.data = budgetToolResult(execResult.data, tool);\n }\n return { call, result: execResult, isError: execResult.isError };\n }),\n );\n\n for (const settled of readResults) {\n if (settled.status === 'fulfilled') {\n const { call, result, isError } = settled.value;\n yield {\n type: 'tool_result',\n toolName: call.name,\n toolUseId: call.id,\n result: result.data,\n isError,\n };\n } else {\n const idx = readResults.indexOf(settled);\n const call = reads[idx];\n yield {\n type: 'tool_result',\n toolName: call.name,\n toolUseId: call.id,\n result: { error: settled.reason?.message ?? 'Tool execution failed' },\n isError: true,\n };\n }\n }\n }\n\n // Phase 2: execute write tools sequentially under mutex\n for (const call of writes) {\n const tool = findTool(tools, call.name);\n if (!tool) {\n yield {\n type: 'tool_result',\n toolName: call.name,\n toolUseId: call.id,\n result: { error: `Unknown tool: ${call.name}` },\n isError: true,\n };\n continue;\n }\n await txMutex.acquire();\n try {\n const result = await executeSingleTool(tool, call, context);\n if (!result.isError) {\n result.data = budgetToolResult(result.data, tool);\n }\n yield {\n type: 'tool_result',\n toolName: call.name,\n toolUseId: call.id,\n result: result.data,\n isError: result.isError,\n };\n } catch (err) {\n yield {\n type: 'tool_result',\n toolName: call.name,\n toolUseId: call.id,\n result: { error: err instanceof Error ? err.message : 'Tool execution failed' },\n isError: true,\n };\n } finally {\n txMutex.release();\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction partitionToolCalls(\n pending: PendingToolCall[],\n tools: Tool[],\n): { reads: PendingToolCall[]; writes: PendingToolCall[] } {\n const reads: PendingToolCall[] = [];\n const writes: PendingToolCall[] = [];\n\n for (const call of pending) {\n const tool = findTool(tools, call.name);\n if (!tool) {\n reads.push(call); // unknown tools treated as reads — will fail safely\n continue;\n }\n if (tool.isReadOnly && tool.isConcurrencySafe) {\n reads.push(call);\n } else {\n writes.push(call);\n }\n }\n\n return { reads, writes };\n}\n\nasync function executeSingleTool(\n tool: Tool,\n call: PendingToolCall,\n context: ToolContext,\n): Promise<{ data: unknown; isError: boolean }> {\n const parsed = tool.inputSchema.safeParse(call.input);\n if (!parsed.success) {\n return {\n data: {\n error: `Invalid input: ${parsed.error.issues.map((i) => i.message).join(', ')}`,\n },\n isError: true,\n };\n }\n\n const result = await tool.call(parsed.data, context);\n return { data: result.data, isError: false };\n}\n\n/**\n * Enforce per-tool result size limits. When a serialized result exceeds\n * `maxResultSizeChars`, truncate it with a hint to re-call with narrower\n * parameters. Uses the tool's custom `summarizeOnTruncate` when available.\n */\nexport function budgetToolResult(\n data: unknown,\n tool: Tool,\n): unknown {\n if (!tool.maxResultSizeChars) return data;\n\n const serialized = typeof data === 'string' ? data : JSON.stringify(data);\n if (serialized.length <= tool.maxResultSizeChars) return data;\n\n if (tool.summarizeOnTruncate) {\n const summarized = tool.summarizeOnTruncate(serialized, tool.maxResultSizeChars);\n try { return JSON.parse(summarized); } catch { return summarized; }\n }\n\n const preview = serialized.slice(0, tool.maxResultSizeChars);\n const linesOmitted = serialized.split('\\n').length - preview.split('\\n').length;\n const note = `[Truncated — ${linesOmitted} lines omitted. Call ${tool.name} with narrower parameters (e.g. smaller date range or limit) to see more.]`;\n /**\n * [v1.5.2] If the original payload was a JSON object, *don't* return a\n * raw sliced string — the slice is invalid JSON, JSON.parse fails, and\n * downstream consumers (frontend card renderers, history-replay logic,\n * etc.) get a string they cannot destructure. Instead, wrap the\n * preview in a structured `_truncated` envelope so the result stays\n * object-shaped. Tools that genuinely return a string (rare) fall\n * through to the legacy concat behavior.\n */\n if (typeof data === 'object' && data !== null) {\n return { _truncated: true, _preview: preview, _note: note };\n }\n return `${preview}\\n\\n${note}`;\n}\n","import type { Tool, ToolFlags } from './types.js';\n\n/**\n * Central registry of tool flags for the guard runner (RE-2.2).\n *\n * Flags are declarative metadata that guards read to decide what checks to run.\n * Read-only tools have no flags by default (empty object).\n *\n * Flag meanings:\n * mutating — changes on-chain state (deposit, swap, send, borrow)\n * requiresBalance — needs sufficient funds to execute\n * affectsHealth — can change borrow health factor\n * irreversible — physical mail, external transfers — can't undo\n * producesArtifact — returns images, documents, generated content\n * costAware — has a monetary cost the user should know about\n * maxRetries — max calls with same input (default: unlimited for reads, 1 for writes)\n */\nexport const TOOL_FLAGS: Record<string, ToolFlags> = {\n // Write tools — financial\n save_deposit: { mutating: true, requiresBalance: true },\n withdraw: { mutating: true, affectsHealth: true },\n send_transfer: { mutating: true, requiresBalance: true, irreversible: true },\n swap_execute: { mutating: true, requiresBalance: true },\n borrow: { mutating: true, affectsHealth: true },\n repay_debt: { mutating: true, requiresBalance: true },\n claim_rewards: { mutating: true },\n volo_stake: { mutating: true, requiresBalance: true },\n volo_unstake: { mutating: true },\n\n // Write tools — pay / services\n pay_api: { mutating: true, requiresBalance: true, costAware: true, producesArtifact: true, maxRetries: 1 },\n\n // Write tools — lightweight (no financial guards)\n save_contact: {},\n\n // [SIMPLIFICATION DAY 7] Removed flag entries for deleted tools:\n // create_schedule, cancel_schedule (DCA schedules retired)\n // toggle_allowance, update_daily_limit, update_permissions (allowance dormant)\n\n // Receive tools — create/cancel mutate server state\n create_payment_link: { mutating: true },\n cancel_payment_link: { mutating: true },\n create_invoice: { mutating: true },\n cancel_invoice: { mutating: true },\n};\n\n/**\n * Apply flags from the central registry to a tool array.\n * Tools not in the registry get empty flags (read-only tools).\n */\nexport function applyToolFlags<T extends Tool>(tools: T[]): T[] {\n return tools.map((tool) => {\n const flags = TOOL_FLAGS[tool.name];\n if (!flags) return tool;\n return { ...tool, flags: { ...tool.flags, ...flags } };\n });\n}\n\n/**\n * Get flags for a tool by name. Returns empty flags if not registered.\n */\nexport function getToolFlags(name: string): ToolFlags {\n return TOOL_FLAGS[name] ?? {};\n}\n","// ---------------------------------------------------------------------------\n// Direct Sui JSON-RPC coin fetcher — no SDK dependency required.\n// Uses suix_getAllBalances to get wallet coin balances.\n// ---------------------------------------------------------------------------\n\nimport { getDecimalsForCoinType, resolveSymbol } from '@t2000/sdk';\n\nconst SUI_MAINNET_URL = 'https://fullnode.mainnet.sui.io:443';\n\nexport interface SuiCoinBalance {\n coinType: string;\n totalBalance: string;\n coinObjectCount: number;\n}\n\n/** Supplementary coins not in the SDK registry (legacy/wrapped variants). */\nconst EXTRA_COINS: Record<string, { symbol: string; decimals: number }> = {\n '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN': { symbol: 'USDT', decimals: 6 },\n};\n\nexport interface WalletCoin {\n coinType: string;\n symbol: string;\n decimals: number;\n totalBalance: string;\n coinObjectCount: number;\n}\n\n/**\n * Fetch all coin balances for an address directly from the Sui JSON-RPC.\n * Returns enriched objects with known symbol/decimals where possible.\n */\nexport async function fetchWalletCoins(\n address: string,\n rpcUrl?: string,\n): Promise<WalletCoin[]> {\n const url = rpcUrl || SUI_MAINNET_URL;\n\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'suix_getAllBalances',\n params: [address],\n }),\n signal: AbortSignal.timeout(8_000),\n });\n\n if (!res.ok) {\n throw new Error(`Sui RPC error: ${res.status} ${res.statusText}`);\n }\n\n const json = (await res.json()) as {\n result?: SuiCoinBalance[];\n error?: { message: string };\n };\n\n if (json.error) {\n throw new Error(`Sui RPC error: ${json.error.message}`);\n }\n\n const balances = json.result ?? [];\n\n return balances.map((b) => {\n const extra = EXTRA_COINS[b.coinType];\n const symbol = extra?.symbol ?? resolveSymbol(b.coinType);\n const decimals = extra?.decimals ?? getDecimalsForCoinType(b.coinType);\n return {\n coinType: b.coinType,\n symbol,\n decimals,\n totalBalance: b.totalBalance,\n coinObjectCount: b.coinObjectCount,\n };\n });\n}\n","import type { McpServerConfig } from './mcp-client.js';\n\n// ---------------------------------------------------------------------------\n// NAVI MCP server configuration\n// ---------------------------------------------------------------------------\n\nexport const NAVI_SERVER_NAME = 'navi';\nexport const NAVI_MCP_URL = 'https://open-api.naviprotocol.io/api/mcp';\n\nexport const NAVI_MCP_CONFIG: McpServerConfig = {\n name: NAVI_SERVER_NAME,\n url: NAVI_MCP_URL,\n transport: 'streamable-http',\n cacheTtlMs: 30_000,\n readOnly: true,\n};\n\n// ---------------------------------------------------------------------------\n// NAVI MCP tool name constants (as observed from live discovery)\n// ---------------------------------------------------------------------------\n\nexport const NaviTools = {\n GET_POOLS: 'navi_get_pools',\n GET_POOL: 'navi_get_pool',\n GET_PROTOCOL_STATS: 'navi_get_protocol_stats',\n GET_HEALTH_FACTOR: 'navi_get_health_factor',\n GET_BORROW_FEE: 'navi_get_borrow_fee',\n GET_FEES: 'navi_get_fees',\n GET_FLASH_LOAN_ASSETS: 'navi_get_flash_loan_assets',\n GET_FLASH_LOAN_ASSET: 'navi_get_flash_loan_asset',\n GET_LENDING_REWARDS: 'navi_get_lending_rewards',\n GET_AVAILABLE_REWARDS: 'navi_get_available_rewards',\n GET_PRICE_FEEDS: 'navi_get_price_feeds',\n GET_SWAP_QUOTE: 'navi_get_swap_quote',\n GET_BRIDGE_CHAINS: 'navi_get_bridge_chains',\n SEARCH_BRIDGE_TOKENS: 'navi_search_bridge_tokens',\n GET_BRIDGE_QUOTE: 'navi_get_bridge_quote',\n GET_BRIDGE_TX_STATUS: 'navi_get_bridge_tx_status',\n GET_BRIDGE_HISTORY: 'navi_get_bridge_history',\n GET_DCA_ORDERS: 'navi_get_dca_orders',\n GET_DCA_ORDER_DETAILS: 'navi_get_dca_order_details',\n LIST_DCA_ORDERS: 'navi_list_dca_orders',\n GET_COINS: 'navi_get_coins',\n GET_MARKET_CONFIG: 'navi_get_market_config',\n GET_POSITIONS: 'get_positions',\n GET_TRANSACTION: 'sui_get_transaction',\n EXPLAIN_TRANSACTION: 'sui_explain_transaction',\n SEARCH_TOKENS: 'navi_search_tokens',\n} as const;\n","import type { T2000 } from '@t2000/sdk';\nimport type { McpClientManager } from '../mcp-client.js';\nimport { NAVI_SERVER_NAME } from '../navi-config.js';\nimport type { ToolContext } from '../types.js';\n\nexport function hasAgent(context: ToolContext): boolean {\n return !!context.agent;\n}\n\nexport function requireAgent(context: ToolContext): T2000 {\n if (!context.agent) {\n throw new Error(\n 'Tool requires a T2000 agent instance — pass `agent` in EngineConfig',\n );\n }\n return context.agent as T2000;\n}\n\n/**\n * Check if context has an MCP manager with a connected NAVI server\n * and a wallet address for address-dependent reads.\n */\nexport function hasNaviMcp(context: ToolContext): boolean {\n if (!context.mcpManager || !context.walletAddress) return false;\n const mgr = context.mcpManager as McpClientManager;\n return mgr.isConnected(NAVI_SERVER_NAME);\n}\n\n/**\n * Check if context has a connected NAVI MCP (no wallet required).\n * Use for global reads like rates/pools that don't depend on a user address.\n */\nexport function hasNaviMcpGlobal(context: ToolContext): boolean {\n if (!context.mcpManager) return false;\n const mgr = context.mcpManager as McpClientManager;\n return mgr.isConnected(NAVI_SERVER_NAME);\n}\n\n/**\n * Get the MCP client manager from context (assumes hasNaviMcp() is true).\n */\nexport function getMcpManager(context: ToolContext): McpClientManager {\n return context.mcpManager as McpClientManager;\n}\n\n/**\n * Get the wallet address from context (assumes hasNaviMcp() is true).\n */\nexport function getWalletAddress(context: ToolContext): string {\n return context.walletAddress!;\n}\n","import { getDecimalsForCoinType } from '@t2000/sdk';\n\n// ---------------------------------------------------------------------------\n// Raw NAVI MCP response types (as returned by the live NAVI MCP server)\n// ---------------------------------------------------------------------------\n\nexport interface NaviRawPool {\n id: number;\n symbol: string;\n coinType: string;\n price: string;\n market: string;\n ltv: number;\n liquidation: {\n bonus: string;\n ratio: string;\n threshold: string;\n };\n supply: string;\n borrow: string;\n supplyApy: string;\n borrowApy: string;\n}\n\nexport interface NaviRawPosition {\n id: string;\n protocol: string;\n type: string;\n market: string;\n tokenASymbol: string;\n tokenAPrice: number;\n amountA: string;\n tokenBSymbol?: string | null;\n tokenBPrice?: number | null;\n amountB?: string | null;\n valueUSD: string;\n apr: string;\n liquidationThreshold: string;\n lowerPrice?: string | null;\n upperPrice?: string | null;\n currentPrice?: string | null;\n claimableRewards?: string | null;\n isActive?: boolean;\n}\n\nexport interface NaviRawPositionsResponse {\n address: string;\n positions: NaviRawPosition[];\n}\n\nexport interface NaviRawHealthFactor {\n address: string;\n healthFactor: number | null;\n}\n\nexport interface NaviRawCoin {\n coinType: string;\n totalBalance: string;\n coinObjectCount: number;\n symbol?: string;\n decimals?: number;\n}\n\nexport interface NaviRawRewardsResponse {\n address: string;\n rewards: Array<{\n pool?: string;\n rewardType?: string;\n amount?: string;\n symbol?: string;\n valueUsd?: number;\n }>;\n summary: Array<{\n symbol: string;\n totalAmount: string;\n valueUSD?: string;\n }>;\n}\n\nexport interface NaviRawProtocolStats {\n tvl: number;\n totalBorrowUsd: number;\n averageUtilization: number;\n maxApy: number;\n userAmount: number;\n interactionUserAmount: number;\n borrowFee: number;\n}\n\n// ---------------------------------------------------------------------------\n// Transformed engine-friendly types\n// ---------------------------------------------------------------------------\n\nexport interface RatesResult {\n [symbol: string]: {\n saveApy: number;\n borrowApy: number;\n ltv: number;\n price: number;\n };\n}\n\nexport interface HealthFactorResult {\n healthFactor: number;\n supplied: number;\n borrowed: number;\n maxBorrow: number;\n liquidationThreshold: number;\n}\n\nexport interface BalanceResult {\n available: number;\n savings: number;\n debt: number;\n pendingRewards: number;\n gasReserve: number;\n total: number;\n stables: number;\n}\n\nexport interface PositionEntry {\n protocol: string;\n type: 'supply' | 'borrow';\n symbol: string;\n amount: number;\n valueUsd: number;\n apy: number;\n liquidationThreshold: number;\n}\n\nexport interface SavingsResult {\n positions: PositionEntry[];\n earnings: {\n totalYieldEarned: number;\n currentApy: number;\n dailyEarning: number;\n supplied: number;\n };\n fundStatus: {\n supplied: number;\n apy: number;\n earnedToday: number;\n earnedAllTime: number;\n projectedMonthly: number;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Safe number parser — handles strings, numbers, null, undefined\n// ---------------------------------------------------------------------------\n\nfunction toNum(v: unknown): number {\n if (v == null) return 0;\n const n = typeof v === 'number' ? v : Number(v);\n return Number.isFinite(n) ? n : 0;\n}\n\n// ---------------------------------------------------------------------------\n// Transform: pools → rates\n// ---------------------------------------------------------------------------\n\nexport function transformRates(raw: unknown): RatesResult {\n const pools = Array.isArray(raw) ? (raw as NaviRawPool[]) : [];\n const result: RatesResult = {};\n\n for (const pool of pools) {\n if (!pool.symbol) continue;\n result[pool.symbol] = {\n saveApy: toNum(pool.supplyApy) / 100,\n borrowApy: toNum(pool.borrowApy) / 100,\n ltv: toNum(pool.ltv),\n price: toNum(pool.price),\n };\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Transform: positions → typed PositionEntry[]\n// ---------------------------------------------------------------------------\n\n// NAVI MCP divides ALL position amounts by 10^9 (original storage precision),\n// but newer pools (id > 10) store at the token's native decimals. For 6-decimal\n// stablecoins in newer pools, this makes amounts 1000x too small.\n// Correction factor: 10^(9 - 6) = 1000.\n// Remove this map if/when the NAVI MCP fixes pool-aware decimal handling.\nconst NAVI_NEWER_POOL_SYMBOLS = new Set([\n 'USDSUI', 'USDsui',\n 'SUI_USDE', 'suiUSDe', 'USDe',\n 'suiUSDT',\n]);\nconst NEWER_POOL_FACTOR = 1000;\n\nfunction naviDecimalFactor(symbol: string): number {\n return NAVI_NEWER_POOL_SYMBOLS.has(symbol) ? NEWER_POOL_FACTOR : 1;\n}\n\nexport function transformPositions(raw: unknown): PositionEntry[] {\n const data = raw as NaviRawPositionsResponse | undefined;\n const positions = data?.positions ?? (Array.isArray(raw) ? (raw as NaviRawPosition[]) : []);\n\n return positions.map((p) => {\n const symbol = p.tokenASymbol ?? 'UNKNOWN';\n const factor = naviDecimalFactor(symbol);\n return {\n protocol: p.protocol ?? 'navi',\n type: p.type?.includes('borrow') ? ('borrow' as const) : ('supply' as const),\n symbol,\n amount: toNum(p.amountA) * factor,\n valueUsd: toNum(p.valueUSD) * factor,\n apy: toNum(p.apr) / 100,\n liquidationThreshold: toNum(p.liquidationThreshold),\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Transform: health factor (+ optional positions for enrichment)\n// ---------------------------------------------------------------------------\n\nexport function transformHealthFactor(\n rawHf: unknown,\n rawPositions?: unknown,\n): HealthFactorResult {\n const hf = rawHf as NaviRawHealthFactor | undefined;\n const positions = transformPositions(rawPositions);\n\n const supplied = positions\n .filter((p) => p.type === 'supply')\n .reduce((sum, p) => sum + p.valueUsd, 0);\n const borrowed = positions\n .filter((p) => p.type === 'borrow')\n .reduce((sum, p) => sum + p.valueUsd, 0);\n\n const supplyPositions = positions.filter((p) => p.type === 'supply');\n const weightedLt =\n supplied > 0\n ? supplyPositions.reduce(\n (acc, p) => acc + p.liquidationThreshold * p.valueUsd,\n 0,\n ) / supplied\n : 0;\n\n const maxBorrow = supplied * weightedLt - borrowed;\n\n return {\n healthFactor: toNum(hf?.healthFactor) || (borrowed === 0 ? Infinity : 0),\n supplied,\n borrowed,\n maxBorrow: Math.max(0, maxBorrow),\n liquidationThreshold: weightedLt,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Transform: rewards → typed reward summaries\n// ---------------------------------------------------------------------------\n\nexport interface PendingReward {\n symbol: string;\n totalAmount: number;\n valueUsd: number;\n}\n\nexport function transformRewards(raw: unknown): PendingReward[] {\n const data = raw as NaviRawRewardsResponse | undefined;\n return (data?.summary ?? []).map((s) => ({\n symbol: s.symbol ?? 'UNKNOWN',\n totalAmount: toNum(s.totalAmount),\n valueUsd: toNum(s.valueUSD),\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Transform: coins + positions + rewards → balance breakdown\n// Requires `prices` map (symbol → USD price) for proper cross-currency totals.\n// ---------------------------------------------------------------------------\n\nconst STABLECOIN_SYMBOLS = new Set([\n 'USDC', 'USDT', 'USDe', 'USDsui', 'wUSDC', 'wUSDT', 'suiUSDe', 'USDSUI',\n]);\n\nconst GAS_RESERVE_SUI = 0.05;\n\nexport interface BalancePrices {\n [symbol: string]: number;\n}\n\nexport function transformBalance(\n rawCoins: unknown,\n rawPositions: unknown,\n rawRewards: unknown,\n prices?: BalancePrices,\n): BalanceResult {\n const coins = Array.isArray(rawCoins) ? (rawCoins as NaviRawCoin[]) : [];\n const positions = transformPositions(rawPositions);\n const rewards = transformRewards(rawRewards);\n\n let availableUsd = 0;\n let stablesUsd = 0;\n let gasReserveUsd = 0;\n\n for (const coin of coins) {\n const symbol = coin.symbol ?? '';\n const decimals = coin.decimals ?? getDecimalsForCoinType(coin.coinType ?? '');\n const balance = toNum(coin.totalBalance) / 10 ** decimals;\n const price = prices?.[symbol] ?? (STABLECOIN_SYMBOLS.has(symbol) ? 1 : 0);\n\n if (symbol === 'SUI' || coin.coinType === '0x2::sui::SUI') {\n const reserveAmount = Math.min(balance, GAS_RESERVE_SUI);\n gasReserveUsd = reserveAmount * price;\n availableUsd += (balance - reserveAmount) * price;\n } else {\n availableUsd += balance * price;\n if (STABLECOIN_SYMBOLS.has(symbol)) {\n stablesUsd += balance * price;\n }\n }\n }\n\n const savings = positions\n .filter((p) => p.type === 'supply')\n .reduce((sum, p) => sum + p.valueUsd, 0);\n const debt = positions\n .filter((p) => p.type === 'borrow')\n .reduce((sum, p) => sum + p.valueUsd, 0);\n\n const pendingRewardsUsd = rewards.reduce((sum, r) => sum + r.valueUsd, 0);\n\n return {\n available: availableUsd,\n savings,\n debt,\n pendingRewards: pendingRewardsUsd,\n gasReserve: gasReserveUsd,\n total: availableUsd + savings + gasReserveUsd + pendingRewardsUsd - debt,\n stables: stablesUsd,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Transform: positions + pools → savings info\n// ---------------------------------------------------------------------------\n\nexport function transformSavings(\n rawPositions: unknown,\n rawPools: unknown,\n): SavingsResult {\n const positions = transformPositions(rawPositions);\n const rates = transformRates(rawPools);\n\n const supplyPositions = positions.filter((p) => p.type === 'supply');\n const supplied = supplyPositions.reduce((sum, p) => sum + p.valueUsd, 0);\n\n const weightedApy =\n supplied > 0\n ? supplyPositions.reduce(\n (acc, p) => acc + (rates[p.symbol]?.saveApy ?? p.apy) * p.valueUsd,\n 0,\n ) / supplied\n : 0;\n\n const dailyEarning = (supplied * weightedApy) / 365;\n const projectedMonthly = dailyEarning * 30;\n\n return {\n positions,\n earnings: {\n totalYieldEarned: 0, // not available from MCP reads alone\n currentApy: weightedApy,\n dailyEarning,\n supplied,\n },\n fundStatus: {\n supplied,\n apy: weightedApy,\n earnedToday: dailyEarning,\n earnedAllTime: 0, // not available from MCP reads alone\n projectedMonthly,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers: extract text content from MCP response\n// ---------------------------------------------------------------------------\n\nexport function extractMcpText(\n content: Array<{ type: string; text?: string; [key: string]: unknown }>,\n): string {\n return content\n .filter((c) => c.type === 'text' && c.text)\n .map((c) => c.text!)\n .join('\\n');\n}\n\nexport function parseMcpJson<T = unknown>(\n content: Array<{ type: string; text?: string; [key: string]: unknown }>,\n): T {\n const text = extractMcpText(content);\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n}\n","const DEFILLAMA_PRICES_URL = 'https://coins.llama.fi/prices/current';\nconst CACHE_TTL = 60_000;\n\nlet cache: { prices: Record<string, number>; ts: number } | null = null;\nlet pendingRequest: Promise<Record<string, number>> | null = null;\n\n/**\n * Batch-fetch USD prices for Sui coin types from DefiLlama.\n * Returns a map of `coinType -> usdPrice`. Tokens not found return no entry.\n * Results are cached for 60s. Free API, no auth required.\n */\nexport async function fetchTokenPrices(\n coinTypes: string[],\n): Promise<Record<string, number>> {\n if (coinTypes.length === 0) return {};\n\n if (cache && Date.now() - cache.ts < CACHE_TTL) {\n const allHit = coinTypes.every((ct) => ct in cache!.prices);\n if (allHit) return cache.prices;\n }\n\n if (pendingRequest) {\n return pendingRequest;\n }\n\n pendingRequest = doFetch(coinTypes);\n try {\n return await pendingRequest;\n } finally {\n pendingRequest = null;\n }\n}\n\nasync function doFetch(coinTypes: string[]): Promise<Record<string, number>> {\n const coins = coinTypes.map((ct) => `sui:${ct}`).join(',');\n const url = `${DEFILLAMA_PRICES_URL}/${encodeURIComponent(coins)}`;\n\n const res = await fetch(url, {\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!res.ok) {\n console.warn(`[defillama-prices] HTTP ${res.status} from ${DEFILLAMA_PRICES_URL}`);\n return cache?.prices ?? {};\n }\n\n const json = (await res.json()) as {\n coins?: Record<string, { price: number; symbol?: string; decimals?: number }>;\n };\n\n const prices: Record<string, number> = {};\n\n if (json.coins) {\n for (const [key, val] of Object.entries(json.coins)) {\n const coinType = key.replace(/^sui:/, '');\n prices[coinType] = val.price;\n }\n }\n\n cache = { prices, ts: Date.now() };\n return prices;\n}\n\nexport function clearPriceCache(): void {\n cache = null;\n}\n","import { z } from 'zod';\nimport { getDecimalsForCoinType } from '@t2000/sdk';\nimport { fetchWalletCoins } from '../sui-rpc.js';\nimport { buildTool } from '../tool.js';\nimport { hasNaviMcp, getMcpManager, getWalletAddress, requireAgent } from './utils.js';\nimport type { McpClientManager } from '../mcp-client.js';\nimport { NAVI_SERVER_NAME, NaviTools } from '../navi-config.js';\nimport {\n parseMcpJson,\n transformPositions,\n transformRewards,\n} from '../navi-transforms.js';\nimport { fetchTokenPrices } from '../defillama-prices.js';\n\nconst GAS_RESERVE_SUI = 0.05;\n\nasync function callNavi<T = unknown>(\n manager: McpClientManager,\n tool: string,\n args: Record<string, unknown> = {},\n): Promise<T> {\n const result = await manager.callTool(NAVI_SERVER_NAME, tool, args);\n if (result.isError) {\n const msg = result.content\n .filter((c: { type: string; text?: string }) => c.type === 'text' && c.text)\n .map((c: { type: string; text?: string }) => c.text!)\n .join(' ');\n throw new Error(`NAVI MCP error (${tool}): ${msg || 'unknown error'}`);\n }\n return parseMcpJson<T>(result.content);\n}\n\nexport const balanceCheckTool = buildTool({\n name: 'balance_check',\n description:\n 'Get the user\\'s full balance breakdown. Returns wallet holdings (tokens the user owns — NOT savings), NAVI savings deposits (USDC deposited into NAVI Protocol earning yield), outstanding debt, pending rewards, gas reserve, total net worth, and saveableUsdc (only USDC can be deposited into savings). IMPORTANT: wallet holdings like GOLD, SUI, USDT are NOT savings positions — they are just tokens sitting in the wallet.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n // [v1.5.1] Wallet contents change after every send/swap/save/etc.\n // Microcompact must NEVER dedupe these calls — each one reflects a\n // different on-chain state.\n cacheable: false,\n\n async call(_input, context) {\n if (hasNaviMcp(context)) {\n const address = getWalletAddress(context);\n const mgr = getMcpManager(context);\n\n const [walletCoins, positions, rewards] = await Promise.all([\n fetchWalletCoins(address, context.suiRpcUrl).catch((err) => {\n console.warn('[balance_check] Sui RPC coin fetch failed, falling back to MCP:', err);\n return null;\n }),\n callNavi(mgr, NaviTools.GET_POSITIONS, {\n address,\n protocols: 'navi',\n format: 'json',\n }),\n callNavi(mgr, NaviTools.GET_AVAILABLE_REWARDS, { address }),\n ]);\n\n let coins = walletCoins;\n if (!coins || coins.length === 0) {\n const mcpCoins = await callNavi(mgr, NaviTools.GET_COINS, { address }).catch(() => []);\n const coinArr = Array.isArray(mcpCoins) ? mcpCoins as Array<{ coinType?: string; totalBalance?: string; symbol?: string; decimals?: number }> : [];\n coins = coinArr.map((c) => ({\n coinType: c.coinType ?? '',\n symbol: c.symbol ?? '',\n decimals: c.decimals ?? getDecimalsForCoinType(c.coinType ?? ''),\n totalBalance: c.totalBalance ?? '0',\n coinObjectCount: 0,\n }));\n }\n\n const VSUI_COIN_TYPE = '0x549e8b69270defbfafd4f94e17ec44cdbdd99820b33bda2278dea3b9a32d3f55::cert::CERT';\n const coinTypes = coins.map((c) => c.coinType).filter(Boolean);\n const prices = await fetchTokenPrices(coinTypes).catch((err) => {\n console.warn('[balance_check] DefiLlama price fetch failed:', err);\n return {} as Record<string, number>;\n });\n\n if (coins.some((c) => c.coinType === VSUI_COIN_TYPE) && !prices[VSUI_COIN_TYPE]) {\n try {\n const statsRes = await fetch('https://open-api.naviprotocol.io/api/volo/stats', {\n signal: AbortSignal.timeout(5_000),\n });\n if (statsRes.ok) {\n const statsJson = await statsRes.json() as { data?: { exchange_rate?: number; exchangeRate?: number } };\n const d = statsJson.data ?? statsJson as { exchange_rate?: number; exchangeRate?: number };\n const rate = d.exchange_rate ?? d.exchangeRate ?? 1.05;\n const suiPrice = prices['0x2::sui::SUI'] ?? 0;\n prices[VSUI_COIN_TYPE] = rate * suiPrice;\n }\n } catch {\n const suiPrice = prices['0x2::sui::SUI'] ?? 0;\n prices[VSUI_COIN_TYPE] = suiPrice * 1.05;\n }\n }\n\n let availableUsd = 0;\n let stablesUsd = 0;\n let gasReserveUsd = 0;\n\n const STABLE_SYMBOLS = new Set(['USDC', 'USDT', 'USDe', 'USDsui', 'wUSDC', 'wUSDT']);\n const holdings: Array<{ symbol: string; coinType: string; balance: number; usdValue: number }> = [];\n\n for (const coin of coins) {\n const balance = Number(coin.totalBalance) / 10 ** coin.decimals;\n const price = prices[coin.coinType] ?? 0;\n\n if (coin.symbol === 'SUI' || coin.coinType === '0x2::sui::SUI') {\n const reserveAmount = Math.min(balance, GAS_RESERVE_SUI);\n gasReserveUsd = reserveAmount * price;\n availableUsd += (balance - reserveAmount) * price;\n } else {\n availableUsd += balance * price;\n if (STABLE_SYMBOLS.has(coin.symbol)) {\n stablesUsd += balance * price;\n }\n }\n\n if (balance > 0) {\n holdings.push({\n symbol: coin.symbol || coin.coinType.split('::').pop() || coin.coinType,\n coinType: coin.coinType,\n balance,\n usdValue: balance * price,\n });\n }\n }\n\n let savings: number;\n let debt: number;\n let pendingRewardsUsd: number;\n\n if (context.positionFetcher && context.walletAddress) {\n const sp = await context.positionFetcher(context.walletAddress);\n savings = sp.savings;\n debt = sp.borrows;\n pendingRewardsUsd = sp.pendingRewards;\n } else {\n const posEntries = transformPositions(positions);\n const rewardEntries = transformRewards(rewards);\n savings = posEntries\n .filter((p) => p.type === 'supply')\n .reduce((sum, p) => sum + p.valueUsd, 0);\n debt = posEntries\n .filter((p) => p.type === 'borrow')\n .reduce((sum, p) => sum + p.valueUsd, 0);\n pendingRewardsUsd = rewardEntries.reduce((sum, r) => sum + r.valueUsd, 0);\n }\n\n const visibleHoldings = holdings\n .filter((h) => h.usdValue >= 0.01)\n .sort((a, b) => b.usdValue - a.usdValue);\n\n const usdcHolding = holdings.find((h) => h.symbol === 'USDC');\n const saveableUsdc = usdcHolding ? usdcHolding.balance : 0;\n\n const bal = {\n available: availableUsd,\n savings,\n debt,\n pendingRewards: pendingRewardsUsd,\n gasReserve: gasReserveUsd,\n total: availableUsd + savings + gasReserveUsd + pendingRewardsUsd - debt,\n stables: stablesUsd,\n holdings: visibleHoldings,\n saveableUsdc,\n };\n\n const holdingsList = visibleHoldings.map((h) => `${h.symbol}: ${h.balance < 1 ? h.balance.toFixed(6) : h.balance.toFixed(2)} ($${h.usdValue.toFixed(2)})`).join(', ');\n return {\n data: bal,\n displayText: `Balance: $${bal.total.toFixed(2)} total. Wallet holdings (NOT savings): ${holdingsList || 'none'}. NAVI savings deposits: $${bal.savings.toFixed(2)}. Saveable USDC (only USDC can be saved): ${saveableUsdc.toFixed(2)} USDC.`,\n };\n }\n\n const agent = requireAgent(context);\n const balance = await agent.balance();\n\n const gasReserveUsd = typeof balance.gasReserve === 'number'\n ? balance.gasReserve\n : (balance.gasReserve as { usdEquiv: number }).usdEquiv ?? 0;\n const stablesTotal = typeof balance.stables === 'number'\n ? balance.stables\n : Object.values(balance.stables as Record<string, number>).reduce((a: number, b: number) => a + b, 0);\n\n const sdkHoldings = (balance as unknown as Record<string, unknown>).holdings;\n const holdingsArr = Array.isArray(sdkHoldings) ? sdkHoldings : [];\n\n const usdcHolding = holdingsArr.find((h: { symbol?: string }) => h.symbol === 'USDC');\n const sdkSaveableUsdc = usdcHolding ? ((usdcHolding as { balance?: number }).balance ?? 0) : 0;\n\n return {\n data: {\n available: balance.available,\n savings: balance.savings,\n debt: balance.debt,\n pendingRewards: balance.pendingRewards,\n gasReserve: gasReserveUsd,\n total: balance.total,\n stables: stablesTotal,\n holdings: holdingsArr,\n saveableUsdc: sdkSaveableUsdc,\n },\n displayText: `Balance: $${balance.total.toFixed(2)} total. Wallet: $${balance.available.toFixed(2)} available. NAVI savings deposits: $${balance.savings.toFixed(2)}. Saveable USDC (only USDC can be saved): ${sdkSaveableUsdc.toFixed(2)} USDC.`,\n };\n },\n});\n","import type { McpClientManager, McpCallResult } from './mcp-client.js';\nimport { NAVI_SERVER_NAME, NaviTools } from './navi-config.js';\nimport {\n parseMcpJson,\n transformBalance,\n transformHealthFactor,\n transformPositions,\n transformRates,\n transformRewards,\n transformSavings,\n type BalanceResult,\n type HealthFactorResult,\n type PendingReward,\n type PositionEntry,\n type RatesResult,\n type SavingsResult,\n} from './navi-transforms.js';\n\n// ---------------------------------------------------------------------------\n// Options for composite reads\n// ---------------------------------------------------------------------------\n\nexport interface NaviReadOptions {\n /** MCP server name override (default: 'navi'). */\n serverName?: string;\n}\n\nfunction sn(opts?: NaviReadOptions): string {\n return opts?.serverName ?? NAVI_SERVER_NAME;\n}\n\n// ---------------------------------------------------------------------------\n// Helper: call NAVI tool and parse JSON response\n// ---------------------------------------------------------------------------\n\nasync function callNavi<T = unknown>(\n manager: McpClientManager,\n tool: string,\n args: Record<string, unknown> = {},\n opts?: NaviReadOptions,\n): Promise<T> {\n const result: McpCallResult = await manager.callTool(sn(opts), tool, args);\n if (result.isError) {\n const msg = result.content\n .filter((c) => c.type === 'text' && c.text)\n .map((c) => c.text!)\n .join(' ');\n throw new Error(`NAVI MCP error (${tool}): ${msg || 'unknown error'}`);\n }\n return parseMcpJson<T>(result.content);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: rates\n// ---------------------------------------------------------------------------\n\nexport async function fetchRates(\n manager: McpClientManager,\n opts?: NaviReadOptions,\n): Promise<RatesResult> {\n const pools = await callNavi(manager, NaviTools.GET_POOLS, {}, opts);\n return transformRates(pools);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: health factor (enriched with positions)\n// ---------------------------------------------------------------------------\n\nexport async function fetchHealthFactor(\n manager: McpClientManager,\n address: string,\n opts?: NaviReadOptions,\n): Promise<HealthFactorResult> {\n const [hfRaw, posRaw] = await Promise.all([\n callNavi(manager, NaviTools.GET_HEALTH_FACTOR, { address }, opts),\n callNavi(manager, NaviTools.GET_POSITIONS, {\n address,\n protocols: 'navi',\n format: 'json',\n }, opts),\n ]);\n\n return transformHealthFactor(hfRaw, posRaw);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: balance breakdown\n// ---------------------------------------------------------------------------\n\nexport async function fetchBalance(\n manager: McpClientManager,\n address: string,\n opts?: NaviReadOptions,\n): Promise<BalanceResult> {\n const [coins, positions, rewards, pools] = await Promise.all([\n callNavi(manager, NaviTools.GET_COINS, { address }, opts),\n callNavi(manager, NaviTools.GET_POSITIONS, {\n address,\n protocols: 'navi',\n format: 'json',\n }, opts),\n callNavi(manager, NaviTools.GET_AVAILABLE_REWARDS, { address }, opts),\n callNavi(manager, NaviTools.GET_POOLS, {}, opts),\n ]);\n\n const rates = transformRates(pools);\n const prices: Record<string, number> = {};\n for (const [symbol, rate] of Object.entries(rates)) {\n prices[symbol] = rate.price;\n }\n\n return transformBalance(coins, positions, rewards, prices);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: savings info (positions + pool APYs)\n// ---------------------------------------------------------------------------\n\nexport async function fetchSavings(\n manager: McpClientManager,\n address: string,\n opts?: NaviReadOptions,\n): Promise<SavingsResult> {\n const [positions, pools] = await Promise.all([\n callNavi(manager, NaviTools.GET_POSITIONS, {\n address,\n protocols: 'navi',\n format: 'json',\n }, opts),\n callNavi(manager, NaviTools.GET_POOLS, {}, opts),\n ]);\n\n return transformSavings(positions, pools);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: positions only\n// ---------------------------------------------------------------------------\n\nexport async function fetchPositions(\n manager: McpClientManager,\n address: string,\n opts?: NaviReadOptions & { protocols?: string },\n): Promise<PositionEntry[]> {\n const raw = await callNavi(\n manager,\n NaviTools.GET_POSITIONS,\n { address, protocols: opts?.protocols ?? 'navi', format: 'json' },\n opts,\n );\n return transformPositions(raw);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: available rewards\n// ---------------------------------------------------------------------------\n\nexport async function fetchAvailableRewards(\n manager: McpClientManager,\n address: string,\n opts?: NaviReadOptions,\n): Promise<PendingReward[]> {\n const raw = await callNavi(\n manager,\n NaviTools.GET_AVAILABLE_REWARDS,\n { address },\n opts,\n );\n return transformRewards(raw);\n}\n\n// ---------------------------------------------------------------------------\n// Composite read: protocol stats\n// ---------------------------------------------------------------------------\n\nexport interface ProtocolStats {\n tvl: number;\n totalBorrowUsd: number;\n utilization: number;\n maxApy: number;\n totalUsers: number;\n}\n\nexport async function fetchProtocolStats(\n manager: McpClientManager,\n opts?: NaviReadOptions,\n): Promise<ProtocolStats> {\n const raw = await callNavi<{\n tvl?: number;\n totalBorrowUsd?: number;\n averageUtilization?: number;\n maxApy?: number;\n userAmount?: number;\n }>(manager, NaviTools.GET_PROTOCOL_STATS, {}, opts);\n\n return {\n tvl: raw?.tvl ?? 0,\n totalBorrowUsd: raw?.totalBorrowUsd ?? 0,\n utilization: raw?.averageUtilization ?? 0,\n maxApy: raw?.maxApy ?? 0,\n totalUsers: raw?.userAmount ?? 0,\n };\n}\n","import { z } from 'zod';\nimport { fetchSavings } from '../navi-reads.js';\nimport { buildTool } from '../tool.js';\nimport { hasNaviMcp, getMcpManager, getWalletAddress, requireAgent } from './utils.js';\nimport type { PositionEntry, SavingsResult } from '../navi-transforms.js';\nimport type { ServerPositionData } from '../types.js';\n\nconst DUST_THRESHOLD_USD = 0.01;\n\nfunction buildSavingsFromPositions(sp: ServerPositionData): SavingsResult {\n const positions: PositionEntry[] = [\n ...sp.supplies\n .filter((s) => s.amountUsd >= DUST_THRESHOLD_USD)\n .map((s) => ({\n protocol: s.protocol,\n type: 'supply' as const,\n symbol: s.asset,\n amount: s.amount,\n valueUsd: s.amountUsd,\n apy: s.apy,\n liquidationThreshold: 0,\n })),\n ...sp.borrows_detail\n .filter((b) => b.amountUsd >= DUST_THRESHOLD_USD)\n .map((b) => ({\n protocol: b.protocol,\n type: 'borrow' as const,\n symbol: b.asset,\n amount: b.amount,\n valueUsd: b.amountUsd,\n apy: b.apy,\n liquidationThreshold: 0,\n })),\n ];\n\n const supplied = sp.savings;\n const weightedApy = supplied > 0 ? sp.savingsRate : 0;\n const dailyEarning = (supplied * weightedApy) / 365;\n\n return {\n positions,\n earnings: {\n totalYieldEarned: 0,\n currentApy: weightedApy,\n dailyEarning,\n supplied,\n },\n fundStatus: {\n supplied,\n apy: weightedApy,\n earnedToday: dailyEarning,\n earnedAllTime: 0,\n projectedMonthly: dailyEarning * 30,\n },\n };\n}\n\nfunction formatSavingsDisplay(result: SavingsResult): string {\n const { positions, earnings, fundStatus } = result;\n const supplies = positions.filter((p) => p.type === 'supply');\n const borrows = positions.filter((p) => p.type === 'borrow');\n\n const lines: string[] = [];\n if (supplies.length > 0) {\n lines.push(`Savings: $${fundStatus.supplied.toFixed(2)} at ${(earnings.currentApy * 100).toFixed(2)}% blended APY`);\n for (const s of supplies) {\n lines.push(` ${s.symbol}: ${s.amount.toFixed(s.amount < 1 ? 6 : 2)} ($${s.valueUsd.toFixed(2)}) at ${(s.apy * 100).toFixed(2)}% APY`);\n }\n } else {\n lines.push('No savings positions.');\n }\n if (borrows.length > 0) {\n const totalDebt = borrows.reduce((s, b) => s + b.valueUsd, 0);\n lines.push(`Debt: $${totalDebt.toFixed(2)}`);\n }\n lines.push(`Daily earnings: $${fundStatus.earnedToday.toFixed(4)}`);\n lines.push(`Monthly projected: $${fundStatus.projectedMonthly.toFixed(4)}`);\n return lines.join('\\n');\n}\n\nexport const savingsInfoTool = buildTool({\n name: 'savings_info',\n description:\n 'Get detailed savings positions and earnings: current deposits by protocol, APY, total yield earned, daily earning rate, and projected monthly returns.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n // [v1.5.1] NAVI deposits change on save_deposit / withdraw / claim.\n // Each call reflects a fresh on-chain snapshot — never dedupe.\n cacheable: false,\n\n async call(_input, context) {\n if (context.positionFetcher && context.walletAddress) {\n const sp = await context.positionFetcher(context.walletAddress);\n const result = buildSavingsFromPositions(sp);\n return { data: result, displayText: formatSavingsDisplay(result) };\n }\n\n if (hasNaviMcp(context)) {\n const savings = await fetchSavings(\n getMcpManager(context),\n getWalletAddress(context),\n );\n savings.positions = savings.positions.filter((p) => p.valueUsd >= DUST_THRESHOLD_USD);\n return { data: savings, displayText: formatSavingsDisplay(savings) };\n }\n\n const agent = requireAgent(context);\n const [posResult, earnings, fundStatus] = await Promise.all([\n agent.positions(),\n agent.earnings(),\n agent.fundStatus(),\n ]);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const positions = (posResult.positions ?? []).map((p: any) => ({\n protocol: (p.protocol ?? 'navi') as string,\n type: p.type === 'borrow' ? ('borrow' as const) : ('supply' as const),\n symbol: ((p.asset ?? p.symbol) ?? 'UNKNOWN') as string,\n amount: (p.amount ?? 0) as number,\n valueUsd: ((p.amountUsd ?? p.valueUsd) ?? 0) as number,\n apy: (p.apy ?? 0) as number,\n liquidationThreshold: (p.liquidationThreshold ?? 0) as number,\n })).filter((p: PositionEntry) => p.valueUsd >= DUST_THRESHOLD_USD);\n\n const result: SavingsResult = {\n positions,\n earnings: {\n totalYieldEarned: earnings.totalYieldEarned,\n currentApy: earnings.currentApy,\n dailyEarning: earnings.dailyEarning,\n supplied: earnings.supplied,\n },\n fundStatus: {\n supplied: fundStatus.supplied,\n apy: fundStatus.apy,\n earnedToday: fundStatus.earnedToday,\n earnedAllTime: fundStatus.earnedAllTime,\n projectedMonthly: fundStatus.projectedMonthly,\n },\n };\n\n return { data: result, displayText: formatSavingsDisplay(result) };\n },\n});\n","import { z } from 'zod';\nimport { fetchHealthFactor } from '../navi-reads.js';\nimport { buildTool } from '../tool.js';\nimport { hasNaviMcp, getMcpManager, getWalletAddress, requireAgent } from './utils.js';\n\nfunction hfStatus(hf: number): string {\n if (hf >= 2.0) return 'healthy';\n if (hf >= 1.5) return 'moderate';\n if (hf >= 1.2) return 'warning';\n return 'critical';\n}\n\nexport const healthCheckTool = buildTool({\n name: 'health_check',\n description:\n 'Check the lending health factor: current HF ratio, total supplied collateral, total borrowed, max additional borrow capacity, and liquidation threshold. HF < 1.5 is risky, < 1.2 is critical.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n // [v1.5.1] Health factor changes on every borrow / repay / collateral\n // movement and even passively as oracle prices update. Never dedupe.\n cacheable: false,\n\n async call(_input, context) {\n if (context.positionFetcher && context.walletAddress) {\n const sp = await context.positionFetcher(context.walletAddress);\n const hfVal = sp.healthFactor ?? (sp.borrows > 0 ? 0 : Infinity);\n const status = hfStatus(hfVal);\n const displayHf = Number.isFinite(hfVal) ? hfVal.toFixed(2) : '∞';\n return {\n data: {\n healthFactor: hfVal,\n supplied: sp.savings,\n borrowed: sp.borrows,\n maxBorrow: sp.maxBorrow,\n liquidationThreshold: 0,\n status,\n },\n displayText: `Health Factor: ${displayHf} (${status})`,\n };\n }\n\n if (hasNaviMcp(context)) {\n const hf = await fetchHealthFactor(\n getMcpManager(context),\n getWalletAddress(context),\n );\n const status = hfStatus(hf.healthFactor);\n const displayHf = Number.isFinite(hf.healthFactor) ? hf.healthFactor.toFixed(2) : '∞';\n return {\n data: { ...hf, status },\n displayText: `Health Factor: ${displayHf} (${status})`,\n };\n }\n\n const agent = requireAgent(context);\n const hf = await agent.healthFactor();\n const status = hfStatus(hf.healthFactor);\n\n return {\n data: {\n healthFactor: hf.healthFactor,\n supplied: hf.supplied,\n borrowed: hf.borrowed,\n maxBorrow: hf.maxBorrow,\n liquidationThreshold: hf.liquidationThreshold,\n status,\n },\n displayText: `Health Factor: ${hf.healthFactor.toFixed(2)} (${status})`,\n };\n },\n});\n","import { z } from 'zod';\nimport { fetchRates } from '../navi-reads.js';\nimport { buildTool } from '../tool.js';\nimport { hasNaviMcpGlobal, getMcpManager, hasAgent, requireAgent } from './utils.js';\n\nconst YIELDS_API = 'https://yields.llama.fi';\n\nfunction formatRatesSummary(rates: Record<string, { saveApy: number; borrowApy: number }>): string {\n return Object.entries(rates)\n .map(([asset, r]) => `${asset}: Save ${(r.saveApy * 100).toFixed(2)}% / Borrow ${(r.borrowApy * 100).toFixed(2)}%`)\n .join(', ');\n}\n\ninterface DefiLlamaPool {\n chain: string;\n project: string;\n symbol: string;\n apy: number;\n apyBorrow?: number;\n tvlUsd: number;\n}\n\nasync function fetchRatesFromDefiLlama(): Promise<Record<string, { saveApy: number; borrowApy: number }>> {\n const res = await fetch(`${YIELDS_API}/pools`, { signal: AbortSignal.timeout(15_000) });\n if (!res.ok) throw new Error(`DefiLlama API error: HTTP ${res.status}`);\n const data = await res.json() as { data: DefiLlamaPool[] };\n\n const naviPools = (data.data ?? []).filter(\n (p) => p.chain === 'Sui' && p.project === 'navi-lending' && p.tvlUsd > 10_000,\n );\n\n const result: Record<string, { saveApy: number; borrowApy: number }> = {};\n for (const pool of naviPools) {\n const saveApy = (pool.apy ?? 0) / 100;\n const borrowApy = pool.apyBorrow != null ? Math.abs(pool.apyBorrow) / 100 : 0;\n result[pool.symbol] = { saveApy, borrowApy };\n }\n return result;\n}\n\nexport const ratesInfoTool = buildTool({\n name: 'rates_info',\n description:\n 'Get current NAVI Protocol lending/savings rates (APY) for supported assets on Sui. Returns save APY and borrow APY per asset.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n\n async call(_input, context) {\n // MCP first (real-time, includes borrow rates) — no wallet needed for global rates\n if (hasNaviMcpGlobal(context)) {\n const rates = await fetchRates(getMcpManager(context));\n return { data: rates, displayText: formatRatesSummary(rates) };\n }\n\n // SDK agent second\n if (hasAgent(context)) {\n const agent = requireAgent(context);\n const rates = await agent.rates();\n return { data: rates, displayText: formatRatesSummary(rates) };\n }\n\n // DefiLlama fallback (supply-only, no borrow rates)\n const rates = await fetchRatesFromDefiLlama();\n return { data: rates, displayText: formatRatesSummary(rates) };\n },\n});\n","import { z } from 'zod';\nimport {\n classifyTransaction,\n extractTransferDetails,\n type ClassifyBalanceChange,\n type TxDirection,\n} from '@t2000/sdk';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nconst SUI_MAINNET_URL = 'https://fullnode.mainnet.sui.io:443';\n\ntype RpcBalanceChange = ClassifyBalanceChange;\n\ninterface RpcTxBlock {\n digest: string;\n timestampMs?: string;\n transaction?: unknown;\n effects?: { gasUsed?: { computationCost: string; storageCost: string; storageRebate: string } };\n balanceChanges?: RpcBalanceChange[];\n}\n\ninterface TxRecord {\n digest: string;\n /**\n * [v1.4] Coarse bucket — one of `'send' | 'lending' | 'swap' |\n * 'transaction'`. Used by the ACI `action` filter and persisted\n * downstream queries depend on these values, so they are STABLE.\n */\n action: string;\n /**\n * [v1.5.3] Finer-grained display label derived from the\n * Move-call function name (e.g. `'deposit'`, `'withdraw'`,\n * `'payment_link'`, `'on-chain'`). Optional — frontends should\n * fall back to `action` when missing. Never used by filters.\n */\n label?: string;\n amount?: number;\n asset?: string;\n recipient?: string;\n /**\n * [v0.46.2] Direction of the user's principal balance change on\n * this tx (`'in'` → user received, `'out'` → user spent). Lets the\n * card render the correct sign without parsing the textual label.\n */\n direction?: TxDirection;\n timestamp: number;\n date?: string;\n gasCost?: number;\n}\n\nfunction parseRpcTx(tx: RpcTxBlock, address: string): TxRecord {\n const gasUsed = tx.effects?.gasUsed;\n const gasCost = gasUsed\n ? (Number(gasUsed.computationCost) + Number(gasUsed.storageCost) - Number(gasUsed.storageRebate)) / 1e9\n : undefined;\n\n const moveCallTargets: string[] = [];\n const commandTypes: string[] = [];\n try {\n /**\n * Sui JSON-RPC `suix_queryTransactionBlocks` returns the\n * ProgrammableTransaction body with the legacy field name\n * `transactions` (plural). Newer SDK-side types refer to the same\n * data as `commands`. Cover both — the v1.5.3 engine path was\n * only checking `commands`, which always returned empty for prod\n * RPC responses, so every row in the transaction history card\n * fell back to `label: 'on-chain'`.\n */\n const data = (tx.transaction as Record<string, unknown>)?.data as Record<string, unknown> | undefined;\n const inner = data?.transaction as Record<string, unknown> | undefined;\n const commands = (inner?.commands ?? inner?.transactions) as Record<string, unknown>[] | undefined;\n if (Array.isArray(commands)) {\n for (const cmd of commands) {\n if (cmd.MoveCall) {\n const mc = cmd.MoveCall as { package: string; module: string; function: string };\n moveCallTargets.push(`${mc.package}::${mc.module}::${mc.function}`);\n commandTypes.push('MoveCall');\n } else if (cmd.TransferObjects) {\n commandTypes.push('TransferObjects');\n }\n }\n }\n } catch { /* best effort */ }\n\n const changes = tx.balanceChanges ?? [];\n const { amount, asset, recipient, direction } = extractTransferDetails(changes, address);\n\n const timestampMs = Number(tx.timestampMs ?? 0);\n const { action, label } = classifyTransaction(moveCallTargets, commandTypes, changes, address);\n\n return {\n digest: tx.digest,\n action,\n label,\n amount,\n asset,\n recipient,\n direction,\n timestamp: timestampMs,\n date: timestampMs > 0 ? new Date(timestampMs).toISOString() : undefined,\n gasCost,\n };\n}\n\nasync function queryHistoryPage(\n rpcUrl: string,\n address: string,\n limit: number,\n cursor: string | null,\n): Promise<{ data: RpcTxBlock[]; nextCursor: string | null; hasNextPage: boolean }> {\n const res = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'suix_queryTransactionBlocks',\n params: [\n { filter: { FromAddress: address }, options: { showEffects: true, showInput: true, showBalanceChanges: true } },\n cursor,\n limit,\n true,\n ],\n }),\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!res.ok) throw new Error(`Sui RPC error: ${res.status}`);\n const json = (await res.json()) as {\n result?: { data: RpcTxBlock[]; nextCursor: string | null; hasNextPage: boolean };\n error?: { message: string };\n };\n if (json.error) throw new Error(`RPC error: ${json.error.message}`);\n return {\n data: json.result?.data ?? [],\n nextCursor: json.result?.nextCursor ?? null,\n hasNextPage: json.result?.hasNextPage ?? false,\n };\n}\n\nasync function queryHistoryRpc(rpcUrl: string, address: string, limit: number): Promise<TxRecord[]> {\n const page = await queryHistoryPage(rpcUrl, address, limit, null);\n return page.data.map((tx) => parseRpcTx(tx, address));\n}\n\n/**\n * Paginate backwards through transaction history to find transactions\n * around a specific date. Returns up to `limit` transactions from that day.\n */\nasync function queryHistoryByDate(\n rpcUrl: string,\n address: string,\n targetDate: string,\n limit: number,\n): Promise<TxRecord[]> {\n const target = new Date(targetDate);\n const dayStart = new Date(target.getFullYear(), target.getMonth(), target.getDate()).getTime();\n const dayEnd = dayStart + 86_400_000;\n const MAX_PAGES = 20;\n const PAGE_SIZE = 50;\n\n const results: TxRecord[] = [];\n let cursor: string | null = null;\n\n for (let page = 0; page < MAX_PAGES; page++) {\n const res = await queryHistoryPage(rpcUrl, address, PAGE_SIZE, cursor);\n if (res.data.length === 0) break;\n\n for (const tx of res.data) {\n const ts = Number(tx.timestampMs ?? 0);\n if (ts === 0) continue;\n\n if (ts < dayStart) {\n return results.slice(0, limit);\n }\n\n if (ts >= dayStart && ts < dayEnd) {\n results.push(parseRpcTx(tx, address));\n }\n }\n\n if (!res.hasNextPage || !res.nextCursor) break;\n cursor = res.nextCursor;\n }\n\n return results.slice(0, limit);\n}\n\n/**\n * [v1.4 ACI] Allowed values for the `action` filter — kept in sync with\n * `classifyAction` above (the labels it can return).\n */\nconst HISTORY_ACTIONS = ['send', 'lending', 'swap', 'transaction'] as const;\ntype HistoryAction = (typeof HISTORY_ACTIONS)[number];\n\nconst DEFAULT_LOOKBACK_DAYS = 30;\n\nexport const transactionHistoryTool = buildTool({\n name: 'transaction_history',\n description:\n 'Retrieve recent transaction history (last 30 days by default): sends, saves, withdrawals, borrows, repayments, and rewards claims. Pass `date` (YYYY-MM-DD) for a specific day, `action` to filter by category (send/lending/swap), or both.',\n inputSchema: z.object({\n limit: z.number().int().min(1).max(50).optional(),\n date: z.string().optional().describe('Specific date to search for transactions (YYYY-MM-DD format). Paginates back to find that day.'),\n action: z.enum(HISTORY_ACTIONS).optional().describe('Filter by action: send, lending, swap, or transaction.'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n limit: {\n type: 'number',\n description: 'Maximum number of transactions to return (1-50, default 10)',\n },\n date: {\n type: 'string',\n description: 'Specific date to search for transactions (YYYY-MM-DD format). Paginates back to find that day.',\n },\n action: {\n type: 'string',\n enum: [...HISTORY_ACTIONS],\n description: 'Filter results by action category: send, lending, swap, or transaction.',\n },\n },\n },\n isReadOnly: true,\n maxResultSizeChars: 8_000,\n // [v1.5.1] New transactions land continuously. Even with an explicit\n // `date` filter the dedupe is wrong post-write because the just-\n // executed write may now be in history. Never dedupe.\n cacheable: false,\n /**\n * [v1.5.2] Custom truncation that preserves the structured shape.\n *\n * The default `budgetToolResult` slices the JSON string at the byte\n * limit, appends a \"[Truncated…]\" note, and tries `JSON.parse` — which\n * always fails for sliced JSON, so the engine falls back to returning\n * the raw string. The frontend's `transaction_history` card renderer\n * then sees `typeof data !== 'object'` and bails, so the rich card\n * never renders even though the LLM has the full text.\n *\n * Strategy: progressively halve the `transactions` array until the\n * serialized payload fits, then stamp `_truncated: true` and the\n * original length so the LLM knows to recall with `limit` if it needs\n * older entries. Result is always valid JSON, always object-shaped.\n */\n summarizeOnTruncate(serialized, maxChars) {\n type ParsedHistory = {\n transactions: unknown[];\n count: number;\n [k: string]: unknown;\n };\n let parsed: ParsedHistory;\n try {\n parsed = JSON.parse(serialized) as ParsedHistory;\n } catch {\n return JSON.stringify({\n transactions: [],\n count: 0,\n _truncated: true,\n _note: 'Result exceeded size budget and could not be summarized.',\n });\n }\n const original = Array.isArray(parsed.transactions) ? parsed.transactions : [];\n let trimmed = original.slice();\n let payload = JSON.stringify({ ...parsed, transactions: trimmed, _truncated: true, _originalCount: original.length });\n while (payload.length > maxChars && trimmed.length > 1) {\n trimmed = trimmed.slice(0, Math.max(1, Math.floor(trimmed.length / 2)));\n payload = JSON.stringify({ ...parsed, transactions: trimmed, _truncated: true, _originalCount: original.length });\n }\n return payload;\n },\n\n async call(\n input,\n context,\n ): Promise<{ data: Record<string, unknown>; displayText: string }> {\n const limit = input.limit ?? 10;\n const action = input.action as HistoryAction | undefined;\n\n /**\n * [v1.4] After fetching, narrow by `action` (when supplied), and trim\n * to a `DEFAULT_LOOKBACK_DAYS` window when no explicit date is given —\n * keeps results recent and bounded so the LLM doesn't over-summarize.\n */\n const finalize = (records: TxRecord[]): TxRecord[] => {\n let scoped = records;\n if (action) scoped = scoped.filter((r) => r.action === action);\n return scoped.slice(0, limit);\n };\n\n if (context.agent) {\n const agent = requireAgent(context);\n const records = await agent.history({ limit: input.date ? limit : Math.max(limit * 4, 50) });\n const filtered = finalize(records);\n return {\n data: { transactions: filtered, count: filtered.length, date: input.date ?? null, action: action ?? null },\n displayText: `${filtered.length} recent transaction(s)`,\n };\n }\n\n if (!context.walletAddress || !context.suiRpcUrl) {\n throw new Error('Transaction history requires a wallet address');\n }\n\n if (input.date) {\n const records = await queryHistoryByDate(\n context.suiRpcUrl,\n context.walletAddress,\n input.date,\n Math.max(limit * 4, 50),\n );\n const filtered = finalize(records);\n const dateLabel = new Date(input.date).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' });\n return {\n data: { transactions: filtered, count: filtered.length, date: input.date, action: action ?? null },\n displayText: filtered.length > 0\n ? `${filtered.length} transaction(s) on ${dateLabel}`\n : `No transactions found on ${dateLabel}`,\n };\n }\n\n // No date — last 30 days. Over-fetch then trim by lookback window.\n const cutoffMs = Date.now() - DEFAULT_LOOKBACK_DAYS * 86_400_000;\n const records = await queryHistoryRpc(\n context.suiRpcUrl,\n context.walletAddress,\n Math.max(limit * 4, 50),\n );\n const recent = records.filter((r) => r.timestamp >= cutoffMs);\n const filtered = finalize(recent);\n return {\n data: {\n transactions: filtered,\n count: filtered.length,\n date: null,\n action: action ?? null,\n lookbackDays: DEFAULT_LOOKBACK_DAYS,\n },\n displayText: `${filtered.length} transaction(s) in the last ${DEFAULT_LOOKBACK_DAYS} days`,\n };\n },\n});\n","import { z } from 'zod';\nimport { assertAllowedAsset } from '@t2000/sdk';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const saveDepositTool = buildTool({\n name: 'save_deposit',\n description:\n 'Deposit USDC into NAVI savings to earn yield. ONLY USDC is accepted. If the user asks to save/deposit any other token (USDT, SUI, USDe, etc.), do NOT call this tool and do NOT automatically swap their tokens and deposit. Instead, tell the user that only USDC deposits are supported and ask if they would like to swap to USDC first. Let the user decide — never auto-chain swap + deposit.',\n inputSchema: z.object({\n amount: z.number().positive(),\n asset: z.string().optional().describe('Must be USDC or omitted. Any other asset is rejected.'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: {\n description: 'Exact amount of USDC to deposit',\n },\n asset: {\n type: 'string',\n description: 'Must be USDC or omitted. Any other asset is rejected.',\n },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, requiresBalance: true },\n preflight: (input) => {\n if (input.asset && input.asset.toUpperCase() !== 'USDC') {\n return { valid: false, error: `Only USDC deposits are supported. Got: \"${input.asset}\"` };\n }\n return { valid: true };\n },\n\n async call(input, context) {\n assertAllowedAsset('save', input.asset);\n\n const agent = requireAgent(context);\n const result = await agent.save({ amount: input.amount });\n\n return {\n data: {\n success: result.success,\n tx: result.tx,\n amount: result.amount,\n asset: 'USDC',\n apy: result.apy,\n fee: result.fee,\n gasCost: result.gasCost,\n savingsBalance: result.savingsBalance,\n },\n displayText: `Saved ${result.amount.toFixed(result.amount < 1 ? 6 : 2)} USDC at ${(result.apy * 100).toFixed(2)}% APY (tx: ${result.tx.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const withdrawTool = buildTool({\n name: 'withdraw',\n description:\n 'Withdraw from NAVI lending back to wallet. Defaults to USDC. Also supports withdrawing legacy positions (USDe, USDsui, SUI) if the user has them.',\n inputSchema: z.object({\n amount: z.number().positive(),\n asset: z.string().optional().describe('Asset to withdraw (default: USDC). Legacy positions: USDe, USDsui, SUI'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: {\n description: 'Exact amount to withdraw in token units',\n },\n asset: {\n type: 'string',\n description: 'Asset to withdraw (default: USDC). Legacy positions: USDe, USDsui, SUI',\n },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, affectsHealth: true },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.withdraw({\n amount: input.amount,\n asset: input.asset,\n });\n\n const withdrawnAsset = (result as { asset?: string }).asset ?? input.asset ?? 'USDC';\n return {\n data: {\n success: result.success,\n tx: result.tx,\n amount: result.amount,\n asset: withdrawnAsset,\n gasCost: result.gasCost,\n },\n displayText: `Withdrew ${result.amount.toFixed(result.amount < 1 ? 6 : 2)} ${withdrawnAsset} (tx: ${result.tx.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const sendTransferTool = buildTool({\n name: 'send_transfer',\n description:\n 'Send USDC to another Sui address or contact name. Validates the address, checks balance, and executes the on-chain transfer. Returns tx hash, gas cost, and updated balance.',\n inputSchema: z.object({\n to: z.string().min(1),\n amount: z.number().positive(),\n memo: z.string().optional(),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n to: {\n type: 'string',\n description: 'Sui address (0x…) or saved contact name',\n },\n amount: {\n type: 'number',\n description: 'Amount in USD to send',\n },\n memo: {\n type: 'string',\n description: 'Optional note attached to the transfer (shown in transaction receipt)',\n },\n },\n required: ['to', 'amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, requiresBalance: true, irreversible: true },\n preflight: (input) => {\n if (input.to.startsWith('0x') && !/^0x[a-fA-F0-9]{64}$/.test(input.to)) {\n return { valid: false, error: `Invalid Sui address format: \"${input.to}\". Must be 0x followed by 64 hex characters.` };\n }\n const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000000000000000000000000000';\n if (input.to === ZERO_ADDRESS) {\n return { valid: false, error: 'This is the zero address (burn address). Sending funds here will permanently destroy them. If you really intend to burn tokens, please confirm explicitly.' };\n }\n if (input.amount <= 0) {\n return { valid: false, error: 'Amount must be positive.' };\n }\n return { valid: true };\n },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.send({ to: input.to, amount: input.amount });\n\n return {\n data: {\n success: result.success,\n tx: result.tx,\n amount: result.amount,\n to: result.to,\n contactName: result.contactName,\n gasCost: result.gasCost,\n gasMethod: result.gasMethod,\n balance: result.balance,\n memo: input.memo ?? null,\n },\n displayText: `Sent $${result.amount.toFixed(2)} to ${result.contactName ?? result.to.slice(0, 10)}… (tx: ${result.tx.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { assertAllowedAsset } from '@t2000/sdk';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const borrowTool = buildTool({\n name: 'borrow',\n description:\n 'Borrow USDC against savings collateral. ONLY USDC borrows are supported. Requires existing savings deposits. Checks max safe borrow and health factor. Returns tx hash, fee, and post-borrow health factor.',\n inputSchema: z.object({\n amount: z.number().positive(),\n asset: z.string().optional().describe('Must be USDC or omitted. Any other asset is rejected.'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: {\n type: 'number',\n description: 'Amount in USDC to borrow',\n },\n asset: {\n type: 'string',\n description: 'Must be USDC or omitted. Any other asset is rejected.',\n },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, affectsHealth: true },\n preflight: (input) => {\n if (input.asset && input.asset.toUpperCase() !== 'USDC') {\n return { valid: false, error: `Only USDC borrows are supported. Got: \"${input.asset}\"` };\n }\n return { valid: true };\n },\n\n async call(input, context) {\n assertAllowedAsset('borrow', input.asset);\n\n const agent = requireAgent(context);\n const result = await agent.borrow({ amount: input.amount });\n\n return {\n data: {\n success: result.success,\n tx: result.tx,\n amount: result.amount,\n fee: result.fee,\n healthFactor: result.healthFactor,\n gasCost: result.gasCost,\n },\n displayText: `Borrowed $${result.amount.toFixed(2)} — HF: ${result.healthFactor.toFixed(2)} (tx: ${result.tx.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const repayDebtTool = buildTool({\n name: 'repay_debt',\n description:\n 'Repay outstanding USDC debt. Always call balance_check first to know the debt amount, then pass the exact number here. Prioritises the highest-APY borrow first. Returns tx hash, amount repaid, and remaining debt.',\n inputSchema: z.object({\n amount: z.number().positive(),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: {\n description: 'Exact amount in USD to repay (call balance_check first to get debt amount)',\n },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, requiresBalance: true },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.repay({ amount: input.amount });\n\n return {\n data: {\n success: result.success,\n tx: result.tx,\n amount: result.amount,\n remainingDebt: result.remainingDebt,\n gasCost: result.gasCost,\n },\n displayText: `Repaid $${result.amount.toFixed(2)} — remaining debt: $${result.remainingDebt.toFixed(2)} (tx: ${result.tx.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const claimRewardsTool = buildTool({\n name: 'claim_rewards',\n description:\n 'Claim all pending protocol rewards across lending adapters. Returns claimed reward details and total USD value.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true },\n\n async call(_input, context) {\n const agent = requireAgent(context);\n const result = await agent.claimRewards();\n\n return {\n data: {\n success: result.success,\n tx: result.tx || null,\n rewards: result.rewards,\n totalValueUsd: result.totalValueUsd,\n gasCost: result.gasCost,\n },\n displayText: result.rewards.length === 0\n ? 'No pending rewards to claim.'\n : `Claimed $${result.totalValueUsd.toFixed(2)} in rewards (tx: ${result.tx.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nconst MPP_GATEWAY = 'https://mpp.t2000.ai';\n\nconst SERVICE_PRICES: [RegExp, number][] = [\n [/\\/fal\\//, 0.03],\n [/\\/googlemaps\\//, 0.01],\n [/\\/perplexity\\//, 0.01],\n [/\\/firecrawl\\//, 0.01],\n [/\\/serpapi\\//, 0.01],\n [/\\/openweather\\//, 0.005],\n [/\\/brave\\//, 0.005],\n [/\\/serper\\//, 0.005],\n [/\\/newsapi\\//, 0.005],\n [/\\/coingecko\\//, 0.005],\n [/\\/alphavantage\\//, 0.005],\n [/\\/exchangerate\\//, 0.005],\n [/\\/deepl\\//, 0.005],\n [/\\/jina\\//, 0.005],\n [/\\/resend\\//, 0.005],\n];\n\nexport function estimatePayApiCost(url: string): number {\n for (const [pattern, price] of SERVICE_PRICES) {\n if (pattern.test(url)) return price;\n }\n return 0.005;\n}\n\nexport const payApiTool = buildTool({\n name: 'pay_api',\n description: `Execute any MPP gateway service via on-chain USDC micropayment. The gateway at ${MPP_GATEWAY} hosts 40+ services (88 endpoints). Payment is handled automatically.\n\nUse mpp_services tool first to discover available services and get the correct endpoint URL, required body parameters, and pricing. Then call this tool with the full URL and JSON body.\n\nAlways use POST. Construct the URL from the gateway base + service path. Pass parameters as a JSON string in body.\n\nCRITICAL — non-retryable errors: If the result contains \"doNotRetry\": true or \"paymentConfirmed\": true, the user has ALREADY been charged. NEVER call pay_api again for the same request. Report the error to the user.\n\nLob (postcards/letters) — MULTI-STEP, NEVER skip:\n1. Generate design image FIRST via fal/fal-ai/flux/dev ($0.03). Show the image to the user as markdown .\n2. Ask the user to confirm before mailing (\"Here's the design. Print and mail for $1.00?\").\n3. ONLY after user confirms: call lob/v1/postcards with the image URL in the front HTML (<img src=\"URL\" style=\"width:100%;height:100%;object-fit:cover\"/>).\nAlways use ISO-3166 country codes (GB not UK, US not USA). A return address (\"from\") is added automatically — do not include one.`,\n inputSchema: z.object({\n url: z.string().url(),\n method: z.enum(['GET', 'POST', 'PUT', 'DELETE']).optional(),\n body: z.string().optional(),\n headers: z.record(z.string()).optional(),\n maxPrice: z.number().positive().optional(),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'Full MPP endpoint URL (e.g. https://mpp.t2000.ai/openweather/v1/weather)' },\n method: { type: 'string', description: 'HTTP method (always POST for MPP gateway)' },\n body: { type: 'string', description: 'JSON request body as string' },\n headers: { type: 'object', description: 'Additional HTTP headers' },\n maxPrice: { type: 'number', description: 'Maximum price in USD willing to pay (default: service price)' },\n },\n required: ['url'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, requiresBalance: true, costAware: true, producesArtifact: true, maxRetries: 1 },\n preflight: (input) => {\n if (!input.url.startsWith(MPP_GATEWAY)) {\n return { valid: false, error: `URL must start with ${MPP_GATEWAY}. Got: \"${input.url}\"` };\n }\n if (input.body) {\n try {\n JSON.parse(input.body);\n } catch {\n return { valid: false, error: 'body must be valid JSON.' };\n }\n if (input.url.includes('lob/')) {\n const body = JSON.parse(input.body) as Record<string, unknown>;\n const to = body.to as Record<string, unknown> | undefined;\n const country = to?.address_country;\n if (typeof country === 'string' && country.length !== 2) {\n return { valid: false, error: `Country must be ISO-3166 2-letter code (got \"${country}\")` };\n }\n }\n }\n return { valid: true };\n },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.pay({\n url: input.url,\n method: input.method,\n body: input.body,\n headers: input.headers,\n maxPrice: input.maxPrice,\n });\n\n return {\n data: {\n status: result.status,\n body: result.body,\n paid: result.paid,\n cost: result.cost,\n receipt: result.receipt,\n },\n displayText: result.paid\n ? `API call completed — paid $${result.cost?.toFixed(4) ?? '?'} (status: ${result.status})`\n : `API call completed — free (status: ${result.status})`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\n\nconst MPP_GATEWAY = 'https://mpp.t2000.ai';\nconst CATALOG_URL = `${MPP_GATEWAY}/api/services`;\nconst CACHE_TTL = 120_000;\n\ninterface GatewayEndpoint {\n method: string;\n path: string;\n description: string;\n price: string;\n}\n\ninterface GatewayService {\n id: string;\n name: string;\n serviceUrl: string;\n description: string;\n categories: string[];\n endpoints: GatewayEndpoint[];\n}\n\nlet catalogCache: { data: GatewayService[]; ts: number } | null = null;\n\nasync function fetchCatalog(): Promise<GatewayService[]> {\n if (catalogCache && Date.now() - catalogCache.ts < CACHE_TTL) {\n return catalogCache.data;\n }\n const res = await fetch(CATALOG_URL, { signal: AbortSignal.timeout(10_000) });\n if (!res.ok) throw new Error(`MPP catalog fetch failed: HTTP ${res.status}`);\n const data = (await res.json()) as GatewayService[];\n catalogCache = { data, ts: Date.now() };\n return data;\n}\n\nfunction matchesQuery(service: GatewayService, q: string): boolean {\n const lower = q.toLowerCase();\n return (\n service.id.toLowerCase().includes(lower) ||\n service.name.toLowerCase().includes(lower) ||\n service.description.toLowerCase().includes(lower) ||\n service.categories.some((c) => c.toLowerCase().includes(lower)) ||\n service.endpoints.some((e) => e.description.toLowerCase().includes(lower))\n );\n}\n\nexport const mppServicesTool = buildTool({\n name: 'mpp_services',\n description:\n 'Discover available MPP gateway services. Returns service names, descriptions, endpoints with required parameters, and pricing. Pass `query` for keyword search or `category` to filter by category. Calling with NO filters returns a category summary (not the full catalog) — narrow first, then fetch endpoints. Use this BEFORE calling pay_api.',\n inputSchema: z.object({\n query: z\n .string()\n .optional()\n .describe('Filter by keyword (e.g. \"postcard\", \"translate\", \"weather\").'),\n category: z\n .string()\n .optional()\n .describe('Filter by category exactly (e.g. \"weather\", \"image\"). See category summary returned when called without filters.'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Filter by keyword (e.g. \"postcard\", \"translate\", \"weather\").',\n },\n category: {\n type: 'string',\n description: 'Filter by category exactly (e.g. \"weather\", \"image\").',\n },\n },\n required: [],\n },\n isReadOnly: true,\n maxResultSizeChars: 5_000,\n\n async call(input): Promise<{ data: Record<string, unknown>; displayText: string }> {\n const catalog = await fetchCatalog();\n\n // [v1.4 ACI] If neither query nor category is supplied, return a\n // category summary rather than the unbounded full catalog. The model\n // then re-calls with a filter, which keeps the context window tight\n // and makes the MPP discovery flow two-step (categorize → drill down).\n if (!input.query && !input.category) {\n const counts = new Map<string, number>();\n for (const svc of catalog) {\n for (const cat of svc.categories) {\n counts.set(cat, (counts.get(cat) ?? 0) + 1);\n }\n }\n const categories = [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([category, services]) => ({ category, services }));\n return {\n data: {\n _refine: {\n reason: 'MPP catalog has many services — pick a category or supply a query first.',\n suggestedParams: { category: categories[0]?.category ?? 'weather' },\n },\n categories,\n totalServices: catalog.length,\n },\n displayText: `${catalog.length} services across ${categories.length} categories. Re-call with a category or query.`,\n };\n }\n\n let filtered = catalog;\n if (input.category) {\n const cat = input.category.toLowerCase();\n filtered = filtered.filter((s) => s.categories.some((c) => c.toLowerCase() === cat));\n }\n if (input.query) {\n filtered = filtered.filter((s) => matchesQuery(s, input.query!));\n }\n\n const services = filtered.map((s) => ({\n id: s.id,\n name: s.name,\n description: s.description,\n categories: s.categories,\n endpoints: s.endpoints.map((e) => ({\n url: `${MPP_GATEWAY}/${s.id}${e.path}`,\n method: e.method,\n description: e.description,\n price: `$${e.price}`,\n })),\n }));\n\n const filterDesc = [\n input.query ? `query \"${input.query}\"` : null,\n input.category ? `category \"${input.category}\"` : null,\n ].filter(Boolean).join(' + ');\n const summary = `Found ${services.length} service(s) matching ${filterDesc}`;\n\n return {\n data: { services, total: services.length },\n displayText: summary,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const swapExecuteTool = buildTool({\n name: 'swap_execute',\n description:\n 'Swap tokens on Sui via Cetus Aggregator (20+ DEXs). Supports any token pair with liquidity. Use user-friendly names (SUI, USDC, CETUS, DEEP, etc.) or full coin types.',\n inputSchema: z.object({\n from: z.string().describe('Source token (e.g. \"SUI\", \"USDC\", or full coin type)'),\n to: z.string().describe('Target token (e.g. \"USDC\", \"CETUS\", or full coin type)'),\n amount: z.number().positive().describe('Amount to swap'),\n byAmountIn: z.boolean().optional().describe('true = fixed input amount (default), false = fixed output amount'),\n slippage: z.number().min(0.001).max(0.05).optional().describe('Max slippage (default 0.01 = 1%, max 5%)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n from: { type: 'string', description: 'Source token name or coin type' },\n to: { type: 'string', description: 'Target token name or coin type' },\n amount: { type: 'number', description: 'Amount to swap' },\n byAmountIn: { type: 'boolean', description: 'true = fixed input (default), false = fixed output' },\n slippage: { type: 'number', description: 'Max slippage (0.01 = 1%)' },\n },\n required: ['from', 'to', 'amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, requiresBalance: true },\n preflight: (input) => {\n if (input.from.toLowerCase() === input.to.toLowerCase()) {\n return { valid: false, error: `Cannot swap ${input.from} to itself.` };\n }\n return { valid: true };\n },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.swap({\n from: input.from,\n to: input.to,\n amount: input.amount,\n byAmountIn: input.byAmountIn,\n slippage: input.slippage,\n });\n\n return {\n data: {\n tx: result.tx,\n fromToken: result.fromToken,\n toToken: result.toToken,\n fromAmount: result.fromAmount,\n toAmount: result.toAmount,\n priceImpact: result.priceImpact,\n route: result.route,\n gasCost: result.gasCost,\n },\n displayText: `Swapped ${result.fromAmount} ${result.fromToken} for ${result.toAmount.toFixed(4)} ${result.toToken} (tx: ${result.tx.slice(0, 8)}...)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { getSwapQuote } from '@t2000/sdk';\nimport { buildTool } from '../tool.js';\nimport { getWalletAddress } from './utils.js';\n\nexport const swapQuoteTool = buildTool({\n name: 'swap_quote',\n description:\n 'Get a swap quote without executing. Shows expected output amount, price impact, and route. Use before swap_execute to preview a trade.',\n inputSchema: z.object({\n from: z.string().describe('Source token (e.g. \"SUI\", \"USDC\", or full coin type)'),\n to: z.string().describe('Target token (e.g. \"USDC\", \"CETUS\", or full coin type)'),\n amount: z.number().positive().describe('Amount to swap'),\n byAmountIn: z.boolean().optional().describe('true = fixed input (default), false = fixed output'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n from: { type: 'string', description: 'Source token name or coin type' },\n to: { type: 'string', description: 'Target token name or coin type' },\n amount: { type: 'number', description: 'Amount to swap' },\n byAmountIn: { type: 'boolean', description: 'true = fixed input (default), false = fixed output' },\n },\n required: ['from', 'to', 'amount'],\n },\n isReadOnly: true,\n\n async call(input, context) {\n const walletAddress = context.agent\n ? (context.agent as { address(): string }).address()\n : getWalletAddress(context);\n\n const result = await getSwapQuote({\n walletAddress,\n from: input.from,\n to: input.to,\n amount: input.amount,\n byAmountIn: input.byAmountIn,\n });\n\n return {\n data: result,\n displayText: `${result.fromAmount} ${result.fromToken} → ${result.toAmount.toFixed(4)} ${result.toToken} (impact: ${(result.priceImpact * 100).toFixed(2)}%, via ${result.route})`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const voloStakeTool = buildTool({\n name: 'volo_stake',\n description:\n 'Stake SUI for vSUI via VOLO liquid staking. Earn ~3-5% APY. Rewards compound automatically via exchange rate — no claiming needed. Minimum 1 SUI.',\n inputSchema: z.object({\n amount: z.number().min(1).describe('Amount of SUI to stake (minimum 1)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: { type: 'number', description: 'Amount of SUI to stake' },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true, requiresBalance: true },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.stakeVSui({ amount: input.amount });\n\n return {\n data: {\n tx: result.tx,\n amountSui: result.amountSui,\n vSuiReceived: result.vSuiReceived,\n apy: result.apy,\n gasCost: result.gasCost,\n },\n displayText: `Staked ${result.amountSui} SUI for ${result.vSuiReceived.toFixed(4)} vSUI at ${(result.apy * 100).toFixed(2)}% APY (tx: ${result.tx.slice(0, 8)}...)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const voloUnstakeTool = buildTool({\n name: 'volo_unstake',\n description:\n 'Unstake vSUI back to SUI. Returns SUI including accumulated yield. Use amount in vSUI units or \"all\" to unstake entire position.',\n inputSchema: z.object({\n amount: z.union([z.number().positive(), z.literal('all')]).describe('Amount of vSUI to unstake, or \"all\"'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: { description: 'Amount of vSUI to unstake, or the string \"all\"' },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n flags: { mutating: true },\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.unstakeVSui({ amount: input.amount });\n\n return {\n data: {\n tx: result.tx,\n vSuiAmount: result.vSuiAmount,\n suiReceived: result.suiReceived,\n gasCost: result.gasCost,\n },\n displayText: `Unstaked ${result.vSuiAmount.toFixed(4)} vSUI, received ${result.suiReceived.toFixed(4)} SUI (tx: ${result.tx.slice(0, 8)}...)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\n\nconst VOLO_STATS_URL = 'https://open-api.naviprotocol.io/api/volo/stats';\n\nexport const voloStatsTool = buildTool({\n name: 'volo_stats',\n description:\n 'Get current VOLO liquid staking stats: vSUI APY, exchange rate, total staked SUI, and total vSUI supply.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {} },\n isReadOnly: true,\n\n async call() {\n const res = await fetch(VOLO_STATS_URL);\n if (!res.ok) throw new Error(`VOLO API returned ${res.status}`);\n\n const json = (await res.json()) as Record<string, unknown>;\n const data = (json.data ?? json) as {\n apy?: number;\n exchange_rate?: number;\n exchangeRate?: number;\n total_staked?: number;\n totalStaked?: number;\n total_vsui?: number;\n totalVSui?: number;\n };\n\n const stats = {\n apy: data.apy ?? 0,\n exchangeRate: data.exchange_rate ?? data.exchangeRate ?? 0,\n totalStaked: data.total_staked ?? data.totalStaked ?? 0,\n totalVSui: data.total_vsui ?? data.totalVSui ?? 0,\n };\n\n return {\n data: stats,\n displayText: `vSUI APY: ${(stats.apy * 100).toFixed(2)}%, Rate: 1 SUI = ${(1 / stats.exchangeRate).toFixed(4)} vSUI, Total staked: ${stats.totalStaked.toLocaleString()} SUI`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\n\nexport const saveContactTool = buildTool({\n name: 'save_contact',\n description:\n 'Save a contact with a friendly name and Sui address so the user can send to them by name later.',\n inputSchema: z.object({\n name: z.string().describe('Friendly name for the contact (e.g. \"Alex\", \"Mom\")'),\n address: z.string().describe('Full Sui address (0x...)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Friendly name for the contact' },\n address: { type: 'string', description: 'Full Sui address (0x...)' },\n },\n required: ['name', 'address'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n\n async call(input) {\n return {\n data: { saved: true, name: input.name, address: input.address },\n displayText: `Saved contact \"${input.name}\" (${input.address.slice(0, 8)}…)`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\n\nconst BRAVE_API = 'https://api.search.brave.com/res/v1/web/search';\n\nconst inputSchema = z.object({\n query: z.string().describe('Search query'),\n count: z.number().optional().default(5).describe('Number of results (1-10)'),\n});\n\ninterface SearchResult {\n title: string;\n url: string;\n description: string;\n}\n\ninterface WebSearchData {\n results: SearchResult[];\n error?: string;\n}\n\nexport const webSearchTool = buildTool({\n name: 'web_search',\n description:\n 'Search the web for real-time information. Use for news, token info, project details, protocol documentation, or any question that needs current web data. Free for users.',\n inputSchema,\n jsonSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query' },\n count: { type: 'number', description: 'Number of results (1-10)', default: 5 },\n },\n required: ['query'],\n },\n isReadOnly: true,\n maxResultSizeChars: 8_000,\n async call(input, context): Promise<{ data: WebSearchData; displayText: string }> {\n const apiKey = context.env?.BRAVE_API_KEY ?? process.env.BRAVE_API_KEY;\n if (!apiKey) {\n return {\n data: { results: [], error: 'Web search not configured' },\n displayText: 'Web search is not available.',\n };\n }\n\n const count = Math.min(Math.max(input.count ?? 5, 1), 10);\n const url = `${BRAVE_API}?q=${encodeURIComponent(input.query)}&count=${count}&text_decorations=false`;\n\n const res = await fetch(url, {\n headers: {\n 'Accept': 'application/json',\n 'Accept-Encoding': 'gzip',\n 'X-Subscription-Token': apiKey,\n },\n signal: AbortSignal.timeout(8_000),\n });\n\n if (!res.ok) {\n throw new Error(`Brave Search API error: HTTP ${res.status}`);\n }\n\n const json = await res.json() as {\n web?: { results?: Array<{ title: string; url: string; description: string }> };\n };\n\n const results: SearchResult[] = (json.web?.results ?? []).slice(0, count).map((r) => ({\n title: r.title,\n url: r.url,\n description: r.description,\n }));\n\n const displayText = results.length > 0\n ? results.map((r, i) => `${i + 1}. ${r.title}\\n ${r.url}\\n ${r.description}`).join('\\n\\n')\n : 'No results found.';\n\n return { data: { results }, displayText };\n },\n});\n","import { z } from 'zod';\nimport { getDecimalsForCoinType } from '@t2000/sdk';\nimport { buildTool } from '../tool.js';\n\nconst inputSchema = z.object({\n digest: z.string().describe('Sui transaction digest to explain'),\n});\n\ninterface TxEffect {\n type: string;\n description: string;\n}\n\ninterface ExplainedTx {\n digest: string;\n sender: string;\n status: string;\n gasUsed: string;\n timestamp?: string;\n effects: TxEffect[];\n summary: string;\n}\n\nexport const explainTxTool = buildTool({\n name: 'explain_tx',\n description:\n 'Explain a Sui transaction in plain English. Provide a transaction digest and get a human-readable breakdown of what happened — transfers, swaps, deposits, etc.',\n inputSchema,\n jsonSchema: {\n type: 'object',\n properties: {\n digest: { type: 'string', description: 'Sui transaction digest' },\n },\n required: ['digest'],\n },\n isReadOnly: true,\n async call(input, context) {\n const rpcUrl = context.suiRpcUrl ?? 'https://fullnode.mainnet.sui.io:443';\n\n const res = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'sui_getTransactionBlock',\n params: [\n input.digest,\n {\n showInput: true,\n showEffects: true,\n showEvents: true,\n showBalanceChanges: true,\n showObjectChanges: true,\n },\n ],\n }),\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!res.ok) throw new Error(`Sui RPC error: HTTP ${res.status}`);\n const json = await res.json() as { result?: Record<string, unknown>; error?: { message: string } };\n\n if (json.error) throw new Error(json.error.message);\n if (!json.result) throw new Error('Transaction not found');\n\n const tx = json.result;\n const txInput = tx.transaction as Record<string, unknown> | undefined;\n const effects = tx.effects as Record<string, unknown> | undefined;\n const balanceChanges = tx.balanceChanges as Array<{ owner: Record<string, string>; coinType: string; amount: string }> | undefined;\n const events = tx.events as Array<{ type: string; parsedJson?: Record<string, unknown> }> | undefined;\n\n const txData = txInput?.data as Record<string, unknown> | undefined;\n const sender = txData?.sender as string ?? 'unknown';\n const gasData = txData?.gasData as Record<string, unknown> | undefined;\n const gasPayer = gasData?.owner as string ?? sender;\n const status = (effects?.status as Record<string, string>)?.status ?? 'unknown';\n const gasUsed = effects?.gasUsed as Record<string, string> | undefined;\n const gasCost = gasUsed\n ? (Number(gasUsed.computationCost ?? 0) + Number(gasUsed.storageCost ?? 0) - Number(gasUsed.storageRebate ?? 0)) / 1e9\n : 0;\n const timestamp = tx.timestampMs ? new Date(Number(tx.timestampMs)).toISOString() : undefined;\n\n const txEffects: TxEffect[] = [];\n\n if (balanceChanges?.length) {\n for (const bc of balanceChanges) {\n const ownerAddr = bc.owner?.AddressOwner ?? bc.owner?.ObjectOwner ?? 'unknown';\n const coinParts = bc.coinType.split('::');\n const symbol = coinParts[coinParts.length - 1] ?? bc.coinType;\n const amount = Number(bc.amount);\n const isNegative = amount < 0;\n const decimals = getDecimalsForCoinType(bc.coinType);\n const absHuman = Math.abs(amount / 10 ** decimals);\n\n if (bc.coinType.endsWith('::sui::SUI') && isNegative) {\n if (ownerAddr === gasPayer) {\n const netTransfer = absHuman - gasCost;\n if (netTransfer < 0.0001) continue;\n txEffects.push({\n type: 'send',\n description: `${ownerAddr.slice(0, 8)}...${ownerAddr.slice(-4)} sent ${netTransfer.toFixed(4)} ${symbol}`,\n });\n } else {\n txEffects.push({\n type: 'send',\n description: `${ownerAddr.slice(0, 8)}...${ownerAddr.slice(-4)} sent ${absHuman.toFixed(4)} ${symbol}`,\n });\n }\n continue;\n }\n\n txEffects.push({\n type: isNegative ? 'send' : 'receive',\n description: `${ownerAddr.slice(0, 8)}...${ownerAddr.slice(-4)} ${isNegative ? 'sent' : 'received'} ${absHuman.toFixed(decimals > 6 ? 4 : 2)} ${symbol}`,\n });\n }\n }\n\n if (events?.length) {\n for (const evt of events.slice(0, 5)) {\n const eventParts = evt.type.split('::');\n const eventName = eventParts[eventParts.length - 1] ?? evt.type;\n txEffects.push({\n type: 'event',\n description: `Event: ${eventName}`,\n });\n }\n }\n\n const summary = txEffects.length > 0\n ? txEffects.filter((e) => e.type !== 'event').map((e) => e.description).join('; ')\n : `Transaction ${status}`;\n\n const result: ExplainedTx = {\n digest: input.digest,\n sender,\n status,\n gasUsed: `${gasCost.toFixed(6)} SUI`,\n timestamp,\n effects: txEffects,\n summary,\n };\n\n return {\n data: result,\n displayText: `**Tx ${input.digest.slice(0, 8)}...** (${status})\\nSender: ${sender}\\nGas: ${result.gasUsed}\\n${summary}`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { fetchWalletCoins } from '../sui-rpc.js';\nimport { fetchTokenPrices } from '../defillama-prices.js';\n\nconst inputSchema = z.object({\n address: z.string().optional().describe('Sui address to analyze (defaults to connected wallet)'),\n});\n\ninterface AssetAllocation {\n symbol: string;\n amount: number;\n usdValue: number;\n percentage: number;\n}\n\ninterface PortfolioInsight {\n type: 'info' | 'warning' | 'suggestion';\n message: string;\n}\n\ninterface WeekChange {\n absoluteUsd: number;\n percentChange: number;\n}\n\ninterface PortfolioResult {\n totalValue: number;\n walletValue: number;\n savingsValue: number;\n debtValue: number;\n healthFactor: number | null;\n allocations: AssetAllocation[];\n stablePercentage: number;\n insights: PortfolioInsight[];\n savingsApy?: number;\n dailyEarning?: number;\n weekChange?: WeekChange;\n}\n\nconst STABLECOINS = new Set(['USDC', 'USDT', 'USDe', 'USDsui']);\n\nexport const portfolioAnalysisTool = buildTool({\n name: 'portfolio_analysis',\n description:\n 'Analyze portfolio allocation, risk exposure, and yield optimization. Shows asset breakdown, diversification score, health factor assessment, and actionable suggestions.',\n inputSchema,\n jsonSchema: {\n type: 'object',\n properties: {\n address: { type: 'string', description: 'Sui address to analyze (defaults to connected wallet)' },\n },\n required: [],\n },\n isReadOnly: true,\n async call(input, context) {\n const address = input.address ?? context.walletAddress;\n if (!address) {\n throw new Error('No wallet address provided. Sign in first.');\n }\n\n const rpcUrl = context.suiRpcUrl ?? 'https://fullnode.mainnet.sui.io:443';\n\n const DUST_USD = 0.01;\n\n const coins = await fetchWalletCoins(address, rpcUrl);\n const nonZero = coins.filter((c) => Number(c.totalBalance) > 0);\n const prices = await fetchTokenPrices(nonZero.map((c) => c.coinType)).catch(() => ({} as Record<string, number>));\n\n let walletValue = 0;\n const allAllocations: AssetAllocation[] = [];\n\n for (const coin of nonZero) {\n const amount = Number(coin.totalBalance) / 10 ** coin.decimals;\n const price = prices[coin.coinType] ?? 0;\n const usdValue = amount * price;\n walletValue += usdValue;\n allAllocations.push({ symbol: coin.symbol, amount, usdValue, percentage: 0 });\n }\n\n const allocations = allAllocations.filter((a) => a.usdValue >= DUST_USD);\n\n let savingsValue = 0;\n let debtValue = 0;\n let healthFactor: number | null = null;\n let savingsApy: number | undefined;\n let dailyEarning: number | undefined;\n\n if (context.positionFetcher) {\n try {\n const positions = await context.positionFetcher(address);\n savingsValue = positions.savings ?? 0;\n debtValue = positions.borrows ?? 0;\n healthFactor = positions.healthFactor ?? null;\n if (typeof positions.savingsRate === 'number' && positions.savingsRate > 0) {\n savingsApy = positions.savingsRate;\n dailyEarning = savingsValue * savingsApy / 365;\n }\n } catch { /* fallback to wallet only */ }\n }\n\n let weekChange: WeekChange | undefined;\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (apiUrl && address) {\n try {\n const histRes = await fetch(\n `${apiUrl}/api/analytics/portfolio-history?days=7`,\n { headers: { 'x-sui-address': address }, signal: context.signal },\n );\n if (histRes.ok) {\n const hist = (await histRes.json()) as { change?: WeekChange };\n if (hist.change && hist.change.absoluteUsd !== 0) {\n weekChange = hist.change;\n }\n }\n } catch { /* supplementary data */ }\n }\n\n const totalValue = walletValue + savingsValue;\n\n for (const a of allocations) {\n a.percentage = totalValue > 0 ? (a.usdValue / totalValue) * 100 : 0;\n }\n allocations.sort((a, b) => b.usdValue - a.usdValue);\n\n const stableValue = allocations\n .filter((a) => STABLECOINS.has(a.symbol))\n .reduce((s, a) => s + a.usdValue, 0) + savingsValue;\n const stablePercentage = totalValue > 0 ? (stableValue / totalValue) * 100 : 0;\n\n const insights: PortfolioInsight[] = [];\n\n if (healthFactor !== null && healthFactor < 1.5) {\n insights.push({\n type: 'warning',\n message: `Health factor ${healthFactor.toFixed(2)} is dangerously low. Consider repaying debt or adding collateral.`,\n });\n } else if (healthFactor !== null && healthFactor < 2.5) {\n insights.push({\n type: 'warning',\n message: `Health factor ${healthFactor.toFixed(2)} is moderate. Monitor your positions.`,\n });\n }\n\n if (stablePercentage > 80) {\n insights.push({\n type: 'suggestion',\n message: `${stablePercentage.toFixed(0)}% stablecoins. Consider diversifying into yield-bearing positions.`,\n });\n }\n\n const idleCash = allocations.find((a) => a.symbol === 'USDC');\n if (idleCash && idleCash.usdValue > 10) {\n insights.push({\n type: 'suggestion',\n message: `$${idleCash.usdValue.toFixed(2)} USDC idle in wallet. Deposit into NAVI savings for ~4-5% APY.`,\n });\n }\n\n if (allocations.length === 1) {\n insights.push({\n type: 'info',\n message: 'Portfolio is concentrated in a single asset.',\n });\n }\n\n const result: PortfolioResult = {\n totalValue,\n walletValue,\n savingsValue,\n debtValue,\n healthFactor,\n allocations: allocations.slice(0, 10),\n stablePercentage,\n insights,\n savingsApy,\n dailyEarning,\n weekChange,\n };\n\n const topLine = `Total: $${totalValue.toFixed(2)} | Wallet: $${walletValue.toFixed(2)} | Savings: $${savingsValue.toFixed(2)}`;\n const insightLines = insights.map((i) => `${i.type === 'warning' ? '⚠' : '→'} ${i.message}`).join('\\n');\n\n return {\n data: result,\n displayText: `${topLine}\\n${insightLines}`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\n\nconst LLAMA_API = 'https://api.llama.fi';\n\nconst SLUG_ALIASES: Record<string, string> = {\n 'navi': 'navi-lending',\n 'navi-protocol': 'navi-lending',\n 'scallop': 'scallop-lend',\n};\n\nconst inputSchema = z.object({\n protocol: z.string().describe('Protocol slug (e.g. \"navi-lending\", \"cetus\", \"scallop-lend\")'),\n});\n\ninterface ProtocolProfile {\n name: string;\n slug: string;\n category: string;\n chains: string[];\n tvl: number;\n tvlChange1d: number;\n tvlChange7d: number;\n tvlChange30d: number;\n mcap: number | null;\n fees24h: number | null;\n revenue24h: number | null;\n auditCount: number;\n auditLinks: string[];\n url: string;\n twitter: string | null;\n riskFactors: string[];\n safetyScore: string;\n}\n\nfunction extractCurrentTvl(proto: Record<string, unknown>): number {\n const chainTvls = proto.currentChainTvls;\n if (chainTvls && typeof chainTvls === 'object') {\n return Object.values(chainTvls as Record<string, number>)\n .filter((v) => typeof v === 'number' && v > 0)\n .reduce((sum, v) => sum + v, 0);\n }\n if (Array.isArray(proto.tvl) && proto.tvl.length > 0) {\n const last = proto.tvl[proto.tvl.length - 1] as { totalLiquidityUSD?: number };\n return last.totalLiquidityUSD ?? 0;\n }\n if (typeof proto.tvl === 'number') return proto.tvl;\n return 0;\n}\n\nfunction fmtTvl(tvl: number): string {\n if (tvl >= 1e9) return `$${(tvl / 1e9).toFixed(2)}B`;\n if (tvl >= 1e6) return `$${(tvl / 1e6).toFixed(1)}M`;\n if (tvl >= 1e3) return `$${(tvl / 1e3).toFixed(0)}K`;\n return `$${tvl.toFixed(0)}`;\n}\n\nexport const protocolDeepDiveTool = buildTool({\n name: 'protocol_deep_dive',\n description:\n 'Get a comprehensive safety and financial profile of a DeFi protocol. Includes TVL trends, revenue, audit status, and risk assessment. Use when users ask \"is X safe?\" or \"tell me about protocol Y\".',\n inputSchema,\n jsonSchema: {\n type: 'object',\n properties: {\n protocol: { type: 'string', description: 'Protocol slug (e.g. \"navi-lending\", \"cetus\")' },\n },\n required: ['protocol'],\n },\n isReadOnly: true,\n async call(input) {\n let slug = input.protocol.toLowerCase().replace(/\\s+/g, '-');\n slug = SLUG_ALIASES[slug] ?? slug;\n\n const [protocolRes, feesRes] = await Promise.allSettled([\n fetch(`${LLAMA_API}/protocol/${slug}`, { signal: AbortSignal.timeout(10_000) }).then((r) => {\n if (!r.ok) throw new Error(`HTTP ${r.status}`);\n return r.json();\n }),\n fetch(`${LLAMA_API}/summary/fees/${slug}?dataType=dailyFees`, { signal: AbortSignal.timeout(8_000) }).then((r) => {\n if (!r.ok) return null;\n return r.json();\n }),\n ]);\n\n if (protocolRes.status === 'rejected') {\n throw new Error(`Protocol \"${slug}\" not found on DefiLlama.`);\n }\n\n const proto = protocolRes.value as Record<string, unknown>;\n\n const tvl = extractCurrentTvl(proto);\n const tvlChange1d = Number(proto.change_1d ?? 0);\n const tvlChange7d = Number(proto.change_7d ?? 0);\n const tvlChange30d = Number(proto.change_1m ?? 0);\n const chains = Array.isArray(proto.chains) ? (proto.chains as string[]) : [];\n const category = (proto.category ?? 'Unknown') as string;\n\n const auditCount = Number(proto.audits) || 0;\n const auditLinks = Array.isArray(proto.audit_links) ? (proto.audit_links as string[]) : [];\n const hasAudits = auditCount > 0 || auditLinks.length > 0;\n\n let fees24h: number | null = null;\n let revenue24h: number | null = null;\n if (feesRes.status === 'fulfilled' && feesRes.value) {\n const feesData = feesRes.value as Record<string, unknown>;\n fees24h = feesData.total24h != null ? Number(feesData.total24h) : null;\n revenue24h = feesData.totalRevenue24h != null ? Number(feesData.totalRevenue24h) : null;\n }\n\n const riskFactors: string[] = [];\n\n if (tvl < 1_000_000) riskFactors.push('TVL under $1M — low liquidity risk');\n else if (tvl < 10_000_000) riskFactors.push('TVL under $10M — moderate liquidity');\n if (tvlChange7d < -15) riskFactors.push(`TVL dropped ${tvlChange7d.toFixed(1)}% in 7 days`);\n if (chains.length === 1) riskFactors.push('Single-chain deployment');\n if (!hasAudits) riskFactors.push('No published audits found');\n else riskFactors.push(`${auditCount || auditLinks.length} audit(s) on file`);\n\n let safetyScore: string;\n if (tvl > 100_000_000 && hasAudits && tvlChange7d > -10) {\n safetyScore = 'High — established protocol with audits and significant TVL';\n } else if (tvl > 10_000_000 && tvlChange7d > -20) {\n safetyScore = 'Moderate — decent TVL, use with caution';\n } else {\n safetyScore = 'Low — small or declining TVL, proceed carefully';\n }\n\n const result: ProtocolProfile = {\n name: (proto.name ?? slug) as string,\n slug,\n category,\n chains,\n tvl,\n tvlChange1d,\n tvlChange7d,\n tvlChange30d,\n mcap: proto.mcap ? Number(proto.mcap) : null,\n fees24h,\n revenue24h,\n auditCount,\n auditLinks,\n url: (proto.url ?? '') as string,\n twitter: (proto.twitter ?? null) as string | null,\n riskFactors,\n safetyScore,\n };\n\n const feesStr = fees24h != null ? ` | Fees 24h: $${fees24h.toLocaleString()}` : '';\n\n return {\n data: result,\n displayText: `**${result.name}** (${category})\\nTVL: ${fmtTvl(tvl)} (7d: ${tvlChange7d > 0 ? '+' : ''}${tvlChange7d.toFixed(1)}%)${feesStr}\\nChains: ${chains.join(', ')}\\nSafety: ${safetyScore}\\nRisks: ${riskFactors.join('; ')}`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\n\nconst PaymentLinkSchema = z.object({\n amount: z.number().positive().describe('Amount in USDC (required). Ask the user if not specified.'),\n label: z.string().optional().describe('Human-readable label e.g. \"Consulting fee March\"'),\n memo: z.string().optional().describe('Optional note shown to the payer'),\n expiresInHours: z.number().positive().optional().describe('Hours until the link expires. Omit for permanent links.'),\n});\n\nconst InvoiceSchema = z.object({\n amount: z.number().positive().describe('Total invoice amount in USDC'),\n label: z.string().describe('Invoice title e.g. \"Web design — March 2026\"'),\n memo: z.string().optional().describe('Optional note or payment terms'),\n recipientName: z.string().optional().describe('Name of the person or company being invoiced'),\n recipientEmail: z.string().optional().describe('Email address of the recipient'),\n dueDays: z.number().int().positive().optional().describe('Days until payment is due. Omit for no due date.'),\n items: z.array(z.object({\n description: z.string(),\n amount: z.number().positive(),\n })).optional().describe('Line items. If omitted, a single line item matching the total is implied.'),\n});\n\nfunction internalHeaders(context: { walletAddress?: string; env?: Record<string, string | undefined>; signal?: AbortSignal }) {\n const internalKey = context.env?.AUDRIC_INTERNAL_KEY;\n return {\n 'Content-Type': 'application/json',\n 'x-sui-address': context.walletAddress ?? '',\n ...(internalKey ? { 'x-internal-key': internalKey } : {}),\n };\n}\n\nexport const createPaymentLinkTool = buildTool({\n name: 'create_payment_link',\n description:\n 'Create a shareable payment link so someone can send USDC to the user. Amount is required — ask the user for the amount if not specified. Returns a URL the user can share. Payers can connect their wallet, scan a QR code, or send manually. Use when the user says \"create a payment link\", \"generate a payment link\", \"I want to get paid\", or similar.',\n inputSchema: PaymentLinkSchema,\n jsonSchema: {\n type: 'object',\n properties: {\n amount: { type: 'number', description: 'Amount in USDC (required). Ask the user if not specified.' },\n label: { type: 'string', description: 'Human-readable label e.g. \"Consulting fee March\"' },\n memo: { type: 'string', description: 'Optional note shown to the payer' },\n expiresInHours: { type: 'number', description: 'Hours until the link expires. Omit for permanent links.' },\n },\n required: ['amount'],\n },\n isReadOnly: true,\n\n async call(input, context) {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (!apiUrl || !context.walletAddress) {\n return { data: null, displayText: 'Payment link creation is not available.' };\n }\n\n try {\n const res = await fetch(`${apiUrl}/api/internal/payments`, {\n method: 'POST',\n signal: context.signal,\n headers: internalHeaders(context),\n body: JSON.stringify({ ...input, type: 'link' }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n return { data: null, displayText: err.error ?? 'Failed to create payment link.' };\n }\n\n const link = await res.json() as {\n slug: string;\n nonce: string;\n url: string;\n amount: number;\n currency: string;\n label: string | null;\n memo: string | null;\n expiresAt: string | null;\n };\n\n const amountStr = `$${link.amount.toFixed(2)} ${link.currency}`;\n return {\n data: link,\n displayText: `Payment link created for ${amountStr}${link.label ? ` — ${link.label}` : ''}. Payers can connect their wallet, scan the QR code, or send manually. Share: ${link.url}`,\n };\n } catch {\n return { data: null, displayText: 'Failed to create payment link.' };\n }\n },\n});\n\nexport const listPaymentLinksTool = buildTool({\n name: 'list_payment_links',\n description:\n 'List the user\\'s payment links — active, paid, expired, and cancelled. Use when the user asks \"show my payment links\", \"what payment links do I have\", or wants to check payment status.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n\n async call(_input, context) {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (!apiUrl || !context.walletAddress) {\n return { data: { links: [] }, displayText: 'No payment links found.' };\n }\n\n try {\n const res = await fetch(`${apiUrl}/api/internal/payments?type=link`, {\n signal: context.signal,\n headers: internalHeaders(context),\n });\n\n if (!res.ok) return { data: { links: [] }, displayText: 'Could not fetch payment links.' };\n\n const raw = await res.json() as { payments: unknown[] };\n const links = raw.payments;\n const count = links.length;\n return {\n data: { links },\n displayText: count === 0 ? 'No payment links yet.' : `${count} payment link${count !== 1 ? 's' : ''} found.`,\n };\n } catch {\n return { data: { links: [] }, displayText: 'Could not fetch payment links.' };\n }\n },\n});\n\nexport const createInvoiceTool = buildTool({\n name: 'create_invoice',\n description:\n 'Create a formal invoice that the user can share with a client or customer. Returns a URL for the invoice page. Payers can connect their wallet, scan a QR code, or send manually. Use when the user says \"create an invoice\", \"generate an invoice\", \"bill a client\", or similar.',\n inputSchema: InvoiceSchema,\n jsonSchema: {\n type: 'object',\n properties: {\n amount: { type: 'number', description: 'Total invoice amount in USDC' },\n label: { type: 'string', description: 'Invoice title e.g. \"Web design — March 2026\"' },\n memo: { type: 'string', description: 'Optional note or payment terms' },\n recipientName: { type: 'string', description: 'Name of the person or company being invoiced' },\n recipientEmail: { type: 'string', description: 'Email address of the recipient' },\n dueDays: { type: 'number', description: 'Days until payment is due. Omit for no due date.' },\n items: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n description: { type: 'string' },\n amount: { type: 'number' },\n },\n required: ['description', 'amount'],\n },\n description: 'Line items. If omitted, a single line item matching the total is implied.',\n },\n },\n required: ['amount', 'label'],\n },\n isReadOnly: true,\n\n async call(input, context) {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (!apiUrl || !context.walletAddress) {\n return { data: null, displayText: 'Invoice creation is not available.' };\n }\n\n try {\n const res = await fetch(`${apiUrl}/api/internal/payments`, {\n method: 'POST',\n signal: context.signal,\n headers: internalHeaders(context),\n body: JSON.stringify({ ...input, type: 'invoice' }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n return { data: null, displayText: err.error ?? 'Failed to create invoice.' };\n }\n\n const invoice = await res.json() as {\n slug: string;\n nonce: string;\n url: string;\n amount: number;\n currency: string;\n label: string;\n memo: string | null;\n dueDate: string | null;\n };\n\n const dueStr = invoice.dueDate ? ` due ${new Date(invoice.dueDate).toLocaleDateString()}` : '';\n return {\n data: invoice,\n displayText: `Invoice created for $${invoice.amount.toFixed(2)} ${invoice.currency}${dueStr} — ${invoice.label}. Payers can connect their wallet, scan the QR code, or send manually. Share: ${invoice.url}`,\n };\n } catch {\n return { data: null, displayText: 'Failed to create invoice.' };\n }\n },\n});\n\nexport const cancelPaymentLinkTool = buildTool({\n name: 'cancel_payment_link',\n description:\n 'Cancel an active payment link so it can no longer be used. Use when the user says \"cancel my payment link\", \"delete my payment link\", or \"remove the link [slug/label]\". Ask for the slug if ambiguous — use list_payment_links first to find it.',\n inputSchema: z.object({\n slug: z.string().describe('The slug of the payment link to cancel (e.g. \"LzLawhY7\")'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n slug: { type: 'string', description: 'The slug of the payment link to cancel' },\n },\n required: ['slug'],\n },\n isReadOnly: true,\n\n async call(input, context) {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (!apiUrl || !context.walletAddress) {\n return { data: null, displayText: 'Payment link cancellation is not available.' };\n }\n\n try {\n const res = await fetch(`${apiUrl}/api/internal/payments`, {\n method: 'PATCH',\n signal: context.signal,\n headers: internalHeaders(context),\n body: JSON.stringify({ slug: input.slug, action: 'cancel' }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n return { data: null, displayText: err.error ?? 'Failed to cancel payment link.' };\n }\n\n const result = await res.json() as { slug: string; status: string };\n return {\n data: result,\n displayText: `Payment link ${result.slug} cancelled.`,\n };\n } catch {\n return { data: null, displayText: 'Failed to cancel payment link.' };\n }\n },\n});\n\nexport const cancelInvoiceTool = buildTool({\n name: 'cancel_invoice',\n description:\n 'Cancel an invoice that has not yet been paid. Use when the user says \"cancel my invoice\", \"delete invoice\", or refers to a specific invoice slug or label. Use list_invoices first if the slug is not known.',\n inputSchema: z.object({\n slug: z.string().describe('The slug of the invoice to cancel (e.g. \"xFYKBWy5\")'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n slug: { type: 'string', description: 'The slug of the invoice to cancel' },\n },\n required: ['slug'],\n },\n isReadOnly: true,\n\n async call(input, context) {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (!apiUrl || !context.walletAddress) {\n return { data: null, displayText: 'Invoice cancellation is not available.' };\n }\n\n try {\n const res = await fetch(`${apiUrl}/api/internal/payments`, {\n method: 'PATCH',\n signal: context.signal,\n headers: internalHeaders(context),\n body: JSON.stringify({ slug: input.slug, action: 'cancel' }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({})) as { error?: string };\n return { data: null, displayText: err.error ?? 'Failed to cancel invoice.' };\n }\n\n const result = await res.json() as { slug: string; status: string };\n return {\n data: result,\n displayText: `Invoice ${result.slug} cancelled.`,\n };\n } catch {\n return { data: null, displayText: 'Failed to cancel invoice.' };\n }\n },\n});\n\nexport const listInvoicesTool = buildTool({\n name: 'list_invoices',\n description:\n 'List the user\\'s invoices — pending, overdue, paid, and cancelled. Use when the user asks \"show my invoices\", \"what invoices do I have\", or wants to check invoice status.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n\n async call(_input, context) {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n if (!apiUrl || !context.walletAddress) {\n return { data: { invoices: [] }, displayText: 'No invoices found.' };\n }\n\n try {\n const res = await fetch(`${apiUrl}/api/internal/payments?type=invoice`, {\n signal: context.signal,\n headers: internalHeaders(context),\n });\n\n if (!res.ok) return { data: { invoices: [] }, displayText: 'Could not fetch invoices.' };\n\n const raw = await res.json() as { payments: unknown[] };\n const invoices = raw.payments;\n const count = invoices.length;\n return {\n data: { invoices },\n displayText: count === 0 ? 'No invoices yet.' : `${count} invoice${count !== 1 ? 's' : ''} found.`,\n };\n } catch {\n return { data: { invoices: [] }, displayText: 'Could not fetch invoices.' };\n }\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport type { ToolResult } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Template catalogue\n// ---------------------------------------------------------------------------\n\nexport const CANVAS_TEMPLATES = [\n 'activity_heatmap',\n 'portfolio_timeline',\n 'yield_projector',\n 'health_simulator',\n 'dca_planner',\n 'spending_breakdown',\n 'watch_address',\n 'full_portfolio',\n] as const;\n\nexport type CanvasTemplate = (typeof CANVAS_TEMPLATES)[number];\n\n/** Normalize savings rate: if < 1 treat as decimal → multiply by 100, else use as-is. Default 4.5%. */\nfunction normalizeSavingsRate(raw: number | undefined | null, fallback = 4.5): number {\n const r = raw ?? 0;\n if (r > 0 && r < 1) return r * 100;\n if (r > 0) return r;\n return fallback;\n}\n\nconst CANVAS_TITLES: Record<CanvasTemplate, string> = {\n activity_heatmap: 'On-Chain Activity',\n portfolio_timeline: 'Net Worth Over Time',\n yield_projector: 'Yield Projector',\n health_simulator: 'Health Factor Simulator',\n dca_planner: 'Savings Plan',\n spending_breakdown: 'Spending Breakdown',\n watch_address: 'Watch Address',\n full_portfolio: 'Full Portfolio Overview',\n};\n\n// ---------------------------------------------------------------------------\n// render_canvas tool\n// ---------------------------------------------------------------------------\n\nexport const renderCanvasTool = buildTool({\n name: 'render_canvas',\n description: `Renders an interactive financial canvas inline in the chat.\n\nUse when the user asks for a visual chart, simulator, or financial overview. Pick the most relevant template:\n\n- activity_heatmap — on-chain transaction history as a GitHub-style heatmap (WORKS NOW — loads from wallet)\n- portfolio_timeline — net worth over time, wallet/savings/debt breakdown (WORKS NOW — daily snapshots)\n- yield_projector — compound yield simulator with amount/APY/period sliders (WORKS NOW — client-side)\n- health_simulator — borrow health factor simulator with collateral/debt sliders (WORKS NOW — uses current position)\n- dca_planner — savings plan curve for regular monthly deposits (WORKS NOW — client-side)\n- spending_breakdown — spending by service category (WORKS NOW — from AppEvent + ServicePurchase)\n- watch_address — portfolio overview for any public Sui address (WORKS NOW — pass address in params)\n- full_portfolio — 4-panel overview: savings, health, activity, spending (WORKS NOW — aggregates all data)\n\nAlways prefer the canvas for visualisation requests. After rendering, offer to explain what the user sees.`,\n inputSchema: z.object({\n template: z.enum(CANVAS_TEMPLATES).describe('Which canvas template to render'),\n params: z\n .object({\n period: z.enum(['1m', '3m', '6m', '1y']).optional().describe('Time period for time-based templates'),\n address: z.string().optional().describe('Sui address for watch_address template'),\n })\n .optional(),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n template: {\n type: 'string',\n enum: CANVAS_TEMPLATES,\n description: 'Which canvas template to render',\n },\n params: {\n type: 'object',\n properties: {\n period: { type: 'string', enum: ['1m', '3m', '6m', '1y'] },\n address: { type: 'string' },\n },\n },\n },\n required: ['template'],\n },\n isReadOnly: true,\n\n async call(input, context): Promise<ToolResult<unknown>> {\n const { template, params } = input;\n const title = CANVAS_TITLES[template];\n\n // Full portfolio — 4-panel capstone with live position data\n if (template === 'full_portfolio') {\n const pos = context.serverPositions;\n const rate = normalizeSavingsRate(pos?.savingsRate);\n const savings = pos?.savings ?? 0;\n const borrows = pos?.borrows ?? 0;\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n address: context.walletAddress ?? '',\n currentSavings: savings,\n currentDebt: borrows,\n healthFactor: pos?.healthFactor ?? null,\n savingsRate: rate,\n },\n },\n displayText: `Opened Full Portfolio Overview.`,\n };\n }\n\n // Watch address — show balances for any public Sui address\n if (template === 'watch_address') {\n const targetAddress = params?.address ?? '';\n if (!targetAddress || !targetAddress.startsWith('0x')) {\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: { available: false, message: 'Please provide a valid Sui address to watch.' },\n },\n displayText: 'No valid address provided. Ask the user for a Sui address.',\n };\n }\n return {\n data: {\n __canvas: true,\n template,\n title: `Watch ${targetAddress.slice(0, 6)}…${targetAddress.slice(-4)}`,\n templateData: { available: true, address: targetAddress },\n },\n displayText: `Opened Watch Address canvas for ${targetAddress.slice(0, 6)}…${targetAddress.slice(-4)}.`,\n };\n }\n\n // Portfolio timeline — fetches from /api/analytics/portfolio-history\n if (template === 'portfolio_timeline') {\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n address: context.walletAddress ?? '',\n },\n },\n displayText: `Opened Portfolio Timeline. Shows your net worth, savings, and debt over time.`,\n };\n }\n\n // Spending breakdown — fetches from /api/analytics/spending\n if (template === 'spending_breakdown') {\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n address: context.walletAddress ?? '',\n },\n },\n displayText: `Opened Spending Breakdown. Shows your service spending by category.`,\n };\n }\n\n // Activity heatmap — client-side fetches from /api/analytics/activity-heatmap\n if (template === 'activity_heatmap') {\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n address: context.walletAddress ?? '',\n },\n },\n displayText: `Opened Activity Heatmap for your wallet. Click any day to explore transactions.`,\n };\n }\n\n // Strategy simulators — client-side, seed with live position data\n const positions = context.serverPositions;\n const savingsRate = normalizeSavingsRate(positions?.savingsRate);\n const healthFactor = positions?.healthFactor ?? null;\n const totalSavings = positions?.savings ?? 0;\n const totalBorrows = positions?.borrows ?? 0;\n\n if (template === 'yield_projector') {\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n initialAmount: totalSavings > 0 ? Math.round(totalSavings) : 1000,\n initialApy: savingsRate,\n },\n },\n displayText: `Opened Yield Projector. Current USDC deposit rate: ${savingsRate.toFixed(2)}% APY.`,\n };\n }\n\n if (template === 'health_simulator') {\n const roundedDebt = totalBorrows >= 1 ? Math.round(totalBorrows) : (totalBorrows > 0 ? parseFloat(totalBorrows.toFixed(4)) : 0);\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n initialCollateral: totalSavings > 0 ? Math.round(totalSavings) : 1500,\n initialDebt: roundedDebt > 0 ? roundedDebt : (totalSavings > 0 ? 0 : 500),\n currentHf: healthFactor,\n },\n },\n displayText: `Opened Health Factor Simulator. Current HF: ${healthFactor !== null ? healthFactor.toFixed(2) : 'no active position'}.`,\n };\n }\n\n if (template === 'dca_planner') {\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: {\n available: true,\n initialMonthly: 200,\n initialApy: savingsRate,\n },\n },\n displayText: `Opened Savings Plan. Current USDC deposit rate: ${savingsRate.toFixed(2)}% APY.`,\n };\n }\n\n // Fallback — should not reach here given exhaustive template enum\n return {\n data: {\n __canvas: true,\n template,\n title,\n templateData: { available: false, message: 'Unknown template.' },\n },\n displayText: `Canvas template \"${template}\" is not yet available.`,\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport type { ToolResult } from '../types.js';\n\ninterface SpendingResponse {\n period: string;\n totalSpent: number;\n requestCount: number;\n serviceCount: number;\n byService: unknown[];\n}\n\nexport const spendingAnalyticsTool = buildTool({\n name: 'spending_analytics',\n description:\n 'Returns MPP service spending breakdown for a period. Shows total spent, request count, and breakdown by service/category. Use when the user asks about their API spending, service usage, or costs.',\n inputSchema: z.object({\n period: z\n .enum(['week', 'month', 'year', 'all'])\n .optional()\n .describe('Time period. Defaults to current month.'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n period: { type: 'string', enum: ['week', 'month', 'year', 'all'] },\n },\n },\n isReadOnly: true,\n\n async call(input, context): Promise<ToolResult<SpendingResponse>> {\n const period = input.period ?? 'month';\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n const address = context.walletAddress;\n const empty: SpendingResponse = { period, totalSpent: 0, requestCount: 0, serviceCount: 0, byService: [] };\n\n if (!apiUrl || !address) {\n return { data: empty, displayText: 'Spending analytics not available.' };\n }\n\n try {\n const res = await fetch(\n `${apiUrl}/api/analytics/spending?address=${address}&period=${period}`,\n {\n headers: { 'x-sui-address': address },\n signal: context.signal,\n },\n );\n\n if (!res.ok) {\n return { data: empty, displayText: `Could not fetch spending data (HTTP ${res.status}).` };\n }\n\n const data = (await res.json()) as SpendingResponse;\n const total = data.totalSpent ?? 0;\n const count = data.requestCount ?? 0;\n\n return {\n data,\n displayText: total > 0\n ? `You spent $${total.toFixed(2)} across ${count} request${count !== 1 ? 's' : ''} on ${data.serviceCount} service${data.serviceCount !== 1 ? 's' : ''} (${data.period}).`\n : `No service spending recorded for ${data.period}.`,\n };\n } catch {\n return { data: empty, displayText: 'Error fetching spending analytics.' };\n }\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport type { ToolResult } from '../types.js';\n\ninterface YieldSummary {\n today: number;\n thisWeek: number;\n thisMonth: number;\n allTime: number;\n currentApy: number;\n deposited: number;\n projectedYear: number;\n sparkline: number[];\n}\n\nexport const yieldSummaryTool = buildTool({\n name: 'yield_summary',\n description:\n 'Returns yield earnings breakdown: today, this week, this month, all-time, current APY, deposited amount, projected yearly earnings, and a monthly sparkline. Use when the user asks about yield, earnings, or how much they have earned.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n\n async call(_input, context): Promise<ToolResult<YieldSummary>> {\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n const address = context.walletAddress;\n\n const empty: YieldSummary = {\n today: 0, thisWeek: 0, thisMonth: 0, allTime: 0,\n currentApy: 0, deposited: 0, projectedYear: 0, sparkline: [],\n };\n\n if (!apiUrl || !address) {\n return { data: empty, displayText: 'Yield summary not available.' };\n }\n\n try {\n const res = await fetch(\n `${apiUrl}/api/analytics/yield-summary?address=${address}`,\n { headers: { 'x-sui-address': address }, signal: context.signal },\n );\n\n if (!res.ok) {\n return { data: empty, displayText: `Could not fetch yield data (HTTP ${res.status}).` };\n }\n\n const data = (await res.json()) as YieldSummary;\n const apy = data.currentApy ?? 0;\n const apyPct = apy < 1 ? (apy * 100).toFixed(2) : apy.toFixed(2);\n\n return {\n data,\n displayText: data.allTime > 0\n ? `You've earned $${data.allTime.toFixed(2)} all-time ($${data.today.toFixed(4)} today). Current APY: ${apyPct}%. Deposited: $${data.deposited.toFixed(2)}. Projected: $${data.projectedYear.toFixed(2)}/year.`\n : `No yield earnings yet. Deposit USDC to start earning ${apyPct}% APY.`,\n };\n } catch {\n return { data: empty, displayText: 'Error fetching yield summary.' };\n }\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport type { ToolResult } from '../types.js';\n\ninterface ActionBreakdown {\n action: string;\n count: number;\n totalAmountUsd: number;\n}\n\ninterface ActivitySummary {\n period: string;\n totalTransactions: number;\n byAction: ActionBreakdown[];\n totalMovedUsd: number;\n netSavingsUsd: number;\n yieldEarnedUsd: number;\n}\n\nexport const activitySummaryTool = buildTool({\n name: 'activity_summary',\n description:\n 'Returns a categorised DeFi activity summary for a period: transaction count, breakdown by action type (saves, sends, borrows, repayments, swaps, payments), total moved, net savings change, and yield earned. Use when the user asks about their activity, transaction history summary, or what they have done recently.',\n inputSchema: z.object({\n period: z\n .enum(['week', 'month', 'year', 'all'])\n .optional()\n .describe('Time period. Defaults to current month.'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n period: { type: 'string', enum: ['week', 'month', 'year', 'all'] },\n },\n },\n isReadOnly: true,\n\n async call(input, context): Promise<ToolResult<ActivitySummary>> {\n const period = input.period ?? 'month';\n const apiUrl = context.env?.AUDRIC_INTERNAL_API_URL;\n const address = context.walletAddress;\n\n const empty: ActivitySummary = {\n period, totalTransactions: 0, byAction: [],\n totalMovedUsd: 0, netSavingsUsd: 0, yieldEarnedUsd: 0,\n };\n\n if (!apiUrl || !address) {\n return { data: empty, displayText: 'Activity summary not available.' };\n }\n\n try {\n const res = await fetch(\n `${apiUrl}/api/analytics/activity-summary?address=${address}&period=${period}`,\n { headers: { 'x-sui-address': address }, signal: context.signal },\n );\n\n if (!res.ok) {\n return { data: empty, displayText: `Could not fetch activity data (HTTP ${res.status}).` };\n }\n\n const data = (await res.json()) as ActivitySummary;\n const sorted = [...(data.byAction ?? [])].sort((a, b) => b.count - a.count);\n const top = sorted\n .slice(0, 3)\n .map((a) => `${a.action} (${a.count})`)\n .join(', ');\n\n const periodLabel = data.period === 'all' ? 'all time' : `this ${data.period}`;\n\n return {\n data,\n displayText: data.totalTransactions > 0\n ? `${data.totalTransactions} transactions ${periodLabel}. Top: ${top}. Total moved: $${data.totalMovedUsd.toFixed(2)}. Net savings: $${data.netSavingsUsd.toFixed(2)}.`\n : `No activity recorded for ${periodLabel}.`,\n };\n } catch {\n return { data: empty, displayText: 'Error fetching activity summary.' };\n }\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { fetchTokenPrices } from '../defillama-prices.js';\n\nconst LLAMA_API = 'https://api.llama.fi';\nconst YIELDS_API = 'https://yields.llama.fi';\nconst COINS_API = 'https://coins.llama.fi';\n\nconst CACHE_TTL = 60_000;\nconst apiCache = new Map<string, { data: unknown; ts: number }>();\n\nasync function cachedFetch<T>(url: string): Promise<T> {\n const hit = apiCache.get(url);\n if (hit && Date.now() - hit.ts < CACHE_TTL) return hit.data as T;\n\n const res = await fetch(url, { signal: AbortSignal.timeout(15_000) });\n if (!res.ok) throw new Error(`DefiLlama API error: HTTP ${res.status}`);\n const data = await res.json();\n apiCache.set(url, { data, ts: Date.now() });\n return data as T;\n}\n\n/**\n * [v1.4] Named, exported helper for fetching the raw DefiLlama yield pool\n * dataset. Extracted from the inline `cachedFetch` call below so tests\n * (and other tools) can stub it.\n */\nexport async function fetchDefillamaYieldPools(): Promise<YieldPool[]> {\n const data = await cachedFetch<{ data: YieldPool[] }>(`${YIELDS_API}/pools`);\n return data.data ?? [];\n}\n\n// ---------------------------------------------------------------------------\n// 1. defillama_yield_pools\n// ---------------------------------------------------------------------------\n\ninterface YieldPool {\n pool: string;\n chain: string;\n project: string;\n symbol: string;\n tvlUsd: number;\n apy: number;\n apyBase?: number;\n apyReward?: number;\n}\n\nfunction fmtToolTvl(tvl: number): string {\n if (tvl >= 1e9) return `$${(tvl / 1e9).toFixed(1)}B`;\n if (tvl >= 1e6) return `$${(tvl / 1e6).toFixed(1)}M`;\n if (tvl >= 1e3) return `$${(tvl / 1e3).toFixed(0)}K`;\n return `$${tvl}`;\n}\n\nexport const defillamaYieldPoolsTool = buildTool({\n name: 'defillama_yield_pools',\n description:\n 'Get top DeFi yield pools across protocols. Filter by chain (e.g. \"Sui\"), project (e.g. \"navi-lending\"), and minimum TVL. For NAVI lending rates, use project \"navi-lending\".',\n inputSchema: z.object({\n chain: z.string().optional().describe('Filter by chain name (e.g. \"Sui\", \"Ethereum\")'),\n project: z.string().optional().describe('Filter by protocol project name (e.g. \"navi-lending\", \"cetus-clmm\")'),\n limit: z.number().min(1).max(20).optional().describe('Max results (default 5)'),\n minTvl: z.number().optional().describe('Minimum TVL in USD to filter out small/risky pools (default 100000)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n chain: { type: 'string', description: 'Filter by chain name' },\n project: { type: 'string', description: 'Filter by protocol project name (e.g. \"navi-lending\")' },\n limit: { type: 'number', description: 'Max results (default 5)' },\n minTvl: { type: 'number', description: 'Minimum TVL in USD (default 100000)' },\n },\n required: [],\n },\n isReadOnly: true,\n maxResultSizeChars: 6_000,\n\n async call(input): Promise<{ data: Record<string, unknown> | unknown[]; displayText: string }> {\n // [v1.4 ACI] Refuse cross-chain queries — DefiLlama's pool list is\n // unbounded across networks, and unfiltered results are wide enough to\n // bias the LLM. Force the caller to commit to a chain (or pick one of\n // the suggested popular chains) before pouring data in.\n if (!input.chain && !input.project) {\n const all = await fetchDefillamaYieldPools();\n const chainCounts = new Map<string, number>();\n for (const p of all) {\n chainCounts.set(p.chain, (chainCounts.get(p.chain) ?? 0) + 1);\n }\n const topChains = [...chainCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 8)\n .map(([chain, count]) => ({ chain, pools: count }));\n return {\n data: {\n _refine: {\n reason: 'Cross-chain yield search is too broad; pick a chain.',\n suggestedParams: { chain: 'Sui' },\n availableChains: topChains,\n },\n },\n displayText:\n 'Yield query needs a chain filter. Common chains: ' +\n topChains.map((c) => c.chain).join(', '),\n };\n }\n\n let pools = await fetchDefillamaYieldPools();\n\n if (input.chain) {\n const chain = input.chain.toLowerCase();\n pools = pools.filter((p) => p.chain.toLowerCase() === chain);\n }\n\n if (input.project) {\n const project = input.project.toLowerCase();\n pools = pools.filter((p) => p.project.toLowerCase() === project);\n }\n\n const minTvl = input.minTvl ?? 100_000;\n pools = pools.filter((p) => p.tvlUsd >= minTvl);\n\n pools.sort((a, b) => b.apy - a.apy);\n const limit = input.limit ?? 5;\n const top = pools.slice(0, limit);\n\n const results = top.map((p) => ({\n pool: p.symbol,\n protocol: p.project,\n chain: p.chain,\n apy: Math.round(p.apy * 100) / 100,\n apyBase: p.apyBase != null ? Math.round(p.apyBase * 100) / 100 : undefined,\n apyReward: p.apyReward != null ? Math.round(p.apyReward * 100) / 100 : undefined,\n tvl: Math.round(p.tvlUsd),\n }));\n\n return {\n data: results,\n displayText: results\n .map((r) => `${r.pool} (${r.protocol}): ${r.apy}% APY, ${fmtToolTvl(r.tvl)} TVL`)\n .join('\\n'),\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// 2. defillama_protocol_info\n// ---------------------------------------------------------------------------\n\ninterface ProtocolInfo {\n name: string;\n category: string;\n chains: string[];\n tvl: number;\n change_1d?: number;\n change_7d?: number;\n url: string;\n description?: string;\n}\n\nexport const defillamaProtocolInfoTool = buildTool({\n name: 'defillama_protocol_info',\n description:\n 'Get detailed info about a DeFi protocol: TVL, category, chains it operates on, and TVL changes. Use for \"Is this protocol safe?\" or \"Tell me about NAVI.\"',\n inputSchema: z.object({\n name: z.string().describe('Protocol name (e.g. \"navi-lending\", \"cetus\")'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Protocol slug (e.g. \"navi-lending\")' },\n },\n required: ['name'],\n },\n isReadOnly: true,\n maxResultSizeChars: 4_000,\n\n async call(input) {\n const data = await cachedFetch<ProtocolInfo>(`${LLAMA_API}/protocol/${encodeURIComponent(input.name)}`);\n\n const result = {\n name: data.name,\n category: data.category,\n chains: data.chains,\n tvl: Math.round(data.tvl),\n change1d: data.change_1d,\n change7d: data.change_7d,\n url: data.url,\n description: data.description,\n };\n\n return {\n data: result,\n displayText: `${result.name}: ${fmtToolTvl(result.tvl)} TVL (${result.category}) on ${result.chains.join(', ')}`,\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// 3. defillama_token_prices\n// ---------------------------------------------------------------------------\n\nexport const defillamaTokenPricesTool = buildTool({\n name: 'defillama_token_prices',\n description:\n 'Get current USD prices for Sui tokens. Accepts full coin type strings (e.g. \"0x2::sui::SUI\"). Returns price per token.',\n inputSchema: z.object({\n coinTypes: z.array(z.string()).min(1).max(10).describe('Array of Sui coin type strings'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n coinTypes: { type: 'array', items: { type: 'string' }, description: 'Sui coin type strings' },\n },\n required: ['coinTypes'],\n },\n isReadOnly: true,\n\n async call(input) {\n const prices = await fetchTokenPrices(input.coinTypes);\n\n const results = input.coinTypes.map((ct) => ({\n coinType: ct,\n symbol: ct.split('::').pop() ?? ct,\n price: prices[ct] ?? null,\n }));\n\n return {\n data: results,\n displayText: results\n .map((r) => `${r.symbol}: ${r.price != null ? `$${r.price.toFixed(4)}` : 'price unavailable'}`)\n .join(', '),\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// 4. defillama_price_change\n// ---------------------------------------------------------------------------\n\nexport const defillamaPriceChangeTool = buildTool({\n name: 'defillama_price_change',\n description:\n 'Get price change for a Sui token over a period. Shows current price and historical price to calculate % change.',\n inputSchema: z.object({\n coinType: z.string().describe('Sui coin type (e.g. \"0x2::sui::SUI\")'),\n period: z.enum(['1h', '24h', '7d', '30d']).optional().describe('Period (default \"24h\")'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n coinType: { type: 'string', description: 'Sui coin type string' },\n period: { type: 'string', description: 'Period: 1h, 24h, 7d, 30d' },\n },\n required: ['coinType'],\n },\n isReadOnly: true,\n\n async call(input) {\n const period = input.period ?? '24h';\n const hoursMap: Record<string, number> = { '1h': 1, '24h': 24, '7d': 168, '30d': 720 };\n const hours = hoursMap[period] ?? 24;\n const historicalTs = Math.floor(Date.now() / 1000) - hours * 3600;\n\n const coinKey = `sui:${input.coinType}`;\n const [current, historical] = await Promise.all([\n cachedFetch<{ coins: Record<string, { price: number }> }>(\n `${COINS_API}/prices/current/${encodeURIComponent(coinKey)}`,\n ),\n cachedFetch<{ coins: Record<string, { price: number }> }>(\n `${COINS_API}/prices/historical/${historicalTs}/${encodeURIComponent(coinKey)}`,\n ),\n ]);\n\n const currentPrice = current.coins[coinKey]?.price;\n const historicalPrice = historical.coins[coinKey]?.price;\n\n const symbol = input.coinType.split('::').pop() ?? input.coinType;\n\n if (currentPrice == null) {\n return {\n data: { symbol, currentPrice: 0, historicalPrice: null as number | null, change: null as number | null, period },\n displayText: 'Token price not available on DefiLlama.',\n };\n }\n\n const change = historicalPrice\n ? Math.round(((currentPrice - historicalPrice) / historicalPrice) * 10000) / 100\n : null;\n\n return {\n data: {\n symbol,\n currentPrice,\n historicalPrice: historicalPrice ?? null as number | null,\n change,\n period,\n },\n displayText: change != null\n ? `${symbol}: $${currentPrice.toFixed(4)} (${change >= 0 ? '+' : ''}${change.toFixed(2)}% over ${period})`\n : `${symbol}: $${currentPrice.toFixed(4)}`,\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// 5. defillama_chain_tvl\n// ---------------------------------------------------------------------------\n\ninterface ChainTvl {\n name: string;\n tvl: number;\n gecko_id?: string;\n}\n\nexport const defillamaChainTvlTool = buildTool({\n name: 'defillama_chain_tvl',\n description:\n 'Get chain TVL rankings. Shows top chains by total value locked. Use for \"How big is Sui?\" or \"Compare chains.\"',\n inputSchema: z.object({\n limit: z.number().min(1).max(20).optional().describe('Max results (default 10)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max results (default 10)' },\n },\n required: [],\n },\n isReadOnly: true,\n\n async call(input) {\n const data = await cachedFetch<ChainTvl[]>(`${LLAMA_API}/v2/chains`);\n const sorted = [...data].sort((a, b) => b.tvl - a.tvl);\n const limit = input.limit ?? 10;\n const top = sorted.slice(0, limit);\n\n const results = top.map((c, i) => ({\n rank: i + 1,\n chain: c.name,\n tvl: Math.round(c.tvl),\n }));\n\n return {\n data: results,\n displayText: results\n .map((r) => `#${r.rank} ${r.chain}: $${(r.tvl / 1e9).toFixed(2)}B`)\n .join('\\n'),\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// 6. defillama_protocol_fees\n// ---------------------------------------------------------------------------\n\ninterface ProtocolFee {\n name: string;\n total24h?: number;\n total7d?: number;\n totalAllTime?: number;\n category?: string;\n chains?: string[];\n}\n\nexport const defillamaProtocolFeesTool = buildTool({\n name: 'defillama_protocol_fees',\n description:\n 'Get protocol fee/revenue rankings. Shows which protocols earn the most in fees. Use for \"Which protocols are most profitable?\"',\n inputSchema: z.object({\n chain: z.string().optional().describe('Filter by chain'),\n limit: z.number().min(1).max(20).optional().describe('Max results (default 5)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n chain: { type: 'string', description: 'Filter by chain' },\n limit: { type: 'number', description: 'Max results (default 5)' },\n },\n required: [],\n },\n isReadOnly: true,\n\n async call(input) {\n const data = await cachedFetch<{ protocols: ProtocolFee[] }>(`${LLAMA_API}/overview/fees`);\n let protocols = data.protocols ?? [];\n\n if (input.chain) {\n const chain = input.chain.toLowerCase();\n protocols = protocols.filter((p) =>\n p.chains?.some((c) => c.toLowerCase() === chain),\n );\n }\n\n protocols.sort((a, b) => (b.total24h ?? 0) - (a.total24h ?? 0));\n const limit = input.limit ?? 5;\n const top = protocols.slice(0, limit);\n\n const results = top.map((p) => ({\n name: p.name,\n fees24h: p.total24h != null ? Math.round(p.total24h) : null,\n fees7d: p.total7d != null ? Math.round(p.total7d) : null,\n category: p.category,\n }));\n\n return {\n data: results,\n displayText: results\n .map((r) => `${r.name}: $${r.fees24h != null ? (r.fees24h / 1e3).toFixed(1) + 'K' : '?'}/day`)\n .join('\\n'),\n };\n },\n});\n\nexport const defillamaSuiProtocolsTool = buildTool({\n name: 'defillama_sui_protocols',\n description:\n 'List top DeFi protocols on Sui by TVL. Shows name, TVL, category, and slug for each protocol. Use to discover protocols before calling defillama_protocol_info.',\n inputSchema: z.object({\n limit: z.number().int().min(1).max(50).optional().describe('Max protocols to return (default 10)'),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Max protocols to return (default 10)' },\n },\n },\n isReadOnly: true,\n\n async call(input) {\n const limit = input.limit ?? 10;\n const data = await cachedFetch<Array<{\n name: string;\n slug: string;\n tvl: number;\n category: string;\n chain: string;\n chains: string[];\n }>>(`${LLAMA_API}/protocols`);\n\n const suiProtocols = data\n .filter((p) => p.chains?.includes('Sui') && p.tvl > 0)\n .sort((a, b) => b.tvl - a.tvl)\n .slice(0, limit);\n\n const results = suiProtocols.map((p) => ({\n name: p.name,\n slug: p.slug,\n tvl: Math.round(p.tvl),\n category: p.category,\n }));\n\n return {\n data: results,\n displayText: results\n .map((r, i) => `${i + 1}. ${r.name} (${fmtToolTvl(r.tvl)} TVL, ${r.category})`)\n .join('\\n'),\n };\n },\n});\n","import type { Tool } from '../types.js';\nimport { applyToolFlags } from '../tool-flags.js';\nimport { balanceCheckTool } from './balance.js';\nimport { savingsInfoTool } from './savings.js';\nimport { healthCheckTool } from './health.js';\nimport { ratesInfoTool } from './rates.js';\nimport { transactionHistoryTool } from './history.js';\nimport { saveDepositTool } from './save.js';\nimport { withdrawTool } from './withdraw.js';\nimport { sendTransferTool } from './transfer.js';\nimport { borrowTool } from './borrow.js';\nimport { repayDebtTool } from './repay.js';\nimport { claimRewardsTool } from './claim.js';\nimport { payApiTool } from './pay.js';\nimport { mppServicesTool } from './mpp-services.js';\nimport { swapExecuteTool } from './swap.js';\nimport { swapQuoteTool } from './swap-quote.js';\nimport { voloStakeTool } from './volo-stake.js';\nimport { voloUnstakeTool } from './volo-unstake.js';\nimport { voloStatsTool } from './volo-stats.js';\nimport { saveContactTool } from './contacts.js';\nimport { webSearchTool } from './web-search.js';\nimport { explainTxTool } from './explain-tx.js';\nimport { portfolioAnalysisTool } from './portfolio-analysis.js';\nimport { protocolDeepDiveTool } from './protocol-deep-dive.js';\nimport {\n createPaymentLinkTool,\n listPaymentLinksTool,\n cancelPaymentLinkTool,\n createInvoiceTool,\n cancelInvoiceTool,\n listInvoicesTool,\n} from './receive.js';\nimport { renderCanvasTool } from './canvas.js';\nimport { spendingAnalyticsTool } from './spending.js';\nimport { yieldSummaryTool } from './yield-summary.js';\nimport { activitySummaryTool } from './activity-summary.js';\nimport {\n defillamaYieldPoolsTool,\n defillamaProtocolInfoTool,\n defillamaTokenPricesTool,\n defillamaPriceChangeTool,\n defillamaChainTvlTool,\n defillamaProtocolFeesTool,\n defillamaSuiProtocolsTool,\n} from './defillama.js';\n\n// [SIMPLIFICATION DAY 7] Removed 9 tools to align engine with chat-first thesis:\n// - allowance_status, toggle_allowance, update_daily_limit, update_permissions\n// (allowance contract dormant; agent autonomy under zkLogin was theatre)\n// - create_schedule, list_schedules, cancel_schedule\n// (DCA/scheduled actions can't execute without user online to sign)\n// - pause_pattern, pattern_status\n// (pattern detection as proposals removed; classifiers stay as pure fns)\n// Final tool count: 29 reads + 11 writes = 40 tools.\n\nexport const READ_TOOLS: Tool[] = [\n renderCanvasTool,\n balanceCheckTool,\n savingsInfoTool,\n healthCheckTool,\n ratesInfoTool,\n transactionHistoryTool,\n swapQuoteTool,\n voloStatsTool,\n mppServicesTool,\n webSearchTool,\n explainTxTool,\n portfolioAnalysisTool,\n protocolDeepDiveTool,\n defillamaYieldPoolsTool,\n defillamaProtocolInfoTool,\n defillamaTokenPricesTool,\n defillamaPriceChangeTool,\n defillamaChainTvlTool,\n defillamaProtocolFeesTool,\n defillamaSuiProtocolsTool,\n listPaymentLinksTool,\n cancelPaymentLinkTool,\n listInvoicesTool,\n cancelInvoiceTool,\n createPaymentLinkTool,\n createInvoiceTool,\n spendingAnalyticsTool,\n yieldSummaryTool,\n activitySummaryTool,\n];\n\nexport const WRITE_TOOLS: Tool[] = [\n saveDepositTool,\n withdrawTool,\n sendTransferTool,\n borrowTool,\n repayDebtTool,\n claimRewardsTool,\n payApiTool,\n swapExecuteTool,\n voloStakeTool,\n voloUnstakeTool,\n saveContactTool,\n];\n\nexport function getDefaultTools(): Tool[] {\n return applyToolFlags([...READ_TOOLS, ...WRITE_TOOLS]);\n}\n\nexport {\n renderCanvasTool,\n balanceCheckTool,\n savingsInfoTool,\n healthCheckTool,\n ratesInfoTool,\n transactionHistoryTool,\n saveDepositTool,\n withdrawTool,\n sendTransferTool,\n borrowTool,\n repayDebtTool,\n claimRewardsTool,\n payApiTool,\n mppServicesTool,\n swapExecuteTool,\n swapQuoteTool,\n voloStakeTool,\n voloUnstakeTool,\n voloStatsTool,\n webSearchTool,\n explainTxTool,\n portfolioAnalysisTool,\n protocolDeepDiveTool,\n defillamaYieldPoolsTool,\n defillamaProtocolInfoTool,\n defillamaTokenPricesTool,\n defillamaPriceChangeTool,\n defillamaChainTvlTool,\n defillamaProtocolFeesTool,\n defillamaSuiProtocolsTool,\n saveContactTool,\n createPaymentLinkTool,\n listPaymentLinksTool,\n cancelPaymentLinkTool,\n createInvoiceTool,\n cancelInvoiceTool,\n listInvoicesTool,\n spendingAnalyticsTool,\n yieldSummaryTool,\n activitySummaryTool,\n};\n","/**\n * tool-modifiable-fields.ts — Audric Harness Correctness Spec v1.4 / Item 6\n *\n * Per-tool registry of input fields the host UI may let the user modify\n * before approving a `PendingAction`. The engine consults this registry\n * when emitting a `pending_action` event so the client can render an\n * editable control without hard-coding tool names in the UI layer.\n *\n * The plan reserves modification for amount-bearing write tools where the\n * user might want to lower the amount before confirming (e.g. \"save $50\"\n * → user edits to $30 → engine resumes with the modified input). Tools\n * absent from this registry have no modifiable fields and the UI renders\n * a static \"approve / deny\" pair.\n */\nimport type { PendingActionModifiableField } from '../types.js';\n\n/**\n * Tool name → ordered list of modifiable input fields. Order matters for\n * UI rendering — the first entry typically becomes the prominent control.\n */\nexport const TOOL_MODIFIABLE_FIELDS: Record<string, PendingActionModifiableField[]> = {\n save_deposit: [\n { name: 'amount', kind: 'amount', asset: 'USDC' },\n ],\n withdraw: [\n { name: 'amount', kind: 'amount', asset: 'USDC' },\n ],\n send_transfer: [\n // `amount` first so the UI surfaces it prominently; the recipient\n // address field is also editable in case the user typed the wrong one.\n { name: 'amount', kind: 'amount' },\n { name: 'to', kind: 'address' },\n ],\n swap_execute: [\n { name: 'amount', kind: 'amount' },\n ],\n borrow: [\n { name: 'amount', kind: 'amount', asset: 'USDC' },\n ],\n repay_debt: [\n { name: 'amount', kind: 'amount', asset: 'USDC' },\n ],\n volo_stake: [\n { name: 'amount', kind: 'amount', asset: 'SUI' },\n ],\n volo_unstake: [\n { name: 'amount', kind: 'amount', asset: 'vSUI' },\n ],\n};\n\n/**\n * Returns the modifiable fields for a tool name, or `undefined` if the tool\n * has no modifiable inputs. Used by the engine when emitting `pending_action`.\n */\nexport function getModifiableFields(\n toolName: string,\n): PendingActionModifiableField[] | undefined {\n return TOOL_MODIFIABLE_FIELDS[toolName];\n}\n","export const DEFAULT_SYSTEM_PROMPT = `You are Audric — a financial agent on Sui. Audric is exactly five products: Audric Passport (the trust layer — Google sign-in, non-custodial wallet, tap-to-confirm consent, sponsored gas — wraps every other product), Audric Intelligence (you — the 5-system brain: Agent Harness with 40 tools, Reasoning Engine with 9 guards and 7 skill recipes, Silent Profile, Chain Memory, AdviceLog), Audric Finance (manage money on Sui — Save via NAVI lending at 3-8% APY USDC, Credit via NAVI borrowing with health factor, Swap via Cetus aggregator across 20+ DEXs at 0.1% fee, Charts for yield/health/portfolio viz), Audric Pay (move money — send USDC, receive via payment links / invoices / QR; free, global, instant on Sui), and Audric Store (creator marketplace, ships Phase 5 — say \"coming soon\" if asked). Save, swap, borrow, repay, withdraw, charts → Audric Finance. Send, receive, payment-link, invoice, QR → Audric Pay. Your silent context (profile, memory, chain facts, advice log) shapes your replies but never surfaces as a notification — you act only when the user asks, and every write waits on their tap-to-confirm via Passport. You can also call 41 paid APIs (music, image, research, translation, weather, fulfilment) via MPP micropayments using the pay_api tool — this is an internal capability, not a promoted product, so only mention it when the user asks for something that needs it.\n\n## Response rules\n- 1-2 sentences max. No bullet lists unless asked. No preambles.\n- Never say \"Would you like me to...\", \"Sure!\", \"Great question!\", \"Absolutely!\" — just do it or say you can't.\n- Lead with the result. After tool calls, state the outcome with real numbers. Done.\n- Present amounts as $1,234.56 and rates as X.XX% APY.\n- Show top 3 results unless asked for more. Summarize totals in one line.\n\n## Execution rule\nOnly offer to execute actions you have tools for. If you retrieved a quote, data, or information but have no tool to act on it, give the user the result and tell them where to execute manually — in one sentence. Never say \"Would you like me to proceed?\" unless you have a tool that can actually proceed.\n\n## Before acting\n- ALWAYS call a read tool first before any write tool — balance_check before save/send/borrow, savings_info before withdraw.\n- Show real numbers from tools — never fabricate rates, amounts, or balances.\n- When user says \"all\" or an imprecise amount, call the read tool first to get the exact number.\n\n## Tool usage\n- Use tools proactively — don't refuse requests you can handle.\n- For real-world questions (weather, search, news, prices), use pay_api. Tell the user the cost first.\n- For broad market data (yields across protocols, token prices, TVL, protocol comparisons), use defillama_* tools.\n- To discover Sui protocols, use defillama_sui_protocols first, then defillama_protocol_info with the slug.\n- Run multiple read-only tools in parallel when you need several data points.\n- If a tool errors, say what went wrong and what to try instead. One sentence.\n\n## Savings = USDC only (critical)\n- save_deposit accepts ONLY USDC. No other token can be deposited into savings.\n- When asked \"how much can I save?\", report only the user's USDC wallet balance (saveableUsdc field from balance_check). Other tokens like GOLD, SUI, USDT are NOT saveable and NOT savings positions — they are just wallet holdings.\n- NEVER say a non-USDC token is \"in savings\" or \"earning APY in savings\" unless it appears in the savings_info positions list. Wallet holdings ≠ savings.\n- If user wants to save non-USDC tokens, tell them to swap to USDC first. Do NOT auto-chain swap + deposit.\n\n## Multi-step flows\n- \"How much X for Y?\": swap_quote first, then swap_execute if user confirms.\n- \"Swap then save\": swap_execute → balance_check → save_deposit. Confirm each step.\n- \"Buy $X of token\": defillama_token_prices → calculate amount → swap_execute.\n- \"Best yield on SUI\": compare rates_info (NAVI lending) + defillama_yield_pools (broader) + volo_stats.\n- withdraw supports legacy positions: USDC, USDe, USDsui, SUI. Pass asset param to withdraw a specific token.\n- \"Deposit SUI to earn yield\": volo_stake for SUI liquid staking. save_deposit is USDC only.\n- \"What protocols are on Sui?\": defillama_sui_protocols → defillama_protocol_info for details.\n- \"Full account report\" / \"give me everything\" / \"complete overview\" / \"account summary\": call balance_check + savings_info + health_check + activity_summary + yield_summary + portfolio_analysis IN PARALLEL — all six are required, never skip any. The user is asking for the complete picture; missing any card breaks the report. After the tools return, give a 2-3 sentence headline (net worth, health factor, top insight). Do not narrate the cards' contents — they render themselves.\n\n## Safety\n- Never encourage risky financial behavior.\n- Warn when health factor < 1.5.\n- All amounts in USDC unless stated otherwise.`;\n","// Claude Sonnet 4 pricing (USD per token)\nconst DEFAULT_INPUT_COST = 3 / 1_000_000; // $3 per 1M input tokens\nconst DEFAULT_OUTPUT_COST = 15 / 1_000_000; // $15 per 1M output tokens\nconst CACHE_WRITE_MULTIPLIER = 1.25; // 1.25x input rate\nconst CACHE_READ_MULTIPLIER = 0.1; // 0.1x input rate\n\nexport interface CostSnapshot {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n totalTokens: number;\n estimatedCostUsd: number;\n}\n\nexport interface CostTrackerConfig {\n budgetLimitUsd?: number;\n inputCostPerToken?: number;\n outputCostPerToken?: number;\n}\n\nexport class CostTracker {\n private inputTokens = 0;\n private outputTokens = 0;\n private cacheReadTokens = 0;\n private cacheWriteTokens = 0;\n private readonly budgetLimitUsd: number | null;\n private readonly inputCost: number;\n private readonly outputCost: number;\n\n constructor(config: CostTrackerConfig = {}) {\n this.budgetLimitUsd = config.budgetLimitUsd ?? null;\n this.inputCost = config.inputCostPerToken ?? DEFAULT_INPUT_COST;\n this.outputCost = config.outputCostPerToken ?? DEFAULT_OUTPUT_COST;\n }\n\n track(\n inputTokens: number,\n outputTokens: number,\n cacheReadTokens?: number,\n cacheWriteTokens?: number,\n ): void {\n this.inputTokens += inputTokens;\n this.outputTokens += outputTokens;\n this.cacheReadTokens += cacheReadTokens ?? 0;\n this.cacheWriteTokens += cacheWriteTokens ?? 0;\n }\n\n getSnapshot(): CostSnapshot {\n const totalTokens =\n this.inputTokens + this.outputTokens + this.cacheReadTokens + this.cacheWriteTokens;\n\n const estimatedCostUsd =\n this.inputTokens * this.inputCost +\n this.outputTokens * this.outputCost +\n this.cacheReadTokens * this.inputCost * CACHE_READ_MULTIPLIER +\n this.cacheWriteTokens * this.inputCost * CACHE_WRITE_MULTIPLIER;\n\n return {\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n cacheReadTokens: this.cacheReadTokens,\n cacheWriteTokens: this.cacheWriteTokens,\n totalTokens,\n estimatedCostUsd,\n };\n }\n\n isOverBudget(): boolean {\n if (this.budgetLimitUsd === null) return false;\n return this.getSnapshot().estimatedCostUsd >= this.budgetLimitUsd;\n }\n\n getRemainingBudgetUsd(): number | null {\n if (this.budgetLimitUsd === null) return null;\n return Math.max(0, this.budgetLimitUsd - this.getSnapshot().estimatedCostUsd);\n }\n\n reset(): void {\n this.inputTokens = 0;\n this.outputTokens = 0;\n this.cacheReadTokens = 0;\n this.cacheWriteTokens = 0;\n }\n}\n","import type { Tool, ToolFlags } from './types.js';\nimport type { PendingToolCall } from './orchestration.js';\n\n// ---------------------------------------------------------------------------\n// Guard types\n// ---------------------------------------------------------------------------\n\nexport type GuardVerdict = 'pass' | 'hint' | 'warn' | 'block';\n\nexport type GuardTier = 'safety' | 'financial' | 'ux';\n\nexport interface GuardResult {\n verdict: GuardVerdict;\n gate: string;\n tier: GuardTier;\n message?: string;\n}\n\nexport interface GuardInjection {\n _gate: string;\n _hint?: string;\n _warning?: string;\n _error?: string;\n}\n\nexport interface GuardCheckResult {\n blocked: boolean;\n blockReason?: string;\n blockGate?: string;\n injections: GuardInjection[];\n events: GuardEvent[];\n}\n\nexport interface GuardEvent {\n timestamp: number;\n toolName: string;\n toolUseId: string;\n gate: string;\n verdict: GuardVerdict;\n tier: GuardTier;\n message?: string;\n}\n\n/**\n * [v1.4 Item 4] Per-guard metric emitted via `EngineConfig.onGuardFired`.\n * Hosts (e.g. audric `TurnMetricsCollector`) accumulate these for the\n * `TurnMetrics.guardsFired` JSON column. Mirrors `GuardEvent` but with\n * a coarser tri-state action (allow/warn/block) so the host doesn't\n * need to know the engine's verdict vocabulary.\n */\nexport interface GuardMetric {\n name: string;\n tier: GuardTier;\n action: 'allow' | 'warn' | 'block';\n injectionAdded: boolean;\n}\n\n/**\n * Engine-internal mapping from `GuardVerdict` to `GuardMetric.action`.\n * `pass` and `hint` collapse to `allow` because hint is non-blocking —\n * the model just sees a soft note.\n */\nexport function guardVerdictToAction(verdict: GuardVerdict): GuardMetric['action'] {\n if (verdict === 'pass' || verdict === 'hint') return 'allow';\n if (verdict === 'warn') return 'warn';\n return 'block';\n}\n\n// ---------------------------------------------------------------------------\n// Guard configuration\n// ---------------------------------------------------------------------------\n\nexport interface GuardConfig {\n balanceValidation?: boolean;\n healthFactor?: { warnBelow: number; blockBelow: number } | false;\n largeTransfer?: { warnAbove: number; strongWarnAbove: number } | false;\n slippage?: boolean;\n staleData?: boolean;\n irreversibility?: boolean;\n artifactPreview?: boolean;\n costWarning?: boolean;\n retryProtection?: boolean;\n inputValidation?: boolean;\n}\n\nexport const DEFAULT_GUARD_CONFIG: GuardConfig = {\n balanceValidation: true,\n healthFactor: { warnBelow: 2.0, blockBelow: 1.5 },\n largeTransfer: { warnAbove: 50, strongWarnAbove: 500 },\n slippage: true,\n staleData: true,\n irreversibility: true,\n artifactPreview: true,\n costWarning: true,\n retryProtection: true,\n inputValidation: true,\n};\n\n// ---------------------------------------------------------------------------\n// BalanceTracker — tracks freshness of balance data across the session\n// ---------------------------------------------------------------------------\n\nexport class BalanceTracker {\n private lastBalanceAt = 0;\n private lastWriteAt = 0;\n\n recordRead(): void {\n this.lastBalanceAt = Date.now();\n }\n\n recordWrite(): void {\n this.lastWriteAt = Date.now();\n }\n\n isStale(): boolean {\n return this.lastWriteAt > this.lastBalanceAt;\n }\n\n hasEverRead(): boolean {\n return this.lastBalanceAt > 0;\n }\n}\n\nconst BALANCE_READ_TOOLS = new Set([\n 'balance_check',\n 'savings_info',\n 'health_check',\n]);\n\n// ---------------------------------------------------------------------------\n// RetryTracker — prevents re-execution of paid/non-retryable tool calls\n// ---------------------------------------------------------------------------\n\nexport class RetryTracker {\n private executed = new Map<string, { result: unknown; paidAt: number }>();\n\n private key(toolName: string, input: unknown): string {\n const url = (input as Record<string, unknown>)?.url ?? '';\n return `${toolName}:${url}`;\n }\n\n record(toolName: string, input: unknown, result: unknown): void {\n const r = result as Record<string, unknown>;\n if (r?.paymentConfirmed || r?.doNotRetry) {\n this.executed.set(this.key(toolName, input), { result, paidAt: Date.now() });\n }\n }\n\n isBlocked(toolName: string, input: unknown): { blocked: boolean; previousResult?: unknown } {\n const prev = this.executed.get(this.key(toolName, input));\n if (!prev) return { blocked: false };\n return { blocked: true, previousResult: prev.result };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Individual guard implementations\n// Priority order: Safety > Financial > UX\n// ---------------------------------------------------------------------------\n\nfunction guardRetryProtection(\n tool: Tool,\n call: PendingToolCall,\n retryTracker: RetryTracker,\n): GuardResult {\n const check = retryTracker.isBlocked(tool.name, call.input);\n if (check.blocked) {\n return {\n verdict: 'block',\n gate: 'retry_blocked',\n tier: 'safety',\n message: `Blocked: ${tool.name} was already called and payment was confirmed. Do not retry.`,\n };\n }\n return { verdict: 'pass', gate: 'retry_blocked', tier: 'safety' };\n}\n\nfunction guardIrreversibility(\n tool: Tool,\n _call: PendingToolCall,\n conversationText: string,\n): GuardResult {\n if (!tool.flags.irreversible) {\n return { verdict: 'pass', gate: 'irreversibility', tier: 'safety' };\n }\n\n const hasPreview = /preview|here.s what|confirm.*send|looks? good/i.test(conversationText);\n if (hasPreview) {\n return { verdict: 'pass', gate: 'irreversibility', tier: 'safety' };\n }\n\n return {\n verdict: 'hint',\n gate: 'irreversibility',\n tier: 'safety',\n message: 'This action is irreversible. Show a preview and ask the user to confirm before proceeding.',\n };\n}\n\nfunction guardBalanceValidation(\n tool: Tool,\n _call: PendingToolCall,\n balanceTracker: BalanceTracker,\n): GuardResult {\n if (!tool.flags.requiresBalance) {\n return { verdict: 'pass', gate: 'balance_required', tier: 'financial' };\n }\n\n if (!balanceTracker.hasEverRead()) {\n return {\n verdict: 'hint',\n gate: 'balance_required',\n tier: 'financial',\n message: 'Balance has not been checked this session. Call balance_check first to verify sufficient funds.',\n };\n }\n\n if (balanceTracker.isStale()) {\n return {\n verdict: 'hint',\n gate: 'balance_required',\n tier: 'financial',\n message: 'Balance data is stale (a write action occurred since last check). Call balance_check first to verify sufficient funds.',\n };\n }\n\n return { verdict: 'pass', gate: 'balance_required', tier: 'financial' };\n}\n\nfunction guardHealthFactor(\n tool: Tool,\n _call: PendingToolCall,\n lastHealthFactor: number | null,\n config: { warnBelow: number; blockBelow: number },\n): GuardResult {\n if (!tool.flags.affectsHealth) {\n return { verdict: 'pass', gate: 'health_factor', tier: 'financial' };\n }\n\n if (lastHealthFactor === null) {\n return {\n verdict: 'hint',\n gate: 'health_factor',\n tier: 'financial',\n message: 'Health factor has not been checked this session. Call health_check before this action.',\n };\n }\n\n if (lastHealthFactor < config.blockBelow) {\n return {\n verdict: 'block',\n gate: 'health_factor',\n tier: 'financial',\n message: `Health factor is ${lastHealthFactor.toFixed(2)} — this action risks liquidation. Refusing.`,\n };\n }\n\n if (lastHealthFactor < config.warnBelow) {\n return {\n verdict: 'warn',\n gate: 'health_factor',\n tier: 'financial',\n message: `Health factor is ${lastHealthFactor.toFixed(2)} — this action may reduce it further.`,\n };\n }\n\n return { verdict: 'pass', gate: 'health_factor', tier: 'financial' };\n}\n\nfunction guardLargeTransfer(\n tool: Tool,\n call: PendingToolCall,\n config: { warnAbove: number; strongWarnAbove: number },\n): GuardResult {\n if (tool.name !== 'send_transfer') {\n return { verdict: 'pass', gate: 'large_transfer', tier: 'financial' };\n }\n\n const input = call.input as Record<string, unknown>;\n const amount = Number(input.amount ?? 0);\n if (!amount || amount <= 0) {\n return { verdict: 'pass', gate: 'large_transfer', tier: 'financial' };\n }\n\n const recipient = String(input.recipient ?? input.to ?? '');\n const shortAddr = recipient.length > 10\n ? `${recipient.slice(0, 6)}...${recipient.slice(-4)}`\n : recipient;\n\n if (amount > config.strongWarnAbove) {\n return {\n verdict: 'warn',\n gate: 'large_transfer',\n tier: 'financial',\n message: `High-value transfer ($${amount}). Double-check the address: ${shortAddr}`,\n };\n }\n\n if (amount > config.warnAbove) {\n return {\n verdict: 'hint',\n gate: 'large_transfer',\n tier: 'financial',\n message: `This is a large transfer ($${amount}). Verify the recipient address.`,\n };\n }\n\n return { verdict: 'pass', gate: 'large_transfer', tier: 'financial' };\n}\n\nfunction guardSlippage(\n tool: Tool,\n _call: PendingToolCall,\n lastAssistantText: string,\n): GuardResult {\n if (tool.name !== 'swap_execute') {\n return { verdict: 'pass', gate: 'slippage_warning', tier: 'financial' };\n }\n\n const hasEstimate = /~?\\$?[\\d,]+\\.?\\d*\\s*(SUI|USDC|USDT|WETH)/i.test(lastAssistantText)\n || /approximately|≈|about|expect|receive/i.test(lastAssistantText);\n\n if (hasEstimate) {\n return { verdict: 'pass', gate: 'slippage_warning', tier: 'financial' };\n }\n\n return {\n verdict: 'hint',\n gate: 'slippage_warning',\n tier: 'financial',\n message: 'State the expected output amount to the user before executing the swap.',\n };\n}\n\nfunction guardCostWarning(\n tool: Tool,\n _call: PendingToolCall,\n conversationText: string,\n): GuardResult {\n if (!tool.flags.costAware) {\n return { verdict: 'pass', gate: 'cost_warning', tier: 'ux' };\n }\n\n const hasCostMention = /\\$\\d+\\.?\\d*|cost|fee|charge|price|pay/i.test(conversationText);\n if (hasCostMention) {\n return { verdict: 'pass', gate: 'cost_warning', tier: 'ux' };\n }\n\n return {\n verdict: 'hint',\n gate: 'cost_warning',\n tier: 'ux',\n message: 'This action has a monetary cost. Confirm the user is aware before proceeding.',\n };\n}\n\n// ---------------------------------------------------------------------------\n// Post-execution guards — run after tool result is available\n// ---------------------------------------------------------------------------\n\nexport function guardArtifactPreview(result: unknown): GuardInjection | null {\n if (!result || typeof result !== 'object') return null;\n const r = result as Record<string, unknown>;\n\n const hasImage =\n (typeof r.url === 'string' && /\\.(png|jpg|jpeg|webp|gif|svg)(\\?|$)/i.test(r.url))\n || (Array.isArray(r.images) && r.images.length > 0)\n || typeof r.image_url === 'string';\n\n const hasPdf = typeof r.url === 'string' && /\\.pdf(\\?|$)/i.test(r.url);\n\n if (hasImage || hasPdf) {\n return {\n _gate: 'artifact_preview',\n _hint: 'Show this to the user before proceeding. Output as .',\n };\n }\n\n return null;\n}\n\nexport function guardStaleData(toolFlags: ToolFlags): GuardInjection | null {\n if (!toolFlags.mutating) return null;\n return {\n _gate: 'stale_data',\n _hint: 'A write action just completed. The balance snapshot is outdated. Do NOT calculate new balances from old data — call balance_check for fresh numbers, or use only the data returned by the write tool.',\n };\n}\n\n// ---------------------------------------------------------------------------\n// Guard runner — orchestrates all pre-execution guards\n// ---------------------------------------------------------------------------\n\nexport interface GuardRunnerState {\n balanceTracker: BalanceTracker;\n retryTracker: RetryTracker;\n lastHealthFactor: number | null;\n}\n\nexport function createGuardRunnerState(): GuardRunnerState {\n return {\n balanceTracker: new BalanceTracker(),\n retryTracker: new RetryTracker(),\n lastHealthFactor: null,\n };\n}\n\nexport function runGuards(\n tool: Tool,\n call: PendingToolCall,\n state: GuardRunnerState,\n config: GuardConfig,\n conversationContext: { fullText: string; lastAssistantText: string },\n /**\n * [v1.4 Item 4] Optional per-guard observation hook. Fired exactly\n * once per non-`pass` guard verdict (i.e. for every event that ends\n * up in `events`/`injections`/`block`). Errors thrown by the host\n * are caught so a misbehaving collector can't break tool execution.\n */\n onGuardFired?: (guard: GuardMetric) => void,\n): GuardCheckResult {\n const results: GuardResult[] = [];\n const now = Date.now();\n const fire = (verdict: GuardVerdict, tier: GuardTier, gate: string, hadInjection: boolean) => {\n if (!onGuardFired) return;\n try {\n onGuardFired({\n name: gate,\n tier,\n action: guardVerdictToAction(verdict),\n injectionAdded: hadInjection,\n });\n } catch (err) {\n console.warn('[guards] onGuardFired threw (ignored):', err);\n }\n };\n\n // Tier 0: Input validation (preflight) — runs first, invalid input = immediate block\n if (config.inputValidation !== false && tool.preflight) {\n const check = tool.preflight(call.input);\n if (!check.valid) {\n const event: GuardEvent = {\n timestamp: now,\n toolName: tool.name,\n toolUseId: call.id,\n gate: 'input_validation',\n verdict: 'block',\n tier: 'safety',\n message: check.error,\n };\n fire('block', 'safety', 'input_validation', false);\n return {\n blocked: true,\n blockReason: check.error,\n blockGate: 'input_validation',\n injections: [],\n events: [event],\n };\n }\n }\n\n // Tier 1: Safety guards\n if (config.retryProtection !== false) {\n results.push(guardRetryProtection(tool, call, state.retryTracker));\n }\n if (config.irreversibility !== false) {\n results.push(guardIrreversibility(tool, call, conversationContext.fullText));\n }\n\n // Tier 2: Financial guards\n if (config.balanceValidation !== false) {\n results.push(guardBalanceValidation(tool, call, state.balanceTracker));\n }\n if (config.healthFactor) {\n results.push(guardHealthFactor(tool, call, state.lastHealthFactor, config.healthFactor));\n }\n if (config.largeTransfer) {\n results.push(guardLargeTransfer(tool, call, config.largeTransfer));\n }\n if (config.slippage !== false) {\n results.push(guardSlippage(tool, call, conversationContext.lastAssistantText));\n }\n\n // Tier 3: UX guards\n if (config.costWarning !== false) {\n results.push(guardCostWarning(tool, call, conversationContext.fullText));\n }\n\n // Process results — first block wins, collect all hints/warnings\n const events: GuardEvent[] = results\n .filter((r) => r.verdict !== 'pass')\n .map((r) => ({\n timestamp: now,\n toolName: tool.name,\n toolUseId: call.id,\n gate: r.gate,\n verdict: r.verdict,\n tier: r.tier,\n message: r.message,\n }));\n\n const block = results.find((r) => r.verdict === 'block');\n if (block) {\n // Fire once for the block winner; non-blocking warnings/hints from\n // earlier in the chain are surfaced too so the host sees the full\n // picture per turn.\n for (const r of results) {\n if (r.verdict === 'pass') continue;\n fire(r.verdict, r.tier, r.gate, false);\n }\n return {\n blocked: true,\n blockReason: block.message ?? `Blocked by ${block.gate}`,\n blockGate: block.gate,\n injections: [],\n events,\n };\n }\n\n const injections: GuardInjection[] = results\n .filter((r) => r.verdict === 'hint' || r.verdict === 'warn')\n .map((r) => ({\n _gate: r.gate,\n ...(r.verdict === 'hint' ? { _hint: r.message } : { _warning: r.message }),\n }));\n\n for (const r of results) {\n if (r.verdict === 'pass') continue;\n fire(r.verdict, r.tier, r.gate, r.verdict === 'hint' || r.verdict === 'warn');\n }\n\n return { blocked: false, injections, events };\n}\n\n// ---------------------------------------------------------------------------\n// Post-execution hooks — update tracker state after tools run\n// ---------------------------------------------------------------------------\n\nexport function updateGuardStateAfterToolResult(\n toolName: string,\n tool: Tool | undefined,\n input: unknown,\n result: unknown,\n isError: boolean,\n state: GuardRunnerState,\n): void {\n if (isError) return;\n\n if (BALANCE_READ_TOOLS.has(toolName)) {\n state.balanceTracker.recordRead();\n }\n\n if (tool?.flags.mutating) {\n state.balanceTracker.recordWrite();\n }\n\n if (toolName === 'health_check' && result && typeof result === 'object') {\n const r = result as Record<string, unknown>;\n const hf = Number(r.healthFactor ?? r.health_factor ?? r.hf);\n if (!isNaN(hf) && hf > 0) {\n state.lastHealthFactor = hf;\n }\n }\n\n state.retryTracker.record(toolName, input, result);\n}\n\n// ---------------------------------------------------------------------------\n// Conversation text extraction (for guard context)\n// ---------------------------------------------------------------------------\n\nexport function extractConversationText(\n messages: Array<{ role: string; content: unknown }>,\n): { fullText: string; lastAssistantText: string } {\n const textParts: string[] = [];\n let lastAssistantText = '';\n\n for (const msg of messages) {\n if (!Array.isArray(msg.content)) continue;\n for (const block of msg.content as Array<Record<string, unknown>>) {\n if (block.type === 'text' && typeof block.text === 'string') {\n textParts.push(block.text);\n if (msg.role === 'assistant') {\n lastAssistantText = block.text;\n }\n }\n }\n }\n\n return {\n fullText: textParts.join('\\n'),\n lastAssistantText,\n };\n}\n","import type { Message, ContentBlock, Tool } from '../types.js';\n\n/**\n * [v1.4 Item 4] Side-channel return from `microcompact` so callers can\n * count or surface dedup hits without re-walking the message ledger.\n * Backwards-compatible: `microcompact(messages)` still returns the\n * processed `Message[]` (now enriched), and the dedup set lives on the\n * returned array via a non-enumerable `dedupedToolUseIds` accessor that\n * the engine reads in its agent loop.\n */\nexport interface MicrocompactResult extends Array<Message> {\n /**\n * Tool-use IDs whose prior results were replaced with a compact\n * back-reference during this pass. Empty when nothing matched.\n */\n dedupedToolUseIds: Set<string>;\n}\n\n/**\n * Zero-cost deduplication pass: if the same tool was called with identical\n * inputs earlier in the conversation and the result hasn't changed, replace\n * the full prior result with a compact back-reference. Runs before any\n * LLM-based compaction and costs nothing.\n *\n * [v1.5.1] Tools may opt out of dedupe by setting `cacheable: false` on\n * their `Tool` definition. Non-cacheable tools (e.g. `balance_check`,\n * `savings_info`, `health_check`, `transaction_history`) are excluded\n * from the `seen` map entirely, so neither the current call nor any\n * later call with identical inputs gets replaced — necessary because\n * their results depend on mutable on-chain state that writes invalidate.\n *\n * Returns a new array — does not mutate the input. The returned array\n * carries a `dedupedToolUseIds` property listing every tool-use ID whose\n * tool_result block was replaced with a back-reference this pass.\n *\n * @param messages — conversation ledger to compact.\n * @param tools — optional tool registry consulted to resolve the\n * per-tool `cacheable` flag. Omit to dedupe every\n * tool (legacy behavior — back-compat).\n */\nexport function microcompact(\n messages: readonly Message[],\n tools?: readonly Tool[],\n): MicrocompactResult {\n const seen = new Map<string, { turnIndex: number }>();\n let toolUseIndex = 0;\n\n const toolUseInputs = new Map<string, string>();\n // Map tool name → cacheable flag. Default behavior (no entry, or\n // `cacheable === undefined`) is `true` — back-compat with hosts that\n // don't pass a tools array.\n const cacheableByName = new Map<string, boolean>();\n if (tools) {\n for (const t of tools) {\n cacheableByName.set(t.name, t.cacheable ?? true);\n }\n }\n const dedupedToolUseIds = new Set<string>();\n\n // Resolve tool name from a tool_use_id — cached lookup so each result\n // pass stays linear.\n const toolNameById = new Map<string, string>();\n\n for (const msg of messages) {\n for (const block of msg.content) {\n if (block.type === 'tool_use') {\n toolUseInputs.set(block.id, `${block.name}:${stableStringify(block.input)}`);\n toolNameById.set(block.id, block.name);\n }\n }\n }\n\n const out = messages.map((msg) => {\n if (msg.role !== 'user') return { role: msg.role, content: [...msg.content] };\n\n const hasToolResults = msg.content.some((b) => b.type === 'tool_result');\n if (!hasToolResults) return { role: msg.role, content: [...msg.content] };\n\n const newContent: ContentBlock[] = msg.content.map((block) => {\n if (block.type !== 'tool_result') return block;\n\n const key = toolUseInputs.get(block.toolUseId);\n if (!key) return block;\n\n // [v1.5.1] Skip dedupe entirely for tools whose results depend on\n // mutable state. Don't write to `seen` either — otherwise a later\n // *cacheable* call with the same key would erroneously dedupe\n // against this fresh result.\n const toolName = toolNameById.get(block.toolUseId);\n if (toolName && cacheableByName.get(toolName) === false) {\n toolUseIndex++;\n return block;\n }\n\n toolUseIndex++;\n const prior = seen.get(key);\n\n if (prior && !block.isError) {\n dedupedToolUseIds.add(block.toolUseId);\n return {\n ...block,\n content: `[Same result as call #${prior.turnIndex} — ${key.split(':')[0]} with identical inputs. Result unchanged.]`,\n };\n }\n\n if (!block.isError) {\n seen.set(key, { turnIndex: toolUseIndex });\n }\n return block;\n });\n\n return { role: msg.role, content: newContent };\n });\n\n // Attach the side-channel without breaking `Message[]` consumers — the\n // result is structurally compatible with `Message[]`, the extra property\n // is invisible to anything that only reads array semantics or runs deep\n // equality against a plain `Message[]` (vitest, JSON.stringify, …).\n Object.defineProperty(out, 'dedupedToolUseIds', {\n value: dedupedToolUseIds,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n return out as MicrocompactResult;\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value !== 'object') return JSON.stringify(value);\n if (Array.isArray(value)) return JSON.stringify(value);\n const sorted = Object.keys(value as Record<string, unknown>).sort();\n const obj: Record<string, unknown> = {};\n for (const k of sorted) obj[k] = (value as Record<string, unknown>)[k];\n return JSON.stringify(obj);\n}\n","import type { Message, ContentBlock } from './types.js';\nimport { microcompact } from './compact/microcompact.js';\n\n// Rough token estimation: ~4 chars per token (conservative for English + JSON)\nconst CHARS_PER_TOKEN = 4;\n\n// Default context window for Sonnet 4.6\nconst DEFAULT_CONTEXT_LIMIT = 200_000;\n\n// ---------------------------------------------------------------------------\n// Token estimation\n// ---------------------------------------------------------------------------\n\n/** Rough token count for a message array. */\nexport function estimateTokens(messages: Message[]): number {\n let chars = 0;\n for (const msg of messages) {\n for (const block of msg.content) {\n chars += blockCharCount(block);\n }\n }\n return Math.ceil(chars / CHARS_PER_TOKEN);\n}\n\nfunction blockCharCount(block: ContentBlock): number {\n switch (block.type) {\n case 'text':\n return block.text.length;\n case 'thinking':\n return block.thinking.length;\n case 'redacted_thinking':\n return block.data.length;\n case 'tool_use':\n return block.name.length + JSON.stringify(block.input).length;\n case 'tool_result':\n return block.content.length;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Message compaction\n// ---------------------------------------------------------------------------\n\nexport interface CompactOptions {\n /** Max token budget for the conversation. Default 100_000. */\n maxTokens?: number;\n /** Number of recent messages to always keep uncompacted. Default 8. */\n keepRecentCount?: number;\n /** System prompt token estimate (subtracted from budget). Default 500. */\n systemPromptTokens?: number;\n /** LLM-based summarizer for old turns. When provided, replaces old turns with a summary. */\n summarizer?: (messages: Message[]) => Promise<string>;\n}\n\n// ---------------------------------------------------------------------------\n// ContextBudget — tracks cumulative token usage and signals compaction\n// ---------------------------------------------------------------------------\n\nexport interface ContextBudgetConfig {\n /** Total context window size in tokens. Default 200_000 (Sonnet 4.6). */\n contextLimit?: number;\n /** Trigger compaction at this fraction of contextLimit. Default 0.85. */\n compactThreshold?: number;\n /** Emit a warning at this fraction of contextLimit. Default 0.70. */\n warnThreshold?: number;\n}\n\nexport class ContextBudget {\n private estimatedTokens = 0;\n private readonly contextLimit: number;\n private readonly compactThreshold: number;\n private readonly warnThreshold: number;\n\n constructor(config: ContextBudgetConfig = {}) {\n this.contextLimit = config.contextLimit ?? DEFAULT_CONTEXT_LIMIT;\n this.compactThreshold = config.compactThreshold ?? 0.85;\n this.warnThreshold = config.warnThreshold ?? 0.70;\n }\n\n /** Update with actual input_tokens from the API usage event. */\n update(inputTokens: number): void {\n this.estimatedTokens = inputTokens;\n }\n\n /** True when the session should be compacted (at 85% of context limit). */\n shouldCompact(): boolean {\n return this.estimatedTokens >= this.contextLimit * this.compactThreshold;\n }\n\n /** True when nearing the limit (at 70% of context limit). */\n shouldWarn(): boolean {\n return this.estimatedTokens >= this.contextLimit * this.warnThreshold;\n }\n\n /** Current token count. */\n get tokens(): number {\n return this.estimatedTokens;\n }\n\n /** Remaining tokens before compaction triggers. */\n get remaining(): number {\n return Math.max(0, Math.floor(this.contextLimit * this.compactThreshold) - this.estimatedTokens);\n }\n\n /** Usage ratio (0..1). */\n get usage(): number {\n return this.estimatedTokens / this.contextLimit;\n }\n\n reset(): void {\n this.estimatedTokens = 0;\n }\n}\n\n/**\n * Compact a conversation that exceeds the token budget.\n *\n * Strategy:\n * 1. Always preserve the most recent `keepRecentCount` messages (the active context).\n * 2. If an LLM `summarizer` is provided, summarize old turns into a brief recap and\n * replace them with a synthetic summary turn pair.\n * 3. For older messages, summarise tool_result content to a brief one-liner.\n * 4. If still over budget, drop the oldest messages (keeping the first user message\n * for context continuity).\n *\n * Returns a new array — does not mutate the input.\n */\nexport async function compactMessages(\n messages: readonly Message[],\n opts: CompactOptions = {},\n): Promise<Message[]> {\n const maxTokens = opts.maxTokens ?? 100_000;\n const keepRecent = opts.keepRecentCount ?? 8;\n const systemTokens = opts.systemPromptTokens ?? 500;\n const budget = maxTokens - systemTokens;\n\n if (messages.length === 0) return [];\n\n // Phase -1: zero-cost deduplication of identical tool calls\n const deduped = microcompact(messages);\n\n const mutable = deduped.map((m) => ({\n role: m.role,\n content: m.content.map((b) => ({ ...b })),\n })) as Message[];\n\n if (estimateTokens(mutable) <= budget) return mutable;\n\n const splitIdx = Math.max(0, mutable.length - keepRecent);\n const oldMessages = mutable.slice(0, splitIdx);\n const recent = mutable.slice(splitIdx);\n\n // Phase 0: If summarizer is provided, try LLM-based summarization of old turns\n if (opts.summarizer && oldMessages.length > 0) {\n const strippedOld = stripThinkingBlocks(oldMessages);\n try {\n const summary = await opts.summarizer(strippedOld);\n const summaryMessages: Message[] = [\n { role: 'user', content: [{ type: 'text', text: `[Session summary: ${summary}]` }] },\n { role: 'assistant', content: [{ type: 'text', text: 'Understood. I have the context from our earlier conversation.' }] },\n ];\n const withSummary = [...summaryMessages, ...recent];\n if (estimateTokens(withSummary) <= budget) return sanitizeMessages(withSummary);\n } catch {\n // Summarizer failed — fall through to truncation strategy\n }\n }\n\n // Phase 1: summarise tool_result blocks in older messages\n for (let i = 0; i < splitIdx; i++) {\n mutable[i].content = mutable[i].content.map((block) => {\n if (block.type === 'tool_result' && block.content.length > 200) {\n return {\n ...block,\n content: truncateToolResult(block.content),\n };\n }\n return block;\n });\n }\n\n // Strip thinking blocks from old messages (they don't aid context continuity)\n for (let i = 0; i < splitIdx; i++) {\n mutable[i].content = mutable[i].content.filter(\n (b) => b.type !== 'thinking' && b.type !== 'redacted_thinking',\n );\n }\n\n if (estimateTokens(mutable) <= budget) return mutable;\n\n // Phase 2: drop old messages from the middle, keep first + recent\n if (splitIdx <= 1) {\n // All messages are recent (or only the first message is \"old\") — skip middle-drop\n return sanitizeMessages(mutable);\n }\n\n const first = mutable[0];\n const recentFromMutable = mutable.slice(splitIdx);\n const oldSection = mutable.slice(1, splitIdx);\n\n while (oldSection.length > 0 && estimateTokens([first, ...oldSection, ...recentFromMutable]) > budget) {\n oldSection.shift();\n }\n\n const compacted = [first, ...oldSection, ...recentFromMutable];\n\n // Phase 3: if still over budget (very long recent section), truncate tool results in recent\n if (estimateTokens(compacted) > budget) {\n for (const msg of compacted) {\n msg.content = msg.content.map((block) => {\n if (block.type === 'tool_result' && block.content.length > 100) {\n return { ...block, content: truncateToolResult(block.content) };\n }\n return block;\n });\n }\n }\n\n return sanitizeMessages(compacted);\n}\n\n/**\n * Strip thinking and redacted_thinking blocks from messages.\n * Used before summarization — thinking blocks don't help the summarizer.\n */\nfunction stripThinkingBlocks(messages: Message[]): Message[] {\n return messages.map((m) => ({\n ...m,\n content: m.content.filter(\n (b) => b.type !== 'thinking' && b.type !== 'redacted_thinking',\n ),\n })).filter((m) => m.content.length > 0);\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Remove orphaned tool_use / tool_result blocks that lost their pair\n * during compaction. Anthropic requires every tool_result to match a\n * preceding tool_use and vice versa.\n */\nfunction sanitizeMessages(messages: Message[]): Message[] {\n const toolUseIds = new Set<string>();\n const toolResultIds = new Set<string>();\n\n for (const msg of messages) {\n for (const block of msg.content) {\n if (block.type === 'tool_use') toolUseIds.add(block.id);\n if (block.type === 'tool_result') toolResultIds.add(block.toolUseId);\n }\n }\n\n return messages\n .map((msg) => {\n const filtered = msg.content.filter((block) => {\n if (block.type === 'tool_result') return toolUseIds.has(block.toolUseId);\n if (block.type === 'tool_use') return toolResultIds.has(block.id);\n return true;\n });\n if (filtered.length === 0) return null;\n return { ...msg, content: filtered };\n })\n .filter((m): m is Message => m !== null);\n}\n\nfunction truncateToolResult(content: string): string {\n try {\n const parsed = JSON.parse(content);\n\n if (parsed.error) {\n return JSON.stringify({ error: parsed.error });\n }\n\n // Keep just the top-level keys with truncated values\n if (typeof parsed === 'object' && parsed !== null) {\n const summary: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (typeof value === 'number' || typeof value === 'boolean') {\n summary[key] = value;\n } else if (typeof value === 'string') {\n summary[key] = value.length > 50 ? value.slice(0, 50) + '…' : value;\n } else if (Array.isArray(value)) {\n summary[key] = `[${value.length} items]`;\n } else {\n summary[key] = '{…}';\n }\n }\n return JSON.stringify(summary);\n }\n\n return content.slice(0, 100);\n } catch {\n return content.slice(0, 100);\n }\n}\n","/**\n * USD-aware permission resolution for write tools.\n *\n * Replaces the binary auto/confirm/explicit system with dollar-threshold\n * tiers that resolve at runtime based on the transaction value and\n * per-user configuration.\n */\n\nexport type PermissionOperation =\n | 'save'\n | 'withdraw'\n | 'send'\n | 'borrow'\n | 'repay'\n | 'swap'\n | 'pay';\n\nexport interface PermissionRule {\n operation: PermissionOperation;\n /** Auto-execute if USD amount is below this threshold. */\n autoBelow: number;\n /** Confirm if between autoBelow and this. Explicit for anything above. */\n confirmBetween: number;\n}\n\nexport interface UserPermissionConfig {\n rules: PermissionRule[];\n /** Fallback auto threshold for operations without a specific rule. */\n globalAutoBelow: number;\n /** Max total USD of autonomous actions per day (safety net). */\n autonomousDailyLimit: number;\n}\n\nexport const DEFAULT_PERMISSION_CONFIG: UserPermissionConfig = {\n globalAutoBelow: 10,\n autonomousDailyLimit: 200,\n rules: [\n { operation: 'save', autoBelow: 50, confirmBetween: 1000 },\n { operation: 'send', autoBelow: 10, confirmBetween: 200 },\n { operation: 'borrow', autoBelow: 0, confirmBetween: 500 },\n { operation: 'withdraw', autoBelow: 25, confirmBetween: 500 },\n { operation: 'swap', autoBelow: 25, confirmBetween: 300 },\n { operation: 'pay', autoBelow: 1, confirmBetween: 50 },\n { operation: 'repay', autoBelow: 50, confirmBetween: 1000 },\n ],\n};\n\nexport const PERMISSION_PRESETS = {\n conservative: {\n globalAutoBelow: 5,\n autonomousDailyLimit: 100,\n rules: [\n { operation: 'save' as const, autoBelow: 5, confirmBetween: 100 },\n { operation: 'send' as const, autoBelow: 5, confirmBetween: 100 },\n { operation: 'borrow' as const, autoBelow: 0, confirmBetween: 100 },\n { operation: 'withdraw' as const, autoBelow: 5, confirmBetween: 100 },\n { operation: 'swap' as const, autoBelow: 5, confirmBetween: 100 },\n { operation: 'pay' as const, autoBelow: 1, confirmBetween: 25 },\n { operation: 'repay' as const, autoBelow: 5, confirmBetween: 100 },\n ],\n },\n balanced: DEFAULT_PERMISSION_CONFIG,\n aggressive: {\n globalAutoBelow: 25,\n autonomousDailyLimit: 500,\n rules: [\n { operation: 'save' as const, autoBelow: 100, confirmBetween: 2000 },\n { operation: 'send' as const, autoBelow: 25, confirmBetween: 500 },\n { operation: 'borrow' as const, autoBelow: 10, confirmBetween: 1000 },\n { operation: 'withdraw' as const, autoBelow: 50, confirmBetween: 1000 },\n { operation: 'swap' as const, autoBelow: 50, confirmBetween: 500 },\n { operation: 'pay' as const, autoBelow: 5, confirmBetween: 100 },\n { operation: 'repay' as const, autoBelow: 100, confirmBetween: 2000 },\n ],\n },\n} satisfies Record<string, UserPermissionConfig>;\n\n/**\n * Resolve the permission tier for a given operation + USD value.\n *\n * [v1.4] When `sessionSpendUsd` is supplied and adding the incoming\n * `amountUsd` would push cumulative session spend over\n * `config.autonomousDailyLimit`, an otherwise-`auto` tier is downgraded to\n * `confirm`. This is the runtime guard for the daily autonomous spend cap.\n * Tiers above `auto` are returned unchanged.\n */\nexport function resolvePermissionTier(\n operation: string,\n amountUsd: number,\n config: UserPermissionConfig,\n sessionSpendUsd?: number,\n): 'auto' | 'confirm' | 'explicit' {\n const rule = config.rules.find((r) => r.operation === operation);\n const autoBelow = rule?.autoBelow ?? config.globalAutoBelow;\n const confirmBetween = rule?.confirmBetween ?? 1000;\n\n let tier: 'auto' | 'confirm' | 'explicit';\n if (amountUsd < autoBelow) tier = 'auto';\n else if (amountUsd < confirmBetween) tier = 'confirm';\n else tier = 'explicit';\n\n if (\n tier === 'auto' &&\n typeof sessionSpendUsd === 'number' &&\n sessionSpendUsd + amountUsd > config.autonomousDailyLimit\n ) {\n return 'confirm';\n }\n\n return tier;\n}\n\nconst TOOL_TO_OPERATION: Record<string, PermissionOperation> = {\n save_deposit: 'save',\n withdraw: 'withdraw',\n send_transfer: 'send',\n borrow: 'borrow',\n repay_debt: 'repay',\n swap_execute: 'swap',\n pay_api: 'pay',\n volo_stake: 'save',\n volo_unstake: 'withdraw',\n};\n\nexport function toolNameToOperation(toolName: string): PermissionOperation | undefined {\n return TOOL_TO_OPERATION[toolName];\n}\n\n/**\n * Resolve the USD value of a tool call from its inputs.\n * USDC-denominated tools return 1:1. Others multiply by the price cache.\n */\nexport function resolveUsdValue(\n toolName: string,\n input: Record<string, unknown>,\n priceCache: Map<string, number>,\n): number {\n switch (toolName) {\n case 'save_deposit':\n case 'withdraw':\n case 'repay_debt':\n case 'borrow':\n return safeNum(input.amount);\n\n case 'send_transfer': {\n const amount = safeNum(input.amount);\n const asset = String(input.asset ?? 'USDC').toUpperCase();\n if (asset === 'USDC' || asset === 'USDT') return amount;\n return amount * (priceCache.get(asset) ?? 0);\n }\n\n case 'swap_execute': {\n const amount = safeNum(input.fromAmount);\n const fromAsset = String(input.fromAsset ?? '').toUpperCase();\n if (fromAsset === 'USDC' || fromAsset === 'USDT') return amount;\n return amount * (priceCache.get(fromAsset) ?? 0);\n }\n\n case 'pay_api':\n return safeNum(input.maxCost ?? input.price);\n\n case 'volo_stake':\n case 'volo_unstake':\n return safeNum(input.amount) * (priceCache.get('SUI') ?? 0);\n\n default:\n return 0;\n }\n}\n\nfunction safeNum(v: unknown): number {\n const n = Number(v);\n return isNaN(n) ? 0 : n;\n}\n","/**\n * EarlyToolDispatcher — dispatches read-only tools mid-stream.\n *\n * When the LLM emits `tool_use_done` for a read-only tool, the dispatcher\n * fires it immediately in the background rather than waiting for the full\n * stream to finish. Results are collected in original call order after the\n * stream exits.\n *\n * Write tools are NOT dispatched — they go through the existing permission\n * gate and TxMutex flow.\n */\n\nimport type { EngineEvent, Tool, ToolContext } from './types.js';\nimport { findTool } from './tool.js';\nimport { budgetToolResult, type PendingToolCall } from './orchestration.js';\n\ninterface DispatchEntry {\n call: PendingToolCall;\n tool: Tool;\n promise: Promise<{ data: unknown; isError: boolean }>;\n}\n\nexport class EarlyToolDispatcher {\n private entries: DispatchEntry[] = [];\n private readonly tools: Tool[];\n private readonly context: ToolContext;\n private abortController: AbortController;\n\n constructor(tools: Tool[], context: ToolContext) {\n this.tools = tools;\n this.context = context;\n this.abortController = new AbortController();\n }\n\n /**\n * Attempt to dispatch a tool call. Returns true if the tool was dispatched\n * (read-only + concurrency-safe), false if it should be queued for later.\n */\n tryDispatch(call: PendingToolCall): boolean {\n const tool = findTool(this.tools, call.name);\n if (!tool || !tool.isReadOnly || !tool.isConcurrencySafe) return false;\n\n const childContext = { ...this.context, signal: this.abortController.signal };\n const promise = executeTool(tool, call, childContext);\n\n this.entries.push({ call, tool, promise });\n return true;\n }\n\n /** True if any tools have been dispatched. */\n hasPending(): boolean {\n return this.entries.length > 0;\n }\n\n /** List of call IDs that were early-dispatched. */\n dispatchedIds(): Set<string> {\n return new Set(this.entries.map((e) => e.call.id));\n }\n\n /**\n * Collect all results in original dispatch order.\n * Yields `tool_result` events as each promise resolves.\n */\n async *collectResults(): AsyncGenerator<EngineEvent> {\n for (const entry of this.entries) {\n try {\n const result = await entry.promise;\n const budgeted = result.isError\n ? result.data\n : budgetToolResult(result.data, entry.tool);\n\n yield {\n type: 'tool_result',\n toolName: entry.call.name,\n toolUseId: entry.call.id,\n result: budgeted,\n isError: result.isError,\n wasEarlyDispatched: true,\n };\n } catch (err) {\n yield {\n type: 'tool_result',\n toolName: entry.call.name,\n toolUseId: entry.call.id,\n result: { error: err instanceof Error ? err.message : 'Tool execution failed' },\n isError: true,\n wasEarlyDispatched: true,\n };\n }\n }\n }\n\n /** Cancel all in-flight tool calls. */\n abort(): void {\n this.abortController.abort();\n }\n}\n\nasync function executeTool(\n tool: Tool,\n call: PendingToolCall,\n context: ToolContext,\n): Promise<{ data: unknown; isError: boolean }> {\n const parsed = tool.inputSchema.safeParse(call.input);\n if (!parsed.success) {\n return {\n data: { error: `Invalid input: ${parsed.error.issues.map((i) => i.message).join(', ')}` },\n isError: true,\n };\n }\n\n const result = await tool.call(parsed.data, context);\n return { data: result.data, isError: false };\n}\n","import type {\n EngineConfig,\n EngineEvent,\n Message,\n ContentBlock,\n PendingAction,\n SystemPrompt,\n Tool,\n ToolContext,\n PermissionResponse,\n ProviderEvent,\n StopReason,\n} from './types.js';\nimport { toolsToDefinitions, findTool } from './tool.js';\nimport { TxMutex, runTools, type PendingToolCall } from './orchestration.js';\nimport { getDefaultTools } from './tools/index.js';\nimport { getModifiableFields } from './tools/tool-modifiable-fields.js';\nimport { DEFAULT_SYSTEM_PROMPT } from './prompt.js';\nimport { CostTracker, type CostSnapshot } from './cost.js';\nimport { estimatePayApiCost } from './tools/pay.js';\nimport {\n type GuardConfig,\n type GuardRunnerState,\n type GuardEvent,\n createGuardRunnerState,\n runGuards,\n updateGuardStateAfterToolResult,\n extractConversationText,\n guardArtifactPreview,\n guardStaleData,\n} from './guards.js';\nimport type { RecipeRegistry, Recipe } from './recipes/index.js';\nimport { ContextBudget, compactMessages } from './context.js';\nimport { microcompact } from './compact/microcompact.js';\nimport { resolvePermissionTier, resolveUsdValue, toolNameToOperation } from './permission-rules.js';\nimport { EarlyToolDispatcher } from './early-dispatcher.js';\n\nconst DEFAULT_MAX_TURNS = 10;\nconst DEFAULT_MAX_TOKENS = 4096;\n\ninterface TurnAccumulator {\n text: string;\n stopReason: StopReason;\n assistantBlocks: ContentBlock[];\n pendingToolCalls: PendingToolCall[];\n}\n\nexport class QueryEngine {\n private readonly provider: EngineConfig['provider'];\n private readonly tools: Tool[];\n private readonly systemPrompt: SystemPrompt;\n private readonly model: string | undefined;\n private readonly maxTurns: number;\n private readonly maxTokens: number;\n private readonly temperature: number | undefined;\n private readonly toolChoice: EngineConfig['toolChoice'];\n private readonly thinking: EngineConfig['thinking'];\n private readonly outputConfig: EngineConfig['outputConfig'];\n private readonly agent: unknown;\n private readonly mcpManager: unknown;\n private readonly walletAddress: string | undefined;\n private readonly suiRpcUrl: string | undefined;\n private serverPositions: EngineConfig['serverPositions'];\n private readonly positionFetcher: EngineConfig['positionFetcher'];\n private readonly env: Record<string, string> | undefined;\n private readonly txMutex = new TxMutex();\n private readonly costTracker: CostTracker;\n private readonly guardConfig: GuardConfig | undefined;\n private readonly guardState: GuardRunnerState;\n private readonly recipes: RecipeRegistry | undefined;\n private readonly contextBudget: ContextBudget;\n private readonly contextSummarizer: EngineConfig['contextSummarizer'];\n private readonly priceCache: Map<string, number> | undefined;\n private readonly permissionConfig: import('./permission-rules.js').UserPermissionConfig | undefined;\n // [v1.4] Session-scoped autonomous spend tracking.\n private readonly sessionSpendUsd: number | undefined;\n private readonly onAutoExecuted: EngineConfig['onAutoExecuted'];\n private readonly onGuardFired: EngineConfig['onGuardFired'];\n // [v1.5] See `EngineConfig.postWriteRefresh` — drives the post-write\n // synthetic read injection in `resumeWithToolResult`.\n private readonly postWriteRefresh: EngineConfig['postWriteRefresh'];\n private matchedRecipe: Recipe | null = null;\n\n private messages: Message[] = [];\n private abortController: AbortController | null = null;\n private guardEvents: GuardEvent[] = [];\n\n constructor(config: EngineConfig) {\n this.provider = config.provider;\n this.agent = config.agent;\n this.mcpManager = config.mcpManager;\n this.walletAddress = config.walletAddress;\n this.suiRpcUrl = config.suiRpcUrl;\n this.serverPositions = config.serverPositions;\n this.positionFetcher = config.positionFetcher;\n this.env = config.env;\n this.model = config.model;\n this.maxTurns = config.maxTurns ?? DEFAULT_MAX_TURNS;\n this.maxTokens = config.maxTokens ?? DEFAULT_MAX_TOKENS;\n this.temperature = config.temperature;\n this.toolChoice = config.toolChoice;\n this.thinking = config.thinking;\n this.outputConfig = config.outputConfig;\n this.systemPrompt = config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n this.costTracker = new CostTracker(config.costTracker);\n this.guardConfig = config.guards;\n this.guardState = createGuardRunnerState();\n this.recipes = config.recipes;\n this.contextBudget = new ContextBudget(config.contextBudget);\n this.contextSummarizer = config.contextSummarizer;\n this.priceCache = config.priceCache;\n this.permissionConfig = config.permissionConfig;\n this.sessionSpendUsd = config.sessionSpendUsd;\n this.onAutoExecuted = config.onAutoExecuted;\n this.onGuardFired = config.onGuardFired;\n this.postWriteRefresh = config.postWriteRefresh;\n\n this.tools = config.tools ?? (config.agent ? getDefaultTools() : []);\n }\n\n /**\n * Submit a user message and stream engine events.\n *\n * Read-only tools execute inline. Write tools that need confirmation yield a\n * `pending_action` event and the stream ends — no persistent connection needed.\n * The caller should save messages + pendingAction to the session store, then\n * call `resumeWithToolResult()` after the user approves/denies and executes.\n */\n async *submitMessage(prompt: string): AsyncGenerator<EngineEvent> {\n if (this.costTracker.isOverBudget()) {\n yield { type: 'error', error: new Error('Session budget exceeded') };\n return;\n }\n\n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n\n // RE-3.1: Match recipe before pushing message\n this.matchedRecipe = this.recipes?.match(prompt) ?? null;\n\n this.messages.push({\n role: 'user',\n content: [{ type: 'text', text: prompt }],\n });\n\n yield* this.agentLoop(prompt, signal);\n }\n\n /**\n * Resume the conversation after a pending action is resolved.\n * Called with the user's approval/denial and optional client-side execution result.\n *\n * This is a separate HTTP request — no persistent connection from submitMessage.\n */\n async *resumeWithToolResult(\n action: PendingAction,\n response: PermissionResponse,\n ): AsyncGenerator<EngineEvent> {\n this.abortController = new AbortController();\n const signal = this.abortController.signal;\n\n const writeResult: ContentBlock = response.approved\n ? {\n type: 'tool_result',\n toolUseId: action.toolUseId,\n content: JSON.stringify(response.executionResult ?? { success: true }),\n isError: false,\n }\n : {\n type: 'tool_result',\n toolUseId: action.toolUseId,\n content: JSON.stringify({ error: 'User declined this action' }),\n isError: true,\n };\n\n // Reconstruct the full turn atomically:\n // 1. Push the assistant message that was deferred during pending_action\n // 2. Push ALL tool_results (completed reads + write) in one user message\n if (action.assistantContent?.length) {\n this.messages.push({ role: 'assistant', content: action.assistantContent });\n }\n\n const allResults: ContentBlock[] = [\n ...(action.completedResults ?? []).map((r) => ({\n type: 'tool_result' as const,\n toolUseId: r.toolUseId,\n content: r.content,\n isError: r.isError,\n })),\n writeResult,\n ];\n\n this.messages.push({ role: 'user', content: allResults });\n\n yield {\n type: 'tool_result',\n toolName: action.toolName,\n toolUseId: action.toolUseId,\n result: response.approved\n ? (response.executionResult ?? { success: true })\n : { error: 'User declined this action' },\n isError: !response.approved,\n };\n\n if (!response.approved) {\n yield { type: 'turn_complete', stopReason: 'end_turn' };\n return;\n }\n\n // [v1.5] Post-write refresh — eliminate the \"LLM invents a wallet\n // total in the post-write narration\" hallucination class by\n // physically injecting authoritative ground truth into the\n // conversation BEFORE the LLM gets to narrate. Tools are configured\n // per write via `EngineConfig.postWriteRefresh`. Errors are\n // non-fatal: we still advance to agentLoop so the user gets *some*\n // narration even if RPC blips.\n yield* this.runPostWriteRefresh(action, response, signal);\n\n yield* this.agentLoop(null, signal, false);\n }\n\n /**\n * [v1.5] Auto-run configured read tools after a successful write,\n * push their results into the conversation, and yield `tool_result`\n * events so hosts/UI render them in the timeline. See\n * `EngineConfig.postWriteRefresh`.\n *\n * Pure injection — no LLM call here. The next `agentLoop` turn sees\n * the fresh tool results and narrates from them.\n */\n private async *runPostWriteRefresh(\n action: PendingAction,\n response: PermissionResponse,\n signal: AbortSignal,\n ): AsyncGenerator<EngineEvent> {\n const refreshList = this.postWriteRefresh?.[action.toolName];\n if (!refreshList || refreshList.length === 0) return;\n\n // Refresh only on confirmed success. Failed writes leave on-chain\n // state untouched; refreshing would just surface the pre-write\n // snapshot a second time — wasted RPC + zero new info.\n const exec = response.executionResult;\n const writeFailed =\n exec != null &&\n typeof exec === 'object' &&\n 'success' in exec &&\n (exec as { success?: unknown }).success === false;\n if (writeFailed) return;\n\n // Resolve & filter — silently drop unknown / non-readonly entries\n // so config drift between host & engine never breaks resume.\n const refreshTools = refreshList\n .map((name) => findTool(this.tools, name))\n .filter((t): t is Tool =>\n t !== undefined && t.isReadOnly && t.isConcurrencySafe,\n );\n if (refreshTools.length === 0) return;\n\n const context: ToolContext = {\n agent: this.agent,\n mcpManager: this.mcpManager,\n walletAddress: this.walletAddress,\n suiRpcUrl: this.suiRpcUrl,\n serverPositions: this.serverPositions,\n positionFetcher: this.positionFetcher,\n env: this.env,\n signal,\n priceCache: this.priceCache,\n permissionConfig: this.permissionConfig,\n sessionSpendUsd: this.sessionSpendUsd,\n };\n\n // Run all refreshes in parallel — they're read-only and target\n // different RPC endpoints (wallet, NAVI positions, health). The\n // common case (1-3 tools) finishes well under 1s.\n const idStem = `pwr_${action.toolUseId.slice(-6)}`;\n const refreshes = await Promise.all(\n refreshTools.map(async (tool, idx) => {\n const id = `${idStem}_${idx}_${tool.name}`;\n try {\n const parsed = tool.inputSchema.safeParse({});\n if (!parsed.success) {\n return {\n tool,\n id,\n isError: true as const,\n data: {\n error: `Post-write refresh: invalid input for ${tool.name}`,\n },\n };\n }\n const result = await tool.call(parsed.data, context);\n return { tool, id, isError: false as const, data: result.data };\n } catch (err) {\n return {\n tool,\n id,\n isError: true as const,\n data: {\n error:\n err instanceof Error\n ? err.message\n : 'Post-write refresh failed',\n },\n };\n }\n }),\n );\n\n // Push synthetic conversation pair so the LLM sees:\n // assistant(refresh tool_uses) → user(refresh tool_results)\n // Anthropic accepts back-to-back assistant/user blocks; this is the\n // same shape `buildSyntheticPrefetch` uses at session start.\n const refreshUses: ContentBlock[] = refreshes.map((r) => ({\n type: 'tool_use',\n id: r.id,\n name: r.tool.name,\n input: {},\n }));\n this.messages.push({ role: 'assistant', content: refreshUses });\n\n const refreshResults: ContentBlock[] = refreshes.map((r) => ({\n type: 'tool_result',\n toolUseId: r.id,\n content: typeof r.data === 'string' ? r.data : JSON.stringify(r.data),\n isError: r.isError,\n }));\n this.messages.push({ role: 'user', content: refreshResults });\n\n // Yield events so hosts log them in `TurnMetrics.toolsCalled[]` and\n // the UI renders the refreshed cards in-line.\n for (const r of refreshes) {\n yield {\n type: 'tool_result',\n toolName: r.tool.name,\n toolUseId: r.id,\n result: r.data,\n isError: r.isError,\n wasPostWriteRefresh: true,\n };\n }\n }\n\n interrupt(): void {\n this.abortController?.abort();\n }\n\n getMessages(): readonly Message[] {\n return this.messages;\n }\n\n getMatchedRecipe(): Recipe | null {\n return this.matchedRecipe;\n }\n\n getContextBudget(): ContextBudget {\n return this.contextBudget;\n }\n\n reset(): void {\n this.messages = [];\n this.costTracker.reset();\n this.contextBudget.reset();\n this.guardEvents = [];\n this.matchedRecipe = null;\n }\n\n getGuardEvents(): readonly GuardEvent[] {\n return this.guardEvents;\n }\n\n loadMessages(messages: Message[]): void {\n this.messages = [...messages];\n }\n\n setServerPositions(data: EngineConfig['serverPositions']): void {\n this.serverPositions = data;\n }\n\n getUsage(): CostSnapshot {\n return this.costTracker.getSnapshot();\n }\n\n // ---------------------------------------------------------------------------\n // Core agent loop — shared by submitMessage and resumeWithToolResult\n // ---------------------------------------------------------------------------\n\n /**\n * Run the LLM → tool → LLM loop. When a write tool needs confirmation,\n * yields `pending_action` and returns immediately (stream ends cleanly).\n *\n * @param freshPrompt - The original user prompt (for corrupt-history retry). Null on resume.\n */\n private async *agentLoop(\n freshPrompt: string | null,\n signal: AbortSignal,\n applyToolChoice = true,\n ): AsyncGenerator<EngineEvent> {\n const context: ToolContext = {\n agent: this.agent,\n mcpManager: this.mcpManager,\n walletAddress: this.walletAddress,\n suiRpcUrl: this.suiRpcUrl,\n serverPositions: this.serverPositions,\n positionFetcher: this.positionFetcher,\n env: this.env,\n signal,\n priceCache: this.priceCache,\n permissionConfig: this.permissionConfig,\n sessionSpendUsd: this.sessionSpendUsd,\n };\n\n let turns = 0;\n let hasRetriedWithCleanHistory = false;\n\n while (turns < this.maxTurns) {\n if (signal.aborted) {\n yield { type: 'error', error: new Error('Aborted') };\n return;\n }\n\n turns++;\n const toolDefs = toolsToDefinitions(this.tools);\n\n const acc: TurnAccumulator = {\n text: '',\n stopReason: 'end_turn',\n assistantBlocks: [],\n pendingToolCalls: [],\n };\n\n const dispatcher = new EarlyToolDispatcher(this.tools, context);\n\n try {\n // B.3: Zero-cost dedup of identical tool calls every turn.\n // [v1.4 Item 4] Emit a synthetic tool_result event for each\n // deduped prior call so hosts can flip `resultDeduped` on the\n // matching `TurnMetrics.toolsCalled[]` row. Marker shape is\n // explicit so collectors don't double-count emissions.\n // [v1.5.1] Pass the tool registry so microcompact honors per-tool\n // `cacheable` flags. Mutable-state reads (balance_check etc.)\n // never dedupe, so post-write refreshes always surface fresh\n // data instead of a \"[Same result as call #N]\" marker that the\n // LLM previously misread as \"stale snapshot, fall back to math\".\n const microcompacted = microcompact(this.messages, this.tools);\n this.messages = microcompacted;\n for (const dedupedId of microcompacted.dedupedToolUseIds) {\n yield {\n type: 'tool_result',\n toolName: '__deduped__',\n toolUseId: dedupedId,\n result: null,\n isError: false,\n resultDeduped: true,\n };\n }\n\n // RE-3.3: Compact context if budget is exceeded\n if (this.contextBudget.shouldCompact()) {\n this.messages = await compactMessages(this.messages, {\n maxTokens: 100_000,\n keepRecentCount: 8,\n summarizer: this.contextSummarizer,\n });\n // [v1.4 Item 4] Notify hosts that compaction fired this turn.\n // `compactMessages` stays a pure function; the event keeps the\n // signal observable without coupling.\n yield { type: 'compaction' };\n }\n\n this.messages = validateHistory(this.messages);\n\n if (process.env.NODE_ENV !== 'test') {\n const summary = this.messages.map((m, idx) => {\n const blocks = m.content.map((b) => {\n if (b.type === 'text') return `text(${b.text.slice(0, 40)}…)`;\n if (b.type === 'thinking') return `thinking(${b.thinking.length}ch)`;\n if (b.type === 'redacted_thinking') return `redacted_thinking`;\n if (b.type === 'tool_use') return `tool_use:${b.id.slice(-8)}/${b.name}`;\n return `tool_result:${(b as { toolUseId: string }).toolUseId.slice(-8)}`;\n });\n return ` [${idx}] ${m.role}: [${blocks.join(', ')}]`;\n });\n console.log(`[engine] provider.chat turn=${turns} msgs=${this.messages.length}\\n${summary.join('\\n')}`);\n }\n\n const thinkingEnabled = this.thinking && this.thinking.type !== 'disabled';\n // Anthropic requires toolChoice 'auto' (not 'any') when thinking is enabled\n const effectiveToolChoice = thinkingEnabled\n ? ((applyToolChoice && turns === 1) ? 'auto' as const : undefined)\n : ((applyToolChoice && turns === 1) ? this.toolChoice : undefined);\n\n // RE-3.1: Inject matched recipe context into system prompt for this turn\n let effectivePrompt = this.systemPrompt;\n if (this.matchedRecipe && this.recipes) {\n const recipeCtx = this.recipes.toPromptContext(this.matchedRecipe);\n if (typeof effectivePrompt === 'string') {\n effectivePrompt = `${effectivePrompt}\\n\\n${recipeCtx}`;\n } else if (Array.isArray(effectivePrompt)) {\n effectivePrompt = [\n ...effectivePrompt,\n { type: 'text' as const, text: recipeCtx },\n ];\n }\n }\n\n const stream = this.provider.chat({\n messages: this.messages,\n systemPrompt: effectivePrompt,\n tools: toolDefs,\n model: this.model,\n maxTokens: this.maxTokens,\n temperature: this.temperature,\n toolChoice: effectiveToolChoice,\n thinking: this.thinking,\n outputConfig: this.outputConfig,\n signal,\n });\n\n for await (const event of stream) {\n yield* this.handleProviderEvent(event, acc, dispatcher);\n }\n } catch (err) {\n if (freshPrompt && !hasRetriedWithCleanHistory && isCorruptHistoryError(err)) {\n hasRetriedWithCleanHistory = true;\n console.warn('[engine] Corrupt session history detected, resetting to fresh conversation');\n this.messages = [\n { role: 'user', content: [{ type: 'text', text: freshPrompt }] },\n ];\n turns--;\n continue;\n }\n throw err;\n }\n\n if (acc.text) {\n acc.assistantBlocks.push({ type: 'text', text: acc.text });\n }\n\n // B.1: Collect results from early-dispatched tools\n const earlyResultBlocks: ContentBlock[] = [];\n if (dispatcher.hasPending()) {\n if (signal.aborted) {\n dispatcher.abort();\n }\n for await (const earlyEvent of dispatcher.collectResults()) {\n if (earlyEvent.type === 'tool_result') {\n if (!earlyEvent.isError) {\n const warning = flagSuspiciousResult(earlyEvent.toolName, earlyEvent.result);\n if (warning) {\n const flagged = {\n ...earlyEvent,\n result: typeof earlyEvent.result === 'object' && earlyEvent.result\n ? { ...earlyEvent.result as Record<string, unknown>, _warning: warning }\n : { data: earlyEvent.result, _warning: warning },\n };\n yield flagged;\n earlyResultBlocks.push({\n type: 'tool_result',\n toolUseId: flagged.toolUseId,\n content: JSON.stringify(flagged.result),\n isError: flagged.isError,\n });\n continue;\n }\n }\n const tool = findTool(this.tools, earlyEvent.toolName);\n updateGuardStateAfterToolResult(\n earlyEvent.toolName, tool, null, earlyEvent.result, earlyEvent.isError, this.guardState,\n );\n\n let enrichedResult = earlyEvent.result;\n if (this.guardConfig && !earlyEvent.isError && tool) {\n const artifactInj = this.guardConfig.artifactPreview !== false\n ? guardArtifactPreview(earlyEvent.result)\n : null;\n const staleInj = this.guardConfig.staleData !== false\n ? guardStaleData(tool.flags)\n : null;\n const allInjections = [\n ...(artifactInj ? [artifactInj] : []),\n ...(staleInj ? [staleInj] : []),\n ];\n if (allInjections.length > 0 && typeof enrichedResult === 'object' && enrichedResult) {\n enrichedResult = { ...enrichedResult as Record<string, unknown>, _guards: allInjections };\n }\n }\n\n const finalEvent = enrichedResult !== earlyEvent.result\n ? { ...earlyEvent, result: enrichedResult }\n : earlyEvent;\n\n yield finalEvent;\n\n if (!finalEvent.isError) {\n const r = finalEvent.result as Record<string, unknown> | null;\n if (r && r.__canvas === true) {\n yield {\n type: 'canvas',\n template: String(r.template ?? ''),\n title: String(r.title ?? ''),\n data: r.templateData ?? null,\n toolUseId: finalEvent.toolUseId,\n };\n }\n }\n\n earlyResultBlocks.push({\n type: 'tool_result',\n toolUseId: finalEvent.toolUseId,\n content: JSON.stringify(finalEvent.result),\n isError: finalEvent.isError,\n });\n }\n }\n }\n\n const hasEarlyResults = earlyResultBlocks.length > 0;\n const hasRemainingCalls = acc.pendingToolCalls.length > 0;\n\n if (!hasEarlyResults && !hasRemainingCalls) {\n this.messages.push({ role: 'assistant', content: acc.assistantBlocks });\n yield { type: 'turn_complete', stopReason: acc.stopReason };\n return;\n }\n\n if (signal.aborted) {\n this.messages.push({ role: 'assistant', content: acc.assistantBlocks });\n if (hasEarlyResults) {\n this.messages.push({ role: 'user', content: earlyResultBlocks });\n }\n this.addErrorResults(acc.pendingToolCalls, 'Aborted');\n yield { type: 'error', error: new Error('Aborted') };\n return;\n }\n\n // --- Permission gate (only for non-early-dispatched calls) ---\n const approved: PendingToolCall[] = [];\n const toolResultBlocks: ContentBlock[] = [...earlyResultBlocks];\n let pendingWrite: { call: PendingToolCall; tool: Tool } | null = null;\n\n for (const call of acc.pendingToolCalls) {\n const tool = findTool(this.tools, call.name);\n\n const needsConfirmation = (() => {\n if (!tool || tool.isReadOnly) return false;\n if (tool.permissionLevel === 'explicit') return true;\n // Without an agent, write tools can't execute server-side —\n // always require confirmation so the client handles execution.\n if (!context.agent && !tool.isReadOnly) return true;\n if (context.permissionConfig && context.priceCache) {\n const operation = toolNameToOperation(call.name);\n if (operation) {\n const usdValue = resolveUsdValue(call.name, call.input as Record<string, unknown>, context.priceCache);\n // [v1.4] sessionSpendUsd consulted to enforce daily cap\n const tier = resolvePermissionTier(\n operation,\n usdValue,\n context.permissionConfig,\n context.sessionSpendUsd,\n );\n return tier !== 'auto';\n }\n }\n return tool.permissionLevel !== 'auto';\n })();\n\n if (!needsConfirmation) {\n approved.push(call);\n yield { type: 'tool_start', toolName: call.name, toolUseId: call.id, input: call.input };\n continue;\n }\n\n pendingWrite = { call, tool: tool! };\n break;\n }\n\n // --- Guard checks (pre-execution) ---\n const guardedApproved: PendingToolCall[] = [];\n\n if (this.guardConfig) {\n const convCtx = extractConversationText(this.messages);\n\n for (const call of approved) {\n const tool = findTool(this.tools, call.name);\n if (!tool) { guardedApproved.push(call); continue; }\n\n const check = runGuards(\n tool,\n call,\n this.guardState,\n this.guardConfig,\n convCtx,\n this.onGuardFired,\n );\n this.guardEvents.push(...check.events);\n\n if (check.blocked) {\n yield {\n type: 'tool_result',\n toolName: call.name,\n toolUseId: call.id,\n result: { error: check.blockReason, _gate: check.blockGate },\n isError: true,\n };\n toolResultBlocks.push({\n type: 'tool_result',\n toolUseId: call.id,\n content: JSON.stringify({ error: check.blockReason, _gate: check.blockGate }),\n isError: true,\n });\n continue;\n }\n\n if (check.injections.length > 0) {\n (call as PendingToolCall & { _guardInjections?: unknown[] })._guardInjections = check.injections;\n }\n guardedApproved.push(call);\n }\n } else {\n guardedApproved.push(...approved);\n }\n\n // Execute auto-approved tool calls (reads) even if a write is pending\n for await (const toolEvent of runTools(guardedApproved, this.tools, context, this.txMutex)) {\n if (toolEvent.type === 'tool_result' && !toolEvent.isError) {\n const warning = flagSuspiciousResult(toolEvent.toolName, toolEvent.result);\n if (warning) {\n const flagged = {\n ...toolEvent,\n result: typeof toolEvent.result === 'object' && toolEvent.result\n ? { ...toolEvent.result as Record<string, unknown>, _warning: warning }\n : { data: toolEvent.result, _warning: warning },\n };\n yield flagged;\n toolResultBlocks.push({\n type: 'tool_result',\n toolUseId: flagged.toolUseId,\n content: JSON.stringify(flagged.result),\n isError: flagged.isError,\n });\n continue;\n }\n }\n\n // Post-execution: update guard state & apply injections\n if (toolEvent.type === 'tool_result') {\n const tool = findTool(this.tools, toolEvent.toolName);\n const originalCall = guardedApproved.find((c) => c.id === toolEvent.toolUseId);\n updateGuardStateAfterToolResult(\n toolEvent.toolName, tool, originalCall?.input ?? null, toolEvent.result, toolEvent.isError, this.guardState,\n );\n\n let enrichedResult = toolEvent.result;\n\n if (this.guardConfig && !toolEvent.isError && tool) {\n // Post-execution guards: artifact preview, stale data hint\n const artifactInj = this.guardConfig.artifactPreview !== false\n ? guardArtifactPreview(toolEvent.result)\n : null;\n const staleInj = this.guardConfig.staleData !== false\n ? guardStaleData(tool.flags)\n : null;\n\n // Merge pre-execution injections from guard check\n const preInjections =\n (guardedApproved.find((c) => c.id === toolEvent.toolUseId) as\n PendingToolCall & { _guardInjections?: unknown[] })?._guardInjections ?? [];\n\n const allInjections = [\n ...preInjections,\n ...(artifactInj ? [artifactInj] : []),\n ...(staleInj ? [staleInj] : []),\n ];\n\n if (allInjections.length > 0 && typeof enrichedResult === 'object' && enrichedResult) {\n enrichedResult = { ...enrichedResult as Record<string, unknown>, _guards: allInjections };\n }\n }\n\n const finalEvent = enrichedResult !== toolEvent.result\n ? { ...toolEvent, result: enrichedResult }\n : toolEvent;\n\n yield finalEvent;\n\n if (finalEvent.type === 'tool_result' && !finalEvent.isError) {\n const r = finalEvent.result as Record<string, unknown> | null;\n if (r && r.__canvas === true) {\n yield {\n type: 'canvas',\n template: String(r.template ?? ''),\n title: String(r.title ?? ''),\n data: r.templateData ?? null,\n toolUseId: finalEvent.toolUseId,\n };\n }\n\n // [v1.4] Fire onAutoExecuted for write tools that auto-executed\n // (non-readonly tools that reach this loop have already passed the\n // auto-tier check). Wrapped in try/catch so any host error never\n // propagates back into the engine — the tool result already shipped.\n if (\n tool && !tool.isReadOnly && this.onAutoExecuted &&\n this.permissionConfig && this.priceCache\n ) {\n const operation = toolNameToOperation(toolEvent.toolName);\n if (operation && originalCall) {\n const usdValue = resolveUsdValue(\n toolEvent.toolName,\n originalCall.input as Record<string, unknown>,\n this.priceCache,\n );\n Promise.resolve()\n .then(() => this.onAutoExecuted!({\n toolName: toolEvent.toolName,\n usdValue,\n }))\n .catch((err) => {\n console.warn('[engine] onAutoExecuted callback failed:', err);\n });\n }\n }\n }\n\n toolResultBlocks.push({\n type: 'tool_result',\n toolUseId: finalEvent.toolUseId,\n content: JSON.stringify(finalEvent.result),\n isError: finalEvent.isError,\n });\n continue;\n }\n\n yield toolEvent;\n }\n\n // --- Guard check on pending write tool ---\n if (pendingWrite && this.guardConfig) {\n const convCtx = extractConversationText(this.messages);\n const check = runGuards(\n pendingWrite.tool,\n pendingWrite.call,\n this.guardState,\n this.guardConfig,\n convCtx,\n this.onGuardFired,\n );\n this.guardEvents.push(...check.events);\n\n if (check.blocked) {\n yield {\n type: 'tool_result',\n toolName: pendingWrite.call.name,\n toolUseId: pendingWrite.call.id,\n result: { error: check.blockReason, _gate: check.blockGate },\n isError: true,\n };\n toolResultBlocks.push({\n type: 'tool_result',\n toolUseId: pendingWrite.call.id,\n content: JSON.stringify({ error: check.blockReason, _gate: check.blockGate }),\n isError: true,\n });\n // Blocked write — don't yield pending_action, feed error back to LLM\n this.messages.push({ role: 'assistant', content: acc.assistantBlocks });\n this.messages.push({ role: 'user', content: toolResultBlocks });\n continue;\n }\n\n if (check.injections.length > 0) {\n (pendingWrite.call as PendingToolCall & { _guardInjections?: unknown[] })._guardInjections = check.injections;\n }\n }\n\n if (pendingWrite) {\n // Do NOT push assistant message to this.messages — session stays clean.\n // The full assistant content is stored in PendingAction so\n // resumeWithToolResult can reconstruct the turn atomically.\n const writeGuardInjections =\n (pendingWrite.call as PendingToolCall & { _guardInjections?: Array<{ _gate: string; _hint?: string; _warning?: string }> })._guardInjections;\n\n // [v1.4 Item 6] Stamp the action with the registry's modifiable\n // fields (UI uses this to render editable controls) and a turnIndex\n // derived from the assistant message count so hosts can update the\n // matching `TurnMetrics` row when the action resolves.\n const modifiableFields = getModifiableFields(pendingWrite.call.name);\n const turnIndex = this.messages.filter((m) => m.role === 'assistant').length;\n\n yield {\n type: 'pending_action',\n action: {\n toolName: pendingWrite.call.name,\n toolUseId: pendingWrite.call.id,\n input: pendingWrite.call.input,\n description: describeAction(pendingWrite.tool, pendingWrite.call),\n assistantContent: acc.assistantBlocks,\n completedResults: toolResultBlocks.map((b) => ({\n toolUseId: (b as { toolUseId: string }).toolUseId,\n content: (b as { content: string }).content,\n isError: (b as { isError?: boolean }).isError ?? false,\n })),\n ...(writeGuardInjections?.length ? { guardInjections: writeGuardInjections } : {}),\n ...(modifiableFields?.length ? { modifiableFields } : {}),\n turnIndex,\n },\n };\n return;\n }\n\n // All tools auto-approved — push the complete turn (assistant + results)\n this.messages.push({ role: 'assistant', content: acc.assistantBlocks });\n this.messages.push({ role: 'user', content: toolResultBlocks });\n\n if (this.costTracker.isOverBudget()) {\n yield { type: 'error', error: new Error('Session budget exceeded') };\n return;\n }\n }\n\n yield { type: 'turn_complete', stopReason: 'max_turns' };\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private addErrorResults(pendingCalls: PendingToolCall[], reason: string): void {\n const errorBlocks: ContentBlock[] = pendingCalls.map((call) => ({\n type: 'tool_result' as const,\n toolUseId: call.id,\n content: JSON.stringify({ error: reason }),\n isError: true,\n }));\n if (errorBlocks.length > 0) {\n this.messages.push({ role: 'user', content: errorBlocks });\n }\n }\n\n private *handleProviderEvent(\n event: ProviderEvent,\n acc: TurnAccumulator,\n dispatcher?: EarlyToolDispatcher,\n ): Generator<EngineEvent> {\n switch (event.type) {\n case 'thinking_delta': {\n yield { type: 'thinking_delta', text: event.text };\n break;\n }\n\n case 'thinking_done': {\n acc.assistantBlocks.push({\n type: 'thinking',\n thinking: event.thinking,\n signature: event.signature,\n });\n yield { type: 'thinking_done', signature: event.signature };\n break;\n }\n\n case 'redacted_thinking': {\n acc.assistantBlocks.push({\n type: 'redacted_thinking',\n data: event.data,\n });\n break;\n }\n\n case 'text_delta': {\n acc.text += event.text;\n yield { type: 'text_delta', text: event.text };\n break;\n }\n\n case 'tool_use_done': {\n if (acc.text) {\n acc.assistantBlocks.push({ type: 'text', text: acc.text });\n acc.text = '';\n }\n acc.assistantBlocks.push({\n type: 'tool_use',\n id: event.id,\n name: event.name,\n input: event.input,\n });\n\n const call: PendingToolCall = { id: event.id, name: event.name, input: event.input };\n\n // B.1: Try early dispatch for read-only tools mid-stream\n if (dispatcher?.tryDispatch(call)) {\n yield { type: 'tool_start', toolName: call.name, toolUseId: call.id, input: call.input };\n } else {\n acc.pendingToolCalls.push(call);\n }\n break;\n }\n\n case 'usage': {\n this.costTracker.track(\n event.inputTokens,\n event.outputTokens,\n event.cacheReadTokens,\n event.cacheWriteTokens,\n );\n this.contextBudget.update(event.inputTokens);\n yield {\n type: 'usage',\n inputTokens: event.inputTokens,\n outputTokens: event.outputTokens,\n cacheReadTokens: event.cacheReadTokens,\n cacheWriteTokens: event.cacheWriteTokens,\n };\n break;\n }\n\n case 'stop': {\n acc.stopReason = event.reason;\n break;\n }\n\n default:\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isCorruptHistoryError(err: unknown): boolean {\n const msg = err instanceof Error ? err.message : String(err);\n return (\n (msg.includes('tool_use') && msg.includes('tool_result')) ||\n msg.includes('roles must alternate') ||\n (msg.includes('400') && msg.includes('invalid_request_error'))\n );\n}\n\n/**\n * Pre-flight validation: ensures message history meets Anthropic's requirements\n * right before every API call. Anthropic requires that every tool_use in an\n * assistant message has a matching tool_result in the IMMEDIATELY NEXT user\n * message — not just anywhere in the history. This function strips any\n * tool_use/tool_result blocks that violate this positional constraint and\n * fixes role alternation. Single point of defense — no corrupt messages can\n * reach the API regardless of how they got into the session.\n */\nexport function validateHistory(messages: Message[]): Message[] {\n const result: Message[] = [];\n let i = 0;\n\n while (i < messages.length) {\n const msg = messages[i];\n\n // For assistant messages with tool_use, verify the next message has ALL results\n const toolUseIds = msg.content\n .filter((b): b is { type: 'tool_use'; id: string; name: string; input: unknown } => b.type === 'tool_use')\n .map((b) => b.id);\n\n if (toolUseIds.length > 0 && msg.role === 'assistant') {\n const next = messages[i + 1];\n const nextResultIds = new Set(\n (next?.content ?? [])\n .filter((b): b is { type: 'tool_result'; toolUseId: string; content: string } => b.type === 'tool_result')\n .map((b) => b.toolUseId),\n );\n\n // Strip tool_use blocks that have no result in the next message\n const cleanAssistant = msg.content.filter((b) => {\n if (b.type === 'tool_use') return nextResultIds.has(b.id);\n return true;\n });\n\n // Strip tool_result blocks from next message whose tool_use was removed\n const keptToolUseIds = new Set(\n cleanAssistant\n .filter((b): b is { type: 'tool_use'; id: string; name: string; input: unknown } => b.type === 'tool_use')\n .map((b) => b.id),\n );\n const cleanNext = next?.content.filter((b) => {\n if (b.type === 'tool_result') return keptToolUseIds.has(b.toolUseId);\n return true;\n });\n\n if (cleanAssistant.length > 0) {\n result.push({ role: msg.role, content: cleanAssistant });\n }\n if (cleanNext && cleanNext.length > 0) {\n result.push({ role: next!.role, content: cleanNext });\n }\n i += 2;\n continue;\n }\n\n // For user messages: strip any tool_result blocks that reference a tool_use\n // not present in the immediately preceding assistant message\n if (msg.role === 'user' && msg.content.some((b) => b.type === 'tool_result')) {\n const prevAssistant = result[result.length - 1];\n const prevToolUseIds = new Set(\n (prevAssistant?.role === 'assistant' ? prevAssistant.content : [])\n .filter((b): b is { type: 'tool_use'; id: string; name: string; input: unknown } => b.type === 'tool_use')\n .map((b) => b.id),\n );\n const cleanContent = msg.content.filter((b) => {\n if (b.type === 'tool_result') return prevToolUseIds.has(b.toolUseId);\n return true;\n });\n if (cleanContent.length > 0) {\n result.push({ role: msg.role, content: cleanContent });\n }\n i++;\n continue;\n }\n\n result.push(msg);\n i++;\n }\n\n // Merge consecutive same-role messages (can happen after stripping)\n const merged: Message[] = [];\n for (const msg of result) {\n const last = merged[merged.length - 1];\n if (last && last.role === msg.role) {\n last.content = [...last.content, ...msg.content];\n } else {\n merged.push({ role: msg.role, content: [...msg.content] });\n }\n }\n\n // First message must be user\n while (merged.length > 0 && merged[0].role !== 'user') {\n merged.shift();\n }\n\n return merged;\n}\n\nfunction resolveTokenSymbol(nameOrType: string): string {\n if (!nameOrType.includes('::')) return nameOrType;\n const parts = nameOrType.split('::');\n return parts[parts.length - 1];\n}\n\nfunction describeAction(tool: Tool, call: PendingToolCall): string {\n const input = call.input as Record<string, unknown>;\n switch (tool.name) {\n case 'save_deposit': {\n return `Save ${input.amount} USDC into lending`;\n }\n case 'withdraw': {\n const wAsset = input.asset ?? '';\n return `Withdraw ${input.amount}${wAsset ? ' ' + wAsset : ''} from lending`;\n }\n case 'send_transfer':\n return `Send $${input.amount} to ${input.to}`;\n case 'borrow':\n return `Borrow $${input.amount} against collateral`;\n case 'repay_debt':\n return `Repay $${input.amount} of outstanding debt`;\n case 'claim_rewards':\n return 'Claim all pending protocol rewards';\n case 'pay_api': {\n const url = String(input.url ?? '');\n const cost = estimatePayApiCost(url);\n return `Pay for API call to ${url} (~$${cost})`;\n }\n case 'swap_execute': {\n const from = resolveTokenSymbol(String(input.from ?? '?'));\n const to = resolveTokenSymbol(String(input.to ?? '?'));\n const amt = input.amount ?? '?';\n const slippagePct = ((input.slippage as number) ?? 0.01) * 100;\n return `Swap ${amt} ${from} for ${to} (${slippagePct}% max slippage)`;\n }\n case 'volo_stake':\n return `Stake ${input.amount} SUI for vSUI`;\n case 'volo_unstake':\n return `Unstake ${input.amount === 'all' ? 'all' : input.amount} vSUI`;\n default:\n return `Execute ${tool.name}`;\n }\n}\n\nfunction flagSuspiciousResult(toolName: string, result: unknown): string | null {\n if (!result || typeof result !== 'object') return null;\n const r = result as Record<string, unknown>;\n if (toolName === 'swap_execute') {\n const outAmt = Number(r.toAmount ?? r.outputAmount ?? 0);\n const inAmt = Number(r.fromAmount ?? r.inputAmount ?? 1);\n if (inAmt > 0 && outAmt / inAmt > 1_000_000) {\n return '[Warning: This quote may contain inaccurate data. Verify on-chain before executing.]';\n }\n }\n const apy = Number(r.apy ?? r.APY ?? NaN);\n if (!isNaN(apy) && apy < 0) {\n return '[Warning: Negative APY detected — data may be stale.]';\n }\n return null;\n}\n","import type { EngineEvent, PendingAction, StopReason } from './types.js';\n\n// ---------------------------------------------------------------------------\n// SSE event format — serialisable subset of EngineEvent\n// ---------------------------------------------------------------------------\n\nexport type SSEEvent =\n | { type: 'thinking_delta'; text: string }\n | { type: 'thinking_done'; signature?: string }\n | { type: 'text_delta'; text: string }\n | { type: 'tool_start'; toolName: string; toolUseId: string; input: unknown }\n | {\n type: 'tool_result';\n toolName: string;\n toolUseId: string;\n result: unknown;\n isError: boolean;\n // [v1.4] flags carried through unchanged from EngineEvent.tool_result\n wasEarlyDispatched?: boolean;\n resultDeduped?: boolean;\n // [v1.5] true when injected by the engine's post-write refresh\n // (see EngineConfig.postWriteRefresh)\n wasPostWriteRefresh?: boolean;\n }\n | { type: 'pending_action'; action: PendingAction }\n | { type: 'turn_complete'; stopReason: StopReason }\n | { type: 'usage'; inputTokens: number; outputTokens: number; cacheReadTokens?: number; cacheWriteTokens?: number }\n | { type: 'error'; message: string }\n | { type: 'canvas'; template: string; data: unknown; title: string; toolUseId: string };\n\n// ---------------------------------------------------------------------------\n// Serialise: SSEEvent → SSE text\n// ---------------------------------------------------------------------------\n\nexport function serializeSSE(event: SSEEvent): string {\n const data = JSON.stringify(event);\n return `event: ${event.type}\\ndata: ${data}\\n\\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Deserialise: SSE text → SSEEvent\n// ---------------------------------------------------------------------------\n\nexport function parseSSE(raw: string): SSEEvent | null {\n const dataLine = raw.split('\\n').find((l) => l.startsWith('data: '));\n if (!dataLine) return null;\n try {\n return JSON.parse(dataLine.slice(6)) as SSEEvent;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Stream adapter: engine async generator → SSE text stream\n// ---------------------------------------------------------------------------\n\nexport async function* engineToSSE(\n events: AsyncGenerator<EngineEvent>,\n): AsyncGenerator<string> {\n for await (const event of events) {\n if (event.type === 'error') {\n yield serializeSSE({ type: 'error', message: event.error.message });\n } else {\n yield serializeSSE(event as SSEEvent);\n }\n }\n}\n","import type { Message, PendingAction } from './types.js';\nimport type { CostSnapshot } from './cost.js';\n\n// ---------------------------------------------------------------------------\n// Session data\n// ---------------------------------------------------------------------------\n\nexport interface SessionData {\n id: string;\n messages: Message[];\n usage: CostSnapshot;\n createdAt: number;\n updatedAt: number;\n /** Set when the engine is paused waiting for user approval of a write action. */\n pendingAction?: PendingAction | null;\n metadata?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Session store interface — implement for different backends\n// ---------------------------------------------------------------------------\n\nexport interface SessionStore {\n /** Load a session by ID. Returns null if not found or expired. */\n get(sessionId: string): Promise<SessionData | null>;\n\n /** Save or update a session. */\n set(session: SessionData): Promise<void>;\n\n /** Delete a session. */\n delete(sessionId: string): Promise<void>;\n\n /** Check if a session exists. */\n exists(sessionId: string): Promise<boolean>;\n}\n\n// ---------------------------------------------------------------------------\n// MemorySessionStore — for development and testing\n// ---------------------------------------------------------------------------\n\nexport class MemorySessionStore implements SessionStore {\n private store = new Map<string, { data: SessionData; expiresAt: number }>();\n private readonly ttlMs: number;\n\n constructor(opts?: { ttlMs?: number }) {\n this.ttlMs = opts?.ttlMs ?? 24 * 60 * 60 * 1000; // 24h default\n }\n\n async get(sessionId: string): Promise<SessionData | null> {\n const entry = this.store.get(sessionId);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n this.store.delete(sessionId);\n return null;\n }\n return structuredClone(entry.data);\n }\n\n async set(session: SessionData): Promise<void> {\n this.store.set(session.id, {\n data: structuredClone(session),\n expiresAt: Date.now() + this.ttlMs,\n });\n }\n\n async delete(sessionId: string): Promise<void> {\n this.store.delete(sessionId);\n }\n\n async exists(sessionId: string): Promise<boolean> {\n const entry = this.store.get(sessionId);\n if (!entry) return false;\n if (Date.now() > entry.expiresAt) {\n this.store.delete(sessionId);\n return false;\n }\n return true;\n }\n\n /** For testing: number of active (non-expired) sessions. */\n get size(): number {\n this.evictExpired();\n return this.store.size;\n }\n\n private evictExpired(): void {\n const now = Date.now();\n for (const [id, entry] of this.store) {\n if (now > entry.expiresAt) this.store.delete(id);\n }\n }\n}\n","import { readFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport yaml from 'js-yaml';\nimport { z } from 'zod';\nimport type { Recipe, RecipeStep } from './types.js';\n\nconst StepRequirementSchema = z.object({\n step: z.string().optional(),\n field: z.string().optional(),\n confirmation: z.boolean().optional(),\n});\n\nconst OnErrorSchema = z.object({\n action: z.enum(['abort', 'refuse', 'report', 'retry']),\n message: z.string(),\n suggest: z.string().optional(),\n});\n\nconst StepSchema: z.ZodType<RecipeStep> = z.object({\n name: z.string().min(1),\n tool: z.string().optional(),\n service: z.string().optional(),\n purpose: z.string().min(1),\n cost: z.string().optional(),\n output: z.object({ type: z.string(), key: z.string() }).optional(),\n gate: z.enum(['none', 'preview', 'review', 'estimate']).optional(),\n gate_prompt: z.string().optional(),\n requires: z.array(StepRequirementSchema).optional(),\n rules: z.array(z.string()).optional(),\n condition: z.string().optional(),\n notes: z.string().optional(),\n flags: z.record(z.unknown()).optional() as z.ZodType<RecipeStep['flags']>,\n on_error: OnErrorSchema.optional(),\n input_template: z.record(z.string()).optional(),\n cost_per_unit: z.string().optional(),\n});\n\nconst RecipeSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n triggers: z.array(z.string().min(1)).min(1),\n services: z.array(z.string()).optional(),\n prerequisites: z.array(z.object({ field: z.string(), prompt: z.string() })).optional(),\n steps: z.array(StepSchema).min(1),\n}).refine(\n (r) => {\n const names = r.steps.map((s) => s.name);\n return new Set(names).size === names.length;\n },\n { message: 'Step names must be unique within a recipe' },\n);\n\n/**\n * Load all recipe YAML files from a directory.\n * Throws on validation errors — recipes should fail at load time, not runtime.\n */\nexport function loadRecipes(yamlDir: string): Recipe[] {\n const files = readdirSync(yamlDir).filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'));\n const recipes: Recipe[] = [];\n\n for (const file of files) {\n const content = readFileSync(join(yamlDir, file), 'utf-8');\n const raw = yaml.load(content);\n const parsed = RecipeSchema.parse(raw);\n recipes.push(parsed as Recipe);\n }\n\n return recipes;\n}\n\n/**\n * Parse a single recipe from a YAML string (useful for embedded/bundled recipes).\n */\nexport function parseRecipe(yamlContent: string): Recipe {\n const raw = yaml.load(yamlContent);\n return RecipeSchema.parse(raw) as Recipe;\n}\n","import type { Recipe } from './types.js';\nimport { loadRecipes, parseRecipe } from './loader.js';\n\n/**\n * Stores loaded recipes and matches user messages to the most specific recipe\n * using longest-trigger-match-wins.\n */\nexport class RecipeRegistry {\n private recipes: Recipe[] = [];\n\n /** Load all recipes from a directory of YAML files. */\n loadDir(yamlDir: string): void {\n this.recipes.push(...loadRecipes(yamlDir));\n }\n\n /** Register a single recipe from a YAML string. */\n loadYaml(yamlContent: string): void {\n this.recipes.push(parseRecipe(yamlContent));\n }\n\n /** Register a pre-parsed Recipe object. */\n register(recipe: Recipe): void {\n this.recipes.push(recipe);\n }\n\n /** All loaded recipes. */\n all(): readonly Recipe[] {\n return this.recipes;\n }\n\n /**\n * Match a user message to the most specific recipe.\n * Longest trigger phrase match wins. Returns null if no match.\n */\n match(userMessage: string): Recipe | null {\n const normalized = userMessage.toLowerCase().trim();\n let best: Recipe | null = null;\n let bestLength = 0;\n\n for (const recipe of this.recipes) {\n for (const trigger of recipe.triggers) {\n const triggerLower = trigger.toLowerCase();\n if (normalized.includes(triggerLower) && triggerLower.length > bestLength) {\n best = recipe;\n bestLength = triggerLower.length;\n }\n }\n }\n\n return best;\n }\n\n /**\n * Format a matched recipe as a compact context block for the system prompt.\n * Injected dynamically — only when the recipe matches.\n */\n toPromptContext(recipe: Recipe): string {\n const lines: string[] = [\n `## Active Recipe: ${recipe.name}`,\n recipe.description,\n 'Follow these steps:',\n ];\n\n for (let i = 0; i < recipe.steps.length; i++) {\n const step = recipe.steps[i];\n const num = i + 1;\n const toolNote = step.tool ? ` → ${step.tool}` : '';\n const serviceNote = step.service ? ` (${step.service})` : '';\n const costNote = step.cost ? ` — ${step.cost}` : '';\n const gateNote = step.gate && step.gate !== 'none'\n ? ` [GATE: ${step.gate}]`\n : '';\n\n let line = `${num}. ${step.name}${toolNote}${serviceNote}${costNote}${gateNote}`;\n\n if (step.gate_prompt) {\n line += ` — \"${step.gate_prompt}\"`;\n }\n\n lines.push(line);\n\n if (step.rules?.length) {\n for (const rule of step.rules) {\n lines.push(` - ${rule}`);\n }\n }\n\n if (step.notes) {\n lines.push(` Note: ${step.notes}`);\n }\n\n if (step.on_error) {\n lines.push(` On error: ${step.on_error.action} — ${step.on_error.message}`);\n }\n\n if (step.condition) {\n lines.push(` Condition: ${step.condition}`);\n }\n }\n\n if (recipe.prerequisites?.length) {\n lines.push('Prerequisites (ask before starting):');\n for (const pre of recipe.prerequisites) {\n lines.push(`- ${pre.field}: \"${pre.prompt}\"`);\n }\n }\n\n return lines.join('\\n');\n }\n}\n","import type { ThinkingEffort } from './types.js';\nimport type { Recipe } from './recipes/index.js';\n\n/**\n * Routes each turn to the appropriate thinking effort level based on\n * message content, matched recipe, and session write history.\n *\n * Heuristics only — no LLM call. Cost per session becomes proportional\n * to actual query complexity rather than a fixed budget.\n */\nexport function classifyEffort(\n model: string,\n userMessage: string,\n matchedRecipe: Recipe | null,\n sessionWriteCount: number,\n): ThinkingEffort {\n const supportsMax = model.includes('opus-4-6');\n const msg = userMessage.toLowerCase();\n\n if (supportsMax) {\n if (matchedRecipe?.name === 'portfolio_rebalance') return 'max';\n if (matchedRecipe?.name === 'emergency_withdraw') return 'max';\n if (/rebalance|reallocate|dca setup|close.*position/i.test(msg)) return 'max';\n }\n\n if (matchedRecipe && matchedRecipe.steps.length >= 3) return 'high';\n if (matchedRecipe?.name === 'safe_borrow' || matchedRecipe?.name === 'bulk_mail') return 'high';\n if (sessionWriteCount > 0 && /borrow|withdraw|send|swap/i.test(msg)) return 'high';\n\n if (/balance|rate|how much|what is|check|history|show|price/i.test(msg)) return 'low';\n if (!matchedRecipe && !/deposit|send|swap|borrow|withdraw|save|pay/i.test(msg)) return 'low';\n\n return 'medium';\n}\n","import type { SystemBlock } from './types.js';\n\n/**\n * Build a cacheable system prompt array from static and dynamic parts.\n *\n * Anthropic caches system prompt blocks marked with `cache_control: { type: 'ephemeral' }`.\n * Static blocks (identity, tool descriptions) are cached across turns. Dynamic blocks\n * (user profile, positions, state) change per-turn and are NOT cached.\n *\n * Cache breakpoints are placed at the end of each static block — Anthropic caches\n * from the start of the prompt up to the last cache_control marker.\n */\nexport function buildCachedSystemPrompt(\n staticParts: string[],\n dynamicPart?: string,\n): SystemBlock[] {\n const blocks: SystemBlock[] = staticParts.map((text, i) => ({\n type: 'text' as const,\n text,\n ...(i === staticParts.length - 1 && { cache_control: { type: 'ephemeral' as const } }),\n }));\n\n if (dynamicPart) {\n blocks.push({ type: 'text', text: dynamicPart });\n }\n\n return blocks;\n}\n","/**\n * Intelligence Layer prompt builders (F1, F2, F5).\n * Pure functions — no DB or Redis dependencies.\n * Consumed by the host app's dynamic context assembly.\n */\n\n// ---------------------------------------------------------------------------\n// F1: User Financial Profile types + context builder\n// ---------------------------------------------------------------------------\n\nexport interface UserFinancialProfile {\n userId: string;\n riskAppetite: 'conservative' | 'moderate' | 'aggressive';\n financialLiteracy: 'novice' | 'intermediate' | 'advanced';\n prefersBriefResponses: boolean;\n prefersExplainers: boolean;\n currencyFraming: 'usdc' | 'fiat';\n primaryGoals: string[];\n knownPatterns: string[];\n riskConfidence: number;\n literacyConfidence: number;\n lastInferredAt: Date | null;\n}\n\n/**\n * Build system prompt context from a user's financial profile.\n * Returns empty string if profile is absent or confidence is too low.\n * Takes the profile object directly — no DB query.\n */\nexport function buildProfileContext(profile: UserFinancialProfile | null): string {\n if (!profile || profile.riskConfidence < 0.3) return '';\n\n const lines: string[] = ['User financial profile (inferred from conversation history):'];\n\n if (profile.riskConfidence >= 0.5) {\n lines.push(`- Risk appetite: ${profile.riskAppetite}`);\n }\n if (profile.literacyConfidence >= 0.5) {\n lines.push(`- Financial literacy: ${profile.financialLiteracy}`);\n if (profile.financialLiteracy === 'advanced') {\n lines.push(' → Skip basic DeFi explanations (health factor, APY, etc). User knows these.');\n }\n if (profile.financialLiteracy === 'novice') {\n lines.push(' → Always explain DeFi concepts in plain language.');\n }\n }\n if (profile.currencyFraming === 'fiat') {\n lines.push('- Frame amounts as dollars (e.g. \"$50\" not \"50 USDC\")');\n }\n if (profile.prefersBriefResponses) {\n lines.push('- Prefers brief responses — be concise');\n }\n if (profile.primaryGoals.length > 0) {\n lines.push(`- Stated goals: ${profile.primaryGoals.join(', ')}`);\n }\n if (profile.knownPatterns.length > 0) {\n lines.push(`- Behavioural patterns: ${profile.knownPatterns.join(', ')}`);\n }\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// F2: In-Session Proactive Awareness\n// ---------------------------------------------------------------------------\n\nexport function buildProactivenessInstructions(profile: UserFinancialProfile | null): string {\n const brevityGuidance = profile?.prefersBriefResponses\n ? 'This user prefers brevity — only surface context if urgent or directly actionable.'\n : 'Surface relevant context when criteria are met.';\n\n const styleGuidance = profile?.financialLiteracy === 'novice'\n ? 'Frame observations in plain English, no DeFi jargon.'\n : 'Technical framing is fine.';\n\n return `Proactive awareness:\nAfter completing the user's request, consider whether ONE additional piece of financial\ncontext is worth mentioning. ${brevityGuidance}\n\n✓ Mention if:\n- Their savings goal is materially off-track (>20% behind pace)\n- Yield rate changed significantly since last session (>0.5%)\n- They have idle USDC >$50 sitting for >48h\n- An action they just took interacts with an active goal or debt position\n- A pattern would materially benefit from their attention\n\n✗ Do NOT mention if:\n- Tangentially related but not actionable\n- Already surfaced this session\n- Requires more explanation than the original answer\n- Would seem pushy or sales-y\n\n${styleGuidance}\nFormat: One sentence maximum, after main response, separated by a line break.\nFrame as observation, not advice: \"Your Tokyo goal is $80 behind pace.\" — not \"You should deposit more.\"`;\n}\n\n// ---------------------------------------------------------------------------\n// F5: Post-Action Self-Evaluation\n// ---------------------------------------------------------------------------\n\nexport function buildSelfEvaluationInstruction(): string {\n return `Self-evaluation (apply silently before composing your response):\n\n1. ACCURACY — Quote exact values from tool results, not estimates or rounded figures.\n Never combine post-action tool results with pre-action snapshot numbers.\n If the tool returned an error, label it as an error — do not paraphrase it as success.\n\n2. STATE CONSISTENCY — Describe the actual outcome of all steps.\n Partial success (swap ok, deposit failed): describe both clearly.\n Never describe a failed action as if it succeeded.\n\n3. COMPLETENESS — If the user asked multiple things, answer all of them.\n If you couldn't complete something, explain why and what the current state is.\n\n4. TONE — Match tone to outcome.\n Success: confirming and forward-looking.\n Failure: clear about what failed, unchanged, and what to do next.\n Warning: specific risk, not generic caution.\n\nIf any check fails, rewrite before outputting.`;\n}\n","/**\n * Conversation State Machine — F4 of the Intelligence Layer.\n *\n * Types, pure context builder, and a generic state manager interface.\n * The Redis implementation lives in the host app (audric) since it depends on @upstash/redis.\n */\n\n// ---------------------------------------------------------------------------\n// State definitions\n// ---------------------------------------------------------------------------\n\nexport type ConversationState =\n | { type: 'idle' }\n\n | {\n type: 'mid_recipe';\n recipeName: string;\n currentStep: number;\n totalSteps: number;\n completedStepOutputs: Record<string, Record<string, string | number>>;\n startedAt: number;\n }\n\n | {\n type: 'awaiting_confirmation';\n action: string;\n amount?: number;\n recipient?: string;\n proposedAt: number;\n expiresAt: number;\n }\n\n | {\n type: 'post_error';\n failedAction: string;\n errorMessage: string;\n occurredAt: number;\n partialState?: string;\n }\n\n | {\n type: 'post_liquidation_warning';\n healthFactor: number;\n warnedAt: number;\n }\n\n | {\n type: 'onboarding';\n sessionNumber: number;\n hasBalance: boolean;\n hasSavedBefore: boolean;\n };\n\nexport type StateType = ConversationState['type'];\n\n// ---------------------------------------------------------------------------\n// State manager interface (host app provides the implementation)\n// ---------------------------------------------------------------------------\n\nexport interface ConversationStateStore {\n get(): Promise<ConversationState>;\n set(state: ConversationState): Promise<void>;\n transition(to: ConversationState): Promise<void>;\n reset(): Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Context builder — pure function, no I/O\n// ---------------------------------------------------------------------------\n\nexport function buildStateContext(state: ConversationState): string {\n switch (state.type) {\n case 'idle':\n return '';\n\n case 'mid_recipe': {\n const elapsed = Math.round((Date.now() - state.startedAt) / 60_000);\n const outputs = JSON.stringify(state.completedStepOutputs);\n return [\n `Conversation state: MID-RECIPE`,\n `Active recipe: ${state.recipeName} (step ${state.currentStep + 1} of ${state.totalSteps})`,\n `Started: ${elapsed} minutes ago`,\n `Completed step key outputs: ${outputs}`,\n `If the user asks an unrelated question: answer briefly, then offer to continue the ${state.recipeName} flow.`,\n `If the user says \"cancel\" or \"stop\": confirm you have abandoned the recipe and return to idle.`,\n ].join('\\n');\n }\n\n case 'awaiting_confirmation': {\n const expiryMins = Math.max(0, Math.round((state.expiresAt - Date.now()) / 60_000));\n const expired = state.expiresAt < Date.now();\n return [\n `Conversation state: AWAITING CONFIRMATION`,\n `Proposed action: ${state.action}${state.amount ? ` for $${state.amount}` : ''}${state.recipient ? ` to ${state.recipient}` : ''}`,\n expired\n ? `Status: EXPIRED — ask if user still wants to proceed`\n : `Expires in: ${expiryMins} minutes`,\n `\"yes/confirm/do it\" → execute. \"no/cancel/wait\" → abort, reset to idle.`,\n ].join('\\n');\n }\n\n case 'post_error':\n return [\n `Conversation state: POST-ERROR`,\n `Failed action: ${state.failedAction}`,\n `Error: ${state.errorMessage}`,\n state.partialState ? `Partial state: ${state.partialState}` : '',\n `Acknowledge failure clearly. Offer a specific recovery path if one exists.`,\n `This state clears automatically on the next successful action.`,\n ].filter(Boolean).join('\\n');\n\n case 'post_liquidation_warning':\n return [\n `Conversation state: LIQUIDATION WARNING ACTIVE`,\n `Health factor: ${state.healthFactor.toFixed(2)} — below safe threshold`,\n `Prioritise debt repayment or collateral deposit.`,\n `Do not proceed with any action that would further reduce health factor.`,\n ].join('\\n');\n\n case 'onboarding':\n return [\n `Conversation state: ONBOARDING (session ${state.sessionNumber})`,\n state.sessionNumber === 1\n ? 'First session — introduce capabilities through context, not a feature list.'\n : `Returning user — ${state.hasSavedBefore ? 'has saved before' : 'has not saved yet'}.`,\n ].join('\\n');\n\n default:\n return '';\n }\n}\n","import type { Tool, ToolContext } from './types.js';\nimport { getDefaultTools } from './tools/index.js';\n\n// ---------------------------------------------------------------------------\n// MCP tool descriptor — the shape MCP servers need to register tools\n// ---------------------------------------------------------------------------\n\nexport interface McpToolDescriptor {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (args: Record<string, unknown>) => Promise<{\n content: Array<{ type: 'text'; text: string }>;\n isError?: boolean;\n }>;\n}\n\n// ---------------------------------------------------------------------------\n// Convert engine tools → MCP tool descriptors\n// ---------------------------------------------------------------------------\n\n/**\n * Builds MCP-compatible tool descriptors from engine tools.\n * Each tool's `call()` is wrapped to return the MCP response format.\n *\n * Usage with @modelcontextprotocol/sdk:\n * ```\n * const descriptors = buildMcpTools(context);\n * for (const desc of descriptors) {\n * server.tool(desc.name, desc.description, desc.inputSchema, desc.handler);\n * }\n * ```\n */\nexport function buildMcpTools(\n context: ToolContext,\n tools?: Tool[],\n): McpToolDescriptor[] {\n const engineTools = tools ?? getDefaultTools();\n\n return engineTools.map((tool) => ({\n name: `audric_${tool.name}`,\n description: tool.description,\n inputSchema: tool.jsonSchema as unknown as Record<string, unknown>,\n\n async handler(args: Record<string, unknown>) {\n try {\n const parsed = tool.inputSchema.safeParse(args);\n if (!parsed.success) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n error: `Invalid input: ${parsed.error.issues.map((i) => i.message).join(', ')}`,\n }),\n }],\n isError: true,\n };\n }\n\n const result = await tool.call(parsed.data, context);\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify(result.data),\n }],\n };\n } catch (err) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n error: err instanceof Error ? err.message : 'Tool execution failed',\n }),\n }],\n isError: true,\n };\n }\n },\n }));\n}\n\n/**\n * Register all engine tools with an MCP server instance.\n * Convenience wrapper for the common pattern.\n */\nexport function registerEngineTools(\n server: { tool: (name: string, description: string, schema: Record<string, unknown>, handler: (args: Record<string, unknown>) => Promise<unknown>) => void },\n context: ToolContext,\n tools?: Tool[],\n): void {\n const descriptors = buildMcpTools(context, tools);\n for (const desc of descriptors) {\n server.tool(desc.name, desc.description, desc.inputSchema, desc.handler);\n }\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport type { Tool as McpToolDef } from '@modelcontextprotocol/sdk/types.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface McpServerConfig {\n /** Human-readable server name, used as tool namespace prefix. */\n name: string;\n /** MCP server URL (Streamable HTTP or SSE endpoint). */\n url: string;\n /** Transport type. Defaults to 'streamable-http'. */\n transport?: 'streamable-http' | 'sse';\n /** Response cache TTL in ms. Default 30_000 (30s). */\n cacheTtlMs?: number;\n /** Whether all tools from this server are read-only. Default true. */\n readOnly?: boolean;\n}\n\nexport interface McpServerConnection {\n config: McpServerConfig;\n client: Client;\n transport: Transport;\n tools: McpToolDef[];\n status: 'connected' | 'disconnected' | 'error';\n lastError?: string;\n}\n\nexport interface McpCallResult {\n content: Array<{ type: string; text?: string; [key: string]: unknown }>;\n isError?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Response cache\n// ---------------------------------------------------------------------------\n\ninterface CacheEntry {\n result: McpCallResult;\n expiresAt: number;\n}\n\nexport class McpResponseCache {\n private cache = new Map<string, CacheEntry>();\n private readonly defaultTtlMs: number;\n\n constructor(defaultTtlMs = 30_000) {\n this.defaultTtlMs = defaultTtlMs;\n }\n\n private key(serverName: string, toolName: string, args: unknown): string {\n return `${serverName}::${toolName}::${JSON.stringify(args)}`;\n }\n\n get(serverName: string, toolName: string, args: unknown): McpCallResult | null {\n const k = this.key(serverName, toolName, args);\n const entry = this.cache.get(k);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(k);\n return null;\n }\n return entry.result;\n }\n\n set(serverName: string, toolName: string, args: unknown, result: McpCallResult, ttlMs?: number): void {\n const k = this.key(serverName, toolName, args);\n this.cache.set(k, {\n result,\n expiresAt: Date.now() + (ttlMs ?? this.defaultTtlMs),\n });\n }\n\n invalidate(serverName?: string): void {\n if (!serverName) {\n this.cache.clear();\n return;\n }\n for (const key of this.cache.keys()) {\n if (key.startsWith(`${serverName}::`)) {\n this.cache.delete(key);\n }\n }\n }\n\n get size(): number {\n return this.cache.size;\n }\n}\n\n// ---------------------------------------------------------------------------\n// McpClientManager — multi-server connection registry\n// ---------------------------------------------------------------------------\n\nexport class McpClientManager {\n private connections = new Map<string, McpServerConnection>();\n private readonly responseCache: McpResponseCache;\n\n constructor(opts?: { cacheTtlMs?: number }) {\n this.responseCache = new McpResponseCache(opts?.cacheTtlMs ?? 30_000);\n }\n\n /**\n * Connect to an MCP server and discover its tools.\n * If already connected to a server with this name, disconnects first.\n */\n async connect(config: McpServerConfig): Promise<McpServerConnection> {\n if (this.connections.has(config.name)) {\n await this.disconnect(config.name);\n }\n\n const client = new Client(\n { name: 'audric-engine', version: '0.1.0' },\n { capabilities: {} },\n );\n\n const transportType = config.transport ?? 'streamable-http';\n const url = new URL(config.url);\n\n const transport = transportType === 'sse'\n ? new SSEClientTransport(url)\n : new StreamableHTTPClientTransport(url, {\n reconnectionOptions: {\n maxReconnectionDelay: 30_000,\n initialReconnectionDelay: 1_000,\n reconnectionDelayGrowFactor: 1.5,\n maxRetries: 3,\n },\n });\n\n const conn: McpServerConnection = {\n config,\n client,\n transport,\n tools: [],\n status: 'disconnected',\n };\n\n try {\n await client.connect(transport);\n conn.status = 'connected';\n\n const { tools } = await client.listTools();\n conn.tools = tools;\n } catch (err) {\n try { await client.close(); } catch { /* best-effort */ }\n throw err;\n }\n\n this.connections.set(config.name, conn);\n return conn;\n }\n\n /** Disconnect from a server by name. */\n async disconnect(name: string): Promise<void> {\n const conn = this.connections.get(name);\n if (!conn) return;\n try {\n await conn.client.close();\n } catch { /* best-effort */ }\n conn.status = 'disconnected';\n conn.tools = [];\n this.connections.delete(name);\n this.responseCache.invalidate(name);\n }\n\n /** Disconnect from all servers. */\n async disconnectAll(): Promise<void> {\n const names = [...this.connections.keys()];\n await Promise.allSettled(names.map((n) => this.disconnect(n)));\n }\n\n /** Get a connection by server name. */\n getConnection(name: string): McpServerConnection | undefined {\n return this.connections.get(name);\n }\n\n /** Check if a server is connected. */\n isConnected(name: string): boolean {\n return this.connections.get(name)?.status === 'connected';\n }\n\n /** List all tool definitions across all connected servers. */\n listAllTools(): Array<{ serverName: string; tool: McpToolDef }> {\n const result: Array<{ serverName: string; tool: McpToolDef }> = [];\n for (const [name, conn] of this.connections) {\n if (conn.status !== 'connected') continue;\n for (const tool of conn.tools) {\n result.push({ serverName: name, tool });\n }\n }\n return result;\n }\n\n /**\n * Call a tool on a specific server.\n * Uses response cache for read-only servers.\n */\n async callTool(\n serverName: string,\n toolName: string,\n args: Record<string, unknown> = {},\n ): Promise<McpCallResult> {\n const conn = this.connections.get(serverName);\n if (!conn) throw new Error(`MCP server \"${serverName}\" not connected`);\n if (conn.status !== 'connected') throw new Error(`MCP server \"${serverName}\" is ${conn.status}`);\n\n const cacheTtl = conn.config.cacheTtlMs ?? 30_000;\n if (conn.config.readOnly !== false && cacheTtl > 0) {\n const cached = this.responseCache.get(serverName, toolName, args);\n if (cached) return cached;\n }\n\n const result = await conn.client.callTool({ name: toolName, arguments: args });\n\n const callResult: McpCallResult = {\n content: (result.content ?? []) as McpCallResult['content'],\n isError: result.isError as boolean | undefined,\n };\n\n if (conn.config.readOnly !== false && cacheTtl > 0) {\n this.responseCache.set(serverName, toolName, args, callResult, cacheTtl);\n }\n\n return callResult;\n }\n\n /** Get the response cache (for testing / manual invalidation). */\n get cache(): McpResponseCache {\n return this.responseCache;\n }\n\n /** Number of connected servers. */\n get serverCount(): number {\n let count = 0;\n for (const conn of this.connections.values()) {\n if (conn.status === 'connected') count++;\n }\n return count;\n }\n\n /** All server names. */\n get serverNames(): string[] {\n return [...this.connections.keys()];\n }\n}\n","import { z } from 'zod';\nimport type { Tool as McpToolDef } from '@modelcontextprotocol/sdk/types.js';\nimport type { Tool, ToolJsonSchema, PermissionLevel } from './types.js';\nimport type { McpClientManager } from './mcp-client.js';\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport interface McpToolAdapterConfig {\n /** The McpClientManager to route calls through. */\n manager: McpClientManager;\n /** Server name this tool belongs to. */\n serverName: string;\n /** Override permission level for all tools from this server. */\n permissionLevel?: PermissionLevel;\n /** Override isReadOnly for all tools from this server. */\n isReadOnly?: boolean;\n /** Per-tool overrides keyed by MCP tool name. */\n toolOverrides?: Record<string, {\n permissionLevel?: PermissionLevel;\n isReadOnly?: boolean;\n description?: string;\n }>;\n}\n\n// ---------------------------------------------------------------------------\n// Adapter: single MCP tool → engine Tool\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a single MCP tool definition into an engine Tool.\n * The tool name is namespaced as `{serverName}_{mcpToolName}`.\n */\nexport function adaptMcpTool(\n mcpTool: McpToolDef,\n config: McpToolAdapterConfig,\n): Tool {\n const overrides = config.toolOverrides?.[mcpTool.name];\n const isReadOnly = overrides?.isReadOnly ?? config.isReadOnly ?? true;\n const permissionLevel = overrides?.permissionLevel ?? config.permissionLevel ?? 'auto';\n const namespacedName = `${config.serverName}_${mcpTool.name}`;\n\n const jsonSchema: ToolJsonSchema = (mcpTool.inputSchema ?? {\n type: 'object',\n properties: {},\n }) as ToolJsonSchema;\n\n return {\n name: namespacedName,\n description: overrides?.description ?? mcpTool.description ?? `MCP tool: ${mcpTool.name}`,\n inputSchema: z.record(z.unknown()),\n jsonSchema,\n isReadOnly,\n isConcurrencySafe: isReadOnly,\n permissionLevel,\n flags: {},\n\n async call(input, _context) {\n const result = await config.manager.callTool(\n config.serverName,\n mcpTool.name,\n input as Record<string, unknown>,\n );\n\n const textContent = result.content\n .filter((c) => c.type === 'text' && c.text)\n .map((c) => c.text!)\n .join('\\n');\n\n let data: unknown;\n try {\n data = JSON.parse(textContent);\n } catch {\n data = textContent || result.content;\n }\n\n if (result.isError) {\n return { data: { error: data } };\n }\n\n return { data };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Batch adapter: all tools from a server → engine Tools\n// ---------------------------------------------------------------------------\n\n/**\n * Convert all discovered tools from an MCP server into engine Tools.\n * Call this after `manager.connect(config)` completes successfully.\n */\nexport function adaptAllMcpTools(config: McpToolAdapterConfig): Tool[] {\n const conn = config.manager.getConnection(config.serverName);\n if (!conn || conn.status !== 'connected') {\n return [];\n }\n return conn.tools.map((t) => adaptMcpTool(t, config));\n}\n\n/**\n * Convenience: adapt tools from all connected servers.\n * Returns a flat array of engine Tools, namespaced by server name.\n */\nexport function adaptAllServerTools(\n manager: McpClientManager,\n serverConfigs?: Record<string, Omit<McpToolAdapterConfig, 'manager' | 'serverName'>>,\n): Tool[] {\n const allTools: Tool[] = [];\n\n for (const { serverName, tool } of manager.listAllTools()) {\n const serverOpts = serverConfigs?.[serverName] ?? {};\n allTools.push(adaptMcpTool(tool, {\n manager,\n serverName,\n ...serverOpts,\n }));\n }\n\n return allTools;\n}\n","import Anthropic from '@anthropic-ai/sdk';\nimport type {\n ChatParams,\n LLMProvider,\n Message,\n ProviderEvent,\n StopReason,\n SystemPrompt,\n ThinkingConfig,\n ToolDefinition,\n} from '../types.js';\n\nconst DEFAULT_MODEL = 'claude-sonnet-4-20250514';\nconst DEFAULT_MAX_TOKENS = 4096;\n\nexport interface AnthropicProviderConfig {\n apiKey: string;\n defaultModel?: string;\n defaultMaxTokens?: number;\n}\n\nexport class AnthropicProvider implements LLMProvider {\n private client: Anthropic;\n private defaultModel: string;\n private defaultMaxTokens: number;\n\n constructor(config: AnthropicProviderConfig) {\n this.client = new Anthropic({ apiKey: config.apiKey });\n this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;\n this.defaultMaxTokens = config.defaultMaxTokens ?? DEFAULT_MAX_TOKENS;\n }\n\n async *chat(params: ChatParams): AsyncGenerator<ProviderEvent> {\n const messages = sanitizeAnthropicMessages(\n params.messages.map(toAnthropicMessage),\n );\n const tools = params.tools.map(toAnthropicTool);\n\n let toolChoice: Anthropic.Messages.MessageCreateParams['tool_choice'] | undefined;\n if (params.toolChoice && tools.length > 0) {\n if (params.toolChoice === 'any') {\n toolChoice = { type: 'any' };\n } else if (params.toolChoice === 'auto') {\n toolChoice = { type: 'auto' };\n } else if (typeof params.toolChoice === 'object') {\n toolChoice = { type: 'tool', name: params.toolChoice.name };\n }\n }\n\n const thinkingParam = toAnthropicThinking(params.thinking);\n\n const systemParam = toAnthropicSystem(params.systemPrompt);\n\n const baseParams: Anthropic.Messages.MessageCreateParamsStreaming = {\n model: params.model ?? this.defaultModel,\n max_tokens: params.maxTokens ?? this.defaultMaxTokens,\n system: systemParam,\n messages,\n stream: true as const,\n tools: tools.length > 0 ? tools : undefined,\n ...(!thinkingParam && params.temperature !== undefined && { temperature: params.temperature }),\n ...(toolChoice && { tool_choice: toolChoice }),\n };\n\n const streamParams = {\n ...baseParams,\n ...(thinkingParam && { thinking: thinkingParam }),\n ...(params.outputConfig?.effort && { output_config: { effort: params.outputConfig.effort } }),\n };\n\n // Cast to satisfy SDK types — thinking/output_config may not be in the type defs yet\n const stream = params.signal\n ? this.client.messages.stream(streamParams as Anthropic.Messages.MessageCreateParamsStreaming, { signal: params.signal })\n : this.client.messages.stream(streamParams as Anthropic.Messages.MessageCreateParamsStreaming);\n\n const toolInputBuffers = new Map<number, { id: string; name: string; json: string }>();\n const thinkingBuffers = new Map<number, { type: 'thinking'; text: string; signature: string } | { type: 'redacted_thinking'; data: string }>();\n let outputTokensFromStart = 0;\n\n try {\n for await (const event of stream) {\n switch (event.type) {\n case 'message_start': {\n const msg = event.message;\n yield {\n type: 'message_start',\n messageId: msg.id,\n model: msg.model,\n };\n if (msg.usage) {\n const u = msg.usage as unknown as Record<string, number>;\n outputTokensFromStart = msg.usage.output_tokens;\n yield {\n type: 'usage',\n inputTokens: msg.usage.input_tokens,\n outputTokens: msg.usage.output_tokens,\n cacheReadTokens: u.cache_read_input_tokens,\n cacheWriteTokens: u.cache_creation_input_tokens,\n };\n }\n break;\n }\n\n case 'content_block_start': {\n const block = event.content_block as { type: string; id?: string; name?: string; data?: string };\n if (block.type === 'tool_use') {\n toolInputBuffers.set(event.index, {\n id: block.id!,\n name: block.name!,\n json: '',\n });\n yield {\n type: 'tool_use_start',\n id: block.id!,\n name: block.name!,\n };\n } else if (block.type === 'thinking') {\n thinkingBuffers.set(event.index, { type: 'thinking', text: '', signature: '' });\n } else if (block.type === 'redacted_thinking') {\n thinkingBuffers.set(event.index, { type: 'redacted_thinking', data: block.data ?? '' });\n }\n break;\n }\n\n case 'content_block_delta': {\n const delta = event.delta as { type: string; text?: string; partial_json?: string; thinking?: string; signature?: string };\n if (delta.type === 'text_delta') {\n yield { type: 'text_delta', text: delta.text! };\n } else if (delta.type === 'input_json_delta') {\n const buf = toolInputBuffers.get(event.index);\n if (buf) {\n buf.json += delta.partial_json!;\n yield {\n type: 'tool_use_delta',\n id: buf.id,\n partialJson: delta.partial_json!,\n };\n }\n } else if (delta.type === 'thinking_delta') {\n const buf = thinkingBuffers.get(event.index);\n if (buf?.type === 'thinking') buf.text += delta.thinking ?? '';\n yield { type: 'thinking_delta', text: delta.thinking ?? '' };\n } else if (delta.type === 'signature_delta') {\n const buf = thinkingBuffers.get(event.index);\n if (buf?.type === 'thinking') buf.signature = delta.signature ?? '';\n }\n break;\n }\n\n case 'content_block_stop': {\n const toolBuf = toolInputBuffers.get(event.index);\n if (toolBuf) {\n let input: unknown = {};\n try {\n input = JSON.parse(toolBuf.json || '{}');\n } catch {\n input = {};\n }\n yield {\n type: 'tool_use_done',\n id: toolBuf.id,\n name: toolBuf.name,\n input,\n };\n toolInputBuffers.delete(event.index);\n }\n const thinkBuf = thinkingBuffers.get(event.index);\n if (thinkBuf?.type === 'thinking') {\n yield { type: 'thinking_done', thinking: thinkBuf.text, signature: thinkBuf.signature };\n thinkingBuffers.delete(event.index);\n } else if (thinkBuf?.type === 'redacted_thinking') {\n yield { type: 'redacted_thinking', data: thinkBuf.data };\n thinkingBuffers.delete(event.index);\n }\n break;\n }\n\n case 'message_delta': {\n const delta = event.delta as { stop_reason?: string };\n const usage = event.usage as { output_tokens?: number } | undefined;\n // message_delta.usage.output_tokens is cumulative — emit only the delta\n if (usage?.output_tokens && usage.output_tokens > outputTokensFromStart) {\n const increment = usage.output_tokens - outputTokensFromStart;\n outputTokensFromStart = usage.output_tokens;\n yield {\n type: 'usage',\n inputTokens: 0,\n outputTokens: increment,\n };\n }\n if (delta.stop_reason) {\n yield {\n type: 'stop',\n reason: mapStopReason(delta.stop_reason),\n };\n }\n break;\n }\n }\n }\n } finally {\n stream.abort();\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Conversion helpers\n// ---------------------------------------------------------------------------\n\nfunction toAnthropicSystem(prompt: SystemPrompt): string | Anthropic.Messages.TextBlockParam[] {\n if (typeof prompt === 'string') return prompt;\n return prompt.map((block) => ({\n type: 'text' as const,\n text: block.text,\n ...(block.cache_control && { cache_control: block.cache_control }),\n }));\n}\n\nfunction toAnthropicThinking(config?: ThinkingConfig): Record<string, unknown> | undefined {\n if (!config || config.type === 'disabled') return undefined;\n if (config.type === 'adaptive') return { type: 'adaptive' };\n return { type: 'enabled', budget_tokens: config.budgetTokens };\n}\n\nfunction toAnthropicMessage(msg: Message): Anthropic.MessageParam {\n const content: Anthropic.ContentBlockParam[] = msg.content\n .map((block): Anthropic.ContentBlockParam | null => {\n switch (block.type) {\n case 'text':\n return { type: 'text' as const, text: block.text };\n case 'thinking':\n return { type: 'thinking' as const, thinking: block.thinking, signature: block.signature } as unknown as Anthropic.ContentBlockParam;\n case 'redacted_thinking':\n return { type: 'redacted_thinking' as const, data: block.data } as unknown as Anthropic.ContentBlockParam;\n case 'tool_use':\n return {\n type: 'tool_use' as const,\n id: block.id,\n name: block.name,\n input: block.input as Record<string, unknown>,\n };\n case 'tool_result':\n return {\n type: 'tool_result' as const,\n tool_use_id: block.toolUseId,\n content: block.content,\n is_error: block.isError,\n };\n }\n })\n .filter((b): b is Anthropic.ContentBlockParam => b !== null);\n\n return { role: msg.role, content };\n}\n\nfunction toAnthropicTool(\n def: ToolDefinition,\n): Anthropic.Messages.Tool {\n return {\n name: def.name,\n description: def.description,\n input_schema: def.input_schema as Anthropic.Messages.Tool.InputSchema,\n };\n}\n\nfunction mapStopReason(reason: string): StopReason {\n switch (reason) {\n case 'end_turn':\n return 'end_turn';\n case 'tool_use':\n return 'tool_use';\n case 'max_tokens':\n return 'max_tokens';\n default:\n return 'end_turn';\n }\n}\n\n/**\n * Last-line-of-defense sanitization operating directly on Anthropic-format messages.\n * Enforces the positional constraint: every tool_use in an assistant message must have\n * a matching tool_result (by tool_use_id) in the immediately next user message.\n * Strips orphans in both directions and fixes role alternation.\n */\nfunction sanitizeAnthropicMessages(\n messages: Anthropic.MessageParam[],\n): Anthropic.MessageParam[] {\n const result: Anthropic.MessageParam[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n const content = Array.isArray(msg.content) ? msg.content : [{ type: 'text' as const, text: msg.content }];\n\n // Collect tool_use ids in this assistant message\n const toolUseIds = content\n .filter((b): b is Anthropic.ToolUseBlockParam => (b as { type: string }).type === 'tool_use')\n .map((b) => b.id);\n\n if (msg.role === 'assistant' && toolUseIds.length > 0) {\n const next = messages[i + 1];\n const nextContent = next ? (Array.isArray(next.content) ? next.content : []) : [];\n const nextResultIds = new Set(\n nextContent\n .filter((b): b is Anthropic.ToolResultBlockParam => (b as { type: string }).type === 'tool_result')\n .map((b) => b.tool_use_id),\n );\n\n // Keep only tool_use blocks that have a result in the next message\n const cleanContent = content.filter((b) => {\n if ((b as { type: string }).type === 'tool_use') return nextResultIds.has((b as Anthropic.ToolUseBlockParam).id);\n return true;\n });\n\n // Keep only tool_result blocks in next whose tool_use survived\n const keptIds = new Set(\n cleanContent\n .filter((b): b is Anthropic.ToolUseBlockParam => (b as { type: string }).type === 'tool_use')\n .map((b) => b.id),\n );\n const cleanNext = nextContent.filter((b) => {\n if ((b as { type: string }).type === 'tool_result')\n return keptIds.has((b as Anthropic.ToolResultBlockParam).tool_use_id);\n return true;\n });\n\n if (cleanContent.length > 0) result.push({ role: 'assistant', content: cleanContent });\n if (cleanNext.length > 0 && next) result.push({ role: next.role, content: cleanNext });\n i++; // skip the next message (already processed)\n\n if (cleanContent.length < content.length || cleanNext.length < nextContent.length) {\n console.warn(\n `[anthropic] sanitized orphans: stripped ${content.length - cleanContent.length} tool_use, ${nextContent.length - cleanNext.length} tool_result`,\n );\n }\n continue;\n }\n\n // For user messages: strip tool_result referencing non-existent tool_use in prev assistant\n if (msg.role === 'user' && content.some((b) => (b as { type: string }).type === 'tool_result')) {\n const prev = result[result.length - 1];\n const prevContent = prev?.role === 'assistant' && Array.isArray(prev.content) ? prev.content : [];\n const prevToolUseIds = new Set(\n prevContent\n .filter((b): b is Anthropic.ToolUseBlockParam => (b as { type: string }).type === 'tool_use')\n .map((b) => b.id),\n );\n const cleanContent = content.filter((b) => {\n if ((b as { type: string }).type === 'tool_result')\n return prevToolUseIds.has((b as Anthropic.ToolResultBlockParam).tool_use_id);\n return true;\n });\n if (cleanContent.length > 0) result.push({ role: msg.role, content: cleanContent });\n continue;\n }\n\n result.push(msg);\n }\n\n // Merge consecutive same-role messages\n const merged: Anthropic.MessageParam[] = [];\n for (const msg of result) {\n const last = merged[merged.length - 1];\n if (last && last.role === msg.role) {\n const lastContent = Array.isArray(last.content) ? last.content : [{ type: 'text' as const, text: last.content }];\n const msgContent = Array.isArray(msg.content) ? msg.content : [{ type: 'text' as const, text: msg.content }];\n last.content = [...lastContent, ...msgContent];\n } else {\n merged.push({ ...msg });\n }\n }\n\n // First message must be user\n while (merged.length > 0 && merged[0].role !== 'user') {\n merged.shift();\n }\n\n return merged;\n}\n"]}
|