@t2000/mcp 0.20.11 → 0.20.14
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/README.md +16 -6
- package/dist/bin.js +614 -287
- package/dist/bin.js.map +1 -1
- package/dist/index.js +614 -287
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/unlock.ts","../src/errors.ts","../src/tools/read.ts","../src/mutex.ts","../src/tools/write.ts","../src/tools/safety.ts","../src/prompts.ts","../src/index.ts","../src/bin.ts"],"names":["z"],"mappings":"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","file":"bin.js","sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000 } from '@t2000/sdk';\n\nconst SESSION_PATH = resolve(homedir(), '.t2000', '.session');\n\nasync function resolvePin(): Promise<string> {\n const envPin = process.env.T2000_PIN ?? process.env.T2000_PASSPHRASE;\n if (envPin) return envPin;\n\n try {\n const session = await readFile(SESSION_PATH, 'utf-8');\n if (session.trim()) return session.trim();\n } catch { /* no session */ }\n\n throw new Error(\n 'No PIN available. Either:\\n' +\n ' 1. Run `t2000 balance` first (creates session), or\\n' +\n ' 2. Set T2000_PIN environment variable',\n );\n}\n\nexport async function createAgent(keyPath?: string): Promise<T2000> {\n const pin = await resolvePin();\n return T2000.create({ pin, keyPath });\n}\n","import { T2000Error, SafeguardError } from '@t2000/sdk';\n\ninterface McpToolError {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n}\n\nexport function mapError(err: unknown): McpToolError {\n if (err instanceof SafeguardError) {\n return {\n code: 'SAFEGUARD_BLOCKED',\n message: err.message,\n retryable: false,\n details: { rule: err.rule, ...err.details },\n };\n }\n\n if (err instanceof T2000Error) {\n return {\n code: err.code,\n message: err.message,\n retryable: err.retryable,\n };\n }\n\n return {\n code: 'UNKNOWN',\n message: err instanceof Error ? err.message : String(err),\n retryable: false,\n };\n}\n\nexport function errorResult(err: unknown) {\n const mapped = mapError(err);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(mapped) }],\n isError: true,\n };\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { T2000 } from '@t2000/sdk';\nimport { errorResult } from '../errors.js';\n\nexport function registerReadTools(server: McpServer, agent: T2000): void {\n server.tool(\n 't2000_balance',\n \"Get agent's current balance — available (checking), savings, credit (debt), gas reserve, and net total. All values in USD.\",\n {},\n async () => {\n try {\n const result = await agent.balance();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_address',\n \"Get the agent's Sui wallet address.\",\n {},\n async () => {\n try {\n const address = agent.address();\n return { content: [{ type: 'text', text: JSON.stringify({ address }) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_positions',\n 'View current lending positions across protocols (NAVI, Suilend) — deposits, borrows, APYs.',\n {},\n async () => {\n try {\n const result = await agent.positions();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_rates',\n 'Get best available interest rates per asset across all lending protocols.',\n {},\n async () => {\n try {\n const result = await agent.rates();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_health',\n \"Check the agent's health factor — measures how safe current borrows are. Below 1.0 risks liquidation.\",\n {},\n async () => {\n try {\n const result = await agent.healthFactor();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_history',\n 'View recent transactions (sends, saves, borrows, swaps, etc.).',\n { limit: z.number().optional().describe('Number of transactions to return (default: 20)') },\n async ({ limit }) => {\n try {\n const result = await agent.history({ limit });\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_earnings',\n 'View yield earnings from savings positions — total earned, daily rate, current APY.',\n {},\n async () => {\n try {\n const result = await agent.earnings();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_contacts',\n 'List saved contacts (name → address mappings). Use contact names with t2000_send instead of raw addresses.',\n {},\n async () => {\n try {\n const contacts = agent.contacts.list();\n return { content: [{ type: 'text', text: JSON.stringify({ contacts }) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_portfolio',\n 'Show investment portfolio — positions, cost basis, current value, unrealized/realized P&L.',\n {},\n async () => {\n try {\n const result = await agent.getPortfolio();\n const enriched = {\n ...result,\n positions: result.positions.map(p => ({\n ...p,\n ...(p.currentPrice === 0 && p.totalAmount > 0 ? { note: 'price unavailable' } : {}),\n })),\n };\n return { content: [{ type: 'text', text: JSON.stringify(enriched) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n}\n","export class TxMutex {\n private queue: Promise<void> = Promise.resolve();\n\n async run<T>(fn: () => Promise<T>): Promise<T> {\n let release: () => void;\n const next = new Promise<void>(r => { release = r; });\n const prev = this.queue;\n this.queue = next;\n await prev;\n try {\n return await fn();\n } finally {\n release!();\n }\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { T2000 } from '@t2000/sdk';\nimport { INVESTMENT_ASSETS } from '@t2000/sdk';\nimport type { InvestmentAsset } from '@t2000/sdk';\nimport { TxMutex } from '../mutex.js';\nimport { errorResult } from '../errors.js';\n\nexport function registerWriteTools(server: McpServer, agent: T2000): void {\n const mutex = new TxMutex();\n\n server.tool(\n 't2000_send',\n 'Send USDC or stablecoins to a Sui address or contact name. Amount is in dollars. Subject to per-transaction and daily send limits. Set dryRun: true to preview without signing.',\n {\n to: z.string().describe(\"Recipient Sui address (0x...) or contact name (e.g. 'Tom')\"),\n amount: z.number().describe('Amount in dollars to send'),\n asset: z.string().optional().describe('Asset to send (default: USDC)'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ to, amount, asset, dryRun }) => {\n try {\n const resolved = agent.contacts.resolve(to);\n\n if (dryRun) {\n agent.enforcer.check({ operation: 'send', amount });\n const balance = await agent.balance();\n const config = agent.enforcer.getConfig();\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n canSend: balance.available >= amount,\n amount,\n to: resolved.address,\n contactName: resolved.contactName,\n asset: asset ?? 'USDC',\n currentBalance: balance.available,\n balanceAfter: balance.available - amount,\n safeguards: {\n dailyUsedAfter: config.dailyUsed + amount,\n dailyLimit: config.maxDailySend,\n },\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.send({ to, amount, asset }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_save',\n 'Deposit USDC to savings (earns yield). Amount is in dollars. Use \"all\" to save entire available balance. Set dryRun: true to preview.',\n {\n amount: z.union([z.number(), z.literal('all')]).describe('Dollar amount to save, or \"all\"'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const balance = await agent.balance();\n const rates = await agent.rates();\n const saveAmount = amount === 'all' ? balance.available - 1.0 : amount;\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n amount: saveAmount,\n currentApy: rates.USDC?.saveApy ?? 0,\n savingsBalanceAfter: balance.savings + saveAmount,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.save({ amount }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_withdraw',\n 'Withdraw from savings back to checking. Amount is in dollars. Use \"all\" to withdraw everything. Set dryRun: true to preview.',\n {\n amount: z.union([z.number(), z.literal('all')]).describe('Dollar amount to withdraw, or \"all\"'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const positions = await agent.positions();\n const health = await agent.healthFactor();\n const savings = positions.positions\n .filter(p => p.type === 'save')\n .reduce((sum, p) => sum + p.amount, 0);\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n amount: amount === 'all' ? savings : amount,\n currentSavings: savings,\n currentHealthFactor: health.healthFactor,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.withdraw({ amount }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_borrow',\n 'Borrow USDC against savings collateral. Check health factor first — below 1.0 risks liquidation. Amount is in dollars. Set dryRun: true to preview.',\n {\n amount: z.number().describe('Dollar amount to borrow'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const health = await agent.healthFactor();\n const maxBorrow = await agent.maxBorrow();\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n amount,\n maxBorrow: maxBorrow.maxAmount,\n currentHealthFactor: health.healthFactor,\n estimatedHealthFactorAfter: maxBorrow.healthFactorAfter,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.borrow({ amount }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_repay',\n 'Repay borrowed USDC. Amount is in dollars. Use \"all\" to repay entire debt. Set dryRun: true to preview.',\n {\n amount: z.union([z.number(), z.literal('all')]).describe('Dollar amount to repay, or \"all\"'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const health = await agent.healthFactor();\n const positions = await agent.positions();\n const totalDebt = positions.positions\n .filter(p => p.type === 'borrow')\n .reduce((sum, p) => sum + p.amount, 0);\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n amount: amount === 'all' ? totalDebt : amount,\n currentDebt: totalDebt,\n currentHealthFactor: health.healthFactor,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.repay({ amount }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_exchange',\n 'Swap assets via Cetus DEX (e.g. USDC to SUI, SUI to USDC). Amount is in source asset units. Set dryRun: true to get a quote without executing.',\n {\n amount: z.number().describe('Amount to swap (in source asset units)'),\n from: z.string().describe('Source asset (e.g. USDC, SUI)'),\n to: z.string().describe('Target asset (e.g. SUI, USDC)'),\n maxSlippage: z.number().optional().describe('Max slippage percentage (default: 3%)'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, from, to, maxSlippage, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const quote = await agent.exchangeQuote({ from, to, amount });\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n from,\n to,\n amount,\n expectedOutput: quote.expectedOutput,\n priceImpact: quote.priceImpact,\n fee: quote.fee.amount,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() =>\n agent.exchange({ from, to, amount, maxSlippage }),\n );\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n const investAssets = Object.keys(INVESTMENT_ASSETS) as [string, ...string[]];\n server.tool(\n 't2000_invest',\n 'Buy, sell, earn yield, or stop earning on investment assets. Actions: buy (invest USD), sell (convert to USDC), earn (deposit into best-rate lending for yield), unearn (withdraw from lending, keep in portfolio). Amount required for buy/sell only.',\n {\n action: z.enum(['buy', 'sell', 'earn', 'unearn']).describe(\"'buy' to invest, 'sell' to liquidate, 'earn' to deposit into lending for yield, 'unearn' to withdraw from lending\"),\n asset: z.enum(investAssets).describe('Asset to invest in'),\n amount: z.union([z.number(), z.literal('all')]).optional().describe('USD amount (required for buy/sell, ignored for earn/unearn)'),\n slippage: z.number().optional().describe('Max slippage percent (default: 3, for buy/sell only)'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ action, asset, amount, slippage, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const balance = await agent.balance();\n const portfolio = await agent.getPortfolio();\n const position = portfolio.positions.find(p => p.asset === asset);\n\n if (action === 'sell' && amount === 'all' && !position) {\n return {\n content: [{ type: 'text', text: JSON.stringify({ preview: true, error: `No ${asset} position to sell` }) }],\n };\n }\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n action,\n asset,\n amount: amount === 'all' ? position?.currentValue ?? 0 : amount ?? position?.totalAmount ?? 0,\n currentBalance: balance.available,\n currentPosition: position ?? null,\n earning: position?.earning ?? false,\n earningProtocol: position?.earningProtocol ?? null,\n earningApy: position?.earningApy ?? null,\n }),\n }],\n };\n }\n\n const maxSlippage = slippage ? slippage / 100 : undefined;\n if (action === 'buy') {\n if (typeof amount !== 'number') throw new Error('Buy amount must be a number');\n const result = await mutex.run(() => agent.investBuy({ asset: asset as InvestmentAsset, usdAmount: amount, maxSlippage }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } else if (action === 'sell') {\n const usdAmount = amount === 'all' ? 'all' as const : amount as number;\n const result = await mutex.run(() => agent.investSell({ asset: asset as InvestmentAsset, usdAmount, maxSlippage }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } else if (action === 'earn') {\n const result = await mutex.run(() => agent.investEarn({ asset: asset as InvestmentAsset }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } else {\n const result = await mutex.run(() => agent.investUnearn({ asset: asset as InvestmentAsset }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n }\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_invest_rebalance',\n 'Move earning investment positions to better-rate protocols. Checks all earning assets and moves any where another protocol offers a higher APY.',\n {\n dryRun: z.boolean().optional().describe('Preview moves without executing (default: false)'),\n minYieldDiff: z.number().optional().describe('Minimum APY difference to trigger a move (default: 0.1)'),\n },\n async ({ dryRun, minYieldDiff }) => {\n try {\n const result = await mutex.run(() => agent.investRebalance({ dryRun, minYieldDiff }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_strategy',\n 'Manage investment strategies — buy into predefined or custom allocations, sell entire strategies, check status, rebalance, or create/delete custom strategies.',\n {\n action: z.enum(['list', 'buy', 'sell', 'status', 'rebalance', 'create', 'delete']).describe(\"Strategy action to perform\"),\n name: z.string().optional().describe(\"Strategy name (required for all actions except 'list')\"),\n amount: z.number().optional().describe(\"USD amount (required for 'buy')\"),\n allocations: z.record(z.number()).optional().describe(\"Allocation map e.g. {SUI: 40, BTC: 20, ETH: 20, GOLD: 20} (for 'create')\"),\n description: z.string().optional().describe(\"Strategy description (for 'create')\"),\n dryRun: z.boolean().optional().describe(\"Preview without signing (for 'buy')\"),\n },\n async ({ action, name, amount, allocations, description, dryRun }) => {\n try {\n if (action === 'list') {\n const all = agent.strategies.getAll();\n return { content: [{ type: 'text', text: JSON.stringify(all) }] };\n }\n\n if (!name) {\n return { content: [{ type: 'text', text: JSON.stringify({ error: 'Strategy name is required' }) }] };\n }\n\n switch (action) {\n case 'buy': {\n if (typeof amount !== 'number') {\n return { content: [{ type: 'text', text: JSON.stringify({ error: 'Amount is required for buy' }) }] };\n }\n const result = await mutex.run(() => agent.investStrategy({ strategy: name, usdAmount: amount, dryRun }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n }\n case 'sell': {\n const result = await mutex.run(() => agent.sellStrategy({ strategy: name }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n }\n case 'status': {\n const result = await agent.getStrategyStatus(name);\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n }\n case 'rebalance': {\n const result = await mutex.run(() => agent.rebalanceStrategy({ strategy: name }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n }\n case 'create': {\n if (!allocations) {\n return { content: [{ type: 'text', text: JSON.stringify({ error: 'Allocations required for create' }) }] };\n }\n const def = agent.strategies.create({ name, allocations, description });\n return { content: [{ type: 'text', text: JSON.stringify(def) }] };\n }\n case 'delete': {\n agent.strategies.delete(name);\n return { content: [{ type: 'text', text: JSON.stringify({ deleted: name }) }] };\n }\n default:\n return { content: [{ type: 'text', text: JSON.stringify({ error: `Unknown action: ${action}` }) }] };\n }\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_auto_invest',\n 'Dollar-cost averaging (DCA) — set up recurring purchases into strategies or individual assets. Actions: setup, status, run, stop.',\n {\n action: z.enum(['setup', 'status', 'run', 'stop']).describe(\"Auto-invest action\"),\n amount: z.number().optional().describe(\"USD amount per purchase (for 'setup')\"),\n frequency: z.enum(['daily', 'weekly', 'monthly']).optional().describe(\"Purchase frequency (for 'setup')\"),\n strategy: z.string().optional().describe(\"Strategy name (for 'setup')\"),\n asset: z.string().optional().describe(\"Single asset (for 'setup', alternative to strategy)\"),\n scheduleId: z.string().optional().describe(\"Schedule ID (for 'stop')\"),\n },\n async ({ action, amount, frequency, strategy, asset, scheduleId }) => {\n try {\n switch (action) {\n case 'setup': {\n if (!amount || !frequency) {\n return { content: [{ type: 'text', text: JSON.stringify({ error: 'Amount and frequency required for setup' }) }] };\n }\n const schedule = agent.setupAutoInvest({ amount, frequency, strategy, asset });\n return { content: [{ type: 'text', text: JSON.stringify(schedule) }] };\n }\n case 'status': {\n const status = agent.getAutoInvestStatus();\n return { content: [{ type: 'text', text: JSON.stringify(status) }] };\n }\n case 'run': {\n const result = await mutex.run(() => agent.runAutoInvest());\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n }\n case 'stop': {\n if (!scheduleId) {\n return { content: [{ type: 'text', text: JSON.stringify({ error: 'Schedule ID required for stop' }) }] };\n }\n agent.stopAutoInvest(scheduleId);\n return { content: [{ type: 'text', text: JSON.stringify({ stopped: scheduleId }) }] };\n }\n default:\n return { content: [{ type: 'text', text: JSON.stringify({ error: `Unknown action: ${action}` }) }] };\n }\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_rebalance',\n 'Optimize yield by moving funds to the highest-rate protocol. Always previews first — set dryRun: false to execute. Shows plan with expected APY gain and break-even period.',\n {\n dryRun: z.boolean().optional().describe('Preview without executing (default: true)'),\n minYieldDiff: z.number().optional().describe('Min APY difference to rebalance (default: 0.5%)'),\n maxBreakEven: z.number().optional().describe('Max break-even days (default: 30)'),\n },\n async ({ dryRun, minYieldDiff, maxBreakEven }) => {\n try {\n const result = await mutex.run(() =>\n agent.rebalance({\n dryRun: dryRun ?? true,\n minYieldDiff,\n maxBreakEven,\n }),\n );\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_claim_rewards',\n 'Claim pending protocol rewards from lending positions and auto-convert to USDC.',\n {},\n async () => {\n try {\n const result = await mutex.run(() => agent.claimRewards());\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { T2000 } from '@t2000/sdk';\nimport { errorResult } from '../errors.js';\n\nexport function registerSafetyTools(server: McpServer, agent: T2000): void {\n server.tool(\n 't2000_config',\n 'View or set agent safeguard limits (per-transaction max, daily send limit). Use action \"show\" to view current limits, \"set\" to update. Values are in dollars. Set to 0 for unlimited.',\n {\n action: z.enum(['show', 'set']).describe('\"show\" to view current limits, \"set\" to update a limit'),\n key: z.string().optional().describe('Setting to update: \"maxPerTx\" or \"maxDailySend\"'),\n value: z.number().optional().describe('New value in dollars (0 = unlimited)'),\n },\n async ({ action, key, value }) => {\n try {\n if (action === 'show') {\n const config = agent.enforcer.getConfig();\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n locked: config.locked,\n maxPerTx: config.maxPerTx,\n maxDailySend: config.maxDailySend,\n dailyUsed: config.dailyUsed,\n }),\n }],\n };\n }\n\n if (!key || value === undefined) {\n return errorResult(new Error('Both \"key\" and \"value\" are required for action \"set\"'));\n }\n\n if (key === 'locked') {\n return errorResult(new Error('Cannot set \"locked\" via config. Use t2000_lock to freeze operations.'));\n }\n\n if (key !== 'maxPerTx' && key !== 'maxDailySend') {\n return errorResult(new Error(`Unknown key \"${key}\". Valid keys: \"maxPerTx\", \"maxDailySend\"`));\n }\n\n if (value < 0) {\n return errorResult(new Error('Value must be a non-negative number'));\n }\n\n agent.enforcer.set(key, value);\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({ updated: true, key, value }),\n }],\n };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_lock',\n 'Freeze all agent operations immediately. Only a human can unlock via `t2000 unlock` in the terminal. Use this as an emergency stop.',\n {},\n async () => {\n try {\n agent.enforcer.lock();\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n locked: true,\n message: 'Agent locked. Only a human can unlock via: t2000 unlock',\n }),\n }],\n };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nexport function registerPrompts(server: McpServer): void {\n server.prompt(\n 'financial-report',\n 'Get a comprehensive summary of the agent\\'s financial position — balance, savings, debt, health factor, and yield earnings.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a financial assistant for a t2000 AI agent bank account.',\n '',\n 'Please provide a comprehensive financial report by:',\n '1. Check the current balance (t2000_balance)',\n '2. Review lending positions (t2000_positions)',\n '3. Check the health factor (t2000_health)',\n '4. Show yield earnings (t2000_earnings)',\n '5. Review current interest rates (t2000_rates)',\n '6. Check investment portfolio (t2000_portfolio)',\n '7. Check for pending protocol rewards (positions with +rewards tags mean claimable rewards exist)',\n '',\n 'Summarize the agent\\'s financial health in a clear, concise format with actionable recommendations.',\n 'If any positions show claimable rewards, include \"Claim rewards → run t2000_claim_rewards to collect and convert to USDC\" as an action item.',\n 'Check if investment earning positions could move to a better-rate protocol (t2000_invest_rebalance with dryRun: true). If opportunities exist, include as a recommendation.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'optimize-yield',\n 'Analyze savings and investment earning positions — rate comparisons, rebalancing opportunities across protocols.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a yield optimization assistant for a t2000 AI agent bank account.',\n '',\n 'Please analyze the current yield strategy:',\n '1. Check current positions (t2000_positions) — look for +rewards tags indicating claimable protocol rewards',\n '2. Compare rates across protocols (t2000_rates)',\n '3. Run a dry-run savings rebalance (t2000_rebalance with dryRun: true)',\n '4. Run a dry-run investment rebalance (t2000_invest_rebalance with dryRun: true) — checks if earning positions on SUI, BTC, ETH, GOLD could move to a higher-rate protocol',\n '',\n 'If a savings rebalance would improve yield, explain the trade-off (gas cost vs yield gain, break-even period) and ask if the user wants to proceed.',\n 'If an investment rebalance would improve yield, show which assets would move and the APY gain, then ask to proceed.',\n 'If any positions have claimable rewards, recommend running t2000_claim_rewards to collect and auto-convert to USDC.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'send-money',\n 'Guided flow for sending USDC to a Sui address — validates address, checks limits, previews before signing.',\n {\n to: z.string().optional().describe('Recipient Sui address'),\n amount: z.number().optional().describe('Amount in dollars'),\n },\n async ({ to, amount }) => {\n const context = [\n to ? `Recipient address: ${to}` : '',\n amount ? `Amount: $${amount}` : '',\n ].filter(Boolean).join('\\n');\n\n return {\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a payment assistant for a t2000 AI agent bank account.',\n '',\n context ? `Context:\\n${context}\\n` : '',\n 'The user wants to send money. Follow this flow:',\n '1. If address or amount is missing, ask the user',\n '2. Preview the transaction (t2000_send with dryRun: true)',\n '3. Show the preview — amount, recipient, remaining balance, safeguard status',\n '4. Ask the user to confirm before executing',\n '5. Execute the send (t2000_send with dryRun: false)',\n '6. Show the transaction result with the Suiscan link',\n ].join('\\n'),\n },\n }],\n };\n },\n );\n\n server.prompt(\n 'budget-check',\n 'Can I afford to spend $X? Checks balance, daily limit remaining, and whether spending would impact savings.',\n {\n amount: z.number().optional().describe('Amount in dollars to check'),\n },\n async ({ amount }) => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a budget assistant for a t2000 AI agent bank account.',\n '',\n amount ? `The user wants to know if they can afford to spend $${amount}.` : 'The user wants a spending check.',\n '',\n 'Analyze their financial situation:',\n '1. Check current balance (t2000_balance)',\n '2. Check safeguard limits (t2000_config with action: \"show\")',\n '3. Calculate: available balance, daily limit remaining, what percentage of total this spend represents',\n '',\n 'Give a clear yes/no answer with context:',\n '- Can they afford it from checking?',\n '- Would it hit their daily send limit?',\n '- What balance would remain after?',\n '- If it\\'s a large % of their total, flag that.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'savings-strategy',\n 'Analyze idle funds in checking and recommend a savings strategy — how much to save, expected yield, best rates.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a savings advisor for a t2000 AI agent bank account.',\n '',\n 'Analyze the user\\'s funds and recommend a savings strategy:',\n '1. Check current balance (t2000_balance) — how much is idle in checking?',\n '2. Check current positions (t2000_positions) — what\\'s already in savings?',\n '3. Compare rates across protocols (t2000_rates) — where\\'s the best yield?',\n '',\n 'Recommend:',\n '- How much to move from checking to savings (keep a reasonable buffer for gas + daily spending)',\n '- Which protocol offers the best rate right now',\n '- Expected annual yield on the recommended amount',\n '- If they should rebalance existing savings (t2000_rebalance with dryRun: true)',\n '- Whether investing in SUI or other assets could complement their savings strategy',\n '- Note: investment assets (SUI, ETH) can also earn yield via t2000_invest action: \"earn\"',\n '',\n 'If they want to proceed, use t2000_save to deposit. Always preview first.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'investment-strategy',\n 'Analyze investment portfolio, suggest strategies, review DCA schedules, and recommend next steps.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are an investment advisor for a t2000 AI agent bank account.',\n '',\n 'Analyze the user\\'s investment position:',\n '1. Check current balance (t2000_balance) — available checking, savings, investment value',\n '2. Check investment portfolio (t2000_portfolio) — positions, cost basis, P&L, strategy grouping',\n '3. List available strategies (t2000_strategy action: \"list\") — predefined and custom',\n '4. Check DCA schedules (t2000_auto_invest action: \"status\") — any active recurring buys',\n '5. Compare current rates (t2000_rates) — yield alternatives',\n '',\n 'Recommend:',\n '- Portfolio allocation assessment (checking vs savings vs investment)',\n '- Whether a predefined strategy (bluechip, layer1, sui-heavy) suits them better than picking individual assets',\n '- If strategy positions are drifting from target weights, suggest rebalancing',\n '- If they have no DCA schedule, recommend setting one up for dollar-cost averaging',\n '- Whether invested assets should earn yield (t2000_invest action: \"earn\")',\n '- If assets are already earning, check for better rates (t2000_invest_rebalance with dryRun: true) — moves earning positions to higher-APY protocols automatically',\n '- Risk assessment — concentration, unrealized losses, strategy drift',\n '',\n 'For strategies: use t2000_strategy with dryRun: true to preview before buying.',\n 'For DCA: use t2000_auto_invest action: \"setup\" to create recurring buys.',\n 'For direct investments: use t2000_invest with dryRun: true to preview.',\n 'For yield optimization: use t2000_invest_rebalance with dryRun: true to preview earning moves.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n // ---------------------------------------------------------------------------\n // Wow-factor prompts — AI-as-financial-advisor\n // ---------------------------------------------------------------------------\n\n server.prompt(\n 'morning-briefing',\n 'Daily financial snapshot — balance changes, yield earned, portfolio movement, pending DCA, health warnings.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a personal financial briefing assistant for a t2000 AI agent bank account.',\n '',\n 'Deliver a concise morning briefing. Gather all data first, then present a single unified report.',\n '',\n 'Data to collect:',\n '1. Current balance breakdown (t2000_balance)',\n '2. Yield earnings — daily rate, total earned (t2000_earnings)',\n '3. Investment portfolio — positions, P&L movement (t2000_portfolio)',\n '4. Health factor — any borrow risk (t2000_health)',\n '5. Pending DCA runs (t2000_auto_invest action: \"status\")',\n '6. Recent transactions since yesterday (t2000_history with limit: 10)',\n '7. Lending positions (t2000_positions) — check for +rewards tags indicating claimable rewards',\n '8. Investment rebalance opportunities (t2000_invest_rebalance with dryRun: true) — any earning positions on sub-optimal protocols',\n '',\n 'Present the briefing in this structure:',\n '',\n '☀️ MORNING BRIEFING',\n '───────────────────',\n '',\n '💰 Accounts',\n ' Checking / Savings / Credit / Investment totals',\n ' Net worth and change from yesterday if estimable',\n ' If rewards are claimable, show \"Rewards: claimable\"',\n '',\n '📈 Portfolio',\n ' Each position: asset, amount, current price, unrealized P&L',\n ' Overall portfolio performance',\n '',\n '💸 Yield',\n ' What you earned overnight (daily rate × time)',\n ' Current APY across savings and investment lending',\n '',\n '⚠️ Alerts (only if applicable)',\n ' Low health factor, pending DCA runs, strategy drift, large unrealized losses, claimable rewards',\n '',\n '📋 Action Items',\n ' Specific, actionable next steps (max 4)',\n ' e.g. \"Claim rewards → run t2000_claim_rewards\", \"Run pending DCA\", \"Rebalance savings for +0.5% APY\", \"Rebalance investment earning → run t2000_invest_rebalance\", \"Health factor dropping — consider repaying\"',\n ' If positions show +rewards, always include claiming as an action item',\n ' If investment rebalance shows opportunities, include as an action item',\n '',\n 'Keep it scannable. No fluff. Numbers first, narrative second.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'what-if',\n 'Scenario planning — \"What if I invest $X in Y?\" Shows projected impact on portfolio, yield, and risk.',\n {\n scenario: z.string().optional().describe('Scenario to evaluate, e.g. \"invest $500 in bluechip\" or \"withdraw all savings\"'),\n },\n async ({ scenario }) => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a financial scenario planner for a t2000 AI agent bank account.',\n '',\n scenario\n ? `The user wants to evaluate this scenario: \"${scenario}\"`\n : 'The user wants to explore a hypothetical financial scenario. Ask them what they\\'re considering.',\n '',\n 'Gather current state first:',\n '1. Current balance (t2000_balance)',\n '2. Current portfolio (t2000_portfolio)',\n '3. Current positions and rates (t2000_positions, t2000_rates)',\n '4. Health factor if they have borrows (t2000_health)',\n '',\n 'Then model the scenario. For each scenario type:',\n '',\n 'INVESTMENT scenario (\"invest $X in Y\"):',\n ' - Preview the trade (t2000_invest or t2000_strategy with dryRun: true)',\n ' - Show: checking balance after, new portfolio allocation %, concentration risk',\n ' - If the asset can earn yield, show projected annual yield',\n ' - Compare: \"keeping $X in savings at Y% vs investing at historical volatility\"',\n '',\n 'SAVINGS scenario (\"save $X\" or \"withdraw $X\"):',\n ' - Show: new savings balance, new yield rate, impact on available spending',\n ' - If withdrawing: impact on health factor if they have borrows',\n '',\n 'BORROW scenario (\"borrow $X\"):',\n ' - Show: new health factor, liquidation price, interest cost',\n ' - Compare: cost of borrowing vs withdrawing from savings',\n '',\n 'EXCHANGE scenario (\"swap $X of A to B\"):',\n ' - Preview the swap (t2000_exchange with dryRun: true)',\n ' - Show: expected output, price impact, slippage',\n '',\n 'Present results as:',\n ' BEFORE → AFTER comparison table',\n ' Risk assessment (better/worse/neutral)',\n ' Clear recommendation with reasoning',\n '',\n 'Always end with: \"Want me to execute this?\" and the exact command that would run.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'sweep',\n 'Find idle funds in checking and optimally distribute across savings and investments for maximum yield.',\n {\n keepBuffer: z.number().optional().describe('Dollar amount to keep in checking as spending buffer (default: $20)'),\n },\n async ({ keepBuffer }) => {\n const buffer = keepBuffer ?? 20;\n return {\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a smart money routing assistant for a t2000 AI agent bank account.',\n '',\n `Sweep idle checking funds into optimal earning positions. Keep $${buffer} in checking as a spending buffer.`,\n '',\n 'Step 1 — Assess current state:',\n ' - Check balance (t2000_balance) — how much is idle in checking?',\n ' - Check positions (t2000_positions) — what\\'s already earning?',\n ' - Check rates (t2000_rates) — where are the best yields?',\n ' - Check portfolio (t2000_portfolio) — any uninvested assets not earning yield?',\n '',\n `Step 2 — Calculate sweep amount: available checking minus $${buffer} buffer.`,\n ' If sweep amount is < $1, tell the user their funds are already optimized.',\n '',\n 'Step 3 — Recommend allocation of the sweep amount:',\n ' - Savings: stable yield, no price risk — good for majority of idle funds',\n ' - Pick the highest-rate stablecoin protocol',\n ' - If they have investment assets not earning yield, recommend t2000_invest earn',\n ' - Check if rebalancing existing savings would help (t2000_rebalance dryRun: true)',\n '',\n 'Step 4 — Present the sweep plan:',\n '',\n ' 🧹 SWEEP PLAN',\n ' ─────────────',\n ` Available to sweep: $X (keeping $${buffer} buffer)`,\n '',\n ' Action 1: Save $X USDC → Protocol (Y% APY)',\n ' Expected: ~$X.XX/month',\n ' Action 2: Earn yield on X SUI → Protocol (Y% APY) [if applicable]',\n ' Action 3: Rebalance savings → +Y% APY [if applicable]',\n ' Action 4: Rebalance investment earning → move to better protocol [if t2000_invest_rebalance dryRun shows opportunity]',\n ' Action 5: Claim rewards → collect and convert to USDC [if positions show +rewards]',\n '',\n ' Projected monthly yield: $X.XX (before) → $X.XX (after)',\n '',\n 'Ask: \"Want me to execute this sweep?\" Then run each action sequentially.',\n 'Use dryRun: true first for any action over $50.',\n ].join('\\n'),\n },\n }],\n };\n },\n );\n\n server.prompt(\n 'risk-check',\n 'Full risk analysis — health factor, concentration, lending exposure, unrealized losses, liquidation proximity.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a risk assessment specialist for a t2000 AI agent bank account.',\n '',\n 'Perform a comprehensive risk analysis. Gather all data first:',\n '1. Balance breakdown (t2000_balance)',\n '2. Health factor (t2000_health)',\n '3. All lending positions (t2000_positions)',\n '4. Investment portfolio (t2000_portfolio)',\n '5. Current rates (t2000_rates)',\n '',\n 'Analyze and report on each risk dimension:',\n '',\n '🛡️ RISK REPORT',\n '──────────────',\n '',\n '1. LIQUIDATION RISK',\n ' Health factor value and status (safe / moderate / warning / critical)',\n ' How much the collateral can drop before liquidation',\n ' If HF < 2.0: specific repayment recommendation to reach safe zone',\n '',\n '2. CONCENTRATION RISK',\n ' % of total net worth in each account type (checking, savings, investment)',\n ' % of investments in each asset (SUI, BTC, ETH, GOLD)',\n ' Flag if any single position is >50% of portfolio',\n '',\n '3. PROTOCOL EXPOSURE',\n ' Which protocols hold funds (NAVI, Suilend)',\n ' Total exposure per protocol',\n ' Flag if >80% of savings is in one protocol',\n '',\n '4. UNREALIZED LOSSES',\n ' Any investment positions currently at a loss',\n ' Total unrealized P&L',\n ' Cost basis vs current price per position',\n '',\n '5. YIELD EFFICIENCY',\n ' Any assets sitting idle (not earning yield)',\n ' Checking balance vs recommended buffer',\n ' Investment assets not in lending (could earn via invest earn)',\n ' Earning positions on sub-optimal protocols (run t2000_invest_rebalance dryRun: true)',\n '',\n 'OVERALL RISK SCORE: Low / Medium / High / Critical',\n 'Based on weighted combination of all factors above.',\n '',\n 'End with max 3 specific, prioritized actions to reduce risk.',\n 'If overall risk is Low, say so clearly — don\\'t invent problems.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'weekly-recap',\n 'Week in review — transactions, yield earned, portfolio P&L changes, strategy performance, highlights.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a personal finance newsletter writer for a t2000 AI agent bank account.',\n '',\n 'Compile a weekly financial recap. Gather all data:',\n '1. Current balance (t2000_balance)',\n '2. Recent transactions (t2000_history with limit: 50)',\n '3. Yield earnings (t2000_earnings)',\n '4. Investment portfolio with P&L (t2000_portfolio)',\n '5. Strategy statuses (t2000_strategy action: \"list\")',\n '6. DCA schedule status (t2000_auto_invest action: \"status\")',\n '7. Lending positions (t2000_positions) — check for claimable rewards',\n '',\n 'Present as a weekly newsletter:',\n '',\n '📊 WEEKLY RECAP',\n '───────────────',\n '',\n '💰 Net Worth: $X.XX',\n ' Checking: $X | Savings: $X | Investment: $X | Credit: -$X',\n '',\n '📈 This Week\\'s Activity',\n ' Summarize transactions by type:',\n ' - X sends totaling $X',\n ' - X saves/withdrawals',\n ' - X investment trades',\n ' - X exchanges',\n ' Highlight the largest transaction',\n '',\n '💸 Yield Earned',\n ' Total yield this week (daily rate × 7)',\n ' Breakdown by position',\n ' Annualized projection',\n '',\n '📊 Portfolio Performance',\n ' Each position: asset, P&L this week, total unrealized P&L',\n ' Best performer and worst performer',\n ' Strategy performance if applicable',\n '',\n '🔄 DCA Status',\n ' Runs completed this week',\n ' Next scheduled run',\n ' Total invested via DCA to date',\n '',\n '🏆 Highlight of the Week',\n ' One standout metric (best trade, highest yield day, milestone reached)',\n '',\n '🎁 Rewards',\n ' Any pending protocol rewards (if positions show +rewards)',\n ' Suggest claiming if rewards are available',\n '',\n '👉 Next Week\\'s Focus',\n ' 1-2 actionable suggestions based on trends',\n ' If investment earning positions can be rebalanced for better APY, mention it (t2000_invest_rebalance dryRun: true)',\n '',\n 'Tone: confident, concise, data-driven. Like a Bloomberg brief, not a blog post.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'dca-advisor',\n 'Personalized DCA setup — \"I have $X/month\" → recommends strategy, frequency, asset split, projected growth.',\n {\n budget: z.number().optional().describe('Monthly budget in dollars to invest'),\n },\n async ({ budget }) => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a dollar-cost averaging advisor for a t2000 AI agent bank account.',\n '',\n budget\n ? `The user has $${budget}/month to invest via DCA.`\n : 'The user wants to set up a DCA (dollar-cost averaging) schedule. Ask them their monthly budget.',\n '',\n 'Gather context:',\n '1. Current balance (t2000_balance) — can they afford this monthly commitment?',\n '2. Current portfolio (t2000_portfolio) — what do they already hold?',\n '3. Existing DCA schedules (t2000_auto_invest action: \"status\")',\n '4. Available strategies (t2000_strategy action: \"list\")',\n '',\n 'Recommend a DCA plan:',\n '',\n '📅 DCA PLAN',\n '───────────',\n '',\n 'STRATEGY SELECTION:',\n ' Based on their existing portfolio, recommend one of:',\n ' - bluechip (50% BTC, 30% ETH, 20% SUI) — large-cap crypto index',\n ' - all-weather (30% BTC, 20% ETH, 20% SUI, 30% GOLD) — crypto + commodities',\n ' - safe-haven (50% BTC, 50% GOLD) — store-of-value assets',\n ' - layer1 (50% ETH, 50% SUI) — smart contract platforms',\n ' - sui-heavy (60% SUI, 20% BTC, 20% ETH) — Sui-weighted portfolio',\n ' - single asset (100% SUI/BTC/ETH/GOLD) — concentrated conviction play',\n ' Explain WHY this strategy fits their situation.',\n '',\n 'FREQUENCY:',\n ' - Weekly ($X/week) — smoothest averaging, best for volatile markets',\n ' - Monthly ($X/month) — simpler, lower gas costs',\n ' Recommend weekly for budgets > $50/month, monthly for smaller amounts.',\n '',\n 'PROJECTION (12 months):',\n ' Total invested: $X',\n ' If prices stay flat: $X (just accumulation)',\n ' Note: past performance doesn\\'t predict future results',\n ' Key benefit: removes emotion and timing risk from investing',\n '',\n 'AFFORDABILITY CHECK:',\n ' Monthly income vs this commitment',\n ' Remaining checking buffer after DCA',\n ' Flag if DCA would eat into emergency buffer',\n '',\n 'If they want to proceed:',\n ' Show the exact setup command:',\n ' t2000_auto_invest action: \"setup\", amount: X, frequency: \"weekly\", strategy: \"name\"',\n ' Preview first, then confirm.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n // ---------------------------------------------------------------------------\n // Operational prompts — specific workflows\n // ---------------------------------------------------------------------------\n\n server.prompt(\n 'claim-rewards',\n 'Check for pending protocol rewards across all lending positions and claim them — auto-converts to USDC.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a rewards management assistant for a t2000 AI agent bank account.',\n '',\n 'Help the user collect their pending protocol rewards. Follow this flow:',\n '',\n 'Step 1 — Check what\\'s claimable:',\n ' - Check lending positions (t2000_positions)',\n ' - Positions with \"+rewards\" tags have claimable protocol rewards',\n ' - These are incentive tokens (like vSUI, sSUI, DEEP) earned from lending protocols',\n '',\n 'Step 2 — Present findings:',\n ' If rewards are available:',\n ' Show which positions have rewards and from which protocols (NAVI, Suilend)',\n ' Explain: \"These are protocol incentive tokens that accrue on your lending positions\"',\n ' Ask: \"Want me to claim and convert them to USDC?\"',\n '',\n ' If no rewards are claimable:',\n ' Tell the user their rewards are still accruing and to check back later',\n ' Show their current positions and APY so they know yield is being earned',\n '',\n 'Step 3 — Execute claim:',\n ' Run t2000_claim_rewards',\n ' This claims from ALL protocols at once and auto-converts reward tokens to USDC',\n ' Show the result: USDC received, source protocols, transaction link',\n ' If received amount is small (< $0.01), explain that rewards accrue continuously and larger amounts build up over time',\n '',\n 'Step 4 — Follow-up:',\n ' Show updated balance after claiming',\n ' Mention when to claim next (rewards accrue continuously, claiming weekly or monthly is typical)',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'safeguards',\n 'Review account safety settings — per-transaction limits, daily caps, emergency lock, PIN-protected operations.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a security advisor for a t2000 AI agent bank account.',\n '',\n 'Help the user review and manage their account safeguards.',\n '',\n 'Step 1 — Show current settings:',\n ' - Get safeguard config (t2000_config action: \"show\")',\n ' - Show: per-transaction limit, daily send limit, daily spent today, lock status',\n '',\n 'Step 2 — Explain each safeguard:',\n '',\n ' 🛡️ SAFEGUARDS',\n ' ─────────────',\n '',\n ' Per-transaction limit: $X',\n ' Every send is checked against this cap. Prevents large unauthorized transfers.',\n '',\n ' Daily send limit: $X',\n ' Cumulative cap across all sends in a 24-hour window.',\n ' Used today: $X of $X',\n '',\n ' Emergency lock:',\n ' Status: Unlocked / Locked',\n ' When locked: ALL operations are frozen — sends, saves, investments, borrows',\n ' Lock via: t2000_lock (any AI agent can lock)',\n ' Unlock via: CLI only with PIN — no AI can unlock, by design',\n '',\n ' PIN-protected operations:',\n ' - Unlocking the agent',\n ' - Exporting the private key',\n ' - Modifying safeguard limits',\n '',\n 'Step 3 — Recommendations:',\n ' Based on their balance and activity, suggest appropriate limits',\n ' If they have large balances, recommend tighter per-tx limits',\n ' If they want to adjust: t2000_config action: \"set\", key: \"maxPerTx\" or \"maxDailyUsd\", value: X',\n ' Always confirm before changing limits',\n '',\n 'Step 4 — Emergency actions:',\n ' If the user wants to lock: run t2000_lock immediately (no confirmation needed for locking)',\n ' Explain that unlocking requires the CLI: t2000 unlock (with PIN)',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'quick-exchange',\n 'Guided token swap — preview rate, slippage, and price impact before executing.',\n {\n from: z.string().optional().describe('Asset to sell (e.g. USDC, SUI)'),\n to: z.string().optional().describe('Asset to buy (e.g. SUI, USDC)'),\n amount: z.number().optional().describe('Amount in source asset units'),\n },\n async ({ from, to, amount }) => {\n const context = [\n from ? `From: ${from}` : '',\n to ? `To: ${to}` : '',\n amount ? `Amount: ${amount}` : '',\n ].filter(Boolean).join('\\n');\n\n return {\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are an exchange assistant for a t2000 AI agent bank account.',\n '',\n context ? `Context:\\n${context}\\n` : '',\n 'Help the user swap tokens. Follow this flow:',\n '',\n 'Step 1 — Gather details:',\n ' If from, to, or amount is missing, ask the user',\n ' Check balance (t2000_balance) to confirm they have enough',\n ' Available pairs: any combination of USDC, SUI, BTC, ETH, GOLD, USDT, USDe, USDsui',\n '',\n 'Step 2 — Preview the swap:',\n ' Run t2000_exchange with dryRun: true',\n ' Show:',\n ' Input: X FROM → Expected output: Y TO',\n ' Rate: 1 FROM = Z TO',\n ' Price impact: X%',\n ' Slippage: X%',\n ' Fee: $X',\n '',\n 'Step 3 — Ask for confirmation:',\n ' \"Ready to execute this swap?\"',\n ' If price impact > 1%, warn the user about the impact',\n '',\n 'Step 4 — Execute:',\n ' Run t2000_exchange with dryRun: false',\n ' Show: amount received, rate, transaction link',\n ' Show updated balance',\n ].join('\\n'),\n },\n }],\n };\n },\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createAgent } from './unlock.js';\nimport { registerReadTools } from './tools/read.js';\nimport { registerWriteTools } from './tools/write.js';\nimport { registerSafetyTools } from './tools/safety.js';\nimport { registerPrompts } from './prompts.js';\n\nexport async function startMcpServer(opts?: { keyPath?: string }): Promise<void> {\n const agent = await createAgent(opts?.keyPath);\n\n if (!agent.enforcer.isConfigured()) {\n console.error(\n 'Safeguards not configured. Set limits before starting MCP:\\n' +\n ' t2000 config set maxPerTx 100\\n' +\n ' t2000 config set maxDailySend 500\\n',\n );\n process.exit(1);\n }\n\n const server = new McpServer({ name: 't2000', version: '0.20.1' });\n\n registerReadTools(server, agent);\n registerWriteTools(server, agent);\n registerSafetyTools(server, agent);\n registerPrompts(server);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","#!/usr/bin/env node\nimport { startMcpServer } from './index.js';\n\nawait startMcpServer();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/unlock.ts","../src/errors.ts","../src/tools/read.ts","../src/mutex.ts","../src/tools/write.ts","../src/tools/safety.ts","../src/prompts.ts","../src/index.ts","../src/bin.ts"],"names":["z"],"mappings":";;;;;;;;;AAKA,IAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,EAAQ,EAAG,UAAU,UAAU,CAAA;AAE5D,eAAe,UAAA,GAA8B;AAC3C,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,SAAA,IAAa,QAAQ,GAAA,CAAI,gBAAA;AACpD,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,YAAA,EAAc,OAAO,CAAA;AACpD,IAAA,IAAI,OAAA,CAAQ,IAAA,EAAK,EAAG,OAAO,QAAQ,IAAA,EAAK;AAAA,EAC1C,CAAA,CAAA,MAAQ;AAAA,EAAmB;AAE3B,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GAGF;AACF;AAEA,eAAsB,YAAY,OAAA,EAAkC;AAClE,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,EAAW;AAC7B,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,EAAE,GAAA,EAAK,SAAS,CAAA;AACtC;ACjBO,SAAS,SAAS,GAAA,EAA4B;AACnD,EAAA,IAAI,eAAe,cAAA,EAAgB;AACjC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,mBAAA;AAAA,MACN,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,SAAA,EAAW,KAAA;AAAA,MACX,SAAS,EAAE,IAAA,EAAM,IAAI,IAAA,EAAM,GAAG,IAAI,OAAA;AAAQ,KAC5C;AAAA,EACF;AAEA,EAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,IAAA,OAAO;AAAA,MACL,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,WAAW,GAAA,CAAI;AAAA,KACjB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAAA,IACxD,SAAA,EAAW;AAAA,GACb;AACF;AAEO,SAAS,YAAY,GAAA,EAAc;AACxC,EAAA,MAAM,MAAA,GAAS,SAAS,GAAG,CAAA;AAC3B,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA;AAAA,IACjE,OAAA,EAAS;AAAA,GACX;AACF;;;ACnCO,SAAS,iBAAA,CAAkB,QAAmB,KAAA,EAAoB;AAMvE,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,gBAAA;AAAA,IACA,4XAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,CAAC,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,UAAA,EAAY,cAAc,CAAA,GAChF,MAAM,OAAA,CAAQ,UAAA,CAAW;AAAA,UACvB,MAAM,OAAA,EAAQ;AAAA,UACd,MAAM,SAAA,EAAU;AAAA,UAChB,MAAM,YAAA,EAAa;AAAA,UACnB,MAAM,YAAA,EAAa;AAAA,UACnB,MAAM,QAAA,EAAS;AAAA,UACf,MAAM,UAAA,EAAW;AAAA,UACjB,MAAM,iBAAA;AAAkB,SACzB,CAAA;AAEH,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,OAAA,CAAQ,MAAA,KAAW,WAAA,GAAc,QAAQ,KAAA,GAAQ,IAAA;AAAA,UAC1D,SAAA,EAAW,SAAA,CAAU,MAAA,KAAW,WAAA,GAAc,UAAU,KAAA,GAAQ,IAAA;AAAA,UAChE,SAAA,EAAW,SAAA,CAAU,MAAA,KAAW,WAAA,GAAc;AAAA,YAC5C,GAAG,SAAA,CAAU,KAAA;AAAA,YACb,SAAA,EAAW,SAAA,CAAU,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA,CAAA,MAAM;AAAA,cAC7C,GAAG,CAAA;AAAA,cACH,GAAI,CAAA,CAAE,YAAA,KAAiB,CAAA,IAAK,CAAA,CAAE,WAAA,GAAc,CAAA,GAAI,EAAE,IAAA,EAAM,mBAAA,EAAoB,GAAI;AAAC,aACnF,CAAE;AAAA,WACJ,GAAI,IAAA;AAAA,UACJ,MAAA,EAAQ,MAAA,CAAO,MAAA,KAAW,WAAA,GAAc,OAAO,KAAA,GAAQ,IAAA;AAAA,UACvD,QAAA,EAAU,QAAA,CAAS,MAAA,KAAW,WAAA,GAAc,SAAS,KAAA,GAAQ,IAAA;AAAA,UAC7D,UAAA,EAAY,UAAA,CAAW,MAAA,KAAW,WAAA,GAAc,WAAW,KAAA,GAAQ,IAAA;AAAA,UACnE,cAAA,EAAgB,cAAA,CAAe,MAAA,KAAW,WAAA,GAAc,eAAe,KAAA,GAAQ;AAAA,SACjF;AAEA,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAMA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,eAAA;AAAA,IACA,6LAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,EAAQ;AACnC,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,eAAA;AAAA,IACA,yDAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,OAAA,EAAQ;AAC9B,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA,EAAE;AAAA,MAC1E,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,iBAAA;AAAA,IACA,6JAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,SAAA,EAAU;AACrC,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,aAAA;AAAA,IACA,4MAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,KAAA,EAAM;AACjC,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,cAAA;AAAA,IACA,kLAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,YAAA,EAAa;AACxC,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,eAAA;AAAA,IACA,qHAAA;AAAA,IACA,EAAE,OAAO,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAA,CAAS,gDAAgD,CAAA,EAAE;AAAA,IAC1F,OAAO,EAAE,KAAA,EAAM,KAAM;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,KAAA,CAAM,OAAA,CAAQ,EAAE,OAAO,CAAA;AAC5C,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,gBAAA;AAAA,IACA,sJAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,QAAA,EAAS;AACpC,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,mBAAA;AAAA,IACA,2JAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,UAAA,EAAW;AACtC,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,uBAAA;AAAA,IACA,qMAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,iBAAA,EAAkB;AAC7C,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,QAAQ,KAAA,EAAO,MAAA,CAAO,QAAQ,CAAA,EAAG,CAAA,EAAE;AAAA,MACxG,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,oBAAA;AAAA,IACA,kJAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,OAAA,EAAQ;AACnC,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,iBAAA;AAAA,IACA,sMAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,oBAAA,EAAqB;AAChD,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAMA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,qBAAA;AAAA,IACA,gKAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,YAAA,EAAa;AAC3C,QAAA,MAAM,YAAA,GAAe,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,UACvC,GAAG,CAAA;AAAA,UACH,SAAA,EAAW,CAAA,CAAE,SAAA,CAAU,QAAA,EAAS;AAAA,UAChC,YAAA,EAAc,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA,GAAI,GAAA;AAAA,UACpC,SAAA,EAAW,CAAA,CAAE,SAAA,CAAU,QAAA,EAAS;AAAA,UAChC,YAAA,EAAc,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA,GAAI;AAAA,SACtC,CAAE,CAAA;AACF,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,YAAY,CAAA,EAAG,CAAA,EAAE;AAAA,MAC3E,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,qBAAA;AAAA,IACA,qKAAA;AAAA,IACA,EAAE,EAAA,EAAI,CAAA,CAAE,QAAO,CAAE,QAAA,CAAS,gCAAgC,CAAA,EAAE;AAAA,IAC5D,OAAO,EAAE,EAAA,EAAG,KAAM;AAChB,MAAA,IAAI;AACF,QAAA,MAAM,CAAA,GAAI,MAAM,KAAA,CAAM,YAAA,CAAa,EAAE,CAAA;AACrC,QAAA,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACtD,GAAG,CAAA;AAAA,UACH,SAAA,EAAW,CAAA,CAAE,SAAA,CAAU,QAAA,EAAS;AAAA,UAChC,YAAA,EAAc,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA,GAAI,GAAA;AAAA,UACpC,SAAA,EAAW,CAAA,CAAE,SAAA,CAAU,QAAA,EAAS;AAAA,UAChC,YAAA,EAAc,MAAA,CAAO,CAAA,CAAE,SAAS,CAAA,GAAI;AAAA,SACrC,CAAA,EAAG,CAAA,EAAE;AAAA,MACR,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAMA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,gBAAA;AAAA,IACA,6JAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,IAAA,EAAK;AACrC,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,CAAA,EAAG,CAAA,EAAE;AAAA,MAC3E,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,iBAAA;AAAA,IACA,iLAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,YAAA,EAAa;AACxC,QAAA,MAAM,QAAA,GAAW;AAAA,UACf,GAAG,MAAA;AAAA,UACH,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,YACpC,GAAG,CAAA;AAAA,YACH,GAAI,CAAA,CAAE,YAAA,KAAiB,CAAA,IAAK,CAAA,CAAE,WAAA,GAAc,CAAA,GAAI,EAAE,IAAA,EAAM,mBAAA,EAAoB,GAAI;AAAC,WACnF,CAAE;AAAA,SACJ;AACA,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG,CAAA,EAAE;AAAA,MACvE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AACF;;;ACpSO,IAAM,UAAN,MAAc;AAAA,EACX,KAAA,GAAuB,QAAQ,OAAA,EAAQ;AAAA,EAE/C,MAAM,IAAO,EAAA,EAAkC;AAC7C,IAAA,IAAI,OAAA;AACJ,IAAA,MAAM,IAAA,GAAO,IAAI,OAAA,CAAc,CAAA,CAAA,KAAK;AAAE,MAAA,OAAA,GAAU,CAAA;AAAA,IAAG,CAAC,CAAA;AACpD,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,MAAM,IAAA;AACN,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,OAAA,EAAS;AAAA,IACX;AAAA,EACF;AACF,CAAA;;;ACPO,SAAS,kBAAA,CAAmB,QAAmB,KAAA,EAAoB;AACxE,EAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,EAAQ;AAE1B,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,YAAA;AAAA,IACA,iLAAA;AAAA,IACA;AAAA,MACE,EAAA,EAAIA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,4DAA4D,CAAA;AAAA,MACpF,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2BAA2B,CAAA;AAAA,MACvD,OAAOA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,+BAA+B,CAAA;AAAA,MACrE,QAAQA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,0CAA0C;AAAA,KACpF;AAAA,IACA,OAAO,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,QAAO,KAAM;AACvC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,EAAE,CAAA;AAE1C,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,KAAA,CAAM,SAAS,KAAA,CAAM,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAQ,CAAA;AAClD,UAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,OAAA,EAAQ;AACpC,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,SAAA,EAAU;AAExC,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACnB,OAAA,EAAS,IAAA;AAAA,gBACT,OAAA,EAAS,QAAQ,SAAA,IAAa,MAAA;AAAA,gBAC9B,MAAA;AAAA,gBACA,IAAI,QAAA,CAAS,OAAA;AAAA,gBACb,aAAa,QAAA,CAAS,WAAA;AAAA,gBACtB,OAAO,KAAA,IAAS,MAAA;AAAA,gBAChB,gBAAgB,OAAA,CAAQ,SAAA;AAAA,gBACxB,YAAA,EAAc,QAAQ,SAAA,GAAY,MAAA;AAAA,gBAClC,UAAA,EAAY;AAAA,kBACV,cAAA,EAAgB,OAAO,SAAA,GAAY,MAAA;AAAA,kBACnC,YAAY,MAAA,CAAO;AAAA;AACrB,eACD;AAAA,aACF;AAAA,WACH;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,KAAA,CAAM,IAAA,CAAK,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,CAAC,CAAA;AACtE,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,YAAA;AAAA,IACA,uIAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAM,CAACA,EAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA,CAAE,SAAS,iCAAiC,CAAA;AAAA,MAC1F,QAAQA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,0CAA0C;AAAA,KACpF;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAO,KAAM;AAC5B,MAAA,IAAI;AACF,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,KAAA,CAAM,SAAS,eAAA,EAAgB;AAC/B,UAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,OAAA,EAAQ;AACpC,UAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,KAAA,EAAM;AAChC,UAAA,MAAM,UAAA,GAAa,MAAA,KAAW,KAAA,GAAQ,OAAA,CAAQ,YAAY,CAAA,GAAM,MAAA;AAEhE,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACnB,OAAA,EAAS,IAAA;AAAA,gBACT,MAAA,EAAQ,UAAA;AAAA,gBACR,UAAA,EAAY,KAAA,CAAM,IAAA,EAAM,OAAA,IAAW,CAAA;AAAA,gBACnC,mBAAA,EAAqB,QAAQ,OAAA,GAAU;AAAA,eACxC;AAAA,aACF;AAAA,WACH;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAC,CAAA;AAC3D,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,gBAAA;AAAA,IACA,8HAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAM,CAACA,EAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA,CAAE,SAAS,qCAAqC,CAAA;AAAA,MAC9F,QAAQA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,0CAA0C;AAAA,KACpF;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAO,KAAM;AAC5B,MAAA,IAAI;AACF,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,KAAA,CAAM,SAAS,eAAA,EAAgB;AAC/B,UAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,SAAA,EAAU;AACxC,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,YAAA,EAAa;AACxC,UAAA,MAAM,UAAU,SAAA,CAAU,SAAA,CACvB,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,MAAM,CAAA,CAC7B,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,QAAQ,CAAC,CAAA;AAEvC,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACnB,OAAA,EAAS,IAAA;AAAA,gBACT,MAAA,EAAQ,MAAA,KAAW,KAAA,GAAQ,OAAA,GAAU,MAAA;AAAA,gBACrC,cAAA,EAAgB,OAAA;AAAA,gBAChB,qBAAqB,MAAA,CAAO;AAAA,eAC7B;AAAA,aACF;AAAA,WACH;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,MAAM,QAAA,CAAS,EAAE,MAAA,EAAQ,CAAC,CAAA;AAC/D,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,cAAA;AAAA,IACA,0JAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yBAAyB,CAAA;AAAA,MACrD,QAAQA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,0CAA0C;AAAA,KACpF;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAO,KAAM;AAC5B,MAAA,IAAI;AACF,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,KAAA,CAAM,SAAS,eAAA,EAAgB;AAC/B,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,YAAA,EAAa;AACxC,UAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,SAAA,EAAU;AAExC,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACnB,OAAA,EAAS,IAAA;AAAA,gBACT,MAAA;AAAA,gBACA,WAAW,SAAA,CAAU,SAAA;AAAA,gBACrB,qBAAqB,MAAA,CAAO,YAAA;AAAA,gBAC5B,4BAA4B,SAAA,CAAU;AAAA,eACvC;AAAA,aACF;AAAA,WACH;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,MAAM,MAAA,CAAO,EAAE,MAAA,EAAQ,CAAC,CAAA;AAC7D,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,aAAA;AAAA,IACA,yGAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAM,CAACA,EAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA,CAAE,SAAS,kCAAkC,CAAA;AAAA,MAC3F,QAAQA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,0CAA0C;AAAA,KACpF;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAO,KAAM;AAC5B,MAAA,IAAI;AACF,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,KAAA,CAAM,SAAS,eAAA,EAAgB;AAC/B,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,YAAA,EAAa;AACxC,UAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,SAAA,EAAU;AACxC,UAAA,MAAM,YAAY,SAAA,CAAU,SAAA,CACzB,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,QAAQ,CAAA,CAC/B,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,QAAQ,CAAC,CAAA;AAEvC,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACnB,OAAA,EAAS,IAAA;AAAA,gBACT,MAAA,EAAQ,MAAA,KAAW,KAAA,GAAQ,SAAA,GAAY,MAAA;AAAA,gBACvC,WAAA,EAAa,SAAA;AAAA,gBACb,qBAAqB,MAAA,CAAO;AAAA,eAC7B;AAAA,aACF;AAAA,WACH;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,MAAM,KAAA,CAAM,EAAE,MAAA,EAAQ,CAAC,CAAA;AAC5D,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,gBAAA;AAAA,IACA,gJAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wCAAwC,CAAA;AAAA,MACpE,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+BAA+B,CAAA;AAAA,MACzD,EAAA,EAAIA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+BAA+B,CAAA;AAAA,MACvD,aAAaA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,uCAAuC,CAAA;AAAA,MACnF,QAAQA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,0CAA0C;AAAA,KACpF;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,MAAM,EAAA,EAAI,WAAA,EAAa,QAAO,KAAM;AACnD,MAAA,IAAI;AACF,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,KAAA,CAAM,SAAS,eAAA,EAAgB;AAC/B,UAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,aAAA,CAAc,EAAE,IAAA,EAAM,EAAA,EAAI,QAAQ,CAAA;AAE5D,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACnB,OAAA,EAAS,IAAA;AAAA,gBACT,IAAA;AAAA,gBACA,EAAA;AAAA,gBACA,MAAA;AAAA,gBACA,gBAAgB,KAAA,CAAM,cAAA;AAAA,gBACtB,aAAa,KAAA,CAAM,WAAA;AAAA,gBACnB,GAAA,EAAK,MAAM,GAAA,CAAI;AAAA,eAChB;AAAA,aACF;AAAA,WACH;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA;AAAA,UAAI,MAC7B,MAAM,QAAA,CAAS,EAAE,MAAM,EAAA,EAAI,MAAA,EAAQ,aAAa;AAAA,SAClD;AACA,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAA;AAClD,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,cAAA;AAAA,IACA,wPAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQA,CAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAC,CAAA,CAAE,QAAA,CAAS,mHAAmH,CAAA;AAAA,MAC9K,OAAOA,CAAAA,CAAE,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,oBAAoB,CAAA;AAAA,MACzD,QAAQA,CAAAA,CAAE,KAAA,CAAM,CAACA,CAAAA,CAAE,QAAO,EAAGA,CAAAA,CAAE,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,6DAA6D,CAAA;AAAA,MACjI,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,sDAAsD,CAAA;AAAA,MAC/F,QAAQA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,0CAA0C;AAAA,KACpF;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,OAAO,MAAA,EAAQ,QAAA,EAAU,QAAO,KAAM;AACrD,MAAA,IAAI;AACF,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,KAAA,CAAM,SAAS,eAAA,EAAgB;AAC/B,UAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,OAAA,EAAQ;AACpC,UAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,YAAA,EAAa;AAC3C,UAAA,MAAM,WAAW,SAAA,CAAU,SAAA,CAAU,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,KAAK,CAAA;AAEhE,UAAA,IAAI,MAAA,KAAW,MAAA,IAAU,MAAA,KAAW,KAAA,IAAS,CAAC,QAAA,EAAU;AACtD,YAAA,OAAO;AAAA,cACL,SAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,MAAM,KAAA,EAAO,CAAA,GAAA,EAAM,KAAK,CAAA,iBAAA,CAAA,EAAqB,GAAG;AAAA,aAC5G;AAAA,UACF;AAEA,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACnB,OAAA,EAAS,IAAA;AAAA,gBACT,MAAA;AAAA,gBACA,KAAA;AAAA,gBACA,MAAA,EAAQ,WAAW,KAAA,GAAQ,QAAA,EAAU,gBAAgB,CAAA,GAAI,MAAA,IAAU,UAAU,WAAA,IAAe,CAAA;AAAA,gBAC5F,gBAAgB,OAAA,CAAQ,SAAA;AAAA,gBACxB,iBAAiB,QAAA,IAAY,IAAA;AAAA,gBAC7B,OAAA,EAAS,UAAU,OAAA,IAAW,KAAA;AAAA,gBAC9B,eAAA,EAAiB,UAAU,eAAA,IAAmB,IAAA;AAAA,gBAC9C,UAAA,EAAY,UAAU,UAAA,IAAc;AAAA,eACrC;AAAA,aACF;AAAA,WACH;AAAA,QACF;AAEA,QAAA,MAAM,WAAA,GAAc,QAAA,GAAW,QAAA,GAAW,GAAA,GAAM,KAAA,CAAA;AAChD,QAAA,IAAI,WAAW,KAAA,EAAO;AACpB,UAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAC7E,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,KAAA,CAAM,SAAA,CAAU,EAAE,KAAA,EAAiC,SAAA,EAAW,MAAA,EAAQ,WAAA,EAAa,CAAC,CAAA;AACzH,UAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,QACrE,CAAA,MAAA,IAAW,WAAW,MAAA,EAAQ;AAC5B,UAAA,MAAM,SAAA,GAAY,MAAA,KAAW,KAAA,GAAQ,KAAA,GAAiB,MAAA;AACtD,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,KAAA,CAAM,UAAA,CAAW,EAAE,KAAA,EAAiC,SAAA,EAAW,WAAA,EAAa,CAAC,CAAA;AAClH,UAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,QACrE,CAAA,MAAA,IAAW,WAAW,MAAA,EAAQ;AAC5B,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,MAAM,UAAA,CAAW,EAAE,KAAA,EAAiC,CAAC,CAAA;AAC1F,UAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,QACrE,CAAA,MAAO;AACL,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,MAAM,YAAA,CAAa,EAAE,KAAA,EAAiC,CAAC,CAAA;AAC5F,UAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,QACrE;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,wBAAA;AAAA,IACA,iJAAA;AAAA,IACA;AAAA,MACE,QAAQA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,kDAAkD,CAAA;AAAA,MAC1F,cAAcA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yDAAyD;AAAA,KACxG;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,YAAA,EAAa,KAAM;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,KAAA,CAAM,eAAA,CAAgB,EAAE,MAAA,EAAQ,YAAA,EAAc,CAAC,CAAA;AACpF,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,gBAAA;AAAA,IACA,qKAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQA,CAAAA,CAAE,IAAA,CAAK,CAAC,QAAQ,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,WAAA,EAAa,QAAA,EAAU,QAAQ,CAAC,CAAA,CAAE,SAAS,4BAA4B,CAAA;AAAA,MACxH,MAAMA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,wDAAwD,CAAA;AAAA,MAC7F,QAAQA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iCAAiC,CAAA;AAAA,MACxE,WAAA,EAAaA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,0EAA0E,CAAA;AAAA,MAChI,aAAaA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qCAAqC,CAAA;AAAA,MACjF,QAAQA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,qCAAqC;AAAA,KAC/E;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,QAAQ,WAAA,EAAa,WAAA,EAAa,QAAO,KAAM;AACpE,MAAA,IAAI;AACF,QAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,UAAA,CAAW,MAAA,EAAO;AACpC,UAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,EAAG,CAAA,EAAE;AAAA,QAClE;AAEA,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,2BAAA,EAA6B,CAAA,EAAG,CAAA,EAAE;AAAA,QACrG;AAEA,QAAA,QAAQ,MAAA;AAAQ,UACd,KAAK,KAAA,EAAO;AACV,YAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,cAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,4BAAA,EAA8B,CAAA,EAAG,CAAA,EAAE;AAAA,YACtG;AACA,YAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,KAAA,CAAM,cAAA,CAAe,EAAE,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,MAAA,EAAQ,CAAC,CAAA;AACxG,YAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,UACrE;AAAA,UACA,KAAK,MAAA,EAAQ;AACX,YAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,KAAA,CAAM,YAAA,CAAa,EAAE,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AAC3E,YAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,UACrE;AAAA,UACA,KAAK,QAAA,EAAU;AACb,YAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,iBAAA,CAAkB,IAAI,CAAA;AACjD,YAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,UACrE;AAAA,UACA,KAAK,WAAA,EAAa;AAChB,YAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,KAAA,CAAM,iBAAA,CAAkB,EAAE,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA;AAChF,YAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,UACrE;AAAA,UACA,KAAK,QAAA,EAAU;AACb,YAAA,IAAI,CAAC,WAAA,EAAa;AAChB,cAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,iCAAA,EAAmC,CAAA,EAAG,CAAA,EAAE;AAAA,YAC3G;AACA,YAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,MAAA,CAAO,EAAE,IAAA,EAAM,WAAA,EAAa,aAAa,CAAA;AACtE,YAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,EAAG,CAAA,EAAE;AAAA,UAClE;AAAA,UACA,KAAK,QAAA,EAAU;AACb,YAAA,KAAA,CAAM,UAAA,CAAW,OAAO,IAAI,CAAA;AAC5B,YAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA,EAAG,CAAA,EAAE;AAAA,UAChF;AAAA,UACA;AACE,YAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO,CAAA,gBAAA,EAAmB,MAAM,IAAI,CAAA,EAAG,CAAA,EAAE;AAAA;AACvG,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,mBAAA;AAAA,IACA,wIAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQA,CAAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,MAAM,CAAC,CAAA,CAAE,QAAA,CAAS,oBAAoB,CAAA;AAAA,MAChF,QAAQA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,uCAAuC,CAAA;AAAA,MAC9E,SAAA,EAAWA,CAAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,QAAA,EAAU,SAAS,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,kCAAkC,CAAA;AAAA,MACxG,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,6BAA6B,CAAA;AAAA,MACtE,OAAOA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qDAAqD,CAAA;AAAA,MAC3F,YAAYA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,0BAA0B;AAAA,KACvE;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,WAAW,QAAA,EAAU,KAAA,EAAO,YAAW,KAAM;AACpE,MAAA,IAAI;AACF,QAAA,QAAQ,MAAA;AAAQ,UACd,KAAK,OAAA,EAAS;AACZ,YAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW;AACzB,cAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,yCAAA,EAA2C,CAAA,EAAG,CAAA,EAAE;AAAA,YACnH;AACA,YAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,EAAE,QAAQ,SAAA,EAAW,QAAA,EAAU,OAAO,CAAA;AAC7E,YAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,EAAG,CAAA,EAAE;AAAA,UACvE;AAAA,UACA,KAAK,QAAA,EAAU;AACb,YAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,EAAoB;AACzC,YAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,UACrE;AAAA,UACA,KAAK,KAAA,EAAO;AACV,YAAA,MAAM,SAAS,MAAM,KAAA,CAAM,IAAI,MAAM,KAAA,CAAM,eAAe,CAAA;AAC1D,YAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,UACrE;AAAA,UACA,KAAK,MAAA,EAAQ;AACX,YAAA,IAAI,CAAC,UAAA,EAAY;AACf,cAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,+BAAA,EAAiC,CAAA,EAAG,CAAA,EAAE;AAAA,YACzG;AACA,YAAA,KAAA,CAAM,eAAe,UAAU,CAAA;AAC/B,YAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,UAAA,EAAY,CAAA,EAAG,CAAA,EAAE;AAAA,UACtF;AAAA,UACA;AACE,YAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO,CAAA,gBAAA,EAAmB,MAAM,IAAI,CAAA,EAAG,CAAA,EAAE;AAAA;AACvG,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,iBAAA;AAAA,IACA,kLAAA;AAAA,IACA;AAAA,MACE,QAAQA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,2CAA2C,CAAA;AAAA,MACnF,cAAcA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iDAAiD,CAAA;AAAA,MAC9F,cAAcA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mCAAmC;AAAA,KAClF;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,cAAa,KAAM;AAChD,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA;AAAA,UAAI,MAC7B,MAAM,SAAA,CAAU;AAAA,YACd,QAAQ,MAAA,IAAU,IAAA;AAAA,YAClB,YAAA;AAAA,YACA;AAAA,WACD;AAAA,SACH;AACA,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,qBAAA;AAAA,IACA,iFAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,KAAA,CAAM,IAAI,MAAM,KAAA,CAAM,cAAc,CAAA;AACzD,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAMA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,uBAAA;AAAA,IACA,sKAAA;AAAA,IACA;AAAA,MACE,EAAA,EAAIA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0CAA0C,CAAA;AAAA,MAClE,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qFAAgF,CAAA;AAAA,MAC5G,KAAKA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,6DAA8D;AAAA,KACpG;AAAA,IACA,OAAO,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAI,KAAM;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,IAAA,CAAK,MAAM,GAAA,GAAM,GAAG,CAAC,CAAA,GAAI,KAAA,CAAA;AACtD,QAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,MAAM,cAAA,CAAe,EAAA,EAAI,MAAA,EAAQ,OAAO,CAAC,CAAA;AAC9E,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACrE,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAMA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,mBAAA;AAAA,IACA,+KAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oCAAoC,CAAA;AAAA,MAC9D,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,4BAA4B;AAAA,KAC3D;AAAA,IACA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAQ,KAAM;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,MAAM,OAAO,CAAA;AAC/C,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,IAAA,EAAM,MAAM,OAAA,EAAS,GAAG,QAAQ,CAAA,EAAG,CAAA,EAAE;AAAA,MAC1G,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,sBAAA;AAAA,IACA,iCAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wBAAwB;AAAA,KACpD;AAAA,IACA,OAAO,EAAE,IAAA,EAAK,KAAM;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAC1C,QAAA,OAAO,EAAE,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,SAAS,OAAA,EAAS,IAAA,EAAM,CAAA,EAAG,CAAA,EAAE;AAAA,MACzF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AACF;ACjhBO,SAAS,mBAAA,CAAoB,QAAmB,KAAA,EAAoB;AACzE,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,cAAA;AAAA,IACA,uLAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQA,EAAE,IAAA,CAAK,CAAC,QAAQ,KAAK,CAAC,CAAA,CAAE,QAAA,CAAS,wDAAwD,CAAA;AAAA,MACjG,KAAKA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iDAAiD,CAAA;AAAA,MACrF,OAAOA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,sCAAsC;AAAA,KAC9E;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,GAAA,EAAK,OAAM,KAAM;AAChC,MAAA,IAAI;AACF,QAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,SAAA,EAAU;AACxC,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,gBACf,UAAU,MAAA,CAAO,QAAA;AAAA,gBACjB,cAAc,MAAA,CAAO,YAAA;AAAA,gBACrB,WAAW,MAAA,CAAO;AAAA,eACnB;AAAA,aACF;AAAA,WACH;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,GAAA,IAAO,KAAA,KAAU,KAAA,CAAA,EAAW;AAC/B,UAAA,OAAO,WAAA,CAAY,IAAI,KAAA,CAAM,sDAAsD,CAAC,CAAA;AAAA,QACtF;AAEA,QAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,UAAA,OAAO,WAAA,CAAY,IAAI,KAAA,CAAM,sEAAsE,CAAC,CAAA;AAAA,QACtG;AAEA,QAAA,IAAI,GAAA,KAAQ,UAAA,IAAc,GAAA,KAAQ,cAAA,EAAgB;AAChD,UAAA,OAAO,YAAY,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,GAAG,2CAA2C,CAAC,CAAA;AAAA,QAC9F;AAEA,QAAA,IAAI,QAAQ,CAAA,EAAG;AACb,UAAA,OAAO,WAAA,CAAY,IAAI,KAAA,CAAM,qCAAqC,CAAC,CAAA;AAAA,QACrE;AAEA,QAAA,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAC7B,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,SAAS,IAAA,EAAM,GAAA,EAAK,OAAO;AAAA,WACnD;AAAA,SACH;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,YAAA;AAAA,IACA,qIAAA;AAAA,IACA,EAAC;AAAA,IACD,YAAY;AACV,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,SAAS,IAAA,EAAK;AACpB,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACnB,MAAA,EAAQ,IAAA;AAAA,cACR,OAAA,EAAS;AAAA,aACV;AAAA,WACF;AAAA,SACH;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,YAAY,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,GACF;AACF;AC9EO,SAAS,gBAAgB,MAAA,EAAyB;AACvD,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,kBAAA;AAAA,IACA,iIAAA;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,yEAAA;AAAA,YACA,EAAA;AAAA,YACA,gKAAA;AAAA,YACA,6DAAA;AAAA,YACA,EAAA;AAAA,YACA,2CAAA;AAAA,YACA,EAAA;AAAA,YACA,4BAAA;AAAA,YACA,oHAAA;AAAA,YACA,EAAA;AAAA,YACA,oBAAA;AAAA,YACA,wDAAA;AAAA,YACA,aAAA;AAAA,YACA,EAAA;AAAA,YACA,qBAAA;AAAA,YACA,uDAAA;AAAA,YACA,2EAAA;AAAA,YACA,EAAA;AAAA,YACA,iBAAA;AAAA,YACA,iDAAA;AAAA,YACA,sCAAA;AAAA,YACA,EAAA;AAAA,YACA,sBAAA;AAAA,YACA,wBAAA;AAAA,YACA,0BAAA;AAAA,YACA,EAAA;AAAA,YACA,mCAAA;AAAA,YACA,kCAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,gBAAA;AAAA,IACA,uHAAA;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,kFAAA;AAAA,YACA,EAAA;AAAA,YACA,0CAAA;AAAA,YACA,uFAAA;AAAA,YACA,8DAAA;AAAA,YACA,yEAAA;AAAA,YACA,EAAA;AAAA,YACA,sCAAA;AAAA,YACA,EAAA;AAAA,YACA,0BAAA;AAAA,YACA,wGAAA;AAAA,YACA,EAAA;AAAA,YACA,mDAAA;AAAA,YACA,mDAAA;AAAA,YACA,qBAAA;AAAA,YACA,qBAAA;AAAA,YACA,EAAA;AAAA,YACA,yEAAA;AAAA,YACA,CAAA,wDAAA,CAAA;AAAA,YACA,EAAA;AAAA,YACA,aAAA;AAAA,YACA,qDAAA;AAAA,YACA,oEAAA;AAAA,YACA,8DAAA;AAAA,YACA,EAAA;AAAA,YACA,gEAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,YAAA;AAAA,IACA,iHAAA;AAAA,IACA;AAAA,MACE,IAAIA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,uBAAuB,CAAA;AAAA,MAC1D,QAAQA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mBAAmB;AAAA,KAC5D;AAAA,IACA,OAAO,EAAE,EAAA,EAAI,MAAA,EAAO,KAAM;AACxB,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,EAAA,GAAK,CAAA,mBAAA,EAAsB,EAAE,CAAA,CAAA,GAAK,EAAA;AAAA,QAClC,MAAA,GAAS,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA,GAAK;AAAA,OAClC,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAE3B,MAAA,OAAO;AAAA,QACL,UAAU,CAAC;AAAA,UACT,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA,cACJ,gEAAA;AAAA,cACA,EAAA;AAAA,cACA,OAAA,GAAU,CAAA;AAAA,EAAa,OAAO;AAAA,CAAA,GAAO,EAAA;AAAA,cACrC,iDAAA;AAAA,cACA,kDAAA;AAAA,cACA,2DAAA;AAAA,cACA,mFAAA;AAAA,cACA,6CAAA;AAAA,cACA,qDAAA;AAAA,cACA;AAAA,aACF,CAAE,KAAK,IAAI;AAAA;AACb,SACD;AAAA,OACH;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,cAAA;AAAA,IACA,6GAAA;AAAA,IACA;AAAA,MACE,QAAQA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,4BAA4B;AAAA,KACrE;AAAA,IACA,OAAO,EAAE,MAAA,EAAO,MAAO;AAAA,MACrB,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,+DAAA;AAAA,YACA,EAAA;AAAA,YACA,MAAA,GAAS,CAAA,oDAAA,EAAuD,MAAM,CAAA,CAAA,CAAA,GAAM,kCAAA;AAAA,YAC5E,EAAA;AAAA,YACA,oCAAA;AAAA,YACA,0CAAA;AAAA,YACA,8DAAA;AAAA,YACA,wGAAA;AAAA,YACA,EAAA;AAAA,YACA,0CAAA;AAAA,YACA,qCAAA;AAAA,YACA,wCAAA;AAAA,YACA,oCAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,kBAAA;AAAA,IACA,sHAAA;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,qEAAA;AAAA,YACA,EAAA;AAAA,YACA,yFAAA;AAAA,YACA,EAAA;AAAA,YACA,wBAAA;AAAA,YACA,0EAAA;AAAA,YACA,+FAAA;AAAA,YACA,6DAAA;AAAA,YACA,8EAAA;AAAA,YACA,sEAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,qBAAA;AAAA,IACA,mGAAA;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,yEAAA;AAAA,YACA,EAAA;AAAA,YACA,kIAAA;AAAA,YACA,EAAA;AAAA,YACA,wBAAA;AAAA,YACA,8DAAA;AAAA,YACA,4FAAA;AAAA,YACA,iFAAA;AAAA,YACA,yDAAA;AAAA,YACA,mEAAA;AAAA,YACA,4DAAA;AAAA,YACA,EAAA;AAAA,YACA,kEAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAMA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,kBAAA;AAAA,IACA,kHAAA;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,2FAAA;AAAA,YACA,EAAA;AAAA,YACA,uJAAA;AAAA,YACA,+EAAA;AAAA,YACA,2FAAA;AAAA,YACA,EAAA;AAAA,YACA,mHAAA;AAAA,YACA,EAAA;AAAA,YACA,+BAAA;AAAA,YACA,oHAAA;AAAA,YACA,EAAA;AAAA,YACA,uCAAA;AAAA,YACA,sBAAA;AAAA,YACA,qCAAA;AAAA,YACA,0CAAA;AAAA,YACA,2DAAA;AAAA,YACA,sBAAA;AAAA,YACA,EAAA;AAAA,YACA,0DAAA;AAAA,YACA,8DAAA;AAAA,YACA,yCAAA;AAAA,YACA,EAAA;AAAA,YACA,qDAAA;AAAA,YACA,+DAAA;AAAA,YACA,+DAAA;AAAA,YACA,8CAAA;AAAA,YACA,uDAAA;AAAA,YACA,+CAAA;AAAA,YACA,0DAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,SAAA;AAAA,IACA,4GAAA;AAAA,IACA;AAAA,MACE,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,gFAAgF;AAAA,KAC3H;AAAA,IACA,OAAO,EAAE,QAAA,EAAS,MAAO;AAAA,MACvB,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,gFAAA;AAAA,YACA,EAAA;AAAA,YACA,QAAA,GACI,CAAA,2CAAA,EAA8C,QAAQ,CAAA,CAAA,CAAA,GACtD,iGAAA;AAAA,YACJ,EAAA;AAAA,YACA,6GAAA;AAAA,YACA,qDAAA;AAAA,YACA,EAAA;AAAA,YACA,sEAAA;AAAA,YACA,CAAA,8EAAA,CAAA;AAAA,YACA,sEAAA;AAAA,YACA,mGAAA;AAAA,YACA,EAAA;AAAA,YACA,qDAAA;AAAA,YACA,4CAAA;AAAA,YACA,EAAA;AAAA,YACA,qCAAA;AAAA,YACA,8CAAA;AAAA,YACA,EAAA;AAAA,YACA,4CAAA;AAAA,YACA,2CAAA;AAAA,YACA,EAAA;AAAA,YACA,mEAAA;AAAA,YACA,EAAA;AAAA,YACA,mCAAA;AAAA,YACA,iDAAA;AAAA,YACA,EAAA;AAAA,YACA,+BAAA;AAAA,YACA,gCAAA;AAAA,YACA,gCAAA;AAAA,YACA,gCAAA;AAAA,YACA,EAAA;AAAA,YACA,kCAAA;AAAA,YACA,oFAAA;AAAA,YACA,+DAAA;AAAA,YACA,0DAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,OAAA;AAAA,IACA,wGAAA;AAAA,IACA;AAAA,MACE,YAAYA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,oEAAoE;AAAA,KACjH;AAAA,IACA,OAAO,EAAE,UAAA,EAAW,KAAM;AACxB,MAAA,MAAM,SAAS,UAAA,IAAc,CAAA;AAC7B,MAAA,OAAO;AAAA,QACL,UAAU,CAAC;AAAA,UACT,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA,cACJ,mFAAA;AAAA,cACA,EAAA;AAAA,cACA,yEAAyE,MAAM,CAAA,uBAAA,CAAA;AAAA,cAC/E,EAAA;AAAA,cACA,qDAAqD,MAAM,CAAA,QAAA,CAAA;AAAA,cAC3D,oDAAA;AAAA,cACA,EAAA;AAAA,cACA,uBAAA;AAAA,cACA,EAAA;AAAA,cACA,sBAAA;AAAA,cACA,gFAAA;AAAA,cACA,oCAAoC,MAAM,CAAA,QAAA,CAAA;AAAA,cAC1C,EAAA;AAAA,cACA,qBAAA;AAAA,cACA,+CAAA;AAAA,cACA,2DAAA;AAAA,cACA,+EAAA;AAAA,cACA,2CAAA;AAAA,cACA,EAAA;AAAA,cACA,8DAAA;AAAA,cACA,EAAA;AAAA,cACA;AAAA,aACF,CAAE,KAAK,IAAI;AAAA;AACb,SACD;AAAA,OACH;AAAA,IACF;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,YAAA;AAAA,IACA,qHAAA;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,gFAAA;AAAA,YACA,EAAA;AAAA,YACA,uGAAA;AAAA,YACA,EAAA;AAAA,YACA,qBAAA;AAAA,YACA,EAAA;AAAA,YACA,6BAAA;AAAA,YACA,sFAAA;AAAA,YACA,EAAA;AAAA,YACA,mEAAA;AAAA,YACA,kEAAA;AAAA,YACA,0DAAA;AAAA,YACA,gEAAA;AAAA,YACA,2DAAA;AAAA,YACA,EAAA;AAAA,YACA,yCAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,cAAA;AAAA,IACA,4GAAA;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,wFAAA;AAAA,YACA,EAAA;AAAA,YACA,8GAAA;AAAA,YACA,EAAA;AAAA,YACA,wBAAA;AAAA,YACA,4FAAA;AAAA,YACA,EAAA;AAAA,YACA,yEAAA;AAAA,YACA,6DAAA;AAAA,YACA,8DAAA;AAAA,YACA,4DAAA;AAAA,YACA,yDAAA;AAAA,YACA,8CAAA;AAAA,YACA,iDAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,aAAA;AAAA,IACA,uHAAA;AAAA,IACA;AAAA,MACE,QAAQA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qCAAqC;AAAA,KAC9E;AAAA,IACA,OAAO,EAAE,MAAA,EAAO,MAAO;AAAA,MACrB,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,mFAAA;AAAA,YACA,EAAA;AAAA,YACA,MAAA,GACI,CAAA,cAAA,EAAiB,MAAM,CAAA,yBAAA,CAAA,GACvB,0EAAA;AAAA,YACJ,EAAA;AAAA,YACA,oHAAA;AAAA,YACA,EAAA;AAAA,YACA,uBAAA;AAAA,YACA,EAAA;AAAA,YACA,oBAAA;AAAA,YACA,oEAAA;AAAA,YACA,EAAA;AAAA,YACA,uDAAA;AAAA,YACA,0CAAA;AAAA,YACA,uDAAA;AAAA,YACA,oCAAA;AAAA,YACA,+BAAA;AAAA,YACA,2CAAA;AAAA,YACA,+BAAA;AAAA,YACA,EAAA;AAAA,YACA,iEAAA;AAAA,YACA,EAAA;AAAA,YACA,6DAAA;AAAA,YACA,+CAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAMA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,eAAA;AAAA,IACA,8GAAA;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,2EAAA;AAAA,YACA,EAAA;AAAA,YACA,yEAAA;AAAA,YACA,EAAA;AAAA,YACA,uCAAA;AAAA,YACA,+CAAA;AAAA,YACA,oEAAA;AAAA,YACA,sFAAA;AAAA,YACA,EAAA;AAAA,YACA,iCAAA;AAAA,YACA,6BAAA;AAAA,YACA,gFAAA;AAAA,YACA,0FAAA;AAAA,YACA,uDAAA;AAAA,YACA,EAAA;AAAA,YACA,gCAAA;AAAA,YACA,4EAAA;AAAA,YACA,6EAAA;AAAA,YACA,EAAA;AAAA,YACA,8BAAA;AAAA,YACA,2BAAA;AAAA,YACA,kFAAA;AAAA,YACA,sEAAA;AAAA,YACA,yHAAA;AAAA,YACA,EAAA;AAAA,YACA,0BAAA;AAAA,YACA,uCAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,YAAA;AAAA,IACA,qHAAA;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,+DAAA;AAAA,YACA,EAAA;AAAA,YACA,2DAAA;AAAA,YACA,EAAA;AAAA,YACA,sCAAA;AAAA,YACA,wDAAA;AAAA,YACA,mFAAA;AAAA,YACA,EAAA;AAAA,YACA,uCAAA;AAAA,YACA,EAAA;AAAA,YACA,8BAAA;AAAA,YACA,kFAAA;AAAA,YACA,EAAA;AAAA,YACA,6BAAA;AAAA,YACA,oFAAA;AAAA,YACA,EAAA;AAAA,YACA,wBAAA;AAAA,YACA,0DAAA;AAAA,YACA,0BAAA;AAAA,YACA,EAAA;AAAA,YACA,mBAAA;AAAA,YACA,+BAAA;AAAA,YACA,sFAAA;AAAA,YACA,kDAAA;AAAA,YACA,sEAAA;AAAA,YACA,EAAA;AAAA,YACA,6BAAA;AAAA,YACA,2BAAA;AAAA,YACA,iCAAA;AAAA,YACA,kCAAA;AAAA,YACA,EAAA;AAAA,YACA,gCAAA;AAAA,YACA,mEAAA;AAAA,YACA,gEAAA;AAAA,YACA,kGAAA;AAAA,YACA,yCAAA;AAAA,YACA,EAAA;AAAA,YACA,kCAAA;AAAA,YACA,8FAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,gBAAA;AAAA,IACA,qFAAA;AAAA,IACA;AAAA,MACE,MAAMA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,gCAAgC,CAAA;AAAA,MACrE,IAAIA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,+BAA+B,CAAA;AAAA,MAClE,QAAQA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,8BAA8B;AAAA,KACvE;AAAA,IACA,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,QAAO,KAAM;AAC9B,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,IAAA,GAAO,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,GAAK,EAAA;AAAA,QACzB,EAAA,GAAK,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,GAAK,EAAA;AAAA,QACnB,MAAA,GAAS,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA,GAAK;AAAA,OACjC,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAE3B,MAAA,OAAO;AAAA,QACL,UAAU,CAAC;AAAA,UACT,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA,cACJ,kEAAA;AAAA,cACA,EAAA;AAAA,cACA,OAAA,GAAU,CAAA;AAAA,EAAa,OAAO;AAAA,CAAA,GAAO,EAAA;AAAA,cACrC,8CAAA;AAAA,cACA,EAAA;AAAA,cACA,+BAAA;AAAA,cACA,mDAAA;AAAA,cACA,6DAAA;AAAA,cACA,qFAAA;AAAA,cACA,EAAA;AAAA,cACA,iCAAA;AAAA,cACA,wCAAA;AAAA,cACA,SAAA;AAAA,cACA,gDAAA;AAAA,cACA,yBAAA;AAAA,cACA,sBAAA;AAAA,cACA,kBAAA;AAAA,cACA,aAAA;AAAA,cACA,EAAA;AAAA,cACA,qCAAA;AAAA,cACA,iCAAA;AAAA,cACA,wDAAA;AAAA,cACA,EAAA;AAAA,cACA,wBAAA;AAAA,cACA,yCAAA;AAAA,cACA,iDAAA;AAAA,cACA;AAAA,aACF,CAAE,KAAK,IAAI;AAAA;AACb,SACD;AAAA,OACH;AAAA,IACF;AAAA,GACF;AAMA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,eAAA;AAAA,IACA,mGAAA;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,kIAAA;AAAA,YACA,EAAA;AAAA,YACA,oEAAA;AAAA,YACA,EAAA;AAAA,YACA,gCAAA;AAAA,YACA,4IAAA;AAAA,YACA,EAAA;AAAA,YACA,sCAAA;AAAA,YACA,sEAAA;AAAA,YACA,4EAAA;AAAA,YACA,mCAAA;AAAA,YACA,EAAA;AAAA,YACA,mCAAA;AAAA,YACA,uFAAA;AAAA,YACA,0DAAA;AAAA,YACA,EAAA;AAAA,YACA,iCAAA;AAAA,YACA,iFAAA;AAAA,YACA,gFAAA;AAAA,YACA,2FAAA;AAAA,YACA,kGAAA;AAAA,YACA,EAAA;AAAA,YACA,wBAAA;AAAA,YACA,2DAAA;AAAA,YACA,iEAAA;AAAA,YACA,8CAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,YAAA;AAAA,IACA,oFAAA;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,uFAAA;AAAA,YACA,EAAA;AAAA,YACA,yEAAA;AAAA,YACA,EAAA;AAAA,YACA,4BAAA;AAAA,YACA,oHAAA;AAAA,YACA,EAAA;AAAA,YACA,yCAAA;AAAA,YACA,EAAA;AAAA,YACA,qCAAA;AAAA,YACA,kDAAA;AAAA,YACA,2DAAA;AAAA,YACA,gEAAA;AAAA,YACA,EAAA;AAAA,YACA,gDAAA;AAAA,YACA,CAAA,2DAAA,CAAA;AAAA,YACA,mEAAA;AAAA,YACA,qDAAA;AAAA,YACA,mDAAA;AAAA,YACA,4EAAA;AAAA,YACA,EAAA;AAAA,YACA,2CAAA;AAAA,YACA,CAAA,+DAAA,CAAA;AAAA,YACA,gDAAA;AAAA,YACA,EAAA;AAAA,YACA,8CAAA;AAAA,YACA,EAAA;AAAA,YACA,kCAAA;AAAA,YACA,wDAAA;AAAA,YACA,2DAAA;AAAA,YACA,sDAAA;AAAA,YACA,4DAAA;AAAA,YACA,2DAAA;AAAA,YACA,4BAAA;AAAA,YACA,4BAAA;AAAA,YACA,6DAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,WAAA;AAAA,IACA,6FAAA;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,0EAAA;AAAA,YACA,EAAA;AAAA,YACA,8BAAA;AAAA,YACA,gIAAA;AAAA,YACA,EAAA;AAAA,YACA,iFAAA;AAAA,YACA,gFAAA;AAAA,YACA,kCAAA;AAAA,YACA,EAAA;AAAA,YACA,sCAAA;AAAA,YACA,2CAAA;AAAA,YACA,+DAAA;AAAA,YACA,oEAAA;AAAA,YACA,EAAA;AAAA,YACA,qCAAA;AAAA,YACA,4CAAA;AAAA,YACA,+DAAA;AAAA,YACA,2FAAA;AAAA,YACA,EAAA;AAAA,YACA,gCAAA;AAAA,YACA,kDAAA;AAAA,YACA,gEAAA;AAAA,YACA,0DAAA;AAAA,YACA,EAAA;AAAA,YACA,kCAAA;AAAA,YACA,2FAAA;AAAA,YACA,oHAAA;AAAA,YACA,8DAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,cAAA;AAAA,IACA,sHAAA;AAAA,IACA,aAAa;AAAA,MACX,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,4EAAA;AAAA,YACA,EAAA;AAAA,YACA,mFAAA;AAAA,YACA,EAAA;AAAA,YACA,6BAAA;AAAA,YACA,0HAAA;AAAA,YACA,EAAA;AAAA,YACA,sEAAA;AAAA,YACA,EAAA;AAAA,YACA,iDAAA;AAAA,YACA,sCAAA;AAAA,YACA,EAAA;AAAA,YACA,mDAAA;AAAA,YACA,uEAAA;AAAA,YACA,EAAA;AAAA,YACA,0CAAA;AAAA,YACA,4DAAA;AAAA,YACA,EAAA;AAAA,YACA,6DAAA;AAAA,YACA,qDAAA;AAAA,YACA,EAAA;AAAA,YACA,wEAAA;AAAA,YACA,+CAAA;AAAA,YACA,EAAA;AAAA,YACA,0CAAA;AAAA,YACA,EAAA;AAAA,YACA,iDAAA;AAAA,YACA,0RAAA;AAAA,YACA,gDAAA;AAAA,YACA,gDAAA;AAAA,YACA,gDAAA;AAAA,YACA,gDAAA;AAAA,YACA,uDAAA;AAAA,YACA,EAAA;AAAA,YACA,qEAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AAEA,EAAA,MAAA,CAAO,MAAA;AAAA,IACL,cAAA;AAAA,IACA,2GAAA;AAAA,IACA;AAAA,MACE,QAAQA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,kCAAkC,CAAA;AAAA,MACzE,QAAQA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,sCAAsC;AAAA,KAC/E;AAAA,IACA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAO,MAAO;AAAA,MAC7B,UAAU,CAAC;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,0EAAA;AAAA,YACA,EAAA;AAAA,YACA,MAAA,GAAS,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA,GAAK,EAAA;AAAA,YAChC,MAAA,GAAS,CAAA,UAAA,EAAa,MAAM,CAAA,OAAA,CAAA,GAAY,EAAA;AAAA,YACxC,EAAA;AAAA,YACA,4DAAA;AAAA,YACA,EAAA;AAAA,YACA,wBAAA;AAAA,YACA,kGAAA;AAAA,YACA,EAAA;AAAA,YACA,iDAAA;AAAA,YACA,EAAA;AAAA,YACA,wBAAA;AAAA,YACA,EAAA;AAAA,YACA,sBAAA;AAAA,YACA,uBAAA;AAAA,YACA,kBAAA;AAAA,YACA,EAAA;AAAA,YACA,2BAAA;AAAA,YACA,6BAAA;AAAA,YACA,EAAA;AAAA,YACA,mCAAA;AAAA,YACA,iDAAA;AAAA,YACA,iEAAA;AAAA,YACA,EAAA;AAAA,YACA,sBAAA;AAAA,YACA,0BAAA;AAAA,YACA,0CAAA;AAAA,YACA,mCAAA;AAAA,YACA,EAAA;AAAA,YACA,wDAAA;AAAA,YACA,+CAAA;AAAA,YACA,EAAA;AAAA,YACA,gCAAA;AAAA,YACA,uCAAA;AAAA,YACA,8CAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AACF;;;ACv2BA,eAAsB,eAAe,IAAA,EAA4C;AAC/E,EAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA;AAE7C,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,YAAA,EAAa,EAAG;AAClC,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN;AAAA,KAGF;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,UAAU,CAAA;AAEjE,EAAA,iBAAA,CAAkB,QAAQ,KAAK,CAAA;AAC/B,EAAA,kBAAA,CAAmB,QAAQ,KAAK,CAAA;AAChC,EAAA,mBAAA,CAAoB,QAAQ,KAAK,CAAA;AACjC,EAAA,eAAA,CAAgB,MAAM,CAAA;AAEtB,EAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,EAAqB;AAC3C,EAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAChC;;;AC1BA,MAAM,cAAA,EAAe","file":"bin.js","sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000 } from '@t2000/sdk';\n\nconst SESSION_PATH = resolve(homedir(), '.t2000', '.session');\n\nasync function resolvePin(): Promise<string> {\n const envPin = process.env.T2000_PIN ?? process.env.T2000_PASSPHRASE;\n if (envPin) return envPin;\n\n try {\n const session = await readFile(SESSION_PATH, 'utf-8');\n if (session.trim()) return session.trim();\n } catch { /* no session */ }\n\n throw new Error(\n 'No PIN available. Either:\\n' +\n ' 1. Run `t2000 balance` first (creates session), or\\n' +\n ' 2. Set T2000_PIN environment variable',\n );\n}\n\nexport async function createAgent(keyPath?: string): Promise<T2000> {\n const pin = await resolvePin();\n return T2000.create({ pin, keyPath });\n}\n","import { T2000Error, SafeguardError } from '@t2000/sdk';\n\ninterface McpToolError {\n code: string;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n}\n\nexport function mapError(err: unknown): McpToolError {\n if (err instanceof SafeguardError) {\n return {\n code: 'SAFEGUARD_BLOCKED',\n message: err.message,\n retryable: false,\n details: { rule: err.rule, ...err.details },\n };\n }\n\n if (err instanceof T2000Error) {\n return {\n code: err.code,\n message: err.message,\n retryable: err.retryable,\n };\n }\n\n return {\n code: 'UNKNOWN',\n message: err instanceof Error ? err.message : String(err),\n retryable: false,\n };\n}\n\nexport function errorResult(err: unknown) {\n const mapped = mapError(err);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(mapped) }],\n isError: true,\n };\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { T2000 } from '@t2000/sdk';\nimport { errorResult } from '../errors.js';\n\nexport function registerReadTools(server: McpServer, agent: T2000): void {\n\n // ---------------------------------------------------------------------------\n // Composite tool — the single best call for \"how's my account?\"\n // ---------------------------------------------------------------------------\n\n server.tool(\n 't2000_overview',\n 'Complete account snapshot in ONE call — balance, savings positions, investment portfolio, health factor, yield earnings, fund status, and pending rewards. Use this for morning briefings, general account questions, or any time you need the full picture. Prefer this over calling t2000_balance + t2000_positions + t2000_portfolio + t2000_health + t2000_earnings individually.',\n {},\n async () => {\n try {\n const [balance, positions, portfolio, health, earnings, fundStatus, pendingRewards] =\n await Promise.allSettled([\n agent.balance(),\n agent.positions(),\n agent.getPortfolio(),\n agent.healthFactor(),\n agent.earnings(),\n agent.fundStatus(),\n agent.getPendingRewards(),\n ]);\n\n const result = {\n balance: balance.status === 'fulfilled' ? balance.value : null,\n positions: positions.status === 'fulfilled' ? positions.value : null,\n portfolio: portfolio.status === 'fulfilled' ? {\n ...portfolio.value,\n positions: portfolio.value.positions.map(p => ({\n ...p,\n ...(p.currentPrice === 0 && p.totalAmount > 0 ? { note: 'price unavailable' } : {}),\n })),\n } : null,\n health: health.status === 'fulfilled' ? health.value : null,\n earnings: earnings.status === 'fulfilled' ? earnings.value : null,\n fundStatus: fundStatus.status === 'fulfilled' ? fundStatus.value : null,\n pendingRewards: pendingRewards.status === 'fulfilled' ? pendingRewards.value : null,\n };\n\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n // ---------------------------------------------------------------------------\n // Individual read tools\n // ---------------------------------------------------------------------------\n\n server.tool(\n 't2000_balance',\n \"Get agent's current balance — available (checking), savings, credit (debt), gas reserve, and net total. All values in USD. For a full account snapshot, prefer t2000_overview instead.\",\n {},\n async () => {\n try {\n const result = await agent.balance();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_address',\n \"Get the agent's Sui wallet address for receiving funds.\",\n {},\n async () => {\n try {\n const address = agent.address();\n return { content: [{ type: 'text', text: JSON.stringify({ address }) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_positions',\n 'View current lending positions across protocols (NAVI, Suilend) — deposits, borrows, APYs. For a full account snapshot, prefer t2000_overview instead.',\n {},\n async () => {\n try {\n const result = await agent.positions();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_rates',\n 'Get best available interest rates per asset across all lending protocols. Use alongside t2000_positions to compare current vs best rates. Use with t2000_rebalance (dryRun: true) to preview optimization.',\n {},\n async () => {\n try {\n const result = await agent.rates();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_health',\n \"Check the agent's health factor — measures how safe current borrows are. Below 1.0 risks liquidation. Also shows supplied, borrowed, max borrow, and liquidation threshold.\",\n {},\n async () => {\n try {\n const result = await agent.healthFactor();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_history',\n 'View recent transactions (sends, saves, borrows, swaps, investments). Use for activity summaries and weekly recaps.',\n { limit: z.number().optional().describe('Number of transactions to return (default: 20)') },\n async ({ limit }) => {\n try {\n const result = await agent.history({ limit });\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_earnings',\n 'View yield earnings from savings positions — total earned, daily rate, current APY. For a full account snapshot, prefer t2000_overview instead.',\n {},\n async () => {\n try {\n const result = await agent.earnings();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_fund_status',\n 'Detailed savings analytics — total supplied, current APY, earned today, earned all-time, projected monthly yield. More detailed than t2000_earnings.',\n {},\n async () => {\n try {\n const result = await agent.fundStatus();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_pending_rewards',\n 'Check pending protocol rewards from lending positions WITHOUT claiming them. Shows claimable reward tokens per protocol and asset. Use t2000_claim_rewards to actually collect and convert to USDC.',\n {},\n async () => {\n try {\n const result = await agent.getPendingRewards();\n return { content: [{ type: 'text', text: JSON.stringify({ rewards: result, count: result.length }) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_deposit_info',\n 'Get deposit instructions — wallet address, supported networks, accepted assets. Use when the user asks how to fund or top up their account.',\n {},\n async () => {\n try {\n const result = await agent.deposit();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_all_rates',\n 'Compare interest rates across ALL protocols side-by-side for every asset. Shows NAVI vs Suilend rates per asset. Use when the user asks \"am I getting the best rate?\" or wants to compare protocols.',\n {},\n async () => {\n try {\n const result = await agent.allRatesAcrossAssets();\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n // ---------------------------------------------------------------------------\n // Sentinel tools\n // ---------------------------------------------------------------------------\n\n server.tool(\n 't2000_sentinel_list',\n 'List active Sui Sentinels — AI agents with prize pools you can attack. Shows name, attack fee, prize pool, and attack count. Use this for bounty hunting.',\n {},\n async () => {\n try {\n const sentinels = await agent.sentinelList();\n const serializable = sentinels.map(s => ({\n ...s,\n attackFee: s.attackFee.toString(),\n attackFeeSui: Number(s.attackFee) / 1e9,\n prizePool: s.prizePool.toString(),\n prizePoolSui: Number(s.prizePool) / 1e9,\n }));\n return { content: [{ type: 'text', text: JSON.stringify(serializable) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_sentinel_info',\n 'Get detailed info about a specific Sui Sentinel — model, system prompt, prize pool, attack history. Use the sentinel ID or object ID from t2000_sentinel_list.',\n { id: z.string().describe('Sentinel agent ID or object ID') },\n async ({ id }) => {\n try {\n const s = await agent.sentinelInfo(id);\n return { content: [{ type: 'text', text: JSON.stringify({\n ...s,\n attackFee: s.attackFee.toString(),\n attackFeeSui: Number(s.attackFee) / 1e9,\n prizePool: s.prizePool.toString(),\n prizePoolSui: Number(s.prizePool) / 1e9,\n }) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n // ---------------------------------------------------------------------------\n // Contacts & Portfolio\n // ---------------------------------------------------------------------------\n\n server.tool(\n 't2000_contacts',\n 'List saved contacts (name → address mappings). Use contact names with t2000_send instead of raw addresses. Use t2000_contact_add to save new contacts.',\n {},\n async () => {\n try {\n const contacts = agent.contacts.list();\n return { content: [{ type: 'text', text: JSON.stringify({ contacts }) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_portfolio',\n 'Show investment portfolio — positions, cost basis, current value, unrealized/realized P&L, strategy groupings. For a full account snapshot, prefer t2000_overview instead.',\n {},\n async () => {\n try {\n const result = await agent.getPortfolio();\n const enriched = {\n ...result,\n positions: result.positions.map(p => ({\n ...p,\n ...(p.currentPrice === 0 && p.totalAmount > 0 ? { note: 'price unavailable' } : {}),\n })),\n };\n return { content: [{ type: 'text', text: JSON.stringify(enriched) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n}\n","export class TxMutex {\n private queue: Promise<void> = Promise.resolve();\n\n async run<T>(fn: () => Promise<T>): Promise<T> {\n let release: () => void;\n const next = new Promise<void>(r => { release = r; });\n const prev = this.queue;\n this.queue = next;\n await prev;\n try {\n return await fn();\n } finally {\n release!();\n }\n }\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { T2000 } from '@t2000/sdk';\nimport { INVESTMENT_ASSETS } from '@t2000/sdk';\nimport type { InvestmentAsset } from '@t2000/sdk';\nimport { TxMutex } from '../mutex.js';\nimport { errorResult } from '../errors.js';\n\nexport function registerWriteTools(server: McpServer, agent: T2000): void {\n const mutex = new TxMutex();\n\n server.tool(\n 't2000_send',\n 'Send USDC or stablecoins to a Sui address or contact name. Amount is in dollars. Subject to per-transaction and daily send limits. Set dryRun: true to preview without signing.',\n {\n to: z.string().describe(\"Recipient Sui address (0x...) or contact name (e.g. 'Tom')\"),\n amount: z.number().describe('Amount in dollars to send'),\n asset: z.string().optional().describe('Asset to send (default: USDC)'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ to, amount, asset, dryRun }) => {\n try {\n const resolved = agent.contacts.resolve(to);\n\n if (dryRun) {\n agent.enforcer.check({ operation: 'send', amount });\n const balance = await agent.balance();\n const config = agent.enforcer.getConfig();\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n canSend: balance.available >= amount,\n amount,\n to: resolved.address,\n contactName: resolved.contactName,\n asset: asset ?? 'USDC',\n currentBalance: balance.available,\n balanceAfter: balance.available - amount,\n safeguards: {\n dailyUsedAfter: config.dailyUsed + amount,\n dailyLimit: config.maxDailySend,\n },\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.send({ to, amount, asset }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_save',\n 'Deposit USDC to savings (earns yield). Amount is in dollars. Use \"all\" to save entire available balance. Set dryRun: true to preview.',\n {\n amount: z.union([z.number(), z.literal('all')]).describe('Dollar amount to save, or \"all\"'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const balance = await agent.balance();\n const rates = await agent.rates();\n const saveAmount = amount === 'all' ? balance.available - 1.0 : amount;\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n amount: saveAmount,\n currentApy: rates.USDC?.saveApy ?? 0,\n savingsBalanceAfter: balance.savings + saveAmount,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.save({ amount }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_withdraw',\n 'Withdraw from savings back to checking. Amount is in dollars. Use \"all\" to withdraw everything. Set dryRun: true to preview.',\n {\n amount: z.union([z.number(), z.literal('all')]).describe('Dollar amount to withdraw, or \"all\"'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const positions = await agent.positions();\n const health = await agent.healthFactor();\n const savings = positions.positions\n .filter(p => p.type === 'save')\n .reduce((sum, p) => sum + p.amount, 0);\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n amount: amount === 'all' ? savings : amount,\n currentSavings: savings,\n currentHealthFactor: health.healthFactor,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.withdraw({ amount }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_borrow',\n 'Borrow USDC against savings collateral. Check health factor first — below 1.0 risks liquidation. Amount is in dollars. Set dryRun: true to preview.',\n {\n amount: z.number().describe('Dollar amount to borrow'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const health = await agent.healthFactor();\n const maxBorrow = await agent.maxBorrow();\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n amount,\n maxBorrow: maxBorrow.maxAmount,\n currentHealthFactor: health.healthFactor,\n estimatedHealthFactorAfter: maxBorrow.healthFactorAfter,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.borrow({ amount }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_repay',\n 'Repay borrowed USDC. Amount is in dollars. Use \"all\" to repay entire debt. Set dryRun: true to preview.',\n {\n amount: z.union([z.number(), z.literal('all')]).describe('Dollar amount to repay, or \"all\"'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const health = await agent.healthFactor();\n const positions = await agent.positions();\n const totalDebt = positions.positions\n .filter(p => p.type === 'borrow')\n .reduce((sum, p) => sum + p.amount, 0);\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n amount: amount === 'all' ? totalDebt : amount,\n currentDebt: totalDebt,\n currentHealthFactor: health.healthFactor,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() => agent.repay({ amount }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_exchange',\n 'Swap assets via Cetus DEX (e.g. USDC to SUI, SUI to USDC). Amount is in source asset units. Set dryRun: true to get a quote without executing.',\n {\n amount: z.number().describe('Amount to swap (in source asset units)'),\n from: z.string().describe('Source asset (e.g. USDC, SUI)'),\n to: z.string().describe('Target asset (e.g. SUI, USDC)'),\n maxSlippage: z.number().optional().describe('Max slippage percentage (default: 3%)'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ amount, from, to, maxSlippage, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const quote = await agent.exchangeQuote({ from, to, amount });\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n from,\n to,\n amount,\n expectedOutput: quote.expectedOutput,\n priceImpact: quote.priceImpact,\n fee: quote.fee.amount,\n }),\n }],\n };\n }\n\n const result = await mutex.run(() =>\n agent.exchange({ from, to, amount, maxSlippage }),\n );\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n const investAssets = Object.keys(INVESTMENT_ASSETS) as [string, ...string[]];\n server.tool(\n 't2000_invest',\n 'Buy, sell, earn yield, or stop earning on investment assets. Actions: buy (invest USD), sell (convert to USDC), earn (deposit into best-rate lending for yield), unearn (withdraw from lending, keep in portfolio). Amount required for buy/sell only.',\n {\n action: z.enum(['buy', 'sell', 'earn', 'unearn']).describe(\"'buy' to invest, 'sell' to liquidate, 'earn' to deposit into lending for yield, 'unearn' to withdraw from lending\"),\n asset: z.enum(investAssets).describe('Asset to invest in'),\n amount: z.union([z.number(), z.literal('all')]).optional().describe('USD amount (required for buy/sell, ignored for earn/unearn)'),\n slippage: z.number().optional().describe('Max slippage percent (default: 3, for buy/sell only)'),\n dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),\n },\n async ({ action, asset, amount, slippage, dryRun }) => {\n try {\n if (dryRun) {\n agent.enforcer.assertNotLocked();\n const balance = await agent.balance();\n const portfolio = await agent.getPortfolio();\n const position = portfolio.positions.find(p => p.asset === asset);\n\n if (action === 'sell' && amount === 'all' && !position) {\n return {\n content: [{ type: 'text', text: JSON.stringify({ preview: true, error: `No ${asset} position to sell` }) }],\n };\n }\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n preview: true,\n action,\n asset,\n amount: amount === 'all' ? position?.currentValue ?? 0 : amount ?? position?.totalAmount ?? 0,\n currentBalance: balance.available,\n currentPosition: position ?? null,\n earning: position?.earning ?? false,\n earningProtocol: position?.earningProtocol ?? null,\n earningApy: position?.earningApy ?? null,\n }),\n }],\n };\n }\n\n const maxSlippage = slippage ? slippage / 100 : undefined;\n if (action === 'buy') {\n if (typeof amount !== 'number') throw new Error('Buy amount must be a number');\n const result = await mutex.run(() => agent.investBuy({ asset: asset as InvestmentAsset, usdAmount: amount, maxSlippage }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } else if (action === 'sell') {\n const usdAmount = amount === 'all' ? 'all' as const : amount as number;\n const result = await mutex.run(() => agent.investSell({ asset: asset as InvestmentAsset, usdAmount, maxSlippage }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } else if (action === 'earn') {\n const result = await mutex.run(() => agent.investEarn({ asset: asset as InvestmentAsset }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } else {\n const result = await mutex.run(() => agent.investUnearn({ asset: asset as InvestmentAsset }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n }\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_invest_rebalance',\n 'Move earning investment positions to better-rate protocols. Checks all earning assets and moves any where another protocol offers a higher APY.',\n {\n dryRun: z.boolean().optional().describe('Preview moves without executing (default: false)'),\n minYieldDiff: z.number().optional().describe('Minimum APY difference to trigger a move (default: 0.1)'),\n },\n async ({ dryRun, minYieldDiff }) => {\n try {\n const result = await mutex.run(() => agent.investRebalance({ dryRun, minYieldDiff }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_strategy',\n 'Manage investment strategies — buy into predefined or custom allocations, sell entire strategies, check status, rebalance, or create/delete custom strategies.',\n {\n action: z.enum(['list', 'buy', 'sell', 'status', 'rebalance', 'create', 'delete']).describe(\"Strategy action to perform\"),\n name: z.string().optional().describe(\"Strategy name (required for all actions except 'list')\"),\n amount: z.number().optional().describe(\"USD amount (required for 'buy')\"),\n allocations: z.record(z.number()).optional().describe(\"Allocation map e.g. {SUI: 40, BTC: 20, ETH: 20, GOLD: 20} (for 'create')\"),\n description: z.string().optional().describe(\"Strategy description (for 'create')\"),\n dryRun: z.boolean().optional().describe(\"Preview without signing (for 'buy')\"),\n },\n async ({ action, name, amount, allocations, description, dryRun }) => {\n try {\n if (action === 'list') {\n const all = agent.strategies.getAll();\n return { content: [{ type: 'text', text: JSON.stringify(all) }] };\n }\n\n if (!name) {\n return { content: [{ type: 'text', text: JSON.stringify({ error: 'Strategy name is required' }) }] };\n }\n\n switch (action) {\n case 'buy': {\n if (typeof amount !== 'number') {\n return { content: [{ type: 'text', text: JSON.stringify({ error: 'Amount is required for buy' }) }] };\n }\n const result = await mutex.run(() => agent.investStrategy({ strategy: name, usdAmount: amount, dryRun }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n }\n case 'sell': {\n const result = await mutex.run(() => agent.sellStrategy({ strategy: name }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n }\n case 'status': {\n const result = await agent.getStrategyStatus(name);\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n }\n case 'rebalance': {\n const result = await mutex.run(() => agent.rebalanceStrategy({ strategy: name }));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n }\n case 'create': {\n if (!allocations) {\n return { content: [{ type: 'text', text: JSON.stringify({ error: 'Allocations required for create' }) }] };\n }\n const def = agent.strategies.create({ name, allocations, description });\n return { content: [{ type: 'text', text: JSON.stringify(def) }] };\n }\n case 'delete': {\n agent.strategies.delete(name);\n return { content: [{ type: 'text', text: JSON.stringify({ deleted: name }) }] };\n }\n default:\n return { content: [{ type: 'text', text: JSON.stringify({ error: `Unknown action: ${action}` }) }] };\n }\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_auto_invest',\n 'Dollar-cost averaging (DCA) — set up recurring purchases into strategies or individual assets. Actions: setup, status, run, stop.',\n {\n action: z.enum(['setup', 'status', 'run', 'stop']).describe(\"Auto-invest action\"),\n amount: z.number().optional().describe(\"USD amount per purchase (for 'setup')\"),\n frequency: z.enum(['daily', 'weekly', 'monthly']).optional().describe(\"Purchase frequency (for 'setup')\"),\n strategy: z.string().optional().describe(\"Strategy name (for 'setup')\"),\n asset: z.string().optional().describe(\"Single asset (for 'setup', alternative to strategy)\"),\n scheduleId: z.string().optional().describe(\"Schedule ID (for 'stop')\"),\n },\n async ({ action, amount, frequency, strategy, asset, scheduleId }) => {\n try {\n switch (action) {\n case 'setup': {\n if (!amount || !frequency) {\n return { content: [{ type: 'text', text: JSON.stringify({ error: 'Amount and frequency required for setup' }) }] };\n }\n const schedule = agent.setupAutoInvest({ amount, frequency, strategy, asset });\n return { content: [{ type: 'text', text: JSON.stringify(schedule) }] };\n }\n case 'status': {\n const status = agent.getAutoInvestStatus();\n return { content: [{ type: 'text', text: JSON.stringify(status) }] };\n }\n case 'run': {\n const result = await mutex.run(() => agent.runAutoInvest());\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n }\n case 'stop': {\n if (!scheduleId) {\n return { content: [{ type: 'text', text: JSON.stringify({ error: 'Schedule ID required for stop' }) }] };\n }\n agent.stopAutoInvest(scheduleId);\n return { content: [{ type: 'text', text: JSON.stringify({ stopped: scheduleId }) }] };\n }\n default:\n return { content: [{ type: 'text', text: JSON.stringify({ error: `Unknown action: ${action}` }) }] };\n }\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_rebalance',\n 'Optimize yield by moving funds to the highest-rate protocol. Always previews first — set dryRun: false to execute. Shows plan with expected APY gain and break-even period.',\n {\n dryRun: z.boolean().optional().describe('Preview without executing (default: true)'),\n minYieldDiff: z.number().optional().describe('Min APY difference to rebalance (default: 0.5%)'),\n maxBreakEven: z.number().optional().describe('Max break-even days (default: 30)'),\n },\n async ({ dryRun, minYieldDiff, maxBreakEven }) => {\n try {\n const result = await mutex.run(() =>\n agent.rebalance({\n dryRun: dryRun ?? true,\n minYieldDiff,\n maxBreakEven,\n }),\n );\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_claim_rewards',\n 'Claim pending protocol rewards from lending positions and auto-convert to USDC.',\n {},\n async () => {\n try {\n const result = await mutex.run(() => agent.claimRewards());\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n // ---------------------------------------------------------------------------\n // Sentinel\n // ---------------------------------------------------------------------------\n\n server.tool(\n 't2000_sentinel_attack',\n 'Attack a Sui Sentinel with a prompt to try to breach its defenses and win the prize pool. Costs SUI (the attack fee). Use t2000_sentinel_list to find targets first.',\n {\n id: z.string().describe('Sentinel agent ID or object ID to attack'),\n prompt: z.string().describe('Your attack prompt — try to make the AI do something its system prompt forbids'),\n fee: z.number().optional().describe('Override attack fee in SUI (default: sentinel\\'s listed fee)'),\n },\n async ({ id, prompt, fee }) => {\n try {\n const feeMist = fee ? BigInt(Math.round(fee * 1e9)) : undefined;\n const result = await mutex.run(() => agent.sentinelAttack(id, prompt, feeMist));\n return { content: [{ type: 'text', text: JSON.stringify(result) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n // ---------------------------------------------------------------------------\n // Contact management\n // ---------------------------------------------------------------------------\n\n server.tool(\n 't2000_contact_add',\n 'Save a contact name → Sui address mapping. After saving, use the name with t2000_send instead of pasting addresses. Example: save \"Tom\" as 0x1234... then send to \"Tom\".',\n {\n name: z.string().describe('Contact name (e.g. \"Tom\", \"Alice\")'),\n address: z.string().describe('Sui wallet address (0x...)'),\n },\n async ({ name, address }) => {\n try {\n const result = agent.contacts.add(name, address);\n return { content: [{ type: 'text', text: JSON.stringify({ success: true, name, address, ...result }) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_contact_remove',\n 'Remove a saved contact by name.',\n {\n name: z.string().describe('Contact name to remove'),\n },\n async ({ name }) => {\n try {\n const removed = agent.contacts.remove(name);\n return { content: [{ type: 'text', text: JSON.stringify({ success: removed, name }) }] };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport type { T2000 } from '@t2000/sdk';\nimport { errorResult } from '../errors.js';\n\nexport function registerSafetyTools(server: McpServer, agent: T2000): void {\n server.tool(\n 't2000_config',\n 'View or set agent safeguard limits (per-transaction max, daily send limit). Use action \"show\" to view current limits, \"set\" to update. Values are in dollars. Set to 0 for unlimited.',\n {\n action: z.enum(['show', 'set']).describe('\"show\" to view current limits, \"set\" to update a limit'),\n key: z.string().optional().describe('Setting to update: \"maxPerTx\" or \"maxDailySend\"'),\n value: z.number().optional().describe('New value in dollars (0 = unlimited)'),\n },\n async ({ action, key, value }) => {\n try {\n if (action === 'show') {\n const config = agent.enforcer.getConfig();\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n locked: config.locked,\n maxPerTx: config.maxPerTx,\n maxDailySend: config.maxDailySend,\n dailyUsed: config.dailyUsed,\n }),\n }],\n };\n }\n\n if (!key || value === undefined) {\n return errorResult(new Error('Both \"key\" and \"value\" are required for action \"set\"'));\n }\n\n if (key === 'locked') {\n return errorResult(new Error('Cannot set \"locked\" via config. Use t2000_lock to freeze operations.'));\n }\n\n if (key !== 'maxPerTx' && key !== 'maxDailySend') {\n return errorResult(new Error(`Unknown key \"${key}\". Valid keys: \"maxPerTx\", \"maxDailySend\"`));\n }\n\n if (value < 0) {\n return errorResult(new Error('Value must be a non-negative number'));\n }\n\n agent.enforcer.set(key, value);\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({ updated: true, key, value }),\n }],\n };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n\n server.tool(\n 't2000_lock',\n 'Freeze all agent operations immediately. Only a human can unlock via `t2000 unlock` in the terminal. Use this as an emergency stop.',\n {},\n async () => {\n try {\n agent.enforcer.lock();\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n locked: true,\n message: 'Agent locked. Only a human can unlock via: t2000 unlock',\n }),\n }],\n };\n } catch (err) {\n return errorResult(err);\n }\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nexport function registerPrompts(server: McpServer): void {\n server.prompt(\n 'financial-report',\n 'Get a comprehensive summary of the agent\\'s financial position — balance, savings, debt, health factor, and yield earnings.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a financial assistant for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview FIRST — it returns everything (balance, positions, portfolio, health, earnings, fund status, pending rewards) in one call.',\n 'Then call t2000_rates for rate comparison across protocols.',\n '',\n 'Present a comprehensive financial report:',\n '',\n '📊 FINANCIAL REPORT',\n '───────────────────',\n '',\n '💰 Accounts',\n ' Checking / Savings / Credit / Investment with totals',\n ' Net worth',\n '',\n '📈 Positions',\n ' Each savings position: protocol, asset, amount, APY',\n ' Each investment position: asset, amount, cost basis, current value, P&L',\n '',\n '💸 Yield',\n ' Current APY, daily/monthly/projected earnings',\n ' Comparison to best available rates',\n '',\n '🛡️ Risk',\n ' Health factor status',\n ' Concentration analysis',\n '',\n '📋 Recommendations (max 4)',\n ' Actionable items based on data',\n ' Include: idle funds, rate optimization, reward claiming, debt repayment',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'optimize-yield',\n 'Analyze savings and investment earning positions — rate comparisons, rebalancing opportunities across protocols.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a yield optimization assistant for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call these tools in parallel:',\n ' 1. t2000_overview — full account state including positions and pending rewards',\n ' 2. t2000_rates — all available rates across protocols',\n ' 3. t2000_rebalance (dryRun: true) — preview savings optimization',\n '',\n 'Present a structured yield analysis:',\n '',\n '📊 YIELD ANALYSIS',\n '─────────────────',\n '',\n ' Current [asset] on [protocol] · X.XX% APY',\n ' Best [asset] on [protocol] · X.XX% APY',\n ' APY gain +X.XX%',\n ' Break-even X days',\n '',\n 'If a better rate exists: \"Better rate available. Want me to rebalance?\"',\n 'If already optimal: \"You\\'re at the best available rate.\"',\n '',\n 'Also check:',\n ' - Idle checking funds that could be earning yield',\n ' - Investment assets not in lending (could use t2000_invest earn)',\n ' - Claimable protocol rewards (suggest t2000_claim_rewards)',\n '',\n 'On user confirmation, execute t2000_rebalance (dryRun: false).',\n 'After execution, show: new APY, amount moved, transaction link.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'send-money',\n 'Guided flow for sending USDC to a Sui address — validates address, checks limits, previews before signing.',\n {\n to: z.string().optional().describe('Recipient Sui address'),\n amount: z.number().optional().describe('Amount in dollars'),\n },\n async ({ to, amount }) => {\n const context = [\n to ? `Recipient address: ${to}` : '',\n amount ? `Amount: $${amount}` : '',\n ].filter(Boolean).join('\\n');\n\n return {\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a payment assistant for a t2000 AI agent bank account.',\n '',\n context ? `Context:\\n${context}\\n` : '',\n 'The user wants to send money. Follow this flow:',\n '1. If address or amount is missing, ask the user',\n '2. Preview the transaction (t2000_send with dryRun: true)',\n '3. Show the preview — amount, recipient, remaining balance, safeguard status',\n '4. Ask the user to confirm before executing',\n '5. Execute the send (t2000_send with dryRun: false)',\n '6. Show the transaction result with the Suiscan link',\n ].join('\\n'),\n },\n }],\n };\n },\n );\n\n server.prompt(\n 'budget-check',\n 'Can I afford to spend $X? Checks balance, daily limit remaining, and whether spending would impact savings.',\n {\n amount: z.number().optional().describe('Amount in dollars to check'),\n },\n async ({ amount }) => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a budget assistant for a t2000 AI agent bank account.',\n '',\n amount ? `The user wants to know if they can afford to spend $${amount}.` : 'The user wants a spending check.',\n '',\n 'Analyze their financial situation:',\n '1. Check current balance (t2000_balance)',\n '2. Check safeguard limits (t2000_config with action: \"show\")',\n '3. Calculate: available balance, daily limit remaining, what percentage of total this spend represents',\n '',\n 'Give a clear yes/no answer with context:',\n '- Can they afford it from checking?',\n '- Would it hit their daily send limit?',\n '- What balance would remain after?',\n '- If it\\'s a large % of their total, flag that.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'savings-strategy',\n 'Analyze idle funds in checking and recommend a savings strategy — how much to save, expected yield, best rates.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a savings advisor for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview and t2000_all_rates in parallel to get the full picture.',\n '',\n 'Analyze and recommend:',\n ' - How much idle checking can move to savings (keep ~$5 buffer for gas)',\n ' - Which protocol + asset offers the best yield (compare NAVI vs Suilend, USDC vs USDe etc.)',\n ' - Expected monthly/annual yield on the recommended amount',\n ' - If existing savings should rebalance (t2000_rebalance with dryRun: true)',\n ' - Whether investment assets could earn yield via t2000_invest earn',\n '',\n 'If they want to proceed, use t2000_save to deposit.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'investment-strategy',\n 'Analyze investment portfolio, suggest strategies, review DCA schedules, and recommend next steps.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are an investment advisor for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview FIRST, then t2000_strategy (action: \"list\") and t2000_auto_invest (action: \"status\") in parallel.',\n '',\n 'Analyze and recommend:',\n ' - Portfolio allocation (checking vs savings vs investment)',\n ' - Best strategy for their profile (bluechip, all-weather, layer1, sui-heavy, safe-haven)',\n ' - If strategy positions are drifting from target weights, suggest rebalancing',\n ' - If no DCA schedule exists, recommend setting one up',\n ' - Whether invested assets should earn yield (t2000_invest earn)',\n ' - Risk: concentration, unrealized losses, strategy drift',\n '',\n 'For strategies: use t2000_strategy with dryRun: true to preview.',\n 'For DCA: use t2000_auto_invest action: \"setup\" to create recurring buys.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n // ---------------------------------------------------------------------------\n // Wow-factor prompts — AI-as-financial-advisor\n // ---------------------------------------------------------------------------\n\n server.prompt(\n 'morning-briefing',\n 'Daily financial snapshot — balance changes, yield earned, portfolio movement, pending DCA, health warnings.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a personal financial briefing assistant for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview FIRST — it returns balance, positions, portfolio, health, earnings, fund status, and pending rewards in one call.',\n 'Then call t2000_auto_invest (action: \"status\") to check for pending DCA runs.',\n 'Optionally call t2000_rebalance (dryRun: true) to check yield optimization opportunities.',\n '',\n 'Present everything as a single structured briefing. NEVER ask follow-up questions before presenting the briefing.',\n '',\n '☀️ MORNING BRIEFING',\n '───────────────────',\n '',\n 'Show a compact account summary table:',\n ' Checking $XX.XX',\n ' Savings $XX.XX · X.XX% APY',\n ' Credit -$XX.XX (only if borrowed)',\n ' Investment $XX.XX · +X.X% (only if positions exist)',\n ' Net Worth $XX.XX',\n '',\n 'If there are savings positions, show daily yield earned.',\n 'If there are investment positions, show each asset with P&L.',\n 'If pending rewards exist, mention them.',\n '',\n '📋 Action Items (max 4, only if applicable):',\n ' - Idle funds in checking → suggest saving or investing',\n ' - Outstanding debt → suggest repaying to stop interest',\n ' - Pending DCA run → suggest executing',\n ' - Better yield available → suggest rebalancing',\n ' - Claimable rewards → suggest claiming',\n ' - Low health factor → warn about liquidation risk',\n '',\n 'If everything is optimized, say so. Keep it scannable — numbers first, narrative second.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'what-if',\n 'Scenario planning — \"What if I invest $X in Y?\" Shows projected impact on portfolio, yield, and risk.',\n {\n scenario: z.string().optional().describe('Scenario to evaluate, e.g. \"invest $500 in bluechip\" or \"withdraw all savings\"'),\n },\n async ({ scenario }) => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a financial scenario planner for a t2000 AI agent bank account on Sui.',\n '',\n scenario\n ? `The user wants to evaluate this scenario: \"${scenario}\"`\n : 'The user wants to explore a hypothetical financial scenario. Ask them what they\\'re considering.',\n '',\n 'IMPORTANT: Call t2000_overview FIRST to get the full current state (balance, positions, portfolio, health).',\n 'Then preview the specific action with dryRun: true.',\n '',\n 'For INVESTMENT scenarios (\"invest $X in Y\" or \"buy $X of strategy\"):',\n ' - Call t2000_strategy (action: \"list\") to get allocations if it\\'s a strategy',\n ' - Call t2000_invest or t2000_strategy with dryRun: true to preview',\n ' - If the amount exceeds available checking, calculate what they\\'d need to withdraw from savings',\n '',\n 'For SAVINGS scenarios (\"save $X\" or \"withdraw $X\"):',\n ' - Show impact on yield and health factor',\n '',\n 'For BORROW scenarios (\"borrow $X\"):',\n ' - Show new health factor and interest cost',\n '',\n 'For EXCHANGE scenarios (\"swap $X A to B\"):',\n ' - Call t2000_exchange with dryRun: true',\n '',\n 'ALWAYS present results as a BEFORE → AFTER comparison table:',\n '',\n '📊 SCENARIO: [description]',\n ' [strategy allocation breakdown if applicable]',\n '',\n ' Before After',\n ' Checking $XX.XX $XX.XX',\n ' Savings $XX.XX $XX.XX',\n ' Investment $XX.XX $XX.XX',\n '',\n 'Then add a smart recommendation:',\n ' - If amount exceeds checking, suggest a smaller amount that keeps savings intact',\n ' - If it would drain checking below $5, warn about gas needs',\n ' - If the asset can earn yield after buying, mention it',\n '',\n 'End with: \"Want me to go ahead?\" — ready to execute on confirmation.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'sweep',\n 'Find idle funds in checking and optimally distribute across savings and investments for maximum yield.',\n {\n keepBuffer: z.number().optional().describe('Dollar amount to keep in checking as spending buffer (default: $5)'),\n },\n async ({ keepBuffer }) => {\n const buffer = keepBuffer ?? 5;\n return {\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a smart money routing assistant for a t2000 AI agent bank account on Sui.',\n '',\n `IMPORTANT: Call t2000_overview and t2000_all_rates in parallel. Keep $${buffer} in checking as buffer.`,\n '',\n `Calculate sweep amount: available checking minus $${buffer} buffer.`,\n 'If sweep amount < $1, funds are already optimized.',\n '',\n 'Present a sweep plan:',\n '',\n '🧹 SWEEP PLAN',\n '─────────────',\n `Available to sweep: $X (keeping $${buffer} buffer)`,\n '',\n 'Actions (in order):',\n ' 1. Save $X to best-rate protocol (show APY)',\n ' 2. Earn yield on idle investment assets (if applicable)',\n ' 3. Rebalance existing savings for better APY (t2000_rebalance dryRun: true)',\n ' 4. Claim pending rewards (if available)',\n '',\n 'Projected monthly yield: $X.XX (before) → $X.XX (after)',\n '',\n 'Ask to confirm, then execute sequentially.',\n ].join('\\n'),\n },\n }],\n };\n },\n );\n\n server.prompt(\n 'risk-check',\n 'Full risk analysis — health factor, concentration, lending exposure, unrealized losses, liquidation proximity.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a risk assessment specialist for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview FIRST — it has balance, positions, portfolio, health, everything.',\n '',\n 'Analyze and report:',\n '',\n '🛡️ RISK REPORT',\n '──────────────',\n '',\n '1. LIQUIDATION RISK — Health factor, distance to liquidation',\n '2. CONCENTRATION RISK — % in each account type, % per asset',\n '3. PROTOCOL EXPOSURE — NAVI vs Suilend distribution',\n '4. UNREALIZED LOSSES — Any investment positions at a loss',\n '5. YIELD EFFICIENCY — Idle assets, sub-optimal rates',\n '',\n 'OVERALL: Low / Medium / High / Critical',\n '',\n 'End with max 3 prioritized actions. If Low risk, say so — don\\'t invent problems.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'weekly-recap',\n 'Week in review — transactions, yield earned, portfolio P&L changes, strategy performance, highlights.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a personal finance newsletter writer for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview, t2000_history (limit: 50), t2000_auto_invest (action: \"status\") in parallel.',\n '',\n '📊 WEEKLY RECAP',\n '───────────────',\n '',\n '💰 Net Worth: $X — Checking $X | Savings $X | Investment $X',\n '📈 Activity: X sends, X saves, X trades, X exchanges',\n '💸 Yield: $X.XX this week, X% APY, $X/month projected',\n '📊 Portfolio: Per-asset P&L, best & worst performer',\n '🔄 DCA: Runs this week, next run, total invested',\n '🎁 Rewards: Pending? Claim suggestion',\n '👉 Next Week: 1-2 actionable suggestions',\n '',\n 'Tone: confident, concise, data-driven. Bloomberg brief, not blog post.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'dca-advisor',\n 'Personalized DCA setup — \"I have $X/month\" → recommends strategy, frequency, asset split, projected growth.',\n {\n budget: z.number().optional().describe('Monthly budget in dollars to invest'),\n },\n async ({ budget }) => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a dollar-cost averaging advisor for a t2000 AI agent bank account on Sui.',\n '',\n budget\n ? `The user has $${budget}/month to invest via DCA.`\n : 'The user wants to set up a DCA schedule. Ask their monthly budget first.',\n '',\n 'IMPORTANT: Call t2000_overview, t2000_strategy (action: \"list\"), t2000_auto_invest (action: \"status\") in parallel.',\n '',\n 'Recommend a DCA plan:',\n '',\n '📅 DCA PLAN',\n '───────────',\n '',\n 'STRATEGY: Pick one based on their existing portfolio:',\n ' - bluechip (50% BTC, 30% ETH, 20% SUI)',\n ' - all-weather (30% BTC, 20% ETH, 20% SUI, 30% GOLD)',\n ' - safe-haven (50% BTC, 50% GOLD)',\n ' - layer1 (50% ETH, 50% SUI)',\n ' - sui-heavy (60% SUI, 20% BTC, 20% ETH)',\n ' Explain WHY this fits them.',\n '',\n 'FREQUENCY: Weekly for budgets > $50/month, monthly for smaller.',\n '',\n 'AFFORDABILITY: Check remaining buffer after DCA commitment.',\n ' Flag if DCA would eat into spending buffer.',\n '',\n 'If they agree: t2000_auto_invest action: \"setup\", amount, frequency, strategy.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n // ---------------------------------------------------------------------------\n // Operational prompts — specific workflows\n // ---------------------------------------------------------------------------\n\n server.prompt(\n 'claim-rewards',\n 'Check for pending protocol rewards across all lending positions and claim them — auto-converts to USDC.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a rewards management assistant for a t2000 AI agent bank account.',\n '',\n 'Help the user collect their pending protocol rewards. Follow this flow:',\n '',\n 'Step 1 — Check what\\'s claimable:',\n ' - Check lending positions (t2000_positions)',\n ' - Positions with \"+rewards\" tags have claimable protocol rewards',\n ' - These are incentive tokens (like vSUI, sSUI, DEEP) earned from lending protocols',\n '',\n 'Step 2 — Present findings:',\n ' If rewards are available:',\n ' Show which positions have rewards and from which protocols (NAVI, Suilend)',\n ' Explain: \"These are protocol incentive tokens that accrue on your lending positions\"',\n ' Ask: \"Want me to claim and convert them to USDC?\"',\n '',\n ' If no rewards are claimable:',\n ' Tell the user their rewards are still accruing and to check back later',\n ' Show their current positions and APY so they know yield is being earned',\n '',\n 'Step 3 — Execute claim:',\n ' Run t2000_claim_rewards',\n ' This claims from ALL protocols at once and auto-converts reward tokens to USDC',\n ' Show the result: USDC received, source protocols, transaction link',\n ' If received amount is small (< $0.01), explain that rewards accrue continuously and larger amounts build up over time',\n '',\n 'Step 4 — Follow-up:',\n ' Show updated balance after claiming',\n ' Mention when to claim next (rewards accrue continuously, claiming weekly or monthly is typical)',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'safeguards',\n 'Review account safety settings — per-transaction limits, daily caps, emergency lock, PIN-protected operations.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a security advisor for a t2000 AI agent bank account.',\n '',\n 'Help the user review and manage their account safeguards.',\n '',\n 'Step 1 — Show current settings:',\n ' - Get safeguard config (t2000_config action: \"show\")',\n ' - Show: per-transaction limit, daily send limit, daily spent today, lock status',\n '',\n 'Step 2 — Explain each safeguard:',\n '',\n ' 🛡️ SAFEGUARDS',\n ' ─────────────',\n '',\n ' Per-transaction limit: $X',\n ' Every send is checked against this cap. Prevents large unauthorized transfers.',\n '',\n ' Daily send limit: $X',\n ' Cumulative cap across all sends in a 24-hour window.',\n ' Used today: $X of $X',\n '',\n ' Emergency lock:',\n ' Status: Unlocked / Locked',\n ' When locked: ALL operations are frozen — sends, saves, investments, borrows',\n ' Lock via: t2000_lock (any AI agent can lock)',\n ' Unlock via: CLI only with PIN — no AI can unlock, by design',\n '',\n ' PIN-protected operations:',\n ' - Unlocking the agent',\n ' - Exporting the private key',\n ' - Modifying safeguard limits',\n '',\n 'Step 3 — Recommendations:',\n ' Based on their balance and activity, suggest appropriate limits',\n ' If they have large balances, recommend tighter per-tx limits',\n ' If they want to adjust: t2000_config action: \"set\", key: \"maxPerTx\" or \"maxDailyUsd\", value: X',\n ' Always confirm before changing limits',\n '',\n 'Step 4 — Emergency actions:',\n ' If the user wants to lock: run t2000_lock immediately (no confirmation needed for locking)',\n ' Explain that unlocking requires the CLI: t2000 unlock (with PIN)',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'quick-exchange',\n 'Guided token swap — preview rate, slippage, and price impact before executing.',\n {\n from: z.string().optional().describe('Asset to sell (e.g. USDC, SUI)'),\n to: z.string().optional().describe('Asset to buy (e.g. SUI, USDC)'),\n amount: z.number().optional().describe('Amount in source asset units'),\n },\n async ({ from, to, amount }) => {\n const context = [\n from ? `From: ${from}` : '',\n to ? `To: ${to}` : '',\n amount ? `Amount: ${amount}` : '',\n ].filter(Boolean).join('\\n');\n\n return {\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are an exchange assistant for a t2000 AI agent bank account.',\n '',\n context ? `Context:\\n${context}\\n` : '',\n 'Help the user swap tokens. Follow this flow:',\n '',\n 'Step 1 — Gather details:',\n ' If from, to, or amount is missing, ask the user',\n ' Check balance (t2000_balance) to confirm they have enough',\n ' Available pairs: any combination of USDC, SUI, BTC, ETH, GOLD, USDT, USDe, USDsui',\n '',\n 'Step 2 — Preview the swap:',\n ' Run t2000_exchange with dryRun: true',\n ' Show:',\n ' Input: X FROM → Expected output: Y TO',\n ' Rate: 1 FROM = Z TO',\n ' Price impact: X%',\n ' Slippage: X%',\n ' Fee: $X',\n '',\n 'Step 3 — Ask for confirmation:',\n ' \"Ready to execute this swap?\"',\n ' If price impact > 1%, warn the user about the impact',\n '',\n 'Step 4 — Execute:',\n ' Run t2000_exchange with dryRun: false',\n ' Show: amount received, rate, transaction link',\n ' Show updated balance',\n ].join('\\n'),\n },\n }],\n };\n },\n );\n\n // ---------------------------------------------------------------------------\n // Customer-centric prompts — what real users actually ask\n // ---------------------------------------------------------------------------\n\n server.prompt(\n 'sentinel-hunt',\n 'Browse sentinel bounties, pick the best target, and attack — guided bounty hunting workflow.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a bounty hunting strategist for Sui Sentinel — a game where you try to jailbreak AI agents to win their prize pool.',\n '',\n 'IMPORTANT: Call t2000_sentinel_list and t2000_balance in parallel.',\n '',\n '🎯 SENTINEL BOUNTY HUNT',\n '───────────────────────',\n '',\n 'Step 1 — Show the best targets:',\n ' Rank sentinels by reward-to-fee ratio (prize pool ÷ attack fee)',\n ' Show top 5 targets in a table: Name | Fee | Prize Pool | Ratio | Attacks',\n ' Highlight the best value target',\n '',\n 'Step 2 — Recommend a target:',\n ' Explain WHY this target is good (high ratio, fewer attempts = less refined defense)',\n ' Show the attack fee and confirm the user can afford it',\n '',\n 'Step 3 — Craft the attack:',\n ' If the user picks a target, call t2000_sentinel_info to see its system prompt',\n ' Help the user craft a jailbreak prompt based on the sentinel\\'s system prompt',\n ' Common techniques: role-play scenarios, hypotheticals, emotional appeals, format tricks',\n ' WARNING: Never suggest harmful content — this is a game about creative prompt engineering',\n '',\n 'Step 4 — Execute:',\n ' Run t2000_sentinel_attack with the chosen id and prompt',\n ' Show: score, win/lose, agent response, jury verdict, fee paid',\n ' If they won: celebrate and show the prize!',\n ' If they lost: analyze the response and suggest a different approach for next attempt',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'onboarding',\n 'New user setup guide — deposit, first save, set safeguards, explore features.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a friendly onboarding guide for t2000 — an AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview FIRST to understand their current state.',\n '',\n '👋 WELCOME TO T2000',\n '───────────────────',\n '',\n 'Check their balance and adapt the flow:',\n '',\n 'IF they have no funds ($0 balance):',\n ' Show deposit instructions (t2000_deposit_info)',\n ' Explain: \"Send USDC to your Sui address to get started\"',\n ' Mention: they need a small amount of SUI for gas (~$1 worth)',\n '',\n 'IF they have funds but nothing saved/invested:',\n ' \"Great, you have $X ready to go! Here\\'s what you can do:\"',\n ' 1. SAVE — Earn yield on idle funds (show best current APY)',\n ' 2. INVEST — Buy crypto (BTC, ETH, SUI, GOLD)',\n ' 3. AUTO-INVEST — Set up recurring DCA buys',\n ' 4. SAFEGUARDS — Set spending limits (recommend for accounts > $100)',\n '',\n 'IF they already have savings/investments:',\n ' \"Looks like you\\'re already set up! Here\\'s your quick status:\"',\n ' Show a mini briefing, then offer to optimize',\n '',\n 'End with: \"What would you like to do first?\"',\n '',\n 'Available features to highlight:',\n ' - Save/withdraw USDC across NAVI & Suilend protocols',\n ' - Invest in BTC, ETH, SUI, GOLD with portfolio tracking',\n ' - Strategy investing (bluechip, all-weather, etc.)',\n ' - Auto-invest (DCA) — recurring weekly/monthly buys',\n ' - Rebalance — auto-optimize yield across protocols',\n ' - Borrow against savings',\n ' - Send money to contacts',\n ' - Hunt sentinel bounties (jailbreak AI agents for prizes)',\n ' - Safeguards: per-tx limits, daily caps, emergency lock',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'emergency',\n 'Something is wrong — lock account, assess damage, take protective actions immediately.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are an emergency response handler for a t2000 AI agent bank account.',\n '',\n '🚨 EMERGENCY PROTOCOL',\n '─────────────────────',\n '',\n 'IMPORTANT: If the user says \"lock\", \"freeze\", \"hack\", \"stolen\", or \"emergency\":',\n ' → Call t2000_lock IMMEDIATELY — no confirmation needed for locking',\n ' → Then gather information',\n '',\n 'Step 1 — Lock first, ask later:',\n ' Run t2000_lock to freeze ALL operations',\n ' Confirm: \"Account locked. No transactions can be executed.\"',\n ' Explain: unlocking requires the CLI with your PIN (t2000 unlock)',\n '',\n 'Step 2 — Assess the situation:',\n ' Call t2000_overview to see current state',\n ' Call t2000_history (limit: 20) to check recent transactions',\n ' Look for suspicious activity: unexpected sends, large withdrawals, unfamiliar addresses',\n '',\n 'Step 3 — Report findings:',\n ' Show current balances (are funds still there?)',\n ' Flag any suspicious transactions with amounts and timestamps',\n ' Show transaction links so the user can verify on-chain',\n '',\n 'Step 4 — Recovery guidance:',\n ' If funds are safe: \"Your funds are secure. The lock prevents any further transactions.\"',\n ' If suspicious tx found: \"Review this transaction: [link]. If unauthorized, your remaining funds are now locked.\"',\n ' Remind: \"To unlock, use: t2000 unlock (requires your PIN)\"',\n ' Remind: \"Consider rotating your key after investigating\"',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'optimize-all',\n 'One-shot full optimization — sweep idle funds, rebalance savings, claim rewards, rebalance investment earnings.',\n async () => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a full-account optimizer for a t2000 AI agent bank account on Sui.',\n '',\n 'IMPORTANT: Call t2000_overview and t2000_all_rates in parallel to get everything.',\n '',\n '🔧 FULL OPTIMIZATION',\n '────────────────────',\n '',\n 'Check all 5 optimization levers and present a plan BEFORE executing:',\n '',\n '1. IDLE FUNDS — Any checking balance > $5?',\n ' → Save to best-rate protocol',\n '',\n '2. SAVINGS REBALANCE — Better APY available?',\n ' → t2000_rebalance dryRun: true — show current vs new APY',\n '',\n '3. PENDING REWARDS — Any unclaimed?',\n ' → Show rewards, offer to claim and convert to USDC',\n '',\n '4. INVESTMENT YIELD — Any invested assets NOT earning?',\n ' → t2000_invest earn to deposit into lending',\n '',\n '5. INVESTMENT REBALANCE — Earning assets on sub-optimal protocol?',\n ' → t2000_invest_rebalance dryRun: true',\n '',\n 'Present all findings in a summary table:',\n '',\n ' Action | Impact | Status',\n ' ─────────────────|───────────────────|──────────',\n ' Sweep $X idle | +$X.XX/month | Ready',\n ' Rebalance savings| +X.XX% APY | Ready',\n ' Claim rewards | $X.XX USDC | Ready',\n ' Earn on SUI | +X.XX% APY | Ready',\n ' Already optimal | — | Skipped',\n '',\n 'Ask: \"Want me to execute all ready actions?\" Then run sequentially.',\n 'If everything is already optimal, say so clearly.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'savings-goal',\n 'Set a savings target — \"I want to save $X by date Y\" → calculates weekly/monthly amount needed.',\n {\n target: z.number().optional().describe('Target savings amount in dollars'),\n months: z.number().optional().describe('Number of months to reach the target'),\n },\n async ({ target, months }) => ({\n messages: [{\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'You are a savings goal planner for a t2000 AI agent bank account on Sui.',\n '',\n target ? `Target: $${target}` : '',\n months ? `Timeline: ${months} months` : '',\n '',\n 'IMPORTANT: Call t2000_overview FIRST to see current state.',\n '',\n '🎯 SAVINGS GOAL',\n '────────────────',\n '',\n 'If target or timeline is missing, ask the user.',\n '',\n 'Calculate and present:',\n '',\n ' Goal: $X by [date]',\n ' Currently saved: $X',\n ' Gap: $X needed',\n '',\n ' Weekly deposit: $X/week',\n ' Monthly deposit: $X/month',\n '',\n ' With yield (at current APY X%):',\n ' Without yield you\\'d need: $X total deposits',\n ' With yield you\\'d need: $X total deposits (yield covers ~$X)',\n '',\n ' Feasibility check:',\n ' Current checking: $X',\n ' Can fund from checking: $X of $X gap',\n ' Remaining to earn/deposit: $X',\n '',\n 'If they can reach the goal with current funds + yield:',\n ' → Offer to save it all now: t2000_save',\n '',\n 'If they need regular deposits:',\n ' → Suggest a recurring schedule',\n ' → Show how yield accelerates the goal',\n '',\n 'End with a clear YES/NO on whether the goal is achievable in the timeline.',\n ].join('\\n'),\n },\n }],\n }),\n );\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createAgent } from './unlock.js';\nimport { registerReadTools } from './tools/read.js';\nimport { registerWriteTools } from './tools/write.js';\nimport { registerSafetyTools } from './tools/safety.js';\nimport { registerPrompts } from './prompts.js';\n\nexport async function startMcpServer(opts?: { keyPath?: string }): Promise<void> {\n const agent = await createAgent(opts?.keyPath);\n\n if (!agent.enforcer.isConfigured()) {\n console.error(\n 'Safeguards not configured. Set limits before starting MCP:\\n' +\n ' t2000 config set maxPerTx 100\\n' +\n ' t2000 config set maxDailySend 500\\n',\n );\n process.exit(1);\n }\n\n const server = new McpServer({ name: 't2000', version: '0.20.1' });\n\n registerReadTools(server, agent);\n registerWriteTools(server, agent);\n registerSafetyTools(server, agent);\n registerPrompts(server);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","#!/usr/bin/env node\nimport { startMcpServer } from './index.js';\n\nawait startMcpServer();\n"]}
|