@t2000/mcp 0.14.1 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/bin.js +22 -8
- package/dist/bin.js.map +1 -1
- package/dist/index.js +22 -8
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -41,7 +41,7 @@ For other platforms, paste manually:
|
|
|
41
41
|
| `t2000_repay` | write | Repay debt |
|
|
42
42
|
| `t2000_exchange` | write | Swap assets |
|
|
43
43
|
| `t2000_rebalance` | write | Optimize yield |
|
|
44
|
-
| `t2000_invest` | write | Buy/sell investment assets |
|
|
44
|
+
| `t2000_invest` | write | Buy/sell investment assets; earn/unearn yield on SUI, ETH, BTC |
|
|
45
45
|
| `t2000_contacts` | read | List saved contacts (name → address) |
|
|
46
46
|
| `t2000_portfolio` | read | Investment portfolio + P&L |
|
|
47
47
|
| `t2000_config` | safety | View/set limits |
|
package/dist/bin.js
CHANGED
|
@@ -421,12 +421,12 @@ function registerWriteTools(server, agent) {
|
|
|
421
421
|
const investAssets = Object.keys(INVESTMENT_ASSETS);
|
|
422
422
|
server.tool(
|
|
423
423
|
"t2000_invest",
|
|
424
|
-
"Buy or
|
|
424
|
+
"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.",
|
|
425
425
|
{
|
|
426
|
-
action: z.enum(["buy", "sell"]).describe("'buy' to invest
|
|
426
|
+
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"),
|
|
427
427
|
asset: z.enum(investAssets).describe("Asset to invest in"),
|
|
428
|
-
amount: z.union([z.number(), z.literal("all")]).describe(
|
|
429
|
-
slippage: z.number().optional().describe("Max slippage percent (default: 3)"),
|
|
428
|
+
amount: z.union([z.number(), z.literal("all")]).optional().describe("USD amount (required for buy/sell, ignored for earn/unearn)"),
|
|
429
|
+
slippage: z.number().optional().describe("Max slippage percent (default: 3, for buy/sell only)"),
|
|
430
430
|
dryRun: z.boolean().optional().describe("Preview without signing (default: false)")
|
|
431
431
|
},
|
|
432
432
|
async ({ action, asset, amount, slippage, dryRun }) => {
|
|
@@ -448,9 +448,12 @@ function registerWriteTools(server, agent) {
|
|
|
448
448
|
preview: true,
|
|
449
449
|
action,
|
|
450
450
|
asset,
|
|
451
|
-
amount: amount === "all" ? position?.currentValue ?? 0 : amount,
|
|
451
|
+
amount: amount === "all" ? position?.currentValue ?? 0 : amount ?? position?.totalAmount ?? 0,
|
|
452
452
|
currentBalance: balance.available,
|
|
453
|
-
currentPosition: position ?? null
|
|
453
|
+
currentPosition: position ?? null,
|
|
454
|
+
earning: position?.earning ?? false,
|
|
455
|
+
earningProtocol: position?.earningProtocol ?? null,
|
|
456
|
+
earningApy: position?.earningApy ?? null
|
|
454
457
|
})
|
|
455
458
|
}]
|
|
456
459
|
};
|
|
@@ -460,10 +463,16 @@ function registerWriteTools(server, agent) {
|
|
|
460
463
|
if (typeof amount !== "number") throw new Error("Buy amount must be a number");
|
|
461
464
|
const result = await mutex.run(() => agent.investBuy({ asset, usdAmount: amount, maxSlippage }));
|
|
462
465
|
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
463
|
-
} else {
|
|
466
|
+
} else if (action === "sell") {
|
|
464
467
|
const usdAmount = amount === "all" ? "all" : amount;
|
|
465
468
|
const result = await mutex.run(() => agent.investSell({ asset, usdAmount, maxSlippage }));
|
|
466
469
|
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
470
|
+
} else if (action === "earn") {
|
|
471
|
+
const result = await mutex.run(() => agent.investEarn({ asset }));
|
|
472
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
473
|
+
} else {
|
|
474
|
+
const result = await mutex.run(() => agent.investUnearn({ asset }));
|
|
475
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
467
476
|
}
|
|
468
477
|
} catch (err) {
|
|
469
478
|
return errorResult(err);
|
|
@@ -702,6 +711,7 @@ ${context}
|
|
|
702
711
|
"- Expected annual yield on the recommended amount",
|
|
703
712
|
"- If they should rebalance existing savings (t2000_rebalance with dryRun: true)",
|
|
704
713
|
"- Whether investing in SUI or other assets could complement their savings strategy",
|
|
714
|
+
'- Note: investment assets (SUI, ETH) can also earn yield via t2000_invest action: "earn"',
|
|
705
715
|
"",
|
|
706
716
|
"If they want to proceed, use t2000_save to deposit. Always preview first."
|
|
707
717
|
].join("\n")
|
|
@@ -729,9 +739,13 @@ ${context}
|
|
|
729
739
|
"- Portfolio allocation assessment (what % is in checking vs savings vs investment)",
|
|
730
740
|
"- Whether current positions are performing well or need adjustment",
|
|
731
741
|
"- If idle checking funds should be invested or saved for yield",
|
|
742
|
+
'- Whether invested assets should earn yield (t2000_invest action: "earn") \u2014 this deposits the asset into the best lending protocol',
|
|
743
|
+
"- If a position is earning, mention the APY and protocol",
|
|
732
744
|
"- Risk assessment \u2014 concentration, unrealized losses, cost basis vs current price",
|
|
733
745
|
"",
|
|
734
|
-
"If they want to invest, use t2000_invest with dryRun: true to preview first."
|
|
746
|
+
"If they want to invest, use t2000_invest with dryRun: true to preview first.",
|
|
747
|
+
'If they want to earn yield on investments, use t2000_invest action: "earn".',
|
|
748
|
+
'If they want to stop earning, use t2000_invest action: "unearn".'
|
|
735
749
|
].join("\n")
|
|
736
750
|
}
|
|
737
751
|
}]
|
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 or sell investment assets (spot). Amount is in USD. Asset is the crypto to buy/sell (e.g. SUI, BTC, ETH). Set dryRun: true to preview.',\n {\n action: z.enum(['buy', 'sell']).describe(\"'buy' to invest USD into asset, 'sell' to convert asset back to USDC\"),\n asset: z.enum(investAssets).describe('Asset to invest in'),\n amount: z.union([z.number(), z.literal('all')]).describe('USD amount, or \"all\" to sell entire position'),\n slippage: z.number().optional().describe('Max slippage percent (default: 3)'),\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,\n currentBalance: balance.available,\n currentPosition: position ?? 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 {\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 }\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","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 '',\n 'Summarize the agent\\'s financial health in a clear, concise format with actionable recommendations.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'optimize-yield',\n 'Analyze savings positions and suggest yield optimizations — rate comparisons, rebalancing opportunities.',\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)',\n '2. Compare rates across protocols (t2000_rates)',\n '3. Run a dry-run rebalance to see if optimization is available (t2000_rebalance with dryRun: true)',\n '',\n 'If a 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 ].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 '',\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 allocation, review risk, 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',\n '3. Compare current rates (t2000_rates) — yield alternatives',\n '',\n 'Recommend:',\n '- Portfolio allocation assessment (what % is in checking vs savings vs investment)',\n '- Whether current positions are performing well or need adjustment',\n '- If idle checking funds should be invested or saved for yield',\n '- Risk assessment — concentration, unrealized losses, cost basis vs current price',\n '',\n 'If they want to invest, use t2000_invest with dryRun: true to preview first.',\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.13.0' });\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":"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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_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","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 '',\n 'Summarize the agent\\'s financial health in a clear, concise format with actionable recommendations.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'optimize-yield',\n 'Analyze savings positions and suggest yield optimizations — rate comparisons, rebalancing opportunities.',\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)',\n '2. Compare rates across protocols (t2000_rates)',\n '3. Run a dry-run rebalance to see if optimization is available (t2000_rebalance with dryRun: true)',\n '',\n 'If a 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 ].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 allocation, review risk, 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',\n '3. Compare current rates (t2000_rates) — yield alternatives',\n '',\n 'Recommend:',\n '- Portfolio allocation assessment (what % is in checking vs savings vs investment)',\n '- Whether current positions are performing well or need adjustment',\n '- If idle checking funds should be invested or saved for yield',\n '- Whether invested assets should earn yield (t2000_invest action: \"earn\") — this deposits the asset into the best lending protocol',\n '- If a position is earning, mention the APY and protocol',\n '- Risk assessment — concentration, unrealized losses, cost basis vs current price',\n '',\n 'If they want to invest, use t2000_invest with dryRun: true to preview first.',\n 'If they want to earn yield on investments, use t2000_invest action: \"earn\".',\n 'If they want to stop earning, use t2000_invest action: \"unearn\".',\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.13.0' });\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"]}
|
package/dist/index.js
CHANGED
|
@@ -421,12 +421,12 @@ function registerWriteTools(server, agent) {
|
|
|
421
421
|
const investAssets = Object.keys(INVESTMENT_ASSETS);
|
|
422
422
|
server.tool(
|
|
423
423
|
"t2000_invest",
|
|
424
|
-
"Buy or
|
|
424
|
+
"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.",
|
|
425
425
|
{
|
|
426
|
-
action: z.enum(["buy", "sell"]).describe("'buy' to invest
|
|
426
|
+
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"),
|
|
427
427
|
asset: z.enum(investAssets).describe("Asset to invest in"),
|
|
428
|
-
amount: z.union([z.number(), z.literal("all")]).describe(
|
|
429
|
-
slippage: z.number().optional().describe("Max slippage percent (default: 3)"),
|
|
428
|
+
amount: z.union([z.number(), z.literal("all")]).optional().describe("USD amount (required for buy/sell, ignored for earn/unearn)"),
|
|
429
|
+
slippage: z.number().optional().describe("Max slippage percent (default: 3, for buy/sell only)"),
|
|
430
430
|
dryRun: z.boolean().optional().describe("Preview without signing (default: false)")
|
|
431
431
|
},
|
|
432
432
|
async ({ action, asset, amount, slippage, dryRun }) => {
|
|
@@ -448,9 +448,12 @@ function registerWriteTools(server, agent) {
|
|
|
448
448
|
preview: true,
|
|
449
449
|
action,
|
|
450
450
|
asset,
|
|
451
|
-
amount: amount === "all" ? position?.currentValue ?? 0 : amount,
|
|
451
|
+
amount: amount === "all" ? position?.currentValue ?? 0 : amount ?? position?.totalAmount ?? 0,
|
|
452
452
|
currentBalance: balance.available,
|
|
453
|
-
currentPosition: position ?? null
|
|
453
|
+
currentPosition: position ?? null,
|
|
454
|
+
earning: position?.earning ?? false,
|
|
455
|
+
earningProtocol: position?.earningProtocol ?? null,
|
|
456
|
+
earningApy: position?.earningApy ?? null
|
|
454
457
|
})
|
|
455
458
|
}]
|
|
456
459
|
};
|
|
@@ -460,10 +463,16 @@ function registerWriteTools(server, agent) {
|
|
|
460
463
|
if (typeof amount !== "number") throw new Error("Buy amount must be a number");
|
|
461
464
|
const result = await mutex.run(() => agent.investBuy({ asset, usdAmount: amount, maxSlippage }));
|
|
462
465
|
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
463
|
-
} else {
|
|
466
|
+
} else if (action === "sell") {
|
|
464
467
|
const usdAmount = amount === "all" ? "all" : amount;
|
|
465
468
|
const result = await mutex.run(() => agent.investSell({ asset, usdAmount, maxSlippage }));
|
|
466
469
|
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
470
|
+
} else if (action === "earn") {
|
|
471
|
+
const result = await mutex.run(() => agent.investEarn({ asset }));
|
|
472
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
473
|
+
} else {
|
|
474
|
+
const result = await mutex.run(() => agent.investUnearn({ asset }));
|
|
475
|
+
return { content: [{ type: "text", text: JSON.stringify(result) }] };
|
|
467
476
|
}
|
|
468
477
|
} catch (err) {
|
|
469
478
|
return errorResult(err);
|
|
@@ -702,6 +711,7 @@ ${context}
|
|
|
702
711
|
"- Expected annual yield on the recommended amount",
|
|
703
712
|
"- If they should rebalance existing savings (t2000_rebalance with dryRun: true)",
|
|
704
713
|
"- Whether investing in SUI or other assets could complement their savings strategy",
|
|
714
|
+
'- Note: investment assets (SUI, ETH) can also earn yield via t2000_invest action: "earn"',
|
|
705
715
|
"",
|
|
706
716
|
"If they want to proceed, use t2000_save to deposit. Always preview first."
|
|
707
717
|
].join("\n")
|
|
@@ -729,9 +739,13 @@ ${context}
|
|
|
729
739
|
"- Portfolio allocation assessment (what % is in checking vs savings vs investment)",
|
|
730
740
|
"- Whether current positions are performing well or need adjustment",
|
|
731
741
|
"- If idle checking funds should be invested or saved for yield",
|
|
742
|
+
'- Whether invested assets should earn yield (t2000_invest action: "earn") \u2014 this deposits the asset into the best lending protocol',
|
|
743
|
+
"- If a position is earning, mention the APY and protocol",
|
|
732
744
|
"- Risk assessment \u2014 concentration, unrealized losses, cost basis vs current price",
|
|
733
745
|
"",
|
|
734
|
-
"If they want to invest, use t2000_invest with dryRun: true to preview first."
|
|
746
|
+
"If they want to invest, use t2000_invest with dryRun: true to preview first.",
|
|
747
|
+
'If they want to earn yield on investments, use t2000_invest action: "earn".',
|
|
748
|
+
'If they want to stop earning, use t2000_invest action: "unearn".'
|
|
735
749
|
].join("\n")
|
|
736
750
|
}
|
|
737
751
|
}]
|
package/dist/index.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"],"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;AACvE,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,eAAA;AAAA,IACA,iIAAA;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,qCAAA;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,iGAAA;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,2EAAA;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,4GAAA;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,gEAAA;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,0FAAA;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,gBAAA;AAAA,IACA,iHAAA;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,iGAAA;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;;;AC1IO,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,4IAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQA,EAAE,IAAA,CAAK,CAAC,OAAO,MAAM,CAAC,CAAA,CAAE,QAAA,CAAS,sEAAsE,CAAA;AAAA,MAC/G,OAAOA,CAAAA,CAAE,IAAA,CAAK,YAAY,CAAA,CAAE,SAAS,oBAAoB,CAAA;AAAA,MACzD,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAM,CAACA,EAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA,CAAE,SAAS,8CAA8C,CAAA;AAAA,MACvG,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mCAAmC,CAAA;AAAA,MAC5E,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,MAAA,KAAW,KAAA,GAAQ,QAAA,EAAU,gBAAgB,CAAA,GAAI,MAAA;AAAA,gBACzD,gBAAgB,OAAA,CAAQ,SAAA;AAAA,gBACxB,iBAAiB,QAAA,IAAY;AAAA,eAC9B;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,MAAO;AACL,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;AAAA,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;AACF;AClUO,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,kEAAA;AAAA,YACA,EAAA;AAAA,YACA,qDAAA;AAAA,YACA,8CAAA;AAAA,YACA,+CAAA;AAAA,YACA,2CAAA;AAAA,YACA,yCAAA;AAAA,YACA,gDAAA;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,gBAAA;AAAA,IACA,+GAAA;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,4CAAA;AAAA,YACA,8CAAA;AAAA,YACA,iDAAA;AAAA,YACA,oGAAA;AAAA,YACA,EAAA;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,8DAAA;AAAA,YACA,EAAA;AAAA,YACA,4DAAA;AAAA,YACA,+EAAA;AAAA,YACA,gFAAA;AAAA,YACA,gFAAA;AAAA,YACA,EAAA;AAAA,YACA,YAAA;AAAA,YACA,iGAAA;AAAA,YACA,iDAAA;AAAA,YACA,mDAAA;AAAA,YACA,iFAAA;AAAA,YACA,oFAAA;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,0FAAA;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,kEAAA;AAAA,YACA,EAAA;AAAA,YACA,yCAAA;AAAA,YACA,+FAAA;AAAA,YACA,mFAAA;AAAA,YACA,kEAAA;AAAA,YACA,EAAA;AAAA,YACA,YAAA;AAAA,YACA,oFAAA;AAAA,YACA,oEAAA;AAAA,YACA,gEAAA;AAAA,YACA,wFAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AACF;;;AC3KA,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","file":"index.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 or sell investment assets (spot). Amount is in USD. Asset is the crypto to buy/sell (e.g. SUI, BTC, ETH). Set dryRun: true to preview.',\n {\n action: z.enum(['buy', 'sell']).describe(\"'buy' to invest USD into asset, 'sell' to convert asset back to USDC\"),\n asset: z.enum(investAssets).describe('Asset to invest in'),\n amount: z.union([z.number(), z.literal('all')]).describe('USD amount, or \"all\" to sell entire position'),\n slippage: z.number().optional().describe('Max slippage percent (default: 3)'),\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,\n currentBalance: balance.available,\n currentPosition: position ?? 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 {\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 }\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","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 '',\n 'Summarize the agent\\'s financial health in a clear, concise format with actionable recommendations.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'optimize-yield',\n 'Analyze savings positions and suggest yield optimizations — rate comparisons, rebalancing opportunities.',\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)',\n '2. Compare rates across protocols (t2000_rates)',\n '3. Run a dry-run rebalance to see if optimization is available (t2000_rebalance with dryRun: true)',\n '',\n 'If a 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 ].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 '',\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 allocation, review risk, 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',\n '3. Compare current rates (t2000_rates) — yield alternatives',\n '',\n 'Recommend:',\n '- Portfolio allocation assessment (what % is in checking vs savings vs investment)',\n '- Whether current positions are performing well or need adjustment',\n '- If idle checking funds should be invested or saved for yield',\n '- Risk assessment — concentration, unrealized losses, cost basis vs current price',\n '',\n 'If they want to invest, use t2000_invest with dryRun: true to preview first.',\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.13.0' });\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"]}
|
|
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"],"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;AACvE,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,eAAA;AAAA,IACA,iIAAA;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,qCAAA;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,iGAAA;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,2EAAA;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,4GAAA;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,gEAAA;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,0FAAA;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,gBAAA;AAAA,IACA,iHAAA;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,iGAAA;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;;;AC1IO,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,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;AACF;AC3UO,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,kEAAA;AAAA,YACA,EAAA;AAAA,YACA,qDAAA;AAAA,YACA,8CAAA;AAAA,YACA,+CAAA;AAAA,YACA,2CAAA;AAAA,YACA,yCAAA;AAAA,YACA,gDAAA;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,gBAAA;AAAA,IACA,+GAAA;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,4CAAA;AAAA,YACA,8CAAA;AAAA,YACA,iDAAA;AAAA,YACA,oGAAA;AAAA,YACA,EAAA;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,8DAAA;AAAA,YACA,EAAA;AAAA,YACA,4DAAA;AAAA,YACA,+EAAA;AAAA,YACA,gFAAA;AAAA,YACA,gFAAA;AAAA,YACA,EAAA;AAAA,YACA,YAAA;AAAA,YACA,iGAAA;AAAA,YACA,iDAAA;AAAA,YACA,mDAAA;AAAA,YACA,iFAAA;AAAA,YACA,oFAAA;AAAA,YACA,0FAAA;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,0FAAA;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,kEAAA;AAAA,YACA,EAAA;AAAA,YACA,yCAAA;AAAA,YACA,+FAAA;AAAA,YACA,mFAAA;AAAA,YACA,kEAAA;AAAA,YACA,EAAA;AAAA,YACA,YAAA;AAAA,YACA,oFAAA;AAAA,YACA,oEAAA;AAAA,YACA,gEAAA;AAAA,YACA,yIAAA;AAAA,YACA,0DAAA;AAAA,YACA,wFAAA;AAAA,YACA,EAAA;AAAA,YACA,8EAAA;AAAA,YACA,6EAAA;AAAA,YACA;AAAA,WACF,CAAE,KAAK,IAAI;AAAA;AACb,OACD;AAAA,KACH;AAAA,GACF;AACF;;;AChLA,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","file":"index.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_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","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 '',\n 'Summarize the agent\\'s financial health in a clear, concise format with actionable recommendations.',\n ].join('\\n'),\n },\n }],\n }),\n );\n\n server.prompt(\n 'optimize-yield',\n 'Analyze savings positions and suggest yield optimizations — rate comparisons, rebalancing opportunities.',\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)',\n '2. Compare rates across protocols (t2000_rates)',\n '3. Run a dry-run rebalance to see if optimization is available (t2000_rebalance with dryRun: true)',\n '',\n 'If a 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 ].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 allocation, review risk, 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',\n '3. Compare current rates (t2000_rates) — yield alternatives',\n '',\n 'Recommend:',\n '- Portfolio allocation assessment (what % is in checking vs savings vs investment)',\n '- Whether current positions are performing well or need adjustment',\n '- If idle checking funds should be invested or saved for yield',\n '- Whether invested assets should earn yield (t2000_invest action: \"earn\") — this deposits the asset into the best lending protocol',\n '- If a position is earning, mention the APY and protocol',\n '- Risk assessment — concentration, unrealized losses, cost basis vs current price',\n '',\n 'If they want to invest, use t2000_invest with dryRun: true to preview first.',\n 'If they want to earn yield on investments, use t2000_invest action: \"earn\".',\n 'If they want to stop earning, use t2000_invest action: \"unearn\".',\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.13.0' });\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t2000/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.1",
|
|
4
4
|
"description": "MCP server for AI agent bank accounts on Sui — 16 tools, 5 prompts, stdio transport",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@modelcontextprotocol/sdk": "^1.27.0",
|
|
41
41
|
"zod": "^3.25.0",
|
|
42
|
-
"@t2000/sdk": "0.
|
|
42
|
+
"@t2000/sdk": "0.15.1"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/node": "^20",
|