@t2000/engine 0.3.3 → 0.4.1

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 CHANGED
@@ -63,6 +63,8 @@ interface PendingAction {
63
63
  toolUseId: string;
64
64
  input: unknown;
65
65
  description: string;
66
+ /** Full assistant message content from the LLM turn that triggered this action. */
67
+ assistantContent: ContentBlock[];
66
68
  /** Results from auto-approved tools in the same LLM turn (e.g. balance_check). */
67
69
  completedResults?: Array<{
68
70
  toolUseId: string;
@@ -259,9 +261,7 @@ declare class QueryEngine {
259
261
  interrupt(): void;
260
262
  getMessages(): readonly Message[];
261
263
  reset(): void;
262
- loadMessages(messages: Message[], opts?: {
263
- skipSanitize?: boolean;
264
- }): void;
264
+ loadMessages(messages: Message[]): void;
265
265
  setServerPositions(data: EngineConfig['serverPositions']): void;
266
266
  getUsage(): CostSnapshot;
267
267
  /**
@@ -274,6 +274,13 @@ declare class QueryEngine {
274
274
  private addErrorResults;
275
275
  private handleProviderEvent;
276
276
  }
277
+ /**
278
+ * Pre-flight validation: ensures message history meets Anthropic's requirements
279
+ * right before every API call. Strips orphaned tool_use/tool_result blocks and
280
+ * fixes role alternation. This is the single point of defense — no corrupt
281
+ * messages can reach the API regardless of how they got into the session.
282
+ */
283
+ declare function validateHistory(messages: Message[]): Message[];
277
284
 
278
285
  interface BuildToolOptions<TInput, TOutput> {
279
286
  name: string;
@@ -903,4 +910,4 @@ declare function fetchWalletCoins(address: string, rpcUrl?: string): Promise<Wal
903
910
 
904
911
  declare const DEFAULT_SYSTEM_PROMPT = "You are Audric, an AI assistant built on the Sui blockchain. You help users manage finances AND access 40+ paid API services via MPP (Machine Payment Protocol) micropayments.\n\n## Core Capabilities\n- Check balances, savings positions, health factors, and interest rates\n- Execute deposits, withdrawals, transfers, borrows, and repayments\n- Track transaction history and earnings\n- Look up swap quotes, bridge options, and token information via NAVI\n- **Access any MPP service** \u2014 weather, web search, news, crypto prices, stock quotes, translations, image generation, maps, flights, and more via the pay_api tool\n- Answer general knowledge questions conversationally\n\n## MPP Services (via pay_api tool)\nWhen users ask for real-world data (weather, search, prices, news, etc.), use the pay_api tool. Each call costs a few cents in USDC, paid automatically on-chain. Common services:\n- **Weather/forecast**: OpenWeather \u2014 current conditions, 5-day forecast\n- **Web search**: Brave Search, Serper (Google), Perplexity (AI-powered)\n- **News**: NewsAPI headlines and search\n- **Crypto**: CoinGecko prices, markets, trending\n- **Stocks**: Alpha Vantage quotes, daily data\n- **Maps**: Google Maps geocode, places, directions\n- **Translation**: DeepL, Google Translate\n- **FX rates**: Exchange rate conversion\n- **Scraping**: Firecrawl, Jina Reader\n- **Flights**: SerpAPI Google Flights\n- **Image gen**: Flux, Stable Diffusion, DALL-E\n- **Email**: Resend\n\nAlways tell users the cost before calling a paid service. If they agree, use pay_api.\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 \u2014 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 any available tools to help the user \u2014 don't refuse requests you can handle\n- For real-world questions (weather, search, news, prices), use pay_api with the appropriate MPP endpoint\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 \u2014 lead with results, follow with context\n- Use short sentences. Avoid hedging language.\n- When presenting positions or balances, use a structured format\n- For non-financial questions, answer naturally and helpfully\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";
905
912
 
906
- export { AnthropicProvider, type AnthropicProviderConfig, type BalancePrices, type BalanceResult, type BuildToolOptions, type ChatParams, type CompactOptions, type ContentBlock, type CostSnapshot, CostTracker, type CostTrackerConfig, DEFAULT_SYSTEM_PROMPT, type EngineConfig, type EngineEvent, type HealthFactorResult, type LLMProvider, type McpCallResult, McpClientManager, McpResponseCache, type McpServerConfig, type McpServerConnection, type McpToolAdapterConfig, type McpToolDescriptor, MemorySessionStore, type Message, NAVI_MCP_CONFIG, NAVI_MCP_URL, NAVI_SERVER_NAME, type NaviRawCoin, type NaviRawHealthFactor, type NaviRawPool, type NaviRawPosition, type NaviRawPositionsResponse, type NaviRawProtocolStats, type NaviRawRewardsResponse, type NaviReadOptions, NaviTools, type PendingAction, type PendingReward, type PendingToolCall, type PermissionLevel, type PermissionResponse, type PositionEntry, type ProtocolStats, type ProviderEvent, QueryEngine, READ_TOOLS, type RatesResult, type SSEEvent, type SavingsResult, type ServerPositionData, type SessionData, type SessionStore, type StopReason, type SuiCoinBalance, type Tool, type ToolContext, type ToolDefinition, type ToolJsonSchema, type ToolResult, TxMutex, WRITE_TOOLS, type WalletCoin, adaptAllMcpTools, adaptAllServerTools, adaptMcpTool, balanceCheckTool, borrowTool, buildMcpTools, buildTool, claimRewardsTool, compactMessages, engineToSSE, estimateTokens, extractMcpText, fetchAvailableRewards, fetchBalance, fetchHealthFactor, fetchPositions, fetchProtocolStats, fetchRates, fetchSavings, fetchWalletCoins, findTool, getDefaultTools, getMcpManager, getWalletAddress, hasNaviMcp, healthCheckTool, parseMcpJson, parseSSE, payApiTool, ratesInfoTool, registerEngineTools, repayDebtTool, requireAgent, runTools, saveDepositTool, savingsInfoTool, sendTransferTool, serializeSSE, toolsToDefinitions, transactionHistoryTool, transformBalance, transformHealthFactor, transformPositions, transformRates, transformRewards, transformSavings, withdrawTool };
913
+ export { AnthropicProvider, type AnthropicProviderConfig, type BalancePrices, type BalanceResult, type BuildToolOptions, type ChatParams, type CompactOptions, type ContentBlock, type CostSnapshot, CostTracker, type CostTrackerConfig, DEFAULT_SYSTEM_PROMPT, type EngineConfig, type EngineEvent, type HealthFactorResult, type LLMProvider, type McpCallResult, McpClientManager, McpResponseCache, type McpServerConfig, type McpServerConnection, type McpToolAdapterConfig, type McpToolDescriptor, MemorySessionStore, type Message, NAVI_MCP_CONFIG, NAVI_MCP_URL, NAVI_SERVER_NAME, type NaviRawCoin, type NaviRawHealthFactor, type NaviRawPool, type NaviRawPosition, type NaviRawPositionsResponse, type NaviRawProtocolStats, type NaviRawRewardsResponse, type NaviReadOptions, NaviTools, type PendingAction, type PendingReward, type PendingToolCall, type PermissionLevel, type PermissionResponse, type PositionEntry, type ProtocolStats, type ProviderEvent, QueryEngine, READ_TOOLS, type RatesResult, type SSEEvent, type SavingsResult, type ServerPositionData, type SessionData, type SessionStore, type StopReason, type SuiCoinBalance, type Tool, type ToolContext, type ToolDefinition, type ToolJsonSchema, type ToolResult, TxMutex, WRITE_TOOLS, type WalletCoin, adaptAllMcpTools, adaptAllServerTools, adaptMcpTool, balanceCheckTool, borrowTool, buildMcpTools, buildTool, claimRewardsTool, compactMessages, engineToSSE, estimateTokens, extractMcpText, fetchAvailableRewards, fetchBalance, fetchHealthFactor, fetchPositions, fetchProtocolStats, fetchRates, fetchSavings, fetchWalletCoins, findTool, getDefaultTools, getMcpManager, getWalletAddress, hasNaviMcp, healthCheckTool, parseMcpJson, parseSSE, payApiTool, ratesInfoTool, registerEngineTools, repayDebtTool, requireAgent, runTools, saveDepositTool, savingsInfoTool, sendTransferTool, serializeSSE, toolsToDefinitions, transactionHistoryTool, transformBalance, transformHealthFactor, transformPositions, transformRates, transformRewards, transformSavings, validateHistory, withdrawTool };
package/dist/index.js CHANGED
@@ -1299,6 +1299,9 @@ var QueryEngine = class {
1299
1299
  content: JSON.stringify({ error: "User declined this action" }),
1300
1300
  isError: true
1301
1301
  };
1302
+ if (action.assistantContent?.length) {
1303
+ this.messages.push({ role: "assistant", content: action.assistantContent });
1304
+ }
1302
1305
  const allResults = [
1303
1306
  ...(action.completedResults ?? []).map((r) => ({
1304
1307
  type: "tool_result",
@@ -1332,8 +1335,8 @@ var QueryEngine = class {
1332
1335
  this.messages = [];
1333
1336
  this.costTracker.reset();
1334
1337
  }
1335
- loadMessages(messages, opts) {
1336
- this.messages = opts?.skipSanitize ? [...messages] : sanitizeMessages(messages);
1338
+ loadMessages(messages) {
1339
+ this.messages = [...messages];
1337
1340
  }
1338
1341
  setServerPositions(data) {
1339
1342
  this.serverPositions = data;
@@ -1375,6 +1378,7 @@ var QueryEngine = class {
1375
1378
  pendingToolCalls: []
1376
1379
  };
1377
1380
  try {
1381
+ this.messages = validateHistory(this.messages);
1378
1382
  const stream = this.provider.chat({
1379
1383
  messages: this.messages,
1380
1384
  systemPrompt: this.systemPrompt,
@@ -1401,12 +1405,13 @@ var QueryEngine = class {
1401
1405
  if (acc.text) {
1402
1406
  acc.assistantBlocks.push({ type: "text", text: acc.text });
1403
1407
  }
1404
- this.messages.push({ role: "assistant", content: acc.assistantBlocks });
1405
1408
  if (acc.pendingToolCalls.length === 0) {
1409
+ this.messages.push({ role: "assistant", content: acc.assistantBlocks });
1406
1410
  yield { type: "turn_complete", stopReason: acc.stopReason };
1407
1411
  return;
1408
1412
  }
1409
1413
  if (signal.aborted) {
1414
+ this.messages.push({ role: "assistant", content: acc.assistantBlocks });
1410
1415
  this.addErrorResults(acc.pendingToolCalls, "Aborted");
1411
1416
  yield { type: "error", error: new Error("Aborted") };
1412
1417
  return;
@@ -1444,6 +1449,7 @@ var QueryEngine = class {
1444
1449
  toolUseId: pendingWrite.call.id,
1445
1450
  input: pendingWrite.call.input,
1446
1451
  description: describeAction(pendingWrite.tool, pendingWrite.call),
1452
+ assistantContent: acc.assistantBlocks,
1447
1453
  completedResults: toolResultBlocks.map((b) => ({
1448
1454
  toolUseId: b.toolUseId,
1449
1455
  content: b.content,
@@ -1453,6 +1459,7 @@ var QueryEngine = class {
1453
1459
  };
1454
1460
  return;
1455
1461
  }
1462
+ this.messages.push({ role: "assistant", content: acc.assistantBlocks });
1456
1463
  this.messages.push({ role: "user", content: toolResultBlocks });
1457
1464
  if (this.costTracker.isOverBudget()) {
1458
1465
  yield { type: "error", error: new Error("Session budget exceeded") };
@@ -1523,36 +1530,37 @@ function isCorruptHistoryError(err) {
1523
1530
  const msg = err instanceof Error ? err.message : String(err);
1524
1531
  return msg.includes("tool_use") && msg.includes("tool_result") || msg.includes("roles must alternate") || msg.includes("400") && msg.includes("invalid_request_error");
1525
1532
  }
1526
- function sanitizeMessages(messages) {
1527
- const trimmed = [];
1528
- for (let i = 0; i < messages.length; i++) {
1529
- const msg = messages[i];
1530
- const toolUseIds = msg.content.filter((b) => b.type === "tool_use").map((b) => b.id);
1531
- if (toolUseIds.length > 0) {
1532
- const next = messages[i + 1];
1533
- const toolResultIds = new Set(
1534
- (next?.content ?? []).filter((b) => b.type === "tool_result").map((b) => b.toolUseId)
1535
- );
1536
- const allMatched = toolUseIds.every((id) => toolResultIds.has(id));
1537
- if (!allMatched) {
1538
- break;
1539
- }
1533
+ function validateHistory(messages) {
1534
+ const allToolUseIds = /* @__PURE__ */ new Set();
1535
+ const allToolResultIds = /* @__PURE__ */ new Set();
1536
+ for (const msg of messages) {
1537
+ for (const b of msg.content) {
1538
+ if (b.type === "tool_use") allToolUseIds.add(b.id);
1539
+ if (b.type === "tool_result") allToolResultIds.add(b.toolUseId);
1540
1540
  }
1541
- trimmed.push(msg);
1542
1541
  }
1543
- const result = [];
1544
- let lastRole = null;
1545
- for (const msg of trimmed) {
1546
- if (msg.role === lastRole) {
1547
- result.pop();
1542
+ const filtered = messages.map((msg) => {
1543
+ const content = msg.content.filter((b) => {
1544
+ if (b.type === "tool_use") return allToolResultIds.has(b.id);
1545
+ if (b.type === "tool_result") return allToolUseIds.has(b.toolUseId);
1546
+ return true;
1547
+ });
1548
+ if (content.length === 0) return null;
1549
+ return { role: msg.role, content };
1550
+ }).filter((m) => m !== null);
1551
+ const merged = [];
1552
+ for (const msg of filtered) {
1553
+ const last = merged[merged.length - 1];
1554
+ if (last && last.role === msg.role) {
1555
+ last.content = [...last.content, ...msg.content];
1556
+ } else {
1557
+ merged.push({ role: msg.role, content: [...msg.content] });
1548
1558
  }
1549
- result.push(msg);
1550
- lastRole = msg.role;
1551
1559
  }
1552
- while (result.length > 0 && result[result.length - 1].role === "user") {
1553
- result.pop();
1560
+ while (merged.length > 0 && merged[0].role !== "user") {
1561
+ merged.shift();
1554
1562
  }
1555
- return result;
1563
+ return merged;
1556
1564
  }
1557
1565
  function describeAction(tool, call) {
1558
1566
  const input = call.input;
@@ -1712,9 +1720,9 @@ function compactMessages(messages, opts = {}) {
1712
1720
  });
1713
1721
  }
1714
1722
  }
1715
- return sanitizeMessages2(compacted);
1723
+ return sanitizeMessages(compacted);
1716
1724
  }
1717
- function sanitizeMessages2(messages) {
1725
+ function sanitizeMessages(messages) {
1718
1726
  const toolUseIds = /* @__PURE__ */ new Set();
1719
1727
  const toolResultIds = /* @__PURE__ */ new Set();
1720
1728
  for (const msg of messages) {
@@ -2201,6 +2209,6 @@ function mapStopReason(reason) {
2201
2209
  }
2202
2210
  }
2203
2211
 
2204
- export { AnthropicProvider, CostTracker, DEFAULT_SYSTEM_PROMPT, McpClientManager, McpResponseCache, MemorySessionStore, NAVI_MCP_CONFIG, NAVI_MCP_URL, NAVI_SERVER_NAME, NaviTools, QueryEngine, READ_TOOLS, TxMutex, WRITE_TOOLS, adaptAllMcpTools, adaptAllServerTools, adaptMcpTool, balanceCheckTool, borrowTool, buildMcpTools, buildTool, claimRewardsTool, compactMessages, engineToSSE, estimateTokens, extractMcpText, fetchAvailableRewards, fetchBalance, fetchHealthFactor, fetchPositions, fetchProtocolStats, fetchRates, fetchSavings, fetchWalletCoins, findTool, getDefaultTools, getMcpManager, getWalletAddress, hasNaviMcp, healthCheckTool, parseMcpJson, parseSSE, payApiTool, ratesInfoTool, registerEngineTools, repayDebtTool, requireAgent, runTools, saveDepositTool, savingsInfoTool, sendTransferTool, serializeSSE, toolsToDefinitions, transactionHistoryTool, transformBalance, transformHealthFactor, transformPositions, transformRates, transformRewards, transformSavings, withdrawTool };
2212
+ export { AnthropicProvider, CostTracker, DEFAULT_SYSTEM_PROMPT, McpClientManager, McpResponseCache, MemorySessionStore, NAVI_MCP_CONFIG, NAVI_MCP_URL, NAVI_SERVER_NAME, NaviTools, QueryEngine, READ_TOOLS, TxMutex, WRITE_TOOLS, adaptAllMcpTools, adaptAllServerTools, adaptMcpTool, balanceCheckTool, borrowTool, buildMcpTools, buildTool, claimRewardsTool, compactMessages, engineToSSE, estimateTokens, extractMcpText, fetchAvailableRewards, fetchBalance, fetchHealthFactor, fetchPositions, fetchProtocolStats, fetchRates, fetchSavings, fetchWalletCoins, findTool, getDefaultTools, getMcpManager, getWalletAddress, hasNaviMcp, healthCheckTool, parseMcpJson, parseSSE, payApiTool, ratesInfoTool, registerEngineTools, repayDebtTool, requireAgent, runTools, saveDepositTool, savingsInfoTool, sendTransferTool, serializeSSE, toolsToDefinitions, transactionHistoryTool, transformBalance, transformHealthFactor, transformPositions, transformRates, transformRewards, transformSavings, validateHistory, withdrawTool };
2205
2213
  //# sourceMappingURL=index.js.map
2206
2214
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tool.ts","../src/orchestration.ts","../src/sui-rpc.ts","../src/navi-config.ts","../src/tools/utils.ts","../src/navi-transforms.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/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":["STABLECOIN_SYMBOLS","GAS_RESERVE_SUI","gasReserveUsd","balance","callNavi","z","status","hf","rates","sanitizeMessages","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","// ---------------------------------------------------------------------------\n// Direct Sui JSON-RPC coin fetcher — no SDK dependency required.\n// Uses suix_getAllBalances to get wallet coin balances.\n// ---------------------------------------------------------------------------\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\nconst KNOWN_COINS: Record<string, { symbol: string; decimals: number }> = {\n '0x2::sui::SUI': { symbol: 'SUI', decimals: 9 },\n '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC': { symbol: 'USDC', decimals: 6 },\n '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN': { symbol: 'USDT', decimals: 6 },\n '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT': { symbol: 'USDT', decimals: 6 },\n '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH': { symbol: 'ETH', decimals: 8 },\n '0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC': { symbol: 'BTC', decimals: 8 },\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 known = KNOWN_COINS[b.coinType];\n const symbol = known?.symbol ?? extractSymbol(b.coinType);\n const decimals = known?.decimals ?? 9;\n return {\n coinType: b.coinType,\n symbol,\n decimals,\n totalBalance: b.totalBalance,\n coinObjectCount: b.coinObjectCount,\n };\n });\n}\n\nfunction extractSymbol(coinType: string): string {\n const parts = coinType.split('::');\n return parts[parts.length - 1] ?? 'UNKNOWN';\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 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","// ---------------------------------------------------------------------------\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 { z } from 'zod';\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 transformRates,\n} from '../navi-transforms.js';\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\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: 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 address = getWalletAddress(context);\n const mgr = getMcpManager(context);\n\n const [walletCoins, positions, rewards, pools] = 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 callNavi(mgr, NaviTools.GET_POOLS, {}),\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 let availableUsd = 0;\n let stablesUsd = 0;\n let gasReserveUsd = 0;\n\n if (walletCoins && walletCoins.length > 0) {\n for (const coin of walletCoins) {\n const balance = Number(coin.totalBalance) / 10 ** coin.decimals;\n const price = prices[coin.symbol] ?? (STABLECOIN_SYMBOLS.has(coin.symbol) ? 1 : 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 (STABLECOIN_SYMBOLS.has(coin.symbol)) {\n stablesUsd += balance * price;\n }\n }\n }\n } else {\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 for (const c of coinArr) {\n const symbol = c.symbol ?? '';\n const decimals = c.decimals ?? (symbol === 'SUI' ? 9 : 6);\n const balance = Number(c.totalBalance ?? '0') / 10 ** decimals;\n const price = prices[symbol] ?? (STABLECOIN_SYMBOLS.has(symbol) ? 1 : 0);\n\n if (symbol === 'SUI' || c.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\n const sp = context.serverPositions;\n let savings: number;\n let debt: number;\n let pendingRewardsUsd: number;\n\n if (sp) {\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\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 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 };\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 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';\n\nfunction buildSavingsFromServer(\n sp: NonNullable<import('../types.js').ServerPositionData>,\n): SavingsResult {\n const positions: PositionEntry[] = [\n ...sp.supplies.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.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\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 (context.serverPositions) {\n return { data: buildSavingsFromServer(context.serverPositions) };\n }\n\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 (context.serverPositions) {\n const sp = context.serverPositions;\n const hfVal = sp.healthFactor ?? (sp.borrows > 0 ? Infinity : 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 { 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\nconst MPP_GATEWAY = 'https://mpp.t2000.ai';\n\nexport const payApiTool = buildTool({\n name: 'pay_api',\n description: `Call any MPP (Machine Payment Protocol) service via on-chain USDC micropayment. The gateway at ${MPP_GATEWAY} hosts 40+ services (88 endpoints). All endpoints accept POST with JSON body. Payment is handled automatically.\n\nPopular services and their URLs:\n- Weather: ${MPP_GATEWAY}/openweather/v1/weather (body: {\"city\":\"London\"}) — $0.005\n- Forecast: ${MPP_GATEWAY}/openweather/v1/forecast (body: {\"city\":\"London\"}) — $0.005\n- Web search: ${MPP_GATEWAY}/brave/v1/web/search (body: {\"q\":\"search query\"}) — $0.005\n- AI search: ${MPP_GATEWAY}/perplexity/v1/chat/completions (body: {\"model\":\"sonar\",\"messages\":[...]}) — $0.01\n- Google search: ${MPP_GATEWAY}/serper/v1/search (body: {\"q\":\"query\"}) — $0.005\n- News headlines: ${MPP_GATEWAY}/newsapi/v1/headlines (body: {\"country\":\"us\"}) — $0.005\n- Crypto prices: ${MPP_GATEWAY}/coingecko/v1/price (body: {\"ids\":\"bitcoin,sui\",\"vs_currencies\":\"usd\"}) — $0.005\n- Stock quotes: ${MPP_GATEWAY}/alphavantage/v1/quote (body: {\"symbol\":\"AAPL\"}) — $0.005\n- FX rates: ${MPP_GATEWAY}/exchangerate/v1/rates (body: {\"base\":\"USD\"}) — $0.005\n- Translate: ${MPP_GATEWAY}/deepl/v1/translate (body: {\"text\":[\"hello\"],\"target_lang\":\"ES\"}) — $0.005\n- Scrape URL: ${MPP_GATEWAY}/firecrawl/v1/scrape (body: {\"url\":\"https://...\"}) — $0.01\n- Read URL: ${MPP_GATEWAY}/jina/v1/read (body: {\"url\":\"https://...\"}) — $0.005\n- Geocode: ${MPP_GATEWAY}/googlemaps/v1/geocode (body: {\"address\":\"...\"}) — $0.01\n- Directions: ${MPP_GATEWAY}/googlemaps/v1/directions (body: {\"origin\":\"...\",\"destination\":\"...\"}) — $0.01\n- Places: ${MPP_GATEWAY}/googlemaps/v1/places (body: {\"query\":\"restaurants in Sydney\"}) — $0.01\n- Image gen: ${MPP_GATEWAY}/fal/fal-ai/flux/dev (body: {\"prompt\":\"...\"}) — $0.03\n- Send email: ${MPP_GATEWAY}/resend/v1/emails (body: {\"from\":\"...\",\"to\":\"...\",\"subject\":\"...\",\"html\":\"...\"}) — $0.005\n- Flights: ${MPP_GATEWAY}/serpapi/v1/flights (body: {\"departure_id\":\"SYD\",\"arrival_id\":\"NRT\",\"outbound_date\":\"2026-03-01\"}) — $0.01\n\nAlways use POST. Construct the URL from the gateway base + path. Pass parameters in JSON body string.`,\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\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, an AI assistant built on the Sui blockchain. You help users manage finances AND access 40+ paid API services via MPP (Machine Payment Protocol) micropayments.\n\n## Core Capabilities\n- Check balances, savings positions, health factors, and interest rates\n- Execute deposits, withdrawals, transfers, borrows, and repayments\n- Track transaction history and earnings\n- Look up swap quotes, bridge options, and token information via NAVI\n- **Access any MPP service** — weather, web search, news, crypto prices, stock quotes, translations, image generation, maps, flights, and more via the pay_api tool\n- Answer general knowledge questions conversationally\n\n## MPP Services (via pay_api tool)\nWhen users ask for real-world data (weather, search, prices, news, etc.), use the pay_api tool. Each call costs a few cents in USDC, paid automatically on-chain. Common services:\n- **Weather/forecast**: OpenWeather — current conditions, 5-day forecast\n- **Web search**: Brave Search, Serper (Google), Perplexity (AI-powered)\n- **News**: NewsAPI headlines and search\n- **Crypto**: CoinGecko prices, markets, trending\n- **Stocks**: Alpha Vantage quotes, daily data\n- **Maps**: Google Maps geocode, places, directions\n- **Translation**: DeepL, Google Translate\n- **FX rates**: Exchange rate conversion\n- **Scraping**: Firecrawl, Jina Reader\n- **Flights**: SerpAPI Google Flights\n- **Image gen**: Flux, Stable Diffusion, DALL-E\n- **Email**: Resend\n\nAlways tell users the cost before calling a paid service. If they agree, use pay_api.\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 any available tools to help the user — don't refuse requests you can handle\n- For real-world questions (weather, search, news, prices), use pay_api with the appropriate MPP endpoint\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 — lead with results, follow with context\n- Use short sentences. Avoid hedging language.\n- When presenting positions or balances, use a structured format\n- For non-financial questions, answer naturally and helpfully\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 PendingAction,\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 { 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 suiRpcUrl: string | undefined;\n private serverPositions: EngineConfig['serverPositions'];\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.suiRpcUrl = config.suiRpcUrl;\n this.serverPositions = config.serverPositions;\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 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 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 // Combine auto-approved tool results from the same turn with the write result.\n // Anthropic requires ALL tool_results in one user message.\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 yield* this.agentLoop(null, signal);\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[], opts?: { skipSanitize?: boolean }): void {\n this.messages = opts?.skipSanitize ? [...messages] : sanitizeMessages(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 ): 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 signal,\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 try {\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 } 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 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 this.addErrorResults(acc.pendingToolCalls, 'Aborted');\n yield { type: 'error', error: new Error('Aborted') };\n return;\n }\n\n // --- Permission gate ---\n const approved: PendingToolCall[] = [];\n const toolResultBlocks: ContentBlock[] = [];\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 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 pendingWrite = { call, tool: tool! };\n break;\n }\n\n // Execute auto-approved tool calls (reads) even if a write is pending —\n // Anthropic requires ALL tool_use ids to have matching tool_results.\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 if (pendingWrite) {\n // Don't push partial results — Anthropic needs ALL tool_results in one\n // user message. The completedResults are carried in the PendingAction\n // so resumeWithToolResult can combine them with the write tool's result.\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 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 },\n };\n return;\n }\n\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 ): 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 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\nfunction sanitizeMessages(messages: Message[]): Message[] {\n const trimmed: Message[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\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) {\n const next = messages[i + 1];\n const toolResultIds = 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 const allMatched = toolUseIds.every((id) => toolResultIds.has(id));\n if (!allMatched) {\n break;\n }\n }\n\n trimmed.push(msg);\n }\n\n const result: Message[] = [];\n let lastRole: 'user' | 'assistant' | null = null;\n\n for (const msg of trimmed) {\n if (msg.role === lastRole) {\n result.pop();\n }\n result.push(msg);\n lastRole = msg.role;\n }\n\n while (result.length > 0 && result[result.length - 1].role === 'user') {\n result.pop();\n }\n\n return result;\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, PendingAction, StopReason } from './types.js';\n\n// ---------------------------------------------------------------------------\n// SSE event format — serialisable subset of EngineEvent\n// ---------------------------------------------------------------------------\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: '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\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 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"]}
1
+ {"version":3,"sources":["../src/tool.ts","../src/orchestration.ts","../src/sui-rpc.ts","../src/navi-config.ts","../src/tools/utils.ts","../src/navi-transforms.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/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":["STABLECOIN_SYMBOLS","GAS_RESERVE_SUI","gasReserveUsd","balance","callNavi","z","status","hf","rates","DEFAULT_MAX_TOKENS"],"mappings":";;;;;;;AAuBO,SAAS,UACd,IAAA,EACuB;AACvB,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,IAC/B,iBAAA,EAAmB,KAAK,UAAA,IAAc,IAAA;AAAA,IACtC,iBAAiB,IAAA,CAAK,eAAA,KAAoB,IAAA,CAAK,UAAA,KAAe,QAAQ,SAAA,GAAY,MAAA;AAAA,GACpF;AACF;AAMO,SAAS,mBAAmB,KAAA,EAI/B;AACF,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,cAAc,CAAA,CAAE;AAAA,GAClB,CAAE,CAAA;AACJ;AAEO,SAAS,QAAA,CAAS,OAAe,IAAA,EAAgC;AACtE,EAAA,OAAO,MAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAC1C;;;ACvCO,IAAM,UAAN,MAAc;AAAA,EACX,QAAwB,EAAC;AAAA,EACzB,MAAA,GAAS,KAAA;AAAA,EAEjB,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACpC,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAM;AAC9B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,EAAK;AAAA,IACP,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAAA,IAChB;AAAA,EACF;AACF;AAMA,gBAAuB,QAAA,CACrB,OAAA,EACA,KAAA,EACA,OAAA,EACA,OAAA,EAC6B;AAC7B,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,kBAAA,CAAmB,SAAS,KAAK,CAAA;AAG3D,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,UAAA;AAAA,MAChC,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAS;AACxB,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA;AACtC,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAE,MAAM,EAAE,KAAA,EAAO,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,CAAA,CAAA,EAAG,EAAE,EAAG,SAAS,IAAA,EAAK;AAAA,QAC1F;AACA,QAAA,MAAM,UAAA,GAAa,MAAM,iBAAA,CAAkB,IAAA,EAAM,MAAM,OAAO,CAAA;AAC9D,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,OAAA,EAAS,WAAW,OAAA,EAAQ;AAAA,MACjE,CAAC;AAAA,KACH;AAEA,IAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,MAAA,IAAI,OAAA,CAAQ,WAAW,WAAA,EAAa;AAClC,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,KAAY,OAAA,CAAQ,KAAA;AAC1C,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,aAAA;AAAA,UACN,UAAU,IAAA,CAAK,IAAA;AAAA,UACf,WAAW,IAAA,CAAK,EAAA;AAAA,UAChB,QAAQ,MAAA,CAAO,IAAA;AAAA,UACf;AAAA,SACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA;AACvC,QAAA,MAAM,IAAA,GAAO,MAAM,GAAG,CAAA;AACtB,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,aAAA;AAAA,UACN,UAAU,IAAA,CAAK,IAAA;AAAA,UACf,WAAW,IAAA,CAAK,EAAA;AAAA,UAChB,QAAQ,EAAE,KAAA,EAAO,OAAA,CAAQ,MAAA,EAAQ,WAAW,uBAAA,EAAwB;AAAA,UACpE,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM;AAAA,QACJ,IAAA,EAAM,aAAA;AAAA,QACN,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,WAAW,IAAA,CAAK,EAAA;AAAA,QAChB,QAAQ,EAAE,KAAA,EAAO,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,CAAA,CAAA,EAAG;AAAA,QAC9C,OAAA,EAAS;AAAA,OACX;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,OAAA,EAAQ;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,IAAA,EAAM,MAAM,OAAO,CAAA;AAC1D,MAAA,MAAM;AAAA,QACJ,IAAA,EAAM,aAAA;AAAA,QACN,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,WAAW,IAAA,CAAK,EAAA;AAAA,QAChB,QAAQ,MAAA,CAAO,IAAA;AAAA,QACf,SAAS,MAAA,CAAO;AAAA,OAClB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM;AAAA,QACJ,IAAA,EAAM,aAAA;AAAA,QACN,UAAU,IAAA,CAAK,IAAA;AAAA,QACf,WAAW,IAAA,CAAK,EAAA;AAAA,QAChB,QAAQ,EAAE,KAAA,EAAO,eAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,uBAAA,EAAwB;AAAA,QAC9E,OAAA,EAAS;AAAA,OACX;AAAA,IACF,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,IAClB;AAAA,EACF;AACF;AAMA,SAAS,kBAAA,CACP,SACA,KAAA,EACyD;AACzD,EAAA,MAAM,QAA2B,EAAC;AAClC,EAAA,MAAM,SAA4B,EAAC;AAEnC,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,iBAAA,EAAmB;AAC7C,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AACzB;AAEA,eAAe,iBAAA,CACb,IAAA,EACA,IAAA,EACA,OAAA,EAC8C;AAC9C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,KAAK,KAAK,CAAA;AACpD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,CAAA,eAAA,EAAkB,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OAC/E;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAM,OAAO,CAAA;AACnD,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,SAAS,KAAA,EAAM;AAC7C;;;ACtKA,IAAM,eAAA,GAAkB,qCAAA;AAQxB,IAAM,WAAA,GAAoE;AAAA,EACxE,eAAA,EAAiB,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,EAC9C,gFAAA,EAAkF,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAU,CAAA,EAAE;AAAA,EAChH,gFAAA,EAAkF,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAU,CAAA,EAAE;AAAA,EAChH,gFAAA,EAAkF,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAU,CAAA,EAAE;AAAA,EAChH,8EAAA,EAAgF,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA,EAAE;AAAA,EAC7G,gFAAA,EAAkF,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAU,CAAA;AAC/G,CAAA;AAcA,eAAsB,gBAAA,CACpB,SACA,MAAA,EACuB;AACvB,EAAA,MAAM,MAAM,MAAA,IAAU,eAAA;AAEtB,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IAC3B,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,IAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,MACnB,OAAA,EAAS,KAAA;AAAA,MACT,EAAA,EAAI,CAAA;AAAA,MACJ,MAAA,EAAQ,qBAAA;AAAA,MACR,MAAA,EAAQ,CAAC,OAAO;AAAA,KACjB,CAAA;AAAA,IACD,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,GAAK;AAAA,GAClC,CAAA;AAED,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,IAAI,MAAM,CAAA,eAAA,EAAkB,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAK7B,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,IAAU,EAAC;AAEjC,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AACzB,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAA,CAAE,QAAQ,CAAA;AACpC,IAAA,MAAM,MAAA,GAAS,KAAA,EAAO,MAAA,IAAU,aAAA,CAAc,EAAE,QAAQ,CAAA;AACxD,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,CAAA;AACpC,IAAA,OAAO;AAAA,MACL,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,MAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAc,CAAA,CAAE,YAAA;AAAA,MAChB,iBAAiB,CAAA,CAAE;AAAA,KACrB;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,cAAc,QAAA,EAA0B;AAC/C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACjC,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,SAAA;AACpC;;;AC9EO,IAAM,gBAAA,GAAmB;AACzB,IAAM,YAAA,GAAe;AAErB,IAAM,eAAA,GAAmC;AAAA,EAC9C,IAAA,EAAM,gBAAA;AAAA,EACN,GAAA,EAAK,YAAA;AAAA,EACL,SAAA,EAAW,iBAAA;AAAA,EACX,UAAA,EAAY,GAAA;AAAA,EACZ,QAAA,EAAU;AACZ;AAMO,IAAM,SAAA,GAAY;AAAA,EACvB,SAAA,EAAW,gBAAA;AAAA,EACX,QAAA,EAAU,eAAA;AAAA,EACV,kBAAA,EAAoB,yBAAA;AAAA,EACpB,iBAAA,EAAmB,wBAAA;AAAA,EACnB,cAAA,EAAgB,qBAAA;AAAA,EAChB,QAAA,EAAU,eAAA;AAAA,EACV,qBAAA,EAAuB,4BAAA;AAAA,EACvB,oBAAA,EAAsB,2BAAA;AAAA,EACtB,mBAAA,EAAqB,0BAAA;AAAA,EACrB,qBAAA,EAAuB,4BAAA;AAAA,EACvB,eAAA,EAAiB,sBAAA;AAAA,EACjB,cAAA,EAAgB,qBAAA;AAAA,EAChB,iBAAA,EAAmB,wBAAA;AAAA,EACnB,oBAAA,EAAsB,2BAAA;AAAA,EACtB,gBAAA,EAAkB,uBAAA;AAAA,EAClB,oBAAA,EAAsB,2BAAA;AAAA,EACtB,kBAAA,EAAoB,yBAAA;AAAA,EACpB,cAAA,EAAgB,qBAAA;AAAA,EAChB,qBAAA,EAAuB,4BAAA;AAAA,EACvB,eAAA,EAAiB,sBAAA;AAAA,EACjB,SAAA,EAAW,gBAAA;AAAA,EACX,iBAAA,EAAmB,wBAAA;AAAA,EACnB,aAAA,EAAe,eAAA;AAAA,EACf,eAAA,EAAiB,qBAAA;AAAA,EACjB,mBAAA,EAAqB,yBAAA;AAAA,EACrB,aAAA,EAAe;AACjB;;;AC3CO,SAAS,aAAa,OAAA,EAA6B;AACxD,EAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA,CAAQ,KAAA;AACjB;AAMO,SAAS,WAAW,OAAA,EAA+B;AACxD,EAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,IAAc,CAAC,OAAA,CAAQ,eAAe,OAAO,KAAA;AAC1D,EAAA,MAAM,MAAM,OAAA,CAAQ,UAAA;AACpB,EAAA,OAAO,GAAA,CAAI,YAAY,gBAAgB,CAAA;AACzC;AAKO,SAAS,cAAc,OAAA,EAAwC;AACpE,EAAA,OAAO,OAAA,CAAQ,UAAA;AACjB;AAKO,SAAS,iBAAiB,OAAA,EAA8B;AAC7D,EAAA,OAAO,OAAA,CAAQ,aAAA;AACjB;;;ACiHA,SAAS,MAAM,CAAA,EAAoB;AACjC,EAAA,IAAI,CAAA,IAAK,MAAM,OAAO,CAAA;AACtB,EAAA,MAAM,IAAI,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,OAAO,CAAC,CAAA;AAC9C,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AAClC;AAMO,SAAS,eAAe,GAAA,EAA2B;AACxD,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAK,MAAwB,EAAC;AAC7D,EAAA,MAAM,SAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,GAAI;AAAA,MACpB,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,GAAI,GAAA;AAAA,MACjC,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,GAAI,GAAA;AAAA,MACnC,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,MACnB,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,KAAK;AAAA,KACzB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,mBAAmB,GAAA,EAA+B;AAChE,EAAA,MAAM,IAAA,GAAO,GAAA;AACb,EAAA,MAAM,SAAA,GAAY,MAAM,SAAA,KAAc,KAAA,CAAM,QAAQ,GAAG,CAAA,GAAK,MAA4B,EAAC,CAAA;AAEzF,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC3B,QAAA,EAAU,EAAE,QAAA,IAAY,MAAA;AAAA,IACxB,MAAM,CAAA,CAAE,IAAA,EAAM,QAAA,CAAS,QAAQ,IAAK,QAAA,GAAsB,QAAA;AAAA,IAC1D,MAAA,EAAQ,EAAE,YAAA,IAAgB,SAAA;AAAA,IAC1B,MAAA,EAAQ,KAAA,CAAM,CAAA,CAAE,OAAO,CAAA;AAAA,IACvB,QAAA,EAAU,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA;AAAA,IAC1B,GAAA,EAAK,KAAA,CAAM,CAAA,CAAE,GAAG,CAAA,GAAI,GAAA;AAAA,IACpB,oBAAA,EAAsB,KAAA,CAAM,CAAA,CAAE,oBAAoB;AAAA,GACpD,CAAE,CAAA;AACJ;AAMO,SAAS,qBAAA,CACd,OACA,YAAA,EACoB;AACpB,EAAA,MAAM,EAAA,GAAK,KAAA;AACX,EAAA,MAAM,SAAA,GAAY,mBAAmB,YAAY,CAAA;AAEjD,EAAA,MAAM,WAAW,SAAA,CACd,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,QAAQ,CAAA,CACjC,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AACzC,EAAA,MAAM,WAAW,SAAA,CACd,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,QAAQ,CAAA,CACjC,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AAEzC,EAAA,MAAM,kBAAkB,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AACnE,EAAA,MAAM,UAAA,GACJ,QAAA,GAAW,CAAA,GACP,eAAA,CAAgB,MAAA;AAAA,IACd,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,uBAAuB,CAAA,CAAE,QAAA;AAAA,IAC7C;AAAA,MACE,QAAA,GACJ,CAAA;AAEN,EAAA,MAAM,SAAA,GAAY,WAAW,UAAA,GAAa,QAAA;AAE1C,EAAA,OAAO;AAAA,IACL,cAAc,KAAA,CAAM,EAAA,EAAI,YAAY,CAAA,KAAM,QAAA,KAAa,IAAI,QAAA,GAAW,CAAA,CAAA;AAAA,IACtE,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAAA,IAChC,oBAAA,EAAsB;AAAA,GACxB;AACF;AAYO,SAAS,iBAAiB,GAAA,EAA+B;AAC9D,EAAA,MAAM,IAAA,GAAO,GAAA;AACb,EAAA,OAAA,CAAQ,MAAM,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvC,MAAA,EAAQ,EAAE,MAAA,IAAU,SAAA;AAAA,IACpB,WAAA,EAAa,KAAA,CAAM,CAAA,CAAE,WAAW,CAAA;AAAA,IAChC,QAAA,EAAU,KAAA,CAAM,CAAA,CAAE,QAAQ;AAAA,GAC5B,CAAE,CAAA;AACJ;AAOA,IAAM,kBAAA,uBAAyB,GAAA,CAAI;AAAA,EACjC,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW;AACxE,CAAC,CAAA;AAED,IAAM,eAAA,GAAkB,IAAA;AAMjB,SAAS,gBAAA,CACd,QAAA,EACA,YAAA,EACA,UAAA,EACA,MAAA,EACe;AACf,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAK,WAA6B,EAAC;AACvE,EAAA,MAAM,SAAA,GAAY,mBAAmB,YAAY,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,iBAAiB,UAAU,CAAA;AAE3C,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,EAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,KAAa,MAAA,KAAW,QAAQ,CAAA,GAAI,CAAA,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,YAAY,IAAI,EAAA,IAAM,QAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,SAAS,MAAM,CAAA,KAAM,mBAAmB,GAAA,CAAI,MAAM,IAAI,CAAA,GAAI,CAAA,CAAA;AAExE,IAAA,IAAI,MAAA,KAAW,KAAA,IAAS,IAAA,CAAK,QAAA,KAAa,eAAA,EAAiB;AACzD,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,eAAe,CAAA;AACvD,MAAA,aAAA,GAAgB,aAAA,GAAgB,KAAA;AAChC,MAAA,YAAA,IAAA,CAAiB,UAAU,aAAA,IAAiB,KAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,YAAA,IAAgB,OAAA,GAAU,KAAA;AAC1B,MAAA,IAAI,kBAAA,CAAmB,GAAA,CAAI,MAAM,CAAA,EAAG;AAClC,QAAA,UAAA,IAAc,OAAA,GAAU,KAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,UAAU,SAAA,CACb,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,QAAQ,CAAA,CACjC,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AACzC,EAAA,MAAM,OAAO,SAAA,CACV,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,QAAQ,CAAA,CACjC,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AAEzC,EAAA,MAAM,iBAAA,GAAoB,QAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA;AAExE,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,YAAA;AAAA,IACX,OAAA;AAAA,IACA,IAAA;AAAA,IACA,cAAA,EAAgB,iBAAA;AAAA,IAChB,UAAA,EAAY,aAAA;AAAA,IACZ,KAAA,EAAO,YAAA,GAAe,OAAA,GAAU,aAAA,GAAgB,iBAAA,GAAoB,IAAA;AAAA,IACpE,OAAA,EAAS;AAAA,GACX;AACF;AAMO,SAAS,gBAAA,CACd,cACA,QAAA,EACe;AACf,EAAA,MAAM,SAAA,GAAY,mBAAmB,YAAY,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,eAAe,QAAQ,CAAA;AAErC,EAAA,MAAM,kBAAkB,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA;AACnE,EAAA,MAAM,QAAA,GAAW,gBAAgB,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA;AAEvE,EAAA,MAAM,WAAA,GACJ,QAAA,GAAW,CAAA,GACP,eAAA,CAAgB,MAAA;AAAA,IACd,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAA,CAAO,KAAA,CAAM,CAAA,CAAE,MAAM,CAAA,EAAG,OAAA,IAAW,CAAA,CAAE,GAAA,IAAO,CAAA,CAAE,QAAA;AAAA,IAC1D;AAAA,MACE,QAAA,GACJ,CAAA;AAEN,EAAA,MAAM,YAAA,GAAgB,WAAW,WAAA,GAAe,GAAA;AAChD,EAAA,MAAM,mBAAmB,YAAA,GAAe,EAAA;AAExC,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,gBAAA,EAAkB,CAAA;AAAA;AAAA,MAClB,UAAA,EAAY,WAAA;AAAA,MACZ,YAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,QAAA;AAAA,MACA,GAAA,EAAK,WAAA;AAAA,MACL,WAAA,EAAa,YAAA;AAAA,MACb,aAAA,EAAe,CAAA;AAAA;AAAA,MACf;AAAA;AACF,GACF;AACF;AAMO,SAAS,eACd,OAAA,EACQ;AACR,EAAA,OAAO,QACJ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAA,IAAU,CAAA,CAAE,IAAI,CAAA,CACzC,IAAI,CAAC,CAAA,KAAM,EAAE,IAAK,CAAA,CAClB,KAAK,IAAI,CAAA;AACd;AAEO,SAAS,aACd,OAAA,EACG;AACH,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AACnC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACnXA,IAAMA,mBAAAA,uBAAyB,GAAA,CAAI;AAAA,EACjC,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,SAAA;AAAA,EAAW;AACxE,CAAC,CAAA;AAED,IAAMC,gBAAAA,GAAkB,IAAA;AAExB,eAAe,QAAA,CACb,OAAA,EACA,IAAA,EACA,IAAA,GAAgC,EAAC,EACrB;AACZ,EAAA,MAAM,SAAS,MAAM,OAAA,CAAQ,QAAA,CAAS,gBAAA,EAAkB,MAAM,IAAI,CAAA;AAClE,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA,CAChB,OAAO,CAAC,CAAA,KAAuC,EAAE,IAAA,KAAS,MAAA,IAAU,EAAE,IAAI,CAAA,CAC1E,IAAI,CAAC,CAAA,KAAuC,EAAE,IAAK,CAAA,CACnD,KAAK,GAAG,CAAA;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,GAAA,EAAM,GAAA,IAAO,eAAe,CAAA,CAAE,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,YAAA,CAAgB,OAAO,OAAO,CAAA;AACvC;AAEO,IAAM,mBAAmB,SAAA,CAAU;AAAA,EACxC,IAAA,EAAM,eAAA;AAAA,EACN,WAAA,EACE,+IAAA;AAAA,EACF,WAAA,EAAa,CAAA,CAAE,MAAA,CAAO,EAAE,CAAA;AAAA,EACxB,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,EAC3D,UAAA,EAAY,IAAA;AAAA,EAEZ,MAAM,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS;AAC1B,IAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACvB,MAAA,MAAM,OAAA,GAAU,iBAAiB,OAAO,CAAA;AACxC,MAAA,MAAM,GAAA,GAAM,cAAc,OAAO,CAAA;AAEjC,MAAA,MAAM,CAAC,aAAa,SAAA,EAAW,OAAA,EAAS,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QACjE,iBAAiB,OAAA,EAAS,OAAA,CAAQ,SAAS,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAC1D,UAAA,OAAA,CAAQ,IAAA,CAAK,mEAAmE,GAAG,CAAA;AACnF,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,QACD,QAAA,CAAS,GAAA,EAAK,SAAA,CAAU,aAAA,EAAe;AAAA,UACrC,OAAA;AAAA,UACA,SAAA,EAAW,MAAA;AAAA,UACX,MAAA,EAAQ;AAAA,SACT,CAAA;AAAA,QACD,SAAS,GAAA,EAAK,SAAA,CAAU,qBAAA,EAAuB,EAAE,SAAS,CAAA;AAAA,QAC1D,QAAA,CAAS,GAAA,EAAK,SAAA,CAAU,SAAA,EAAW,EAAE;AAAA,OACtC,CAAA;AAED,MAAA,MAAM,KAAA,GAAQ,eAAe,KAAK,CAAA;AAClC,MAAA,MAAM,SAAiC,EAAC;AACxC,MAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAClD,QAAA,MAAA,CAAO,MAAM,IAAI,IAAA,CAAK,KAAA;AAAA,MACxB;AAEA,MAAA,IAAI,YAAA,GAAe,CAAA;AACnB,MAAA,IAAI,UAAA,GAAa,CAAA;AACjB,MAAA,IAAIC,cAAAA,GAAgB,CAAA;AAEpB,MAAA,IAAI,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACzC,QAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,UAAA,MAAMC,WAAU,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,GAAI,MAAM,IAAA,CAAK,QAAA;AACvD,UAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,KAAMH,oBAAmB,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA;AAEhF,UAAA,IAAI,IAAA,CAAK,MAAA,KAAW,KAAA,IAAS,IAAA,CAAK,aAAa,eAAA,EAAiB;AAC9D,YAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAIG,QAAAA,EAASF,gBAAe,CAAA;AACvD,YAAAC,iBAAgB,aAAA,GAAgB,KAAA;AAChC,YAAA,YAAA,IAAA,CAAiBC,WAAU,aAAA,IAAiB,KAAA;AAAA,UAC9C,CAAA,MAAO;AACL,YAAA,YAAA,IAAgBA,QAAAA,GAAU,KAAA;AAC1B,YAAA,IAAIH,mBAAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,EAAG;AACvC,cAAA,UAAA,IAAcG,QAAAA,GAAU,KAAA;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,GAAA,EAAK,SAAA,CAAU,SAAA,EAAW,EAAE,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AACrF,QAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,WAAsG,EAAC;AACjJ,QAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,UAAA,MAAM,MAAA,GAAS,EAAE,MAAA,IAAU,EAAA;AAC3B,UAAA,MAAM,QAAA,GAAW,CAAA,CAAE,QAAA,KAAa,MAAA,KAAW,QAAQ,CAAA,GAAI,CAAA,CAAA;AACvD,UAAA,MAAMA,WAAU,MAAA,CAAO,CAAA,CAAE,YAAA,IAAgB,GAAG,IAAI,EAAA,IAAM,QAAA;AACtD,UAAA,MAAM,KAAA,GAAQ,OAAO,MAAM,CAAA,KAAMH,oBAAmB,GAAA,CAAI,MAAM,IAAI,CAAA,GAAI,CAAA,CAAA;AAEtE,UAAA,IAAI,MAAA,KAAW,KAAA,IAAS,CAAA,CAAE,QAAA,KAAa,eAAA,EAAiB;AACtD,YAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAIG,QAAAA,EAASF,gBAAe,CAAA;AACvD,YAAAC,iBAAgB,aAAA,GAAgB,KAAA;AAChC,YAAA,YAAA,IAAA,CAAiBC,WAAU,aAAA,IAAiB,KAAA;AAAA,UAC9C,CAAA,MAAO;AACL,YAAA,YAAA,IAAgBA,QAAAA,GAAU,KAAA;AAC1B,YAAA,IAAIH,mBAAAA,CAAmB,GAAA,CAAI,MAAM,CAAA,EAAG;AAClC,cAAA,UAAA,IAAcG,QAAAA,GAAU,KAAA;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,KAAK,OAAA,CAAQ,eAAA;AACnB,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,iBAAA;AAEJ,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,OAAA,GAAU,EAAA,CAAG,OAAA;AACb,QAAA,IAAA,GAAO,EAAA,CAAG,OAAA;AACV,QAAA,iBAAA,GAAoB,EAAA,CAAG,cAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,MAAM,UAAA,GAAa,mBAAmB,SAAS,CAAA;AAC/C,QAAA,MAAM,aAAA,GAAgB,iBAAiB,OAAO,CAAA;AAE9C,QAAA,OAAA,GAAU,UAAA,CACP,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,QAAQ,CAAA,CACjC,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AACzC,QAAA,IAAA,GAAO,UAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,QAAQ,CAAA,CACjC,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AACzC,QAAA,iBAAA,GAAoB,aAAA,CAAc,OAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,MAC1E;AAEA,MAAA,MAAM,GAAA,GAAM;AAAA,QACV,SAAA,EAAW,YAAA;AAAA,QACX,OAAA;AAAA,QACA,IAAA;AAAA,QACA,cAAA,EAAgB,iBAAA;AAAA,QAChB,UAAA,EAAYD,cAAAA;AAAA,QACZ,KAAA,EAAO,YAAA,GAAe,OAAA,GAAUA,cAAAA,GAAgB,iBAAA,GAAoB,IAAA;AAAA,QACpE,OAAA,EAAS;AAAA,OACX;AAEA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,GAAA;AAAA,QACN,aAAa,CAAA,UAAA,EAAa,GAAA,CAAI,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,cAAA,EAAiB,GAAA,CAAI,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,YAAA,EAAe,IAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,OAC9H;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,OAAA,EAAQ;AAEpC,IAAA,MAAM,aAAA,GAAgB,OAAO,OAAA,CAAQ,UAAA,KAAe,WAChD,OAAA,CAAQ,UAAA,GACP,OAAA,CAAQ,UAAA,CAAoC,QAAA,IAAY,CAAA;AAC7D,IAAA,MAAM,eAAe,OAAO,OAAA,CAAQ,YAAY,QAAA,GAC5C,OAAA,CAAQ,UACR,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAiC,EAAE,MAAA,CAAO,CAAC,GAAW,CAAA,KAAc,CAAA,GAAI,GAAG,CAAC,CAAA;AAEtG,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,gBAAgB,OAAA,CAAQ,cAAA;AAAA,QACxB,UAAA,EAAY,aAAA;AAAA,QACZ,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,OAAA,EAAS;AAAA,OACX;AAAA,MACA,aAAa,CAAA,UAAA,EAAa,OAAA,CAAQ,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,cAAA,EAAiB,OAAA,CAAQ,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC,CAAA,YAAA,EAAe,QAAQ,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,KAC1I;AAAA,EACF;AACF,CAAC;;;AChJD,SAAS,GAAG,IAAA,EAAgC;AAC1C,EAAA,OAAO,MAAM,UAAA,IAAc,gBAAA;AAC7B;AAMA,eAAeE,UACb,OAAA,EACA,IAAA,EACA,IAAA,GAAgC,IAChC,IAAA,EACY;AACZ,EAAA,MAAM,MAAA,GAAwB,MAAM,OAAA,CAAQ,QAAA,CAAS,GAAG,IAAI,CAAA,EAAG,MAAM,IAAI,CAAA;AACzE,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,MAAM,MAAM,MAAA,CAAO,OAAA,CAChB,OAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,MAAA,IAAU,EAAE,IAAI,CAAA,CACzC,IAAI,CAAC,CAAA,KAAM,EAAE,IAAK,CAAA,CAClB,KAAK,GAAG,CAAA;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,GAAA,EAAM,GAAA,IAAO,eAAe,CAAA,CAAE,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,YAAA,CAAgB,OAAO,OAAO,CAAA;AACvC;AAMA,eAAsB,UAAA,CACpB,SACA,IAAA,EACsB;AACtB,EAAA,MAAM,KAAA,GAAQ,MAAMA,SAAAA,CAAS,OAAA,EAAS,UAAU,SAAA,EAAW,IAAI,IAAI,CAAA;AACnE,EAAA,OAAO,eAAe,KAAK,CAAA;AAC7B;AAMA,eAAsB,iBAAA,CACpB,OAAA,EACA,OAAA,EACA,IAAA,EAC6B;AAC7B,EAAA,MAAM,CAAC,KAAA,EAAO,MAAM,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IACxCA,UAAS,OAAA,EAAS,SAAA,CAAU,mBAAmB,EAAE,OAAA,IAAW,IAAI,CAAA;AAAA,IAChEA,SAAAA,CAAS,OAAA,EAAS,SAAA,CAAU,aAAA,EAAe;AAAA,MACzC,OAAA;AAAA,MACA,SAAA,EAAW,MAAA;AAAA,MACX,MAAA,EAAQ;AAAA,OACP,IAAI;AAAA,GACR,CAAA;AAED,EAAA,OAAO,qBAAA,CAAsB,OAAO,MAAM,CAAA;AAC5C;AAMA,eAAsB,YAAA,CACpB,OAAA,EACA,OAAA,EACA,IAAA,EACwB;AACxB,EAAA,MAAM,CAAC,OAAO,SAAA,EAAW,OAAA,EAAS,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IAC3DA,UAAS,OAAA,EAAS,SAAA,CAAU,WAAW,EAAE,OAAA,IAAW,IAAI,CAAA;AAAA,IACxDA,SAAAA,CAAS,OAAA,EAAS,SAAA,CAAU,aAAA,EAAe;AAAA,MACzC,OAAA;AAAA,MACA,SAAA,EAAW,MAAA;AAAA,MACX,MAAA,EAAQ;AAAA,OACP,IAAI,CAAA;AAAA,IACPA,UAAS,OAAA,EAAS,SAAA,CAAU,uBAAuB,EAAE,OAAA,IAAW,IAAI,CAAA;AAAA,IACpEA,UAAS,OAAA,EAAS,SAAA,CAAU,SAAA,EAAW,IAAI,IAAI;AAAA,GAChD,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,eAAe,KAAK,CAAA;AAClC,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAClD,IAAA,MAAA,CAAO,MAAM,IAAI,IAAA,CAAK,KAAA;AAAA,EACxB;AAEA,EAAA,OAAO,gBAAA,CAAiB,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,MAAM,CAAA;AAC3D;AAMA,eAAsB,YAAA,CACpB,OAAA,EACA,OAAA,EACA,IAAA,EACwB;AACxB,EAAA,MAAM,CAAC,SAAA,EAAW,KAAK,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IAC3CA,SAAAA,CAAS,OAAA,EAAS,SAAA,CAAU,aAAA,EAAe;AAAA,MACzC,OAAA;AAAA,MACA,SAAA,EAAW,MAAA;AAAA,MACX,MAAA,EAAQ;AAAA,OACP,IAAI,CAAA;AAAA,IACPA,UAAS,OAAA,EAAS,SAAA,CAAU,SAAA,EAAW,IAAI,IAAI;AAAA,GAChD,CAAA;AAED,EAAA,OAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C;AAMA,eAAsB,cAAA,CACpB,OAAA,EACA,OAAA,EACA,IAAA,EAC0B;AAC1B,EAAA,MAAM,MAAM,MAAMA,SAAAA;AAAA,IAChB,OAAA;AAAA,IACA,SAAA,CAAU,aAAA;AAAA,IACV,EAAE,OAAA,EAAS,SAAA,EAAW,MAAM,SAAA,IAAa,MAAA,EAAQ,QAAQ,MAAA,EAAO;AAAA,IAChE;AAAA,GACF;AACA,EAAA,OAAO,mBAAmB,GAAG,CAAA;AAC/B;AAMA,eAAsB,qBAAA,CACpB,OAAA,EACA,OAAA,EACA,IAAA,EAC0B;AAC1B,EAAA,MAAM,MAAM,MAAMA,SAAAA;AAAA,IAChB,OAAA;AAAA,IACA,SAAA,CAAU,qBAAA;AAAA,IACV,EAAE,OAAA,EAAQ;AAAA,IACV;AAAA,GACF;AACA,EAAA,OAAO,iBAAiB,GAAG,CAAA;AAC7B;AAcA,eAAsB,kBAAA,CACpB,SACA,IAAA,EACwB;AACxB,EAAA,MAAM,GAAA,GAAM,MAAMA,SAAAA,CAMf,OAAA,EAAS,UAAU,kBAAA,EAAoB,IAAI,IAAI,CAAA;AAElD,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,KAAK,GAAA,IAAO,CAAA;AAAA,IACjB,cAAA,EAAgB,KAAK,cAAA,IAAkB,CAAA;AAAA,IACvC,WAAA,EAAa,KAAK,kBAAA,IAAsB,CAAA;AAAA,IACxC,MAAA,EAAQ,KAAK,MAAA,IAAU,CAAA;AAAA,IACvB,UAAA,EAAY,KAAK,UAAA,IAAc;AAAA,GACjC;AACF;;;ACpMA,SAAS,uBACP,EAAA,EACe;AACf,EAAA,MAAM,SAAA,GAA6B;AAAA,IACjC,GAAG,EAAA,CAAG,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACzB,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,IAAA,EAAM,QAAA;AAAA,MACN,QAAQ,CAAA,CAAE,KAAA;AAAA,MACV,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,UAAU,CAAA,CAAE,SAAA;AAAA,MACZ,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,oBAAA,EAAsB;AAAA,KACxB,CAAE,CAAA;AAAA,IACF,GAAG,EAAA,CAAG,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC/B,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,IAAA,EAAM,QAAA;AAAA,MACN,QAAQ,CAAA,CAAE,KAAA;AAAA,MACV,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,UAAU,CAAA,CAAE,SAAA;AAAA,MACZ,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,oBAAA,EAAsB;AAAA,KACxB,CAAE;AAAA,GACJ;AAEA,EAAA,MAAM,WAAW,EAAA,CAAG,OAAA;AACpB,EAAA,MAAM,WAAA,GAAc,QAAA,GAAW,CAAA,GAAI,EAAA,CAAG,WAAA,GAAc,CAAA;AACpD,EAAA,MAAM,YAAA,GAAgB,WAAW,WAAA,GAAe,GAAA;AAEhD,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,QAAA,EAAU;AAAA,MACR,gBAAA,EAAkB,CAAA;AAAA,MAClB,UAAA,EAAY,WAAA;AAAA,MACZ,YAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,QAAA;AAAA,MACA,GAAA,EAAK,WAAA;AAAA,MACL,WAAA,EAAa,YAAA;AAAA,MACb,aAAA,EAAe,CAAA;AAAA,MACf,kBAAkB,YAAA,GAAe;AAAA;AACnC,GACF;AACF;AAEO,IAAM,kBAAkB,SAAA,CAAU;AAAA,EACvC,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,EACE,wJAAA;AAAA,EACF,WAAA,EAAaC,CAAAA,CAAE,MAAA,CAAO,EAAE,CAAA;AAAA,EACxB,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,EAC3D,UAAA,EAAY,IAAA;AAAA,EAEZ,MAAM,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS;AAC1B,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,OAAO,EAAE,IAAA,EAAM,sBAAA,CAAuB,OAAA,CAAQ,eAAe,CAAA,EAAE;AAAA,IACjE;AAEA,IAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACvB,MAAA,MAAM,UAAU,MAAM,YAAA;AAAA,QACpB,cAAc,OAAO,CAAA;AAAA,QACrB,iBAAiB,OAAO;AAAA,OAC1B;AACA,MAAA,OAAO,EAAE,MAAM,OAAA,EAAQ;AAAA,IACzB;AAEA,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,MAAM,CAAC,SAAA,EAAW,QAAA,EAAU,UAAU,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MAC1D,MAAM,SAAA,EAAU;AAAA,MAChB,MAAM,QAAA,EAAS;AAAA,MACf,MAAM,UAAA;AAAW,KAClB,CAAA;AAGD,IAAA,MAAM,aAAa,SAAA,CAAU,SAAA,IAAa,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,MAC7D,QAAA,EAAW,EAAE,QAAA,IAAY,MAAA;AAAA,MACzB,IAAA,EAAM,CAAA,CAAE,IAAA,KAAS,QAAA,GAAY,QAAA,GAAsB,QAAA;AAAA,MACnD,MAAA,EAAU,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,MAAA,IAAW,SAAA;AAAA,MAClC,MAAA,EAAS,EAAE,MAAA,IAAU,CAAA;AAAA,MACrB,QAAA,EAAY,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,QAAA,IAAa,CAAA;AAAA,MAC1C,GAAA,EAAM,EAAE,GAAA,IAAO,CAAA;AAAA,MACf,oBAAA,EAAuB,EAAE,oBAAA,IAAwB;AAAA,KACnD,CAAE,CAAA;AAEF,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,SAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR,kBAAkB,QAAA,CAAS,gBAAA;AAAA,UAC3B,YAAY,QAAA,CAAS,UAAA;AAAA,UACrB,cAAc,QAAA,CAAS,YAAA;AAAA,UACvB,UAAU,QAAA,CAAS;AAAA,SACrB;AAAA,QACA,UAAA,EAAY;AAAA,UACV,UAAU,UAAA,CAAW,QAAA;AAAA,UACrB,KAAK,UAAA,CAAW,GAAA;AAAA,UAChB,aAAa,UAAA,CAAW,WAAA;AAAA,UACxB,eAAe,UAAA,CAAW,aAAA;AAAA,UAC1B,kBAAkB,UAAA,CAAW;AAAA;AAC/B;AACF,KACF;AAAA,EACF;AACF,CAAC;ACzGD,SAAS,SAAS,EAAA,EAAoB;AACpC,EAAA,IAAI,EAAA,IAAM,GAAK,OAAO,SAAA;AACtB,EAAA,IAAI,EAAA,IAAM,KAAK,OAAO,UAAA;AACtB,EAAA,IAAI,EAAA,IAAM,KAAK,OAAO,SAAA;AACtB,EAAA,OAAO,UAAA;AACT;AAEO,IAAM,kBAAkB,SAAA,CAAU;AAAA,EACvC,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,EACE,gMAAA;AAAA,EACF,WAAA,EAAaA,CAAAA,CAAE,MAAA,CAAO,EAAE,CAAA;AAAA,EACxB,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,EAC3D,UAAA,EAAY,IAAA;AAAA,EAEZ,MAAM,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS;AAC1B,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,MAAM,KAAK,OAAA,CAAQ,eAAA;AACnB,MAAA,MAAM,QAAQ,EAAA,CAAG,YAAA,KAAiB,EAAA,CAAG,OAAA,GAAU,IAAI,QAAA,GAAW,QAAA,CAAA;AAC9D,MAAA,MAAMC,OAAAA,GAAS,SAAS,KAAK,CAAA;AAC7B,MAAA,MAAM,SAAA,GAAY,OAAO,QAAA,CAAS,KAAK,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,QAAA;AAC9D,MAAA,OAAO;AAAA,QACL,IAAA,EAAM;AAAA,UACJ,YAAA,EAAc,KAAA;AAAA,UACd,UAAU,EAAA,CAAG,OAAA;AAAA,UACb,UAAU,EAAA,CAAG,OAAA;AAAA,UACb,WAAW,EAAA,CAAG,SAAA;AAAA,UACd,oBAAA,EAAsB,CAAA;AAAA,UACtB,MAAA,EAAAA;AAAA,SACF;AAAA,QACA,WAAA,EAAa,CAAA,eAAA,EAAkB,SAAS,CAAA,EAAA,EAAKA,OAAM,CAAA,CAAA;AAAA,OACrD;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACvB,MAAA,MAAMC,MAAK,MAAM,iBAAA;AAAA,QACf,cAAc,OAAO,CAAA;AAAA,QACrB,iBAAiB,OAAO;AAAA,OAC1B;AACA,MAAA,MAAMD,OAAAA,GAAS,QAAA,CAASC,GAAAA,CAAG,YAAY,CAAA;AACvC,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,CAASA,GAAAA,CAAG,YAAY,IAAIA,GAAAA,CAAG,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAA,GAAI,QAAA;AAClF,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,EAAE,GAAGA,GAAAA,EAAI,QAAAD,OAAAA,EAAO;AAAA,QACtB,WAAA,EAAa,CAAA,eAAA,EAAkB,SAAS,CAAA,EAAA,EAAKA,OAAM,CAAA,CAAA;AAAA,OACrD;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,MAAM,EAAA,GAAK,MAAM,KAAA,CAAM,YAAA,EAAa;AACpC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,EAAA,CAAG,YAAY,CAAA;AAEvC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,cAAc,EAAA,CAAG,YAAA;AAAA,QACjB,UAAU,EAAA,CAAG,QAAA;AAAA,QACb,UAAU,EAAA,CAAG,QAAA;AAAA,QACb,WAAW,EAAA,CAAG,SAAA;AAAA,QACd,sBAAsB,EAAA,CAAG,oBAAA;AAAA,QACzB;AAAA,OACF;AAAA,MACA,WAAA,EAAa,kBAAkB,EAAA,CAAG,YAAA,CAAa,QAAQ,CAAC,CAAC,KAAK,MAAM,CAAA,CAAA;AAAA,KACtE;AAAA,EACF;AACF,CAAC;AC/DD,SAAS,mBAAmB,KAAA,EAAuE;AACjG,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CACxB,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,CAAC,CAAA,KAAM,CAAA,EAAG,KAAK,CAAA,OAAA,EAAA,CAAW,CAAA,CAAE,OAAA,GAAU,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,WAAA,EAAA,CAAe,CAAA,CAAE,SAAA,GAAY,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA,CACjH,KAAK,IAAI,CAAA;AACd;AAEO,IAAM,gBAAgB,SAAA,CAAU;AAAA,EACrC,IAAA,EAAM,YAAA;AAAA,EACN,WAAA,EACE,yHAAA;AAAA,EACF,WAAA,EAAaD,CAAAA,CAAE,MAAA,CAAO,EAAE,CAAA;AAAA,EACxB,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,EAC3D,UAAA,EAAY,IAAA;AAAA,EAEZ,MAAM,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS;AAC1B,IAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACvB,MAAA,MAAMG,MAAAA,GAAQ,MAAM,UAAA,CAAW,aAAA,CAAc,OAAO,CAAC,CAAA;AACrD,MAAA,OAAO;AAAA,QACL,IAAA,EAAMA,MAAAA;AAAA,QACN,WAAA,EAAa,mBAAmBA,MAAK;AAAA,OACvC;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,KAAA,EAAM;AAEhC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,WAAA,EAAa,mBAAmB,KAAK;AAAA,KACvC;AAAA,EACF;AACF,CAAC;AChCM,IAAM,yBAAyB,SAAA,CAAU;AAAA,EAC9C,IAAA,EAAM,qBAAA;AAAA,EACN,WAAA,EACE,uJAAA;AAAA,EACF,WAAA,EAAaH,EAAE,MAAA,CAAO;AAAA,IACpB,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,QAAA;AAAS,GACjD,CAAA;AAAA,EACD,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf;AACF,GACF;AAAA,EACA,UAAA,EAAY,IAAA;AAAA,EAEZ,MAAM,IAAA,CAAK,KAAA,EAAO,OAAA,EAAS;AACzB,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,OAAA,CAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,EAAA,EAAI,CAAA;AAEhE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,OAAA;AAAA,QACd,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,MACA,WAAA,EAAa,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,sBAAA;AAAA,KAChC;AAAA,EACF;AACF,CAAC;AC9BM,IAAM,kBAAkB,SAAA,CAAU;AAAA,EACvC,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,EACE,gLAAA;AAAA,EACF,WAAA,EAAaA,EAAE,MAAA,CAAO;AAAA,IACpB,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAM,CAACA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,EAAGA,CAAAA,CAAE,OAAA,CAAQ,KAAK,CAAC,CAAC;AAAA,GAC1D,CAAA;AAAA,EACD,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAQ;AAAA,GACrB;AAAA,EACA,UAAA,EAAY,KAAA;AAAA,EACZ,eAAA,EAAiB,SAAA;AAAA,EAEjB,MAAM,IAAA,CAAK,KAAA,EAAO,OAAA,EAAS;AACzB,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA;AAExD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,IAAI,MAAA,CAAO,EAAA;AAAA,QACX,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,gBAAgB,MAAA,CAAO;AAAA,OACzB;AAAA,MACA,WAAA,EAAa,UAAU,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAC,CAAC,QAAQ,MAAA,CAAO,GAAA,GAAM,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,WAAA,EAAc,MAAA,CAAO,GAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,OAAA;AAAA,KACxH;AAAA,EACF;AACF,CAAC;ACpCM,IAAM,eAAe,SAAA,CAAU;AAAA,EACpC,IAAA,EAAM,UAAA;AAAA,EACN,WAAA,EACE,uLAAA;AAAA,EACF,WAAA,EAAaA,EAAE,MAAA,CAAO;AAAA,IACpB,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAM,CAACA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,EAAGA,CAAAA,CAAE,OAAA,CAAQ,KAAK,CAAC,CAAC;AAAA,GAC1D,CAAA;AAAA,EACD,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAQ;AAAA,GACrB;AAAA,EACA,UAAA,EAAY,KAAA;AAAA,EACZ,eAAA,EAAiB,SAAA;AAAA,EAEjB,MAAM,IAAA,CAAK,KAAA,EAAO,OAAA,EAAS;AACzB,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,QAAA,CAAS,EAAE,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA;AAE5D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,IAAI,MAAA,CAAO,EAAA;AAAA,QACX,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,SAAS,MAAA,CAAO;AAAA,OAClB;AAAA,MACA,WAAA,EAAa,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,MAAA,EAAS,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,OAAA;AAAA,KAClF;AAAA,EACF;AACF,CAAC;ACjCM,IAAM,mBAAmB,SAAA,CAAU;AAAA,EACxC,IAAA,EAAM,eAAA;AAAA,EACN,WAAA,EACE,8KAAA;AAAA,EACF,WAAA,EAAaA,EAAE,MAAA,CAAO;AAAA,IACpB,EAAA,EAAIA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,IACpB,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC7B,CAAA;AAAA,EACD,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,EAAA,EAAI;AAAA,QACF,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACf;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,IAAA,EAAM,QAAQ;AAAA,GAC3B;AAAA,EACA,UAAA,EAAY,KAAA;AAAA,EACZ,eAAA,EAAiB,SAAA;AAAA,EAEjB,MAAM,IAAA,CAAK,KAAA,EAAO,OAAA,EAAS;AACzB,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,CAAA;AAEtE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,IAAI,MAAA,CAAO,EAAA;AAAA,QACX,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,IAAI,MAAA,CAAO,EAAA;AAAA,QACX,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,SAAS,MAAA,CAAO;AAAA,OAClB;AAAA,MACA,WAAA,EAAa,SAAS,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,IAAA,EAAO,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,GAAG,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,YAAA,EAAU,OAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,OAAA;AAAA,KAClI;AAAA,EACF;AACF,CAAC;AC3CM,IAAM,aAAa,SAAA,CAAU;AAAA,EAClC,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,EACE,4KAAA;AAAA,EACF,WAAA,EAAaA,EAAE,MAAA,CAAO;AAAA,IACpB,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC7B,CAAA;AAAA,EACD,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAQ;AAAA,GACrB;AAAA,EACA,UAAA,EAAY,KAAA;AAAA,EACZ,eAAA,EAAiB,SAAA;AAAA,EAEjB,MAAM,IAAA,CAAK,KAAA,EAAO,OAAA,EAAS;AACzB,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,MAAA,CAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA;AAE1D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,IAAI,MAAA,CAAO,EAAA;AAAA,QACX,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,SAAS,MAAA,CAAO;AAAA,OAClB;AAAA,MACA,aAAa,CAAA,UAAA,EAAa,MAAA,CAAO,OAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,YAAA,EAAU,MAAA,CAAO,aAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,MAAA,EAAS,MAAA,CAAO,GAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,OAAA;AAAA,KAC1H;AAAA,EACF;AACF,CAAC;ACpCM,IAAM,gBAAgB,SAAA,CAAU;AAAA,EACrC,IAAA,EAAM,YAAA;AAAA,EACN,WAAA,EACE,4KAAA;AAAA,EACF,WAAA,EAAaA,EAAE,MAAA,CAAO;AAAA,IACpB,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAM,CAACA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS,EAAGA,CAAAA,CAAE,OAAA,CAAQ,KAAK,CAAC,CAAC;AAAA,GAC1D,CAAA;AAAA,EACD,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,WAAA,EAAa;AAAA;AACf,KACF;AAAA,IACA,QAAA,EAAU,CAAC,QAAQ;AAAA,GACrB;AAAA,EACA,UAAA,EAAY,KAAA;AAAA,EACZ,eAAA,EAAiB,SAAA;AAAA,EAEjB,MAAM,IAAA,CAAK,KAAA,EAAO,OAAA,EAAS;AACzB,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA;AAEzD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,IAAI,MAAA,CAAO,EAAA;AAAA,QACX,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,SAAS,MAAA,CAAO;AAAA,OAClB;AAAA,MACA,aAAa,CAAA,QAAA,EAAW,MAAA,CAAO,OAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,yBAAA,EAAuB,MAAA,CAAO,cAAc,OAAA,CAAQ,CAAC,CAAC,CAAA,MAAA,EAAS,MAAA,CAAO,GAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,OAAA;AAAA,KACtI;AAAA,EACF;AACF,CAAC;AClCM,IAAM,mBAAmB,SAAA,CAAU;AAAA,EACxC,IAAA,EAAM,eAAA;AAAA,EACN,WAAA,EACE,iHAAA;AAAA,EACF,WAAA,EAAaA,CAAAA,CAAE,MAAA,CAAO,EAAE,CAAA;AAAA,EACxB,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,EAC3D,UAAA,EAAY,KAAA;AAAA,EACZ,eAAA,EAAiB,SAAA;AAAA,EAEjB,MAAM,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS;AAC1B,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,YAAA,EAAa;AAExC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,EAAA,EAAI,OAAO,EAAA,IAAM,IAAA;AAAA,QACjB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,SAAS,MAAA,CAAO;AAAA,OAClB;AAAA,MACA,aAAa,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,GACnC,8BAAA,GACA,YAAY,MAAA,CAAO,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAC,CAAA,iBAAA,EAAoB,MAAA,CAAO,GAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,OAAA;AAAA,KAC1F;AAAA,EACF;AACF,CAAC;AC1BD,IAAM,WAAA,GAAc,sBAAA;AAEb,IAAM,aAAa,SAAA,CAAU;AAAA,EAClC,IAAA,EAAM,SAAA;AAAA,EACN,WAAA,EAAa,kGAAkG,WAAW,CAAA;;AAAA;AAAA,WAAA,EAG/G,WAAW,CAAA;AAAA,YAAA,EACV,WAAW,CAAA;AAAA,cAAA,EACT,WAAW,CAAA;AAAA,aAAA,EACZ,WAAW,CAAA;AAAA,iBAAA,EACP,WAAW,CAAA;AAAA,kBAAA,EACV,WAAW,CAAA;AAAA,iBAAA,EACZ,WAAW,CAAA;AAAA,gBAAA,EACZ,WAAW,CAAA;AAAA,YAAA,EACf,WAAW,CAAA;AAAA,aAAA,EACV,WAAW,CAAA;AAAA,cAAA,EACV,WAAW,CAAA;AAAA,YAAA,EACb,WAAW,CAAA;AAAA,WAAA,EACZ,WAAW,CAAA;AAAA,cAAA,EACR,WAAW,CAAA;AAAA,UAAA,EACf,WAAW,CAAA;AAAA,aAAA,EACR,WAAW,CAAA;AAAA,cAAA,EACV,WAAW,CAAA;AAAA,WAAA,EACd,WAAW,CAAA;;AAAA,qGAAA,CAAA;AAAA,EAGtB,WAAA,EAAaA,EAAE,MAAA,CAAO;AAAA,IACpB,GAAA,EAAKA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI;AAAA,IACpB,MAAA,EAAQA,CAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,QAAQ,KAAA,EAAO,QAAQ,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,IAC1D,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC1B,SAASA,CAAAA,CAAE,MAAA,CAAOA,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,IACvC,UAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AAAS,GAC1C,CAAA;AAAA,EACD,UAAA,EAAY;AAAA,IACV,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV,GAAA,EAAK,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,0EAAA,EAA2E;AAAA,MAC/G,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2CAAA,EAA4C;AAAA,MACnF,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,6BAAA,EAA8B;AAAA,MACnE,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,yBAAA,EAA0B;AAAA,MAClE,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,8DAAA;AAA+D,KAC1G;AAAA,IACA,QAAA,EAAU,CAAC,KAAK;AAAA,GAClB;AAAA,EACA,UAAA,EAAY,KAAA;AAAA,EACZ,eAAA,EAAiB,SAAA;AAAA,EAEjB,MAAM,IAAA,CAAK,KAAA,EAAO,OAAA,EAAS;AACzB,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI;AAAA,MAC7B,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAU,KAAA,CAAM;AAAA,KACjB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,SAAS,MAAA,CAAO;AAAA,OAClB;AAAA,MACA,aAAa,MAAA,CAAO,IAAA,GAChB,CAAA,gCAAA,EAA8B,MAAA,CAAO,MAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,GAAG,aAAa,MAAA,CAAO,MAAM,CAAA,CAAA,CAAA,GACtF,CAAA,wCAAA,EAAsC,OAAO,MAAM,CAAA,CAAA;AAAA,KACzD;AAAA,EACF;AACF,CAAC;;;AC7DM,IAAM,UAAA,GAAqB;AAAA,EAChC,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF;AAEO,IAAM,WAAA,GAAsB;AAAA,EACjC,eAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF;AAEO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAO,CAAC,GAAG,UAAA,EAAY,GAAG,WAAW,CAAA;AACvC;;;AClCO,IAAM,qBAAA,GAAwB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,4DAAA;;;ACCrC,IAAM,qBAAqB,CAAA,GAAI,GAAA;AAC/B,IAAM,sBAAsB,EAAA,GAAK,GAAA;AACjC,IAAM,sBAAA,GAAyB,IAAA;AAC/B,IAAM,qBAAA,GAAwB,GAAA;AAiBvB,IAAM,cAAN,MAAkB;AAAA,EACf,WAAA,GAAc,CAAA;AAAA,EACd,YAAA,GAAe,CAAA;AAAA,EACf,eAAA,GAAkB,CAAA;AAAA,EAClB,gBAAA,GAAmB,CAAA;AAAA,EACV,cAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EAEjB,WAAA,CAAY,MAAA,GAA4B,EAAC,EAAG;AAC1C,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,cAAA,IAAkB,IAAA;AAC/C,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,iBAAA,IAAqB,kBAAA;AAC7C,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,kBAAA,IAAsB,mBAAA;AAAA,EACjD;AAAA,EAEA,KAAA,CACE,WAAA,EACA,YAAA,EACA,eAAA,EACA,gBAAA,EACM;AACN,IAAA,IAAA,CAAK,WAAA,IAAe,WAAA;AACpB,IAAA,IAAA,CAAK,YAAA,IAAgB,YAAA;AACrB,IAAA,IAAA,CAAK,mBAAmB,eAAA,IAAmB,CAAA;AAC3C,IAAA,IAAA,CAAK,oBAAoB,gBAAA,IAAoB,CAAA;AAAA,EAC/C;AAAA,EAEA,WAAA,GAA4B;AAC1B,IAAA,MAAM,cACJ,IAAA,CAAK,WAAA,GAAc,KAAK,YAAA,GAAe,IAAA,CAAK,kBAAkB,IAAA,CAAK,gBAAA;AAErE,IAAA,MAAM,mBACJ,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,SAAA,GACxB,KAAK,YAAA,GAAe,IAAA,CAAK,UAAA,GACzB,IAAA,CAAK,kBAAkB,IAAA,CAAK,SAAA,GAAY,wBACxC,IAAA,CAAK,gBAAA,GAAmB,KAAK,SAAA,GAAY,sBAAA;AAE3C,IAAA,OAAO;AAAA,MACL,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,YAAA,GAAwB;AACtB,IAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,IAAA,EAAM,OAAO,KAAA;AACzC,IAAA,OAAO,IAAA,CAAK,WAAA,EAAY,CAAE,gBAAA,IAAoB,IAAA,CAAK,cAAA;AAAA,EACrD;AAAA,EAEA,qBAAA,GAAuC;AACrC,IAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,IAAA,EAAM,OAAO,IAAA;AACzC,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,iBAAiB,IAAA,CAAK,WAAA,GAAc,gBAAgB,CAAA;AAAA,EAC9E;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AACnB,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AACvB,IAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AAAA,EAC1B;AACF;;;AClEA,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,kBAAA,GAAqB,IAAA;AASpB,IAAM,cAAN,MAAkB;AAAA,EACN,QAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACT,eAAA;AAAA,EACS,OAAA,GAAU,IAAI,OAAA,EAAQ;AAAA,EACtB,WAAA;AAAA,EAET,WAAsB,EAAC;AAAA,EACvB,eAAA,GAA0C,IAAA;AAAA,EAElD,YAAY,MAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAC5B,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,kBAAkB,MAAA,CAAO,eAAA;AAC9B,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,OAAO,QAAA,IAAY,iBAAA;AACnC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,kBAAA;AACrC,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,qBAAA;AAC3C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,CAAY,MAAA,CAAO,WAAW,CAAA;AAErD,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA,KAAU,OAAO,KAAA,GAAQ,eAAA,KAAoB,EAAC,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,cAAc,MAAA,EAA6C;AAChE,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,YAAA,EAAa,EAAG;AACnC,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,IAAI,KAAA,CAAM,yBAAyB,CAAA,EAAE;AACnE,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,CAAgB,MAAA;AAEpC,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK;AAAA,MACjB,IAAA,EAAM,MAAA;AAAA,MACN,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ;AAAA,KACzC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,oBAAA,CACL,MAAA,EACA,QAAA,EAC6B;AAC7B,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,CAAgB,MAAA;AAEpC,IAAA,MAAM,WAAA,GAA4B,SAAS,QAAA,GACvC;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,OAAA,EAAS,KAAK,SAAA,CAAU,QAAA,CAAS,mBAAmB,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,MACrE,OAAA,EAAS;AAAA,KACX,GACA;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,6BAA6B,CAAA;AAAA,MAC9D,OAAA,EAAS;AAAA,KACX;AAKJ,IAAA,IAAI,MAAA,CAAO,kBAAkB,MAAA,EAAQ;AACnC,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,aAAa,OAAA,EAAS,MAAA,CAAO,kBAAkB,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,UAAA,GAA6B;AAAA,MACjC,IAAI,MAAA,CAAO,gBAAA,IAAoB,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC7C,IAAA,EAAM,aAAA;AAAA,QACN,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,SAAS,CAAA,CAAE;AAAA,OACb,CAAE,CAAA;AAAA,MACF;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,YAAY,CAAA;AAExD,IAAA,MAAM;AAAA,MACJ,IAAA,EAAM,aAAA;AAAA,MACN,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,MAAA,EAAQ,QAAA,CAAS,QAAA,GACZ,QAAA,CAAS,eAAA,IAAmB,EAAE,OAAA,EAAS,IAAA,EAAK,GAC7C,EAAE,KAAA,EAAO,2BAAA,EAA4B;AAAA,MACzC,OAAA,EAAS,CAAC,QAAA,CAAS;AAAA,KACrB;AAEA,IAAA,IAAI,CAAC,SAAS,QAAA,EAAU;AACtB,MAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,UAAA,EAAY,UAAA,EAAW;AACtD,MAAA;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAA;AAAA,EACpC;AAAA,EAEA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAAA,EAC9B;AAAA,EAEA,WAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AAAA,EAEA,aAAa,QAAA,EAA2B;AACtC,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,GAAG,QAAQ,CAAA;AAAA,EAC9B;AAAA,EAEA,mBAAmB,IAAA,EAA6C;AAC9D,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AAAA,EAEA,QAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,YAAY,WAAA,EAAY;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAe,SAAA,CACb,WAAA,EACA,MAAA,EAC6B;AAC7B,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB;AAAA,KACF;AAEA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,0BAAA,GAA6B,KAAA;AAEjC,IAAA,OAAO,KAAA,GAAQ,KAAK,QAAA,EAAU;AAC5B,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,IAAI,KAAA,CAAM,SAAS,CAAA,EAAE;AACnD,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,EAAA;AACA,MAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAA;AAE9C,MAAA,MAAM,GAAA,GAAuB;AAAA,QAC3B,IAAA,EAAM,EAAA;AAAA,QACN,UAAA,EAAY,UAAA;AAAA,QACZ,iBAAiB,EAAC;AAAA,QAClB,kBAAkB;AAAC,OACrB;AAEA,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,QAAA,GAAW,eAAA,CAAgB,IAAA,CAAK,QAAQ,CAAA;AAE7C,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK;AAAA,UAChC,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,cAAc,IAAA,CAAK,YAAA;AAAA,UACnB,KAAA,EAAO,QAAA;AAAA,UACP,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB;AAAA,SACD,CAAA;AAED,QAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,UAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,KAAA,EAAO,GAAG,CAAA;AAAA,QAC5C;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,WAAA,IAAe,CAAC,0BAAA,IAA8B,qBAAA,CAAsB,GAAG,CAAA,EAAG;AAC5E,UAAA,0BAAA,GAA6B,IAAA;AAC7B,UAAA,OAAA,CAAQ,KAAK,4EAA4E,CAAA;AACzF,UAAA,IAAA,CAAK,QAAA,GAAW;AAAA,YACd,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAa,CAAA;AAAE,WACjE;AACA,UAAA,KAAA,EAAA;AACA,UAAA;AAAA,QACF;AACA,QAAA,MAAM,GAAA;AAAA,MACR;AAEA,MAAA,IAAI,IAAI,IAAA,EAAM;AACZ,QAAA,GAAA,CAAI,eAAA,CAAgB,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AAAA,MAC3D;AAEA,MAAA,IAAI,GAAA,CAAI,gBAAA,CAAiB,MAAA,KAAW,CAAA,EAAG;AACrC,QAAA,IAAA,CAAK,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,aAAa,OAAA,EAAS,GAAA,CAAI,iBAAiB,CAAA;AACtE,QAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,UAAA,EAAY,IAAI,UAAA,EAAW;AAC1D,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAA,CAAK,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,aAAa,OAAA,EAAS,GAAA,CAAI,iBAAiB,CAAA;AACtE,QAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,gBAAA,EAAkB,SAAS,CAAA;AACpD,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,IAAI,KAAA,CAAM,SAAS,CAAA,EAAE;AACnD,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,WAA8B,EAAC;AACrC,MAAA,MAAM,mBAAmC,EAAC;AAC1C,MAAA,IAAI,YAAA,GAA6D,IAAA;AAEjE,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,gBAAA,EAAkB;AACvC,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,KAAK,IAAI,CAAA;AAC3C,QAAA,MAAM,oBACJ,IAAA,IAAQ,CAAC,IAAA,CAAK,UAAA,IAAc,KAAK,eAAA,KAAoB,MAAA;AAEvD,QAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,UAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAClB,UAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACvF,UAAA;AAAA,QACF;AAEA,QAAA,YAAA,GAAe,EAAE,MAAM,IAAA,EAAY;AACnC,QAAA;AAAA,MACF;AAGA,MAAA,WAAA,MAAiB,SAAA,IAAa,SAAS,QAAA,EAAU,IAAA,CAAK,OAAO,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA,EAAG;AACnF,QAAA,MAAM,SAAA;AAEN,QAAA,IAAI,SAAA,CAAU,SAAS,aAAA,EAAe;AACpC,UAAA,gBAAA,CAAiB,IAAA,CAAK;AAAA,YACpB,IAAA,EAAM,aAAA;AAAA,YACN,WAAW,SAAA,CAAU,SAAA;AAAA,YACrB,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,MAAM,CAAA;AAAA,YACxC,SAAS,SAAA,CAAU;AAAA,WACpB,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,YAAA,EAAc;AAIhB,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,gBAAA;AAAA,UACN,MAAA,EAAQ;AAAA,YACN,QAAA,EAAU,aAAa,IAAA,CAAK,IAAA;AAAA,YAC5B,SAAA,EAAW,aAAa,IAAA,CAAK,EAAA;AAAA,YAC7B,KAAA,EAAO,aAAa,IAAA,CAAK,KAAA;AAAA,YACzB,WAAA,EAAa,cAAA,CAAe,YAAA,CAAa,IAAA,EAAM,aAAa,IAAI,CAAA;AAAA,YAChE,kBAAkB,GAAA,CAAI,eAAA;AAAA,YACtB,gBAAA,EAAkB,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,cAC7C,WAAY,CAAA,CAA4B,SAAA;AAAA,cACxC,SAAU,CAAA,CAA0B,OAAA;AAAA,cACpC,OAAA,EAAU,EAA4B,OAAA,IAAW;AAAA,aACnD,CAAE;AAAA;AACJ,SACF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,EAAE,IAAA,EAAM,aAAa,OAAA,EAAS,GAAA,CAAI,iBAAiB,CAAA;AACtE,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,kBAAkB,CAAA;AAE9D,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,YAAA,EAAa,EAAG;AACnC,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,IAAI,KAAA,CAAM,yBAAyB,CAAA,EAAE;AACnE,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,UAAA,EAAY,WAAA,EAAY;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAA,CAAgB,cAAiC,MAAA,EAAsB;AAC7E,IAAA,MAAM,WAAA,GAA8B,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAC9D,IAAA,EAAM,aAAA;AAAA,MACN,WAAW,IAAA,CAAK,EAAA;AAAA,MAChB,SAAS,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,QAAQ,CAAA;AAAA,MACzC,OAAA,EAAS;AAAA,KACX,CAAE,CAAA;AACF,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,aAAa,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,CAAS,mBAAA,CACP,KAAA,EACA,GAAA,EACwB;AACxB,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,YAAA,EAAc;AACjB,QAAA,GAAA,CAAI,QAAQ,KAAA,CAAM,IAAA;AAClB,QAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAM,IAAA,EAAK;AAC7C,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,eAAA,EAAiB;AACpB,QAAA,GAAA,CAAI,gBAAgB,IAAA,CAAK;AAAA,UACvB,IAAA,EAAM,UAAA;AAAA,UACN,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,OAAO,KAAA,CAAM;AAAA,SACd,CAAA;AACD,QAAA,GAAA,CAAI,iBAAiB,IAAA,CAAK;AAAA,UACxB,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,OAAO,KAAA,CAAM;AAAA,SACd,CAAA;AACD,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,OAAA,EAAS;AACZ,QAAA,IAAA,CAAK,WAAA,CAAY,KAAA;AAAA,UACf,KAAA,CAAM,WAAA;AAAA,UACN,KAAA,CAAM,YAAA;AAAA,UACN,KAAA,CAAM,eAAA;AAAA,UACN,KAAA,CAAM;AAAA,SACR;AACA,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,iBAAiB,KAAA,CAAM,eAAA;AAAA,UACvB,kBAAkB,KAAA,CAAM;AAAA,SAC1B;AACA,QAAA;AAAA,MACF;AAAA,MAEA,KAAK,MAAA,EAAQ;AACX,QAAA,GAAA,CAAI,aAAa,KAAA,CAAM,MAAA;AACvB,QAAA;AAAA,MACF;AAGE;AACJ,EACF;AACF;AAMA,SAAS,sBAAsB,GAAA,EAAuB;AACpD,EAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,EAAA,OACG,IAAI,QAAA,CAAS,UAAU,KAAK,GAAA,CAAI,QAAA,CAAS,aAAa,CAAA,IACvD,GAAA,CAAI,QAAA,CAAS,sBAAsB,KAClC,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,IAAK,GAAA,CAAI,SAAS,uBAAuB,CAAA;AAEhE;AAQO,SAAS,gBAAgB,QAAA,EAAgC;AAE9D,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AAEzC,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,OAAA,EAAS;AAC3B,MAAA,IAAI,EAAE,IAAA,KAAS,UAAA,EAAY,aAAA,CAAc,GAAA,CAAI,EAAE,EAAE,CAAA;AACjD,MAAA,IAAI,EAAE,IAAA,KAAS,aAAA,EAAe,gBAAA,CAAiB,GAAA,CAAI,EAAE,SAAS,CAAA;AAAA,IAChE;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,QAAA,CACd,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM;AACxC,MAAA,IAAI,EAAE,IAAA,KAAS,UAAA,SAAmB,gBAAA,CAAiB,GAAA,CAAI,EAAE,EAAE,CAAA;AAC3D,MAAA,IAAI,EAAE,IAAA,KAAS,aAAA,SAAsB,aAAA,CAAc,GAAA,CAAI,EAAE,SAAS,CAAA;AAClE,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,IAAA,OAAO,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAA,EAAQ;AAAA,EACnC,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAoB,MAAM,IAAI,CAAA;AAGzC,EAAA,MAAM,SAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,GAAA,CAAI,IAAA,EAAM;AAClC,MAAA,IAAA,CAAK,UAAU,CAAC,GAAG,KAAK,OAAA,EAAS,GAAG,IAAI,OAAO,CAAA;AAAA,IACjD,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,CAAC,GAAG,GAAA,CAAI,OAAO,CAAA,EAAG,CAAA;AAAA,IAC3D;AAAA,EACF;AAGA,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,IAAK,OAAO,CAAC,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrD,IAAA,MAAA,CAAO,KAAA,EAAM;AAAA,EACf;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAA,CAAe,MAAY,IAAA,EAA+B;AACjE,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,cAAA;AACH,MAAA,OAAO,CAAA,KAAA,EAAQ,MAAM,MAAA,KAAW,KAAA,GAAQ,kBAAkB,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA,aAAA,CAAA;AAAA,IAC9E,KAAK,UAAA;AACH,MAAA,OAAO,CAAA,SAAA,EAAY,MAAM,MAAA,KAAW,KAAA,GAAQ,QAAQ,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA,aAAA,CAAA;AAAA,IACxE,KAAK,eAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,KAAA,CAAM,MAAM,CAAA,IAAA,EAAO,MAAM,EAAE,CAAA,CAAA;AAAA,IAC7C,KAAK,QAAA;AACH,MAAA,OAAO,CAAA,QAAA,EAAW,MAAM,MAAM,CAAA,mBAAA,CAAA;AAAA,IAChC,KAAK,YAAA;AACH,MAAA,OAAO,CAAA,MAAA,EAAS,MAAM,MAAA,KAAW,KAAA,GAAQ,QAAQ,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA,oBAAA,CAAA;AAAA,IACrE,KAAK,eAAA;AACH,MAAA,OAAO,oCAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,CAAA,oBAAA,EAAuB,KAAA,CAAM,GAAG,CAAA,EAAG,KAAA,CAAM,WAAW,CAAA,OAAA,EAAU,KAAA,CAAM,QAAQ,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAA;AAAA,IAC7F;AACE,MAAA,OAAO,CAAA,QAAA,EAAW,KAAK,IAAI,CAAA,CAAA;AAAA;AAEjC;;;ACldO,SAAS,aAAa,KAAA,EAAyB;AACpD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACjC,EAAA,OAAO,CAAA,OAAA,EAAU,MAAM,IAAI;AAAA,MAAA,EAAW,IAAI;;AAAA,CAAA;AAC5C;AAMO,SAAS,SAAS,GAAA,EAA8B;AACrD,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,QAAQ,CAAC,CAAA;AACnE,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACrC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMA,gBAAuB,YACrB,MAAA,EACwB;AACxB,EAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,IAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,MAAA,MAAM,YAAA,CAAa,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AAAA,IACpE,CAAA,MAAO;AACL,MAAA,MAAM,aAAa,KAAiB,CAAA;AAAA,IACtC;AAAA,EACF;AACF;;;ACZO,IAAM,qBAAN,MAAiD;AAAA,EAC9C,KAAA,uBAAY,GAAA,EAAsD;AAAA,EACzD,KAAA;AAAA,EAEjB,YAAY,IAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,EAAM,KAAA,IAAS,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,IAAI,SAAA,EAAgD;AACxD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AACtC,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,SAAS,CAAA;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,eAAA,CAAgB,MAAM,IAAI,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,IAAI,OAAA,EAAqC;AAC7C,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI;AAAA,MACzB,IAAA,EAAM,gBAAgB,OAAO,CAAA;AAAA,MAC7B,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK;AAAA,KAC9B,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,SAAA,EAAkC;AAC7C,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,SAAS,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,OAAO,SAAA,EAAqC;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AACtC,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,SAAS,CAAA;AAC3B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,IAAA,GAAe;AACjB,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,KAAK,KAAA,EAAO;AACpC,MAAA,IAAI,MAAM,KAAA,CAAM,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,IACjD;AAAA,EACF;AACF;;;ACxFA,IAAM,eAAA,GAAkB,CAAA;AAOjB,SAAS,eAAe,QAAA,EAA6B;AAC1D,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,KAAA,MAAW,KAAA,IAAS,IAAI,OAAA,EAAS;AAC/B,MAAA,KAAA,IAAS,eAAe,KAAK,CAAA;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,eAAe,CAAA;AAC1C;AAEA,SAAS,eAAe,KAAA,EAA6B;AACnD,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,MAAA;AACH,MAAA,OAAO,MAAM,IAAA,CAAK,MAAA;AAAA,IACpB,KAAK,UAAA;AACH,MAAA,OAAO,MAAM,IAAA,CAAK,MAAA,GAAS,KAAK,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA;AAAA,IACzD,KAAK,aAAA;AACH,MAAA,OAAO,MAAM,OAAA,CAAQ,MAAA;AAAA;AAE3B;AA0BO,SAAS,eAAA,CACd,QAAA,EACA,IAAA,GAAuB,EAAC,EACb;AACX,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AACpC,EAAA,MAAM,UAAA,GAAa,KAAK,eAAA,IAAmB,CAAA;AAC3C,EAAA,MAAM,YAAA,GAAe,KAAK,kBAAA,IAAsB,GAAA;AAChD,EAAA,MAAM,SAAS,SAAA,GAAY,YAAA;AAE3B,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEnC,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACnC,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,OAAA,EAAS,EAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAE,CAAE;AAAA,GAC1C,CAAE,CAAA;AAGF,EAAA,IAAI,cAAA,CAAe,OAAO,CAAA,IAAK,MAAA,EAAQ,OAAO,OAAA;AAG9C,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,SAAS,UAAU,CAAA;AAExD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,IAAA,OAAA,CAAQ,CAAC,EAAE,OAAA,GAAU,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AACrD,MAAA,IAAI,MAAM,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,OAAA,CAAQ,SAAS,GAAA,EAAK;AAC9D,QAAA,OAAO;AAAA,UACL,GAAG,KAAA;AAAA,UACH,OAAA,EAAS,kBAAA,CAAmB,KAAA,CAAM,OAAO;AAAA,SAC3C;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,cAAA,CAAe,OAAO,CAAA,IAAK,MAAA,EAAQ,OAAO,OAAA;AAG9C,EAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA;AAGrC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAE5C,EAAA,OAAO,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,cAAA,CAAe,CAAC,KAAA,EAAO,GAAG,UAAA,EAAY,GAAG,MAAM,CAAC,CAAA,GAAI,MAAA,EAAQ;AAC1F,IAAA,UAAA,CAAW,KAAA,EAAM;AAAA,EACnB;AAEA,EAAA,MAAM,YAAY,CAAC,KAAA,EAAO,GAAG,UAAA,EAAY,GAAG,MAAM,CAAA;AAGlD,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,GAAI,MAAA,EAAQ;AACtC,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,MAAA,GAAA,CAAI,OAAA,GAAU,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AACvC,QAAA,IAAI,MAAM,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,OAAA,CAAQ,SAAS,GAAA,EAAK;AAC9D,UAAA,OAAO,EAAE,GAAG,KAAA,EAAO,SAAS,kBAAA,CAAmB,KAAA,CAAM,OAAO,CAAA,EAAE;AAAA,QAChE;AACA,QAAA,OAAO,KAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,iBAAiB,SAAS,CAAA;AACnC;AAWA,SAAS,iBAAiB,QAAA,EAAgC;AACxD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AAEtC,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,KAAA,MAAW,KAAA,IAAS,IAAI,OAAA,EAAS;AAC/B,MAAA,IAAI,MAAM,IAAA,KAAS,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AACtD,MAAA,IAAI,MAAM,IAAA,KAAS,aAAA,EAAe,aAAA,CAAc,GAAA,CAAI,MAAM,SAAS,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO,QAAA,CACJ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAA,KAAU;AAC7C,MAAA,IAAI,MAAM,IAAA,KAAS,aAAA,SAAsB,UAAA,CAAW,GAAA,CAAI,MAAM,SAAS,CAAA;AACvE,MAAA,IAAI,MAAM,IAAA,KAAS,UAAA,SAAmB,aAAA,CAAc,GAAA,CAAI,MAAM,EAAE,CAAA;AAChE,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAClC,IAAA,OAAO,EAAE,GAAG,GAAA,EAAK,OAAA,EAAS,QAAA,EAAS;AAAA,EACrC,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAoB,MAAM,IAAI,CAAA;AAC3C;AAEA,SAAS,mBAAmB,OAAA,EAAyB;AACnD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAEjC,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,OAAO,KAAK,SAAA,CAAU,EAAE,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA;AAAA,IAC/C;AAGA,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,EAAM;AACjD,MAAA,MAAM,UAAmC,EAAC;AAC1C,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW;AAC3D,UAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA;AAAA,QACjB,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AACpC,UAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,EAAA,GAAK,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,QAAA,GAAM,KAAA;AAAA,QAChE,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/B,UAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,OAAA,CAAA;AAAA,QACjC,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,UAAA;AAAA,QACjB;AAAA,MACF;AACA,MAAA,OAAO,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,IAC/B;AAEA,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,EAC7B;AACF;;;ACpJO,SAAS,aAAA,CACd,SACA,KAAA,EACqB;AACrB,EAAA,MAAM,WAAA,GAAc,SAAS,eAAA,EAAgB;AAE7C,EAAA,OAAO,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,IAChC,IAAA,EAAM,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,IACzB,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,aAAa,IAAA,CAAK,UAAA;AAAA,IAElB,MAAM,QAAQ,IAAA,EAA+B;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,IAAI,CAAA;AAC9C,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACnB,KAAA,EAAO,CAAA,eAAA,EAAkB,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,eAC9E;AAAA,aACF,CAAA;AAAA,YACD,OAAA,EAAS;AAAA,WACX;AAAA,QACF;AAEA,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAM,OAAO,CAAA;AACnD,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,IAAI;AAAA,WACjC;AAAA,SACH;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACnB,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,aAC7C;AAAA,WACF,CAAA;AAAA,UACD,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF;AAAA,GACF,CAAE,CAAA;AACJ;AAMO,SAAS,mBAAA,CACd,MAAA,EACA,OAAA,EACA,KAAA,EACM;AACN,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,OAAA,EAAS,KAAK,CAAA;AAChD,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,MAAA,CAAO,IAAA,CAAK,KAAK,IAAA,EAAM,IAAA,CAAK,aAAa,IAAA,CAAK,WAAA,EAAa,KAAK,OAAO,CAAA;AAAA,EACzE;AACF;AChDO,IAAM,mBAAN,MAAuB;AAAA,EACpB,KAAA,uBAAY,GAAA,EAAwB;AAAA,EAC3B,YAAA;AAAA,EAEjB,WAAA,CAAY,eAAe,GAAA,EAAQ;AACjC,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA;AAAA,EACtB;AAAA,EAEQ,GAAA,CAAI,UAAA,EAAoB,QAAA,EAAkB,IAAA,EAAuB;AACvE,IAAA,OAAO,CAAA,EAAG,UAAU,CAAA,EAAA,EAAK,QAAQ,KAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA;AAAA,EAC5D;AAAA,EAEA,GAAA,CAAI,UAAA,EAAoB,QAAA,EAAkB,IAAA,EAAqC;AAC7E,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,UAAU,IAAI,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA;AAC9B,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,MAAA,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AACnB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA,CAAM,MAAA;AAAA,EACf;AAAA,EAEA,GAAA,CAAI,UAAA,EAAoB,QAAA,EAAkB,IAAA,EAAe,QAAuB,KAAA,EAAsB;AACpG,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,UAAU,IAAI,CAAA;AAC7C,IAAA,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG;AAAA,MAChB,MAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,IAAK,SAAS,IAAA,CAAK,YAAA;AAAA,KACxC,CAAA;AAAA,EACH;AAAA,EAEA,WAAW,UAAA,EAA2B;AACpC,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAG;AACnC,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,CAAA,EAAG,UAAU,IAAI,CAAA,EAAG;AACrC,QAAA,IAAA,CAAK,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AACF;AAMO,IAAM,mBAAN,MAAuB;AAAA,EACpB,WAAA,uBAAkB,GAAA,EAAiC;AAAA,EAC1C,aAAA;AAAA,EAEjB,YAAY,IAAA,EAAgC;AAC1C,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,gBAAA,CAAiB,IAAA,EAAM,cAAc,GAAM,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,MAAA,EAAuD;AACnE,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AACrC,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AAAA,IACnC;AAEA,IAAA,MAAM,SAAS,IAAI,MAAA;AAAA,MACjB,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,OAAA,EAAQ;AAAA,MAC1C,EAAE,YAAA,EAAc,EAAC;AAAE,KACrB;AAEA,IAAA,MAAM,aAAA,GAAgB,OAAO,SAAA,IAAa,iBAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA;AAE9B,IAAA,MAAM,SAAA,GAAY,kBAAkB,KAAA,GAChC,IAAI,mBAAmB,GAAG,CAAA,GAC1B,IAAI,6BAAA,CAA8B,GAAA,EAAK;AAAA,MACrC,mBAAA,EAAqB;AAAA,QACnB,oBAAA,EAAsB,GAAA;AAAA,QACtB,wBAAA,EAA0B,GAAA;AAAA,QAC1B,2BAAA,EAA6B,GAAA;AAAA,QAC7B,UAAA,EAAY;AAAA;AACd,KACD,CAAA;AAEL,IAAA,MAAM,IAAA,GAA4B;AAAA,MAChC,MAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAO,EAAC;AAAA,MACR,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAC9B,MAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AAEd,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,SAAA,EAAU;AACzC,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,IACf,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI;AAAE,QAAA,MAAM,OAAO,KAAA,EAAM;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAoB;AACxD,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,IAAI,CAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,WAAW,IAAA,EAA6B;AAC5C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAAoB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,cAAA;AACd,IAAA,IAAA,CAAK,QAAQ,EAAC;AACd,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,IAAI,CAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,CAAc,WAAW,IAAI,CAAA;AAAA,EACpC;AAAA;AAAA,EAGA,MAAM,aAAA,GAA+B;AACnC,IAAA,MAAM,QAAQ,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACzC,IAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAC,CAAA;AAAA,EAC/D;AAAA;AAAA,EAGA,cAAc,IAAA,EAA+C;AAC3D,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAAA,EAClC;AAAA;AAAA,EAGA,YAAY,IAAA,EAAuB;AACjC,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,GAAG,MAAA,KAAW,WAAA;AAAA,EAChD;AAAA;AAAA,EAGA,YAAA,GAAgE;AAC9D,IAAA,MAAM,SAA0D,EAAC;AACjE,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,CAAA,IAAK,KAAK,WAAA,EAAa;AAC3C,MAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa;AACjC,MAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,UAAA,EAAY,IAAA,EAAM,MAAM,CAAA;AAAA,MACxC;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAA,CACJ,UAAA,EACA,QAAA,EACA,IAAA,GAAgC,EAAC,EACT;AACxB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AAC5C,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,UAAU,CAAA,eAAA,CAAiB,CAAA;AACrE,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,WAAA,EAAa,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,UAAU,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAE/F,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,GAAA;AAC3C,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,KAAA,IAAS,WAAW,CAAA,EAAG;AAClD,MAAA,MAAM,SAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,UAAA,EAAY,UAAU,IAAI,CAAA;AAChE,MAAA,IAAI,QAAQ,OAAO,MAAA;AAAA,IACrB;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,IAAA,EAAM,CAAA;AAE7E,IAAA,MAAM,UAAA,GAA4B;AAAA,MAChC,OAAA,EAAU,MAAA,CAAO,OAAA,IAAW,EAAC;AAAA,MAC7B,SAAS,MAAA,CAAO;AAAA,KAClB;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,KAAA,IAAS,WAAW,CAAA,EAAG;AAClD,MAAA,IAAA,CAAK,cAAc,GAAA,CAAI,UAAA,EAAY,QAAA,EAAU,IAAA,EAAM,YAAY,QAAQ,CAAA;AAAA,IACzE;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,KAAA,GAA0B;AAC5B,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,WAAA,GAAsB;AACxB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,WAAA,CAAY,MAAA,EAAO,EAAG;AAC5C,MAAA,IAAI,IAAA,CAAK,WAAW,WAAA,EAAa,KAAA,EAAA;AAAA,IACnC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,WAAA,GAAwB;AAC1B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAAA,EACpC;AACF;ACvNO,SAAS,YAAA,CACd,SACA,MAAA,EACM;AACN,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,aAAA,GAAgB,OAAA,CAAQ,IAAI,CAAA;AACrD,EAAA,MAAM,UAAA,GAAa,SAAA,EAAW,UAAA,IAAc,MAAA,CAAO,UAAA,IAAc,IAAA;AACjE,EAAA,MAAM,eAAA,GAAkB,SAAA,EAAW,eAAA,IAAmB,MAAA,CAAO,eAAA,IAAmB,MAAA;AAChF,EAAA,MAAM,iBAAiB,CAAA,EAAG,MAAA,CAAO,UAAU,CAAA,CAAA,EAAI,QAAQ,IAAI,CAAA,CAAA;AAE3D,EAAA,MAAM,UAAA,GAA8B,QAAQ,WAAA,IAAe;AAAA,IACzD,IAAA,EAAM,QAAA;AAAA,IACN,YAAY;AAAC,GACf;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,aAAa,SAAA,EAAW,WAAA,IAAe,QAAQ,WAAA,IAAe,CAAA,UAAA,EAAa,QAAQ,IAAI,CAAA,CAAA;AAAA,IACvF,WAAA,EAAaA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,SAAS,CAAA;AAAA,IACjC,UAAA;AAAA,IACA,UAAA;AAAA,IACA,iBAAA,EAAmB,UAAA;AAAA,IACnB,eAAA;AAAA,IAEA,MAAM,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAA;AAAA,QAClC,MAAA,CAAO,UAAA;AAAA,QACP,OAAA,CAAQ,IAAA;AAAA,QACR;AAAA,OACF;AAEA,MAAA,MAAM,cAAc,MAAA,CAAO,OAAA,CACxB,OAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,MAAA,IAAU,EAAE,IAAI,CAAA,CACzC,IAAI,CAAC,CAAA,KAAM,EAAE,IAAK,CAAA,CAClB,KAAK,IAAI,CAAA;AAEZ,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,IAAA,CAAK,MAAM,WAAW,CAAA;AAAA,MAC/B,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,GAAO,eAAe,MAAA,CAAO,OAAA;AAAA,MAC/B;AAEA,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,OAAO,EAAE,IAAA,EAAM,EAAE,KAAA,EAAO,MAAK,EAAE;AAAA,MACjC;AAEA,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB;AAAA,GACF;AACF;AAUO,SAAS,iBAAiB,MAAA,EAAsC;AACrE,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,aAAA,CAAc,OAAO,UAAU,CAAA;AAC3D,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,WAAA,EAAa;AACxC,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,OAAO,IAAA,CAAK,MAAM,GAAA,CAAI,CAAC,MAAM,YAAA,CAAa,CAAA,EAAG,MAAM,CAAC,CAAA;AACtD;AAMO,SAAS,mBAAA,CACd,SACA,aAAA,EACQ;AACR,EAAA,MAAM,WAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,EAAE,UAAA,EAAY,IAAA,EAAK,IAAK,OAAA,CAAQ,cAAa,EAAG;AACzD,IAAA,MAAM,UAAA,GAAa,aAAA,GAAgB,UAAU,CAAA,IAAK,EAAC;AACnD,IAAA,QAAA,CAAS,IAAA,CAAK,aAAa,IAAA,EAAM;AAAA,MAC/B,OAAA;AAAA,MACA,UAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAC,CAAA;AAAA,EACJ;AAEA,EAAA,OAAO,QAAA;AACT;AC/GA,IAAM,aAAA,GAAgB,0BAAA;AACtB,IAAMI,mBAAAA,GAAqB,IAAA;AAQpB,IAAM,oBAAN,MAA+C;AAAA,EAC5C,MAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EAER,YAAY,MAAA,EAAiC;AAC3C,IAAA,IAAA,CAAK,SAAS,IAAI,SAAA,CAAU,EAAE,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA;AACrD,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,aAAA;AAC3C,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,gBAAA,IAAoBA,mBAAAA;AAAA,EACrD;AAAA,EAEA,OAAO,KAAK,MAAA,EAAmD;AAC7D,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,kBAAkB,CAAA;AACvD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,eAAe,CAAA;AAE9C,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,IAAA,CAAK,YAAA;AAAA,MAC5B,UAAA,EAAY,MAAA,CAAO,SAAA,IAAa,IAAA,CAAK,gBAAA;AAAA,MACrC,QAAQ,MAAA,CAAO,YAAA;AAAA,MACf,QAAA;AAAA,MACA,KAAA,EAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ;AAAA,KACpC;AAEA,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA,GAClB,KAAK,MAAA,CAAO,QAAA,CAAS,OAAO,YAAA,EAAc,EAAE,MAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA,GACnE,KAAK,MAAA,CAAO,QAAA,CAAS,OAAO,YAAY,CAAA;AAE5C,IAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAwD;AACrF,IAAA,IAAI,qBAAA,GAAwB,CAAA;AAE5B,IAAA,IAAI;AACF,MAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,QAAA,QAAQ,MAAM,IAAA;AAAM,UAClB,KAAK,eAAA,EAAiB;AACpB,YAAA,MAAM,MAAM,KAAA,CAAM,OAAA;AAClB,YAAA,MAAM;AAAA,cACJ,IAAA,EAAM,eAAA;AAAA,cACN,WAAW,GAAA,CAAI,EAAA;AAAA,cACf,OAAO,GAAA,CAAI;AAAA,aACb;AACA,YAAA,IAAI,IAAI,KAAA,EAAO;AACb,cAAA,MAAM,IAAI,GAAA,CAAI,KAAA;AACd,cAAA,qBAAA,GAAwB,IAAI,KAAA,CAAM,aAAA;AAClC,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,OAAA;AAAA,gBACN,WAAA,EAAa,IAAI,KAAA,CAAM,YAAA;AAAA,gBACvB,YAAA,EAAc,IAAI,KAAA,CAAM,aAAA;AAAA,gBACxB,iBAAiB,CAAA,CAAE,uBAAA;AAAA,gBACnB,kBAAkB,CAAA,CAAE;AAAA,eACtB;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,qBAAA,EAAuB;AAC1B,YAAA,MAAM,QAAQ,KAAA,CAAM,aAAA;AACpB,YAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,cAAA,gBAAA,CAAiB,GAAA,CAAI,MAAM,KAAA,EAAO;AAAA,gBAChC,IAAI,KAAA,CAAM,EAAA;AAAA,gBACV,MAAM,KAAA,CAAM,IAAA;AAAA,gBACZ,IAAA,EAAM;AAAA,eACP,CAAA;AACD,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,gBAAA;AAAA,gBACN,IAAI,KAAA,CAAM,EAAA;AAAA,gBACV,MAAM,KAAA,CAAM;AAAA,eACd;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,qBAAA,EAAuB;AAC1B,YAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,YAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,cAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,YAC/C,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,kBAAA,EAAoB;AAC5C,cAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAC5C,cAAA,IAAI,GAAA,EAAK;AACP,gBAAA,GAAA,CAAI,QAAQ,KAAA,CAAM,YAAA;AAClB,gBAAA,MAAM;AAAA,kBACJ,IAAA,EAAM,gBAAA;AAAA,kBACN,IAAI,GAAA,CAAI,EAAA;AAAA,kBACR,aAAa,KAAA,CAAM;AAAA,iBACrB;AAAA,cACF;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,oBAAA,EAAsB;AACzB,YAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAC5C,YAAA,IAAI,GAAA,EAAK;AACP,cAAA,IAAI,QAAiB,EAAC;AACtB,cAAA,IAAI;AACF,gBAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,IAAQ,IAAI,CAAA;AAAA,cACrC,CAAA,CAAA,MAAQ;AACN,gBAAA,KAAA,GAAQ,EAAC;AAAA,cACX;AACA,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,eAAA;AAAA,gBACN,IAAI,GAAA,CAAI,EAAA;AAAA,gBACR,MAAM,GAAA,CAAI,IAAA;AAAA,gBACV;AAAA,eACF;AACA,cAAA,gBAAA,CAAiB,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,YACrC;AACA,YAAA;AAAA,UACF;AAAA,UAEA,KAAK,eAAA,EAAiB;AACpB,YAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,YAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AAEpB,YAAA,IAAI,KAAA,EAAO,aAAA,IAAiB,KAAA,CAAM,aAAA,GAAgB,qBAAA,EAAuB;AACvE,cAAA,MAAM,SAAA,GAAY,MAAM,aAAA,GAAgB,qBAAA;AACxC,cAAA,qBAAA,GAAwB,KAAA,CAAM,aAAA;AAC9B,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,OAAA;AAAA,gBACN,WAAA,EAAa,CAAA;AAAA,gBACb,YAAA,EAAc;AAAA,eAChB;AAAA,YACF;AACA,YAAA,IAAI,MAAM,WAAA,EAAa;AACrB,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,MAAA;AAAA,gBACN,MAAA,EAAQ,aAAA,CAAc,KAAA,CAAM,WAAW;AAAA,eACzC;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAAA;AACF,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,KAAA,EAAM;AAAA,IACf;AAAA,EACF;AACF;AAMA,SAAS,mBAAmB,GAAA,EAAsC;AAChE,EAAA,MAAM,OAAA,GAAyC,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AACxE,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,MAAA;AACH,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,MAAM,IAAA,EAAK;AAAA,MACnD,KAAK,UAAA;AACH,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,UAAA;AAAA,UACN,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,OAAO,KAAA,CAAM;AAAA,SACf;AAAA,MACF,KAAK,aAAA;AACH,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,aAAA;AAAA,UACN,aAAa,KAAA,CAAM,SAAA;AAAA,UACnB,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,UAAU,KAAA,CAAM;AAAA,SAClB;AAAA;AACJ,EACF,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAA,EAAQ;AACnC;AAEA,SAAS,gBACP,GAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,cAAc,GAAA,CAAI;AAAA,GACpB;AACF;AAEA,SAAS,cAAc,MAAA,EAA4B;AACjD,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,UAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT;AACE,MAAA,OAAO,UAAA;AAAA;AAEb","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","// ---------------------------------------------------------------------------\n// Direct Sui JSON-RPC coin fetcher — no SDK dependency required.\n// Uses suix_getAllBalances to get wallet coin balances.\n// ---------------------------------------------------------------------------\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\nconst KNOWN_COINS: Record<string, { symbol: string; decimals: number }> = {\n '0x2::sui::SUI': { symbol: 'SUI', decimals: 9 },\n '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC': { symbol: 'USDC', decimals: 6 },\n '0xc060006111016b8a020ad5b33834984a437aaa7d3c74c18e09a95d48aceab08c::coin::COIN': { symbol: 'USDT', decimals: 6 },\n '0x375f70cf2ae4c00bf37117d0c85a2c71545e6ee05c4a5c7d282cd66a4504b068::usdt::USDT': { symbol: 'USDT', decimals: 6 },\n '0xd0e89b2af5e4910726fbcd8b8dd37bb79b29e5f83f7491bca830e94f7f226d29::eth::ETH': { symbol: 'ETH', decimals: 8 },\n '0x0041f9f9344cac094454cd574e333c4fdb132d7bcc9379bcd4aab485b2a63942::wbtc::WBTC': { symbol: 'BTC', decimals: 8 },\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 known = KNOWN_COINS[b.coinType];\n const symbol = known?.symbol ?? extractSymbol(b.coinType);\n const decimals = known?.decimals ?? 9;\n return {\n coinType: b.coinType,\n symbol,\n decimals,\n totalBalance: b.totalBalance,\n coinObjectCount: b.coinObjectCount,\n };\n });\n}\n\nfunction extractSymbol(coinType: string): string {\n const parts = coinType.split('::');\n return parts[parts.length - 1] ?? 'UNKNOWN';\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 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","// ---------------------------------------------------------------------------\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 { z } from 'zod';\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 transformRates,\n} from '../navi-transforms.js';\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\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: 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 address = getWalletAddress(context);\n const mgr = getMcpManager(context);\n\n const [walletCoins, positions, rewards, pools] = 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 callNavi(mgr, NaviTools.GET_POOLS, {}),\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 let availableUsd = 0;\n let stablesUsd = 0;\n let gasReserveUsd = 0;\n\n if (walletCoins && walletCoins.length > 0) {\n for (const coin of walletCoins) {\n const balance = Number(coin.totalBalance) / 10 ** coin.decimals;\n const price = prices[coin.symbol] ?? (STABLECOIN_SYMBOLS.has(coin.symbol) ? 1 : 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 (STABLECOIN_SYMBOLS.has(coin.symbol)) {\n stablesUsd += balance * price;\n }\n }\n }\n } else {\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 for (const c of coinArr) {\n const symbol = c.symbol ?? '';\n const decimals = c.decimals ?? (symbol === 'SUI' ? 9 : 6);\n const balance = Number(c.totalBalance ?? '0') / 10 ** decimals;\n const price = prices[symbol] ?? (STABLECOIN_SYMBOLS.has(symbol) ? 1 : 0);\n\n if (symbol === 'SUI' || c.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\n const sp = context.serverPositions;\n let savings: number;\n let debt: number;\n let pendingRewardsUsd: number;\n\n if (sp) {\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\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 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 };\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 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';\n\nfunction buildSavingsFromServer(\n sp: NonNullable<import('../types.js').ServerPositionData>,\n): SavingsResult {\n const positions: PositionEntry[] = [\n ...sp.supplies.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.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\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 (context.serverPositions) {\n return { data: buildSavingsFromServer(context.serverPositions) };\n }\n\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 (context.serverPositions) {\n const sp = context.serverPositions;\n const hfVal = sp.healthFactor ?? (sp.borrows > 0 ? Infinity : 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 { 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\nconst MPP_GATEWAY = 'https://mpp.t2000.ai';\n\nexport const payApiTool = buildTool({\n name: 'pay_api',\n description: `Call any MPP (Machine Payment Protocol) service via on-chain USDC micropayment. The gateway at ${MPP_GATEWAY} hosts 40+ services (88 endpoints). All endpoints accept POST with JSON body. Payment is handled automatically.\n\nPopular services and their URLs:\n- Weather: ${MPP_GATEWAY}/openweather/v1/weather (body: {\"city\":\"London\"}) — $0.005\n- Forecast: ${MPP_GATEWAY}/openweather/v1/forecast (body: {\"city\":\"London\"}) — $0.005\n- Web search: ${MPP_GATEWAY}/brave/v1/web/search (body: {\"q\":\"search query\"}) — $0.005\n- AI search: ${MPP_GATEWAY}/perplexity/v1/chat/completions (body: {\"model\":\"sonar\",\"messages\":[...]}) — $0.01\n- Google search: ${MPP_GATEWAY}/serper/v1/search (body: {\"q\":\"query\"}) — $0.005\n- News headlines: ${MPP_GATEWAY}/newsapi/v1/headlines (body: {\"country\":\"us\"}) — $0.005\n- Crypto prices: ${MPP_GATEWAY}/coingecko/v1/price (body: {\"ids\":\"bitcoin,sui\",\"vs_currencies\":\"usd\"}) — $0.005\n- Stock quotes: ${MPP_GATEWAY}/alphavantage/v1/quote (body: {\"symbol\":\"AAPL\"}) — $0.005\n- FX rates: ${MPP_GATEWAY}/exchangerate/v1/rates (body: {\"base\":\"USD\"}) — $0.005\n- Translate: ${MPP_GATEWAY}/deepl/v1/translate (body: {\"text\":[\"hello\"],\"target_lang\":\"ES\"}) — $0.005\n- Scrape URL: ${MPP_GATEWAY}/firecrawl/v1/scrape (body: {\"url\":\"https://...\"}) — $0.01\n- Read URL: ${MPP_GATEWAY}/jina/v1/read (body: {\"url\":\"https://...\"}) — $0.005\n- Geocode: ${MPP_GATEWAY}/googlemaps/v1/geocode (body: {\"address\":\"...\"}) — $0.01\n- Directions: ${MPP_GATEWAY}/googlemaps/v1/directions (body: {\"origin\":\"...\",\"destination\":\"...\"}) — $0.01\n- Places: ${MPP_GATEWAY}/googlemaps/v1/places (body: {\"query\":\"restaurants in Sydney\"}) — $0.01\n- Image gen: ${MPP_GATEWAY}/fal/fal-ai/flux/dev (body: {\"prompt\":\"...\"}) — $0.03\n- Send email: ${MPP_GATEWAY}/resend/v1/emails (body: {\"from\":\"...\",\"to\":\"...\",\"subject\":\"...\",\"html\":\"...\"}) — $0.005\n- Flights: ${MPP_GATEWAY}/serpapi/v1/flights (body: {\"departure_id\":\"SYD\",\"arrival_id\":\"NRT\",\"outbound_date\":\"2026-03-01\"}) — $0.01\n\nAlways use POST. Construct the URL from the gateway base + path. Pass parameters in JSON body string.`,\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\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, an AI assistant built on the Sui blockchain. You help users manage finances AND access 40+ paid API services via MPP (Machine Payment Protocol) micropayments.\n\n## Core Capabilities\n- Check balances, savings positions, health factors, and interest rates\n- Execute deposits, withdrawals, transfers, borrows, and repayments\n- Track transaction history and earnings\n- Look up swap quotes, bridge options, and token information via NAVI\n- **Access any MPP service** — weather, web search, news, crypto prices, stock quotes, translations, image generation, maps, flights, and more via the pay_api tool\n- Answer general knowledge questions conversationally\n\n## MPP Services (via pay_api tool)\nWhen users ask for real-world data (weather, search, prices, news, etc.), use the pay_api tool. Each call costs a few cents in USDC, paid automatically on-chain. Common services:\n- **Weather/forecast**: OpenWeather — current conditions, 5-day forecast\n- **Web search**: Brave Search, Serper (Google), Perplexity (AI-powered)\n- **News**: NewsAPI headlines and search\n- **Crypto**: CoinGecko prices, markets, trending\n- **Stocks**: Alpha Vantage quotes, daily data\n- **Maps**: Google Maps geocode, places, directions\n- **Translation**: DeepL, Google Translate\n- **FX rates**: Exchange rate conversion\n- **Scraping**: Firecrawl, Jina Reader\n- **Flights**: SerpAPI Google Flights\n- **Image gen**: Flux, Stable Diffusion, DALL-E\n- **Email**: Resend\n\nAlways tell users the cost before calling a paid service. If they agree, use pay_api.\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 any available tools to help the user — don't refuse requests you can handle\n- For real-world questions (weather, search, news, prices), use pay_api with the appropriate MPP endpoint\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 — lead with results, follow with context\n- Use short sentences. Avoid hedging language.\n- When presenting positions or balances, use a structured format\n- For non-financial questions, answer naturally and helpfully\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 PendingAction,\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 { 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 suiRpcUrl: string | undefined;\n private serverPositions: EngineConfig['serverPositions'];\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.suiRpcUrl = config.suiRpcUrl;\n this.serverPositions = config.serverPositions;\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 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 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 yield* this.agentLoop(null, signal);\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 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 ): 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 signal,\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 try {\n this.messages = validateHistory(this.messages);\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 } 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 if (acc.pendingToolCalls.length === 0) {\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 this.addErrorResults(acc.pendingToolCalls, 'Aborted');\n yield { type: 'error', error: new Error('Aborted') };\n return;\n }\n\n // --- Permission gate ---\n const approved: PendingToolCall[] = [];\n const toolResultBlocks: ContentBlock[] = [];\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 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 pendingWrite = { call, tool: tool! };\n break;\n }\n\n // Execute auto-approved tool calls (reads) even if a write is pending\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 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 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 },\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 ): 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 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. Strips orphaned tool_use/tool_result blocks and\n * fixes role alternation. This is the single point of defense — no corrupt\n * messages can reach the API regardless of how they got into the session.\n */\nexport function validateHistory(messages: Message[]): Message[] {\n // Collect every tool_use id and every tool_result id across the whole history\n const allToolUseIds = new Set<string>();\n const allToolResultIds = new Set<string>();\n\n for (const msg of messages) {\n for (const b of msg.content) {\n if (b.type === 'tool_use') allToolUseIds.add(b.id);\n if (b.type === 'tool_result') allToolResultIds.add(b.toolUseId);\n }\n }\n\n // Strip orphaned blocks: tool_use without any result, tool_result without any use\n const filtered = messages\n .map((msg) => {\n const content = msg.content.filter((b) => {\n if (b.type === 'tool_use') return allToolResultIds.has(b.id);\n if (b.type === 'tool_result') return allToolUseIds.has(b.toolUseId);\n return true;\n });\n if (content.length === 0) return null;\n return { role: msg.role, content } as Message;\n })\n .filter((m): m is Message => m !== null);\n\n // Merge consecutive same-role messages (can happen after stripping)\n const merged: Message[] = [];\n for (const msg of filtered) {\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 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, PendingAction, StopReason } from './types.js';\n\n// ---------------------------------------------------------------------------\n// SSE event format — serialisable subset of EngineEvent\n// ---------------------------------------------------------------------------\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: '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\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 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t2000/engine",
3
- "version": "0.3.3",
3
+ "version": "0.4.1",
4
4
  "description": "Agent engine for conversational finance — QueryEngine, financial tools, LLM orchestration",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",