@t2000/engine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tool.ts","../src/orchestration.ts","../src/navi-config.ts","../src/navi-transforms.ts","../src/navi-reads.ts","../src/tools/utils.ts","../src/tools/balance.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/index.ts","../src/prompt.ts","../src/cost.ts","../src/engine.ts","../src/streaming.ts","../src/session.ts","../src/context.ts","../src/mcp.ts","../src/mcp-client.ts","../src/mcp-tool-adapter.ts","../src/providers/anthropic.ts"],"names":["z","hf","status","rates","DEFAULT_MAX_TOKENS"],"mappings":"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","file":"index.js","sourcesContent":["import type { z } from 'zod';\nimport type {\n PermissionLevel,\n Tool,\n ToolContext,\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}\n\nexport function buildTool<TInput, TOutput>(\n opts: BuildToolOptions<TInput, TOutput>,\n): Tool<TInput, TOutput> {\n return {\n name: opts.name,\n description: opts.description,\n inputSchema: opts.inputSchema,\n jsonSchema: opts.jsonSchema,\n call: opts.call,\n isReadOnly: opts.isReadOnly ?? true,\n isConcurrencySafe: opts.isReadOnly ?? true,\n permissionLevel: opts.permissionLevel ?? (opts.isReadOnly === false ? 'confirm' : 'auto'),\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 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 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","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","// ---------------------------------------------------------------------------\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\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 protocol: p.protocol ?? 'navi',\n type: p.type?.includes('borrow') ? ('borrow' as const) : ('supply' as const),\n symbol: p.tokenASymbol ?? 'UNKNOWN',\n amount: toNum(p.amountA),\n valueUsd: toNum(p.valueUSD),\n apy: toNum(p.apr) / 100,\n liquidationThreshold: toNum(p.liquidationThreshold),\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', 'wUSDC', 'wUSDT', 'FDUSD', 'AUSD', 'BUCK', '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 ?? (symbol === 'SUI' ? 9 : 6);\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","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 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 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 * 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 { z } from 'zod';\nimport { fetchBalance } from '../navi-reads.js';\nimport { buildTool } from '../tool.js';\nimport { hasNaviMcp, getMcpManager, getWalletAddress, requireAgent } from './utils.js';\n\nexport const balanceCheckTool = buildTool({\n name: 'balance_check',\n description:\n 'Get the user\\'s full balance breakdown: available USDC, savings deposits, outstanding debt, pending rewards, gas reserve, and total net worth.',\n inputSchema: z.object({}),\n jsonSchema: { type: 'object', properties: {}, required: [] },\n isReadOnly: true,\n\n async call(_input, context) {\n if (hasNaviMcp(context)) {\n const bal = await fetchBalance(\n getMcpManager(context),\n getWalletAddress(context),\n );\n return {\n data: bal,\n displayText: `Balance: $${bal.total.toFixed(2)} (Available: $${bal.available.toFixed(2)}, Savings: $${bal.savings.toFixed(2)})`,\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 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 },\n displayText: `Balance: $${balance.total.toFixed(2)} (Available: $${balance.available.toFixed(2)}, Savings: $${balance.savings.toFixed(2)})`,\n };\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';\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\n async call(_input, context) {\n if (hasNaviMcp(context)) {\n const savings = await fetchSavings(\n getMcpManager(context),\n getWalletAddress(context),\n );\n return { data: 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 }));\n\n return {\n data: {\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 },\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\n async call(_input, context) {\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 { hasNaviMcp, getMcpManager, requireAgent } from './utils.js';\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\nexport const ratesInfoTool = buildTool({\n name: 'rates_info',\n description:\n 'Get current lending/borrowing interest rates (APY) for all supported assets. 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 if (hasNaviMcp(context)) {\n const rates = await fetchRates(getMcpManager(context));\n return {\n data: rates,\n displayText: formatRatesSummary(rates),\n };\n }\n\n const agent = requireAgent(context);\n const rates = await agent.rates();\n\n return {\n data: rates,\n displayText: formatRatesSummary(rates),\n };\n },\n});\n","import { z } from 'zod';\nimport { buildTool } from '../tool.js';\nimport { requireAgent } from './utils.js';\n\nexport const transactionHistoryTool = buildTool({\n name: 'transaction_history',\n description:\n 'Retrieve recent transaction history: past sends, saves, withdrawals, borrows, repayments, and rewards claims. Optionally limit the number of results.',\n inputSchema: z.object({\n limit: z.number().int().min(1).max(50).optional(),\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 },\n },\n isReadOnly: true,\n\n async call(input, context) {\n const agent = requireAgent(context);\n const records = await agent.history({ limit: input.limit ?? 10 });\n\n return {\n data: {\n transactions: records,\n count: records.length,\n },\n displayText: `${records.length} recent transaction(s)`,\n };\n },\n});\n","import { z } from 'zod';\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 savings to earn yield. Specify an amount in USD or \"all\" to save everything except a $1 gas reserve. Returns tx hash, APY, fee, and updated savings balance.',\n inputSchema: z.object({\n amount: z.union([z.number().positive(), z.literal('all')]),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: {\n description: 'Amount in USD to save, or \"all\" for maximum deposit',\n },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n\n async call(input, context) {\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 apy: result.apy,\n fee: result.fee,\n gasCost: result.gasCost,\n savingsBalance: result.savingsBalance,\n },\n displayText: `Saved $${result.amount.toFixed(2)} 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 USDC from savings back to wallet. Specify an amount in USD or \"all\" to withdraw everything safely. Checks health factor to prevent liquidation if there is outstanding debt.',\n inputSchema: z.object({\n amount: z.union([z.number().positive(), z.literal('all')]),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: {\n description: 'Amount in USD to withdraw, or \"all\" for full withdrawal',\n },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n\n async call(input, context) {\n const agent = requireAgent(context);\n const result = await agent.withdraw({ amount: input.amount });\n\n return {\n data: {\n success: result.success,\n tx: result.tx,\n amount: result.amount,\n gasCost: result.gasCost,\n },\n displayText: `Withdrew $${result.amount.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 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 }),\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 },\n required: ['to', 'amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\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 },\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 { 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. 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 }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: {\n type: 'number',\n description: 'Amount in USD to borrow',\n },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\n\n async call(input, context) {\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. Specify an amount or \"all\" to repay everything. Prioritises the highest-APY borrow first. Returns tx hash, amount repaid, and remaining debt.',\n inputSchema: z.object({\n amount: z.union([z.number().positive(), z.literal('all')]),\n }),\n jsonSchema: {\n type: 'object',\n properties: {\n amount: {\n description: 'Amount in USD to repay, or \"all\" to repay everything',\n },\n },\n required: ['amount'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\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\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\nexport const payApiTool = buildTool({\n name: 'pay_api',\n description:\n 'Access a paid API endpoint using on-chain micropayments (MPP). Sends the request, handles payment automatically, and returns the API response body. Use for accessing premium data services.',\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: 'API endpoint URL' },\n method: { type: 'string', description: 'HTTP method (default GET)' },\n body: { type: 'string', description: 'Request body (for POST/PUT)' },\n headers: { type: 'object', description: 'Additional HTTP headers' },\n maxPrice: { type: 'number', description: 'Maximum price in USD willing to pay' },\n },\n required: ['url'],\n },\n isReadOnly: false,\n permissionLevel: 'confirm',\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 type { Tool } from '../types.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';\n\nexport const READ_TOOLS: Tool[] = [\n balanceCheckTool,\n savingsInfoTool,\n healthCheckTool,\n ratesInfoTool,\n transactionHistoryTool,\n];\n\nexport const WRITE_TOOLS: Tool[] = [\n saveDepositTool,\n withdrawTool,\n sendTransferTool,\n borrowTool,\n repayDebtTool,\n claimRewardsTool,\n payApiTool,\n];\n\nexport function getDefaultTools(): Tool[] {\n return [...READ_TOOLS, ...WRITE_TOOLS];\n}\n\nexport {\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};\n","export const DEFAULT_SYSTEM_PROMPT = `You are Audric, a financial agent operating on the Sui blockchain. You help users manage their USDC through savings, payments, transfers, and credit.\n\n## Capabilities\n- Check balances, savings positions, health factors, and interest rates\n- Execute deposits, withdrawals, transfers, borrows, and repayments\n- Access API services via micropayments (MPP)\n- Track transaction history and earnings\n\n## Guidelines\n\n### Before Acting\n- Always check the user's balance before suggesting financial actions\n- Show real numbers from tool results — never fabricate rates, amounts, or balances\n- For transactions that move funds, explain what will happen and confirm intent\n\n### Tool Usage\n- Use multiple read-only tools in parallel when you need several data points\n- Present amounts as currency ($1,234.56) and rates as percentages (4.86% APY)\n- If a tool errors, explain the issue clearly and suggest alternatives\n\n### Communication Style\n- Be concise and direct — users want financial data, not filler\n- Lead with numbers and results, follow with context\n- Use short sentences. Avoid hedging language.\n- When presenting positions or balances, use a structured format\n\n### Safety\n- Never encourage risky financial behavior\n- Warn when health factor drops below 1.5\n- Remind users of gas costs for on-chain transactions\n- All amounts are in USDC unless explicitly 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 {\n EngineConfig,\n EngineEvent,\n Message,\n ContentBlock,\n Tool,\n ToolContext,\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 { DEFAULT_SYSTEM_PROMPT } from './prompt.js';\nimport { CostTracker, type CostSnapshot } from './cost.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: string;\n private readonly model: string | undefined;\n private readonly maxTurns: number;\n private readonly maxTokens: number;\n private readonly agent: unknown;\n private readonly mcpManager: unknown;\n private readonly walletAddress: string | undefined;\n private readonly txMutex = new TxMutex();\n private readonly costTracker: CostTracker;\n\n private messages: Message[] = [];\n private abortController: AbortController | null = null;\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.model = config.model;\n this.maxTurns = config.maxTurns ?? DEFAULT_MAX_TURNS;\n this.maxTokens = config.maxTokens ?? DEFAULT_MAX_TOKENS;\n this.systemPrompt = config.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n this.costTracker = new CostTracker(config.costTracker);\n\n this.tools = config.tools ?? (config.agent ? getDefaultTools() : []);\n }\n\n /**\n * Submit a user message and receive a stream of engine events.\n * Handles the full agent loop: LLM → permission check → tool execution → LLM → ...\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 this.messages.push({\n role: 'user',\n content: [{ type: 'text', text: prompt }],\n });\n\n const context: ToolContext = {\n agent: this.agent,\n mcpManager: this.mcpManager,\n walletAddress: this.walletAddress,\n signal,\n };\n\n let turns = 0;\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 stream = this.provider.chat({\n messages: this.messages,\n systemPrompt: this.systemPrompt,\n tools: toolDefs,\n model: this.model,\n maxTokens: this.maxTokens,\n signal,\n });\n\n for await (const event of stream) {\n yield* this.handleProviderEvent(event, acc);\n }\n\n if (acc.text) {\n acc.assistantBlocks.push({ type: 'text', text: acc.text });\n }\n\n this.messages.push({ role: 'assistant', content: acc.assistantBlocks });\n\n if (acc.pendingToolCalls.length === 0) {\n yield { type: 'turn_complete', stopReason: acc.stopReason };\n return;\n }\n\n if (signal.aborted) {\n yield { type: 'error', error: new Error('Aborted') };\n return;\n }\n\n // --- Permission gate: separate auto-approved from needs-confirmation ---\n const approved: PendingToolCall[] = [];\n const toolResultBlocks: ContentBlock[] = [];\n\n for (const call of acc.pendingToolCalls) {\n const tool = findTool(this.tools, call.name);\n const needsConfirmation =\n tool && !tool.isReadOnly && tool.permissionLevel !== 'auto';\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 // Two-phase confirmation: yield permission_request with a resolve callback,\n // then await the promise. The consumer calls resolve() in their loop body\n // before the generator advances to the await.\n // Race with abort signal to prevent deadlock if resolve is never called.\n let resolvePermission!: (v: boolean) => void;\n const permissionPromise = new Promise<boolean>((r) => {\n resolvePermission = r;\n });\n\n yield {\n type: 'permission_request',\n toolName: call.name,\n toolUseId: call.id,\n input: call.input,\n description: describeAction(tool!, call),\n resolve: resolvePermission,\n };\n\n let userApproved: boolean;\n try {\n userApproved = await Promise.race([\n permissionPromise,\n new Promise<never>((_, reject) => {\n if (signal.aborted) reject(new Error('Aborted'));\n signal.addEventListener('abort', () => reject(new Error('Aborted')), { once: true });\n }),\n ]);\n } catch {\n yield { type: 'error', error: new Error('Aborted') };\n return;\n }\n\n if (userApproved) {\n approved.push(call);\n yield { type: 'tool_start', toolName: call.name, toolUseId: call.id, input: call.input };\n } else {\n toolResultBlocks.push({\n type: 'tool_result',\n toolUseId: call.id,\n content: JSON.stringify({ error: 'User declined this action' }),\n isError: true,\n });\n yield {\n type: 'tool_result',\n toolName: call.name,\n toolUseId: call.id,\n result: { error: 'User declined this action' },\n isError: true,\n };\n }\n }\n\n // Execute approved tool calls\n for await (const toolEvent of runTools(approved, this.tools, context, this.txMutex)) {\n yield toolEvent;\n\n if (toolEvent.type === 'tool_result') {\n toolResultBlocks.push({\n type: 'tool_result',\n toolUseId: toolEvent.toolUseId,\n content: JSON.stringify(toolEvent.result),\n isError: toolEvent.isError,\n });\n }\n }\n\n this.messages.push({ role: 'user', content: toolResultBlocks });\n\n // Budget check between turns\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 interrupt(): void {\n this.abortController?.abort();\n }\n\n getMessages(): readonly Message[] {\n return this.messages;\n }\n\n reset(): void {\n this.messages = [];\n this.costTracker.reset();\n }\n\n loadMessages(messages: Message[]): void {\n this.messages = [...messages];\n }\n\n getUsage(): CostSnapshot {\n return this.costTracker.getSnapshot();\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private *handleProviderEvent(\n event: ProviderEvent,\n acc: TurnAccumulator,\n ): Generator<EngineEvent> {\n switch (event.type) {\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 acc.assistantBlocks.push({\n type: 'tool_use',\n id: event.id,\n name: event.name,\n input: event.input,\n });\n acc.pendingToolCalls.push({\n id: event.id,\n name: event.name,\n input: event.input,\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 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 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 === 'all' ? 'all available' : `$${input.amount}`} into savings`;\n case 'withdraw':\n return `Withdraw ${input.amount === 'all' ? 'all' : `$${input.amount}`} from savings`;\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 === 'all' ? 'all' : `$${input.amount}`} of outstanding debt`;\n case 'claim_rewards':\n return 'Claim all pending protocol rewards';\n case 'pay_api':\n return `Pay for API call to ${input.url}${input.maxPrice ? ` (max $${input.maxPrice})` : ''}`;\n default:\n return `Execute ${tool.name}`;\n }\n}\n","import type { EngineEvent, StopReason } from './types.js';\n\n// ---------------------------------------------------------------------------\n// SSE event format — serialisable subset of EngineEvent\n// ---------------------------------------------------------------------------\n\n/**\n * Wire-safe representation of EngineEvent for SSE transport.\n * `permission_request` replaces the `resolve` callback with a `permissionId`\n * that the client sends back via a separate HTTP endpoint.\n */\nexport type SSEEvent =\n | { type: 'text_delta'; text: string }\n | { type: 'tool_start'; toolName: string; toolUseId: string; input: unknown }\n | { type: 'tool_result'; toolName: string; toolUseId: string; result: unknown; isError: boolean }\n | { type: 'permission_request'; permissionId: string; toolName: string; toolUseId: string; input: unknown; description: string }\n | { type: 'turn_complete'; stopReason: StopReason }\n | { type: 'usage'; inputTokens: number; outputTokens: number; cacheReadTokens?: number; cacheWriteTokens?: number }\n | { type: 'error'; message: string };\n\n// ---------------------------------------------------------------------------\n// Serialise: EngineEvent → 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// Permission bridge — maps permissionIds to resolve callbacks\n// ---------------------------------------------------------------------------\n\nexport class PermissionBridge {\n private pending = new Map<string, (approved: boolean) => void>();\n private counter = 0;\n\n /**\n * Register a permission_request resolve callback.\n * Returns the permissionId to send to the client.\n */\n register(resolve: (approved: boolean) => void): string {\n const id = `perm_${++this.counter}_${Date.now()}`;\n this.pending.set(id, resolve);\n return id;\n }\n\n /**\n * Resolve a pending permission request from the client.\n * Returns false if the permissionId is unknown (expired or invalid).\n */\n resolve(permissionId: string, approved: boolean): boolean {\n const resolver = this.pending.get(permissionId);\n if (!resolver) return false;\n resolver(approved);\n this.pending.delete(permissionId);\n return true;\n }\n\n /** Number of pending (unresolved) permission requests. */\n get size(): number {\n return this.pending.size;\n }\n\n /** Reject all pending permissions (e.g., on disconnect). */\n rejectAll(): void {\n for (const resolver of this.pending.values()) {\n resolver(false);\n }\n this.pending.clear();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Stream adapter: engine async generator → SSE text stream\n// ---------------------------------------------------------------------------\n\n/**\n * Wraps a QueryEngine.submitMessage() generator, converting EngineEvents\n * to SSE text. Permission requests are routed through the bridge.\n */\nexport async function* engineToSSE(\n events: AsyncGenerator<EngineEvent>,\n bridge: PermissionBridge,\n): AsyncGenerator<string> {\n for await (const event of events) {\n switch (event.type) {\n case 'permission_request': {\n const permissionId = bridge.register(event.resolve);\n yield serializeSSE({\n type: 'permission_request',\n permissionId,\n toolName: event.toolName,\n toolUseId: event.toolUseId,\n input: event.input,\n description: event.description,\n });\n break;\n }\n\n case 'error': {\n yield serializeSSE({\n type: 'error',\n message: event.error.message,\n });\n break;\n }\n\n default: {\n yield serializeSSE(event as SSEEvent);\n break;\n }\n }\n }\n}\n","import type { Message } 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 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 type { Message, ContentBlock } from './types.js';\n\n// Rough token estimation: ~4 chars per token (conservative for English + JSON)\nconst CHARS_PER_TOKEN = 4;\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 '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 6. */\n keepRecentCount?: number;\n /** System prompt token estimate (subtracted from budget). Default 500. */\n systemPromptTokens?: number;\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. For older messages, summarise tool_result content to a brief one-liner.\n * 3. 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 function compactMessages(\n messages: readonly Message[],\n opts: CompactOptions = {},\n): Message[] {\n const maxTokens = opts.maxTokens ?? 100_000;\n const keepRecent = opts.keepRecentCount ?? 6;\n const systemTokens = opts.systemPromptTokens ?? 500;\n const budget = maxTokens - systemTokens;\n\n if (messages.length === 0) return [];\n\n const mutable = messages.map((m) => ({\n role: m.role,\n content: m.content.map((b) => ({ ...b })),\n })) as Message[];\n\n // If already under budget, return as-is\n if (estimateTokens(mutable) <= budget) return mutable;\n\n // Phase 1: summarise tool_result blocks in older messages\n const splitIdx = Math.max(0, mutable.length - keepRecent);\n\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 if (estimateTokens(mutable) <= budget) return mutable;\n\n // Phase 2: drop old messages from the middle, keep first + recent\n const first = mutable[0];\n const recent = mutable.slice(splitIdx);\n\n // Keep dropping from the start of the old section until under budget\n const oldSection = mutable.slice(1, splitIdx);\n\n while (oldSection.length > 0 && estimateTokens([first, ...oldSection, ...recent]) > budget) {\n oldSection.shift();\n }\n\n const compacted = [first, ...oldSection, ...recent];\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// 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","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\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 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 = params.messages.map(toAnthropicMessage);\n const tools = params.tools.map(toAnthropicTool);\n\n const streamParams = {\n model: params.model ?? this.defaultModel,\n max_tokens: params.maxTokens ?? this.defaultMaxTokens,\n system: params.systemPrompt,\n messages,\n tools: tools.length > 0 ? tools : undefined,\n };\n\n const stream = params.signal\n ? this.client.messages.stream(streamParams, { signal: params.signal })\n : this.client.messages.stream(streamParams);\n\n const toolInputBuffers = new Map<number, { id: string; name: string; json: 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;\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 }\n break;\n }\n\n case 'content_block_delta': {\n const delta = event.delta;\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 }\n break;\n }\n\n case 'content_block_stop': {\n const buf = toolInputBuffers.get(event.index);\n if (buf) {\n let input: unknown = {};\n try {\n input = JSON.parse(buf.json || '{}');\n } catch {\n input = {};\n }\n yield {\n type: 'tool_use_done',\n id: buf.id,\n name: buf.name,\n input,\n };\n toolInputBuffers.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 toAnthropicMessage(msg: Message): Anthropic.MessageParam {\n const content: Anthropic.ContentBlockParam[] = msg.content.map((block) => {\n switch (block.type) {\n case 'text':\n return { type: 'text' as const, text: block.text };\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\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"]}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@t2000/engine",
3
+ "version": "0.1.0",
4
+ "description": "Agent engine for conversational finance — QueryEngine, financial tools, LLM orchestration",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "keywords": [
19
+ "sui",
20
+ "ai",
21
+ "agent",
22
+ "engine",
23
+ "llm",
24
+ "finance",
25
+ "t2000",
26
+ "audric"
27
+ ],
28
+ "author": "t2000",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/mission69b/t2000.git",
32
+ "directory": "packages/engine"
33
+ },
34
+ "homepage": "https://t2000.ai",
35
+ "dependencies": {
36
+ "@anthropic-ai/sdk": "^0.39",
37
+ "@modelcontextprotocol/sdk": "^1.28.0",
38
+ "zod": "^3.25.0",
39
+ "@t2000/sdk": "0.19.24"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^20",
43
+ "eslint": "^9",
44
+ "tsup": "^8",
45
+ "typescript": "^5",
46
+ "typescript-eslint": "^8.58.0",
47
+ "vitest": "^3"
48
+ },
49
+ "license": "MIT",
50
+ "scripts": {
51
+ "build": "tsup",
52
+ "dev": "tsup --watch",
53
+ "test": "vitest run",
54
+ "test:watch": "vitest",
55
+ "typecheck": "tsc --noEmit",
56
+ "lint": "eslint src/",
57
+ "clean": "rm -rf dist"
58
+ }
59
+ }