@t2000/cli 0.22.8 → 0.22.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/program.ts","../src/output.ts","../src/commands/init.ts","../src/prompts.ts","../src/commands/send.ts","../src/commands/balance.ts","../src/commands/address.ts","../src/commands/deposit.ts","../src/commands/history.ts","../src/commands/exportKey.ts","../src/commands/importKey.ts","../src/commands/save.ts","../src/commands/withdraw.ts","../src/commands/borrow.ts","../src/commands/repay.ts","../src/commands/health.ts","../src/commands/rates.ts","../src/commands/positions.ts","../src/commands/earnings.ts","../src/commands/fundStatus.ts","../src/commands/config.ts","../src/commands/serve.ts","../src/commands/pay.ts","../src/commands/lock.ts","../src/commands/sentinel.ts","../src/commands/earn.ts","../src/commands/rebalance.ts","../src/commands/exchange.ts","../src/commands/mcp.ts","../src/commands/contacts.ts","../src/commands/invest.ts","../src/commands/portfolio.ts","../src/commands/claimRewards.ts","../src/commands/gas.ts","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createRequire } from 'node:module';\nimport { setJsonMode } from './output.js';\n\nconst require = createRequire(import.meta.url);\nconst { version: CLI_VERSION } = require('../package.json') as { version: string };\nimport { registerInit } from './commands/init.js';\nimport { registerSend } from './commands/send.js';\nimport { registerBalance } from './commands/balance.js';\nimport { registerAddress } from './commands/address.js';\nimport { registerDeposit } from './commands/deposit.js';\nimport { registerHistory } from './commands/history.js';\nimport { registerExport } from './commands/exportKey.js';\nimport { registerImport } from './commands/importKey.js';\nimport { registerSave } from './commands/save.js';\nimport { registerWithdraw } from './commands/withdraw.js';\nimport { registerBorrow } from './commands/borrow.js';\nimport { registerRepay } from './commands/repay.js';\nimport { registerHealth } from './commands/health.js';\nimport { registerRates } from './commands/rates.js';\nimport { registerPositions } from './commands/positions.js';\nimport { registerEarnings } from './commands/earnings.js';\nimport { registerFundStatus } from './commands/fundStatus.js';\nimport { registerConfig } from './commands/config.js';\nimport { registerServe } from './commands/serve.js';\nimport { registerPay } from './commands/pay.js';\nimport { registerLock } from './commands/lock.js';\nimport { registerSentinel } from './commands/sentinel.js';\nimport { registerEarn } from './commands/earn.js';\nimport { registerRebalance } from './commands/rebalance.js';\nimport { registerExchange } from './commands/exchange.js';\nimport { registerMcp } from './commands/mcp.js';\nimport { registerContacts } from './commands/contacts.js';\nimport { registerInvest } from './commands/invest.js';\nimport { registerPortfolio } from './commands/portfolio.js';\nimport { registerClaimRewards } from './commands/claimRewards.js';\nimport { registerGas } from './commands/gas.js';\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('t2000')\n .description('A bank account for AI agents')\n .version(`${CLI_VERSION} (beta)`)\n .option('--json', 'Output in JSON format')\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n if (opts.json) setJsonMode(true);\n });\n\n registerInit(program);\n registerSend(program);\n registerBalance(program);\n registerAddress(program);\n registerDeposit(program);\n registerHistory(program);\n registerExport(program);\n registerImport(program);\n registerSave(program);\n registerWithdraw(program);\n registerBorrow(program);\n registerRepay(program);\n registerHealth(program);\n registerRates(program);\n registerPositions(program);\n registerEarnings(program);\n registerFundStatus(program);\n registerConfig(program);\n registerServe(program);\n registerPay(program);\n registerLock(program);\n registerSentinel(program);\n registerEarn(program);\n registerRebalance(program);\n registerExchange(program);\n registerMcp(program);\n registerContacts(program);\n registerInvest(program);\n registerPortfolio(program);\n registerClaimRewards(program);\n registerGas(program);\n\n return program;\n}\n","import pc from 'picocolors';\n\nlet jsonMode = false;\n\nexport function setJsonMode(enabled: boolean) {\n jsonMode = enabled;\n}\n\nexport function isJsonMode(): boolean {\n return jsonMode;\n}\n\nexport function printJson(data: unknown) {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function printSuccess(message: string) {\n if (jsonMode) return;\n console.log(` ${pc.green('✓')} ${message}`);\n}\n\nexport function printError(message: string) {\n if (jsonMode) return;\n console.error(` ${pc.red('✗')} ${message}`);\n}\n\nexport function printWarning(message: string) {\n if (jsonMode) return;\n console.log(` ${pc.yellow('⚠')} ${message}`);\n}\n\nexport function printInfo(message: string) {\n if (jsonMode) return;\n console.log(` ${pc.dim(message)}`);\n}\n\nexport function printHeader(title: string) {\n if (jsonMode) return;\n console.log();\n console.log(` ${pc.bold(title)}`);\n console.log();\n}\n\nexport function printKeyValue(key: string, value: string, indent = 2) {\n if (jsonMode) return;\n const pad = ' '.repeat(indent);\n console.log(`${pad}${pc.dim(key + ':')} ${value}`);\n}\n\nexport function printBlank() {\n if (jsonMode) return;\n console.log();\n}\n\nexport function printDivider(width = 53) {\n if (jsonMode) return;\n console.log(` ${pc.dim('─'.repeat(width))}`);\n}\n\nexport function printLine(text: string) {\n if (jsonMode) return;\n console.log(` ${text}`);\n}\n\n\nexport function printSeparator() {\n if (jsonMode) return;\n console.log(` ${pc.dim('──────────────────────────────────────')}`);\n}\n\nexport function explorerUrl(txHash: string, network = 'mainnet'): string {\n const base = network === 'testnet'\n ? 'https://suiscan.xyz/testnet/tx'\n : 'https://suiscan.xyz/mainnet/tx';\n const suffix = '';\n return `${base}/${txHash}${suffix}`;\n}\n\nexport function handleError(error: unknown) {\n if (jsonMode) {\n const data = error instanceof Error && 'toJSON' in error\n ? (error as { toJSON(): unknown }).toJSON()\n : { error: 'UNKNOWN', message: String(error) };\n printJson(data);\n } else {\n const msg = error instanceof Error ? error.message : String(error);\n printError(msg);\n }\n process.exit(1);\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, walletExists, SafeguardEnforcer } from '@t2000/sdk';\nimport { saveSession } from '../prompts.js';\nimport {\n printSuccess, printBlank, printInfo, printLine, handleError,\n} from '../output.js';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport { homedir, platform } from 'node:os';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.json');\n\nfunction loadConfig(): Record<string, unknown> {\n try { return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8')); } catch { return {}; }\n}\n\nfunction saveConfig(config: Record<string, unknown>): void {\n if (!existsSync(CONFIG_DIR)) mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + '\\n');\n}\n\ninterface McpPlatform {\n name: string;\n path: string;\n}\n\nfunction getMcpPlatforms(): McpPlatform[] {\n const home = homedir();\n const isMac = platform() === 'darwin';\n return [\n {\n name: 'Claude Desktop',\n path: isMac\n ? join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json')\n : join(home, 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json'),\n },\n {\n name: 'Cursor',\n path: join(home, '.cursor', 'mcp.json'),\n },\n {\n name: 'Windsurf',\n path: join(home, '.codeium', 'windsurf', 'mcp_config.json'),\n },\n ];\n}\n\nasync function installMcpForPlatforms(platforms: McpPlatform[]): Promise<void> {\n const mcpConfig = { command: 't2000', args: ['mcp'] };\n\n for (const p of platforms) {\n let config: Record<string, unknown> = {};\n try {\n config = JSON.parse(await readFile(p.path, 'utf-8'));\n } catch { /* file doesn't exist yet */ }\n\n const servers = (config.mcpServers as Record<string, unknown>) ?? {};\n if (servers['t2000']) {\n printSuccess(`${p.name} already configured`);\n continue;\n }\n\n config.mcpServers = { ...servers, t2000: mcpConfig };\n const dir = dirname(p.path);\n if (!existsSync(dir)) await mkdir(dir, { recursive: true });\n await writeFile(p.path, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n printSuccess(`${p.name} configured`);\n }\n}\n\nexport function registerInit(program: Command) {\n program\n .command('init')\n .description('Create a new agent bank account — guided setup with MCP + safeguards')\n .option('--key <path>', 'Key file path')\n .option('--no-sponsor', 'Skip gas sponsorship')\n .action(async (opts: { key?: string; sponsor?: boolean }) => {\n try {\n const { checkbox, input, password } = await import('@inquirer/prompts');\n\n console.log('');\n console.log(` ┌─────────────────────────────────────────┐`);\n console.log(` │ ${pc.bold('Welcome to t2000')} │`);\n console.log(` │ A bank account for AI agents │`);\n console.log(` └─────────────────────────────────────────┘`);\n console.log('');\n\n const hasWallet = await walletExists(opts.key);\n let address = '';\n const isReturning = hasWallet;\n const totalSteps = isReturning ? 2 : 3;\n let step = 1;\n\n // ── Step 1: Wallet ──\n if (isReturning) {\n printSuccess('Existing wallet detected');\n\n const pin = await password({ message: 'Enter your PIN:' });\n if (!pin || pin.length < 4) throw new Error('PIN must be at least 4 characters');\n\n const agent = await T2000.create({ pin, keyPath: opts.key });\n address = agent.address();\n await saveSession(pin);\n printSuccess(`Wallet unlocked (${address.slice(0, 6)}...${address.slice(-4)})`);\n } else {\n console.log(` ${pc.bold(`Step ${step} of ${totalSteps}`)} — Create wallet`);\n printBlank();\n\n const pin = await password({ message: `Create PIN (min 4 chars):` });\n if (!pin || pin.length < 4) throw new Error('PIN must be at least 4 characters');\n const pinConfirm = await password({ message: 'Confirm PIN:' });\n if (pin !== pinConfirm) throw new Error('PINs do not match');\n\n printBlank();\n printInfo('Creating agent wallet...');\n\n const { address: addr, sponsored } = await T2000.init({ pin, keyPath: opts.key, sponsored: opts.sponsor });\n address = addr;\n await saveSession(pin);\n\n printSuccess('Keypair generated');\n printSuccess(`Network ${pc.dim('Sui mainnet')}`);\n printSuccess(`Gas sponsorship ${pc.dim(sponsored ? 'enabled' : 'disabled')}`);\n\n printBlank();\n printInfo('Setting up accounts...');\n printLine(\n ` ${pc.green('✓')} Checking ` +\n `${pc.green('✓')} Savings ` +\n `${pc.green('✓')} Credit ` +\n `${pc.green('✓')} Exchange ` +\n `${pc.green('✓')} Investment`\n );\n\n printBlank();\n printLine(` 🎉 ${pc.green('Bank account created')}`);\n printLine(` Address: ${pc.yellow(address.slice(0, 6) + '...' + address.slice(-4))}`);\n printBlank();\n step++;\n }\n\n // ── Step 2: MCP platforms ──\n console.log(` ${pc.bold(`Step ${step} of ${totalSteps}`)} — Connect AI platforms`);\n printBlank();\n\n const allPlatforms = getMcpPlatforms();\n\n const selectedNames = await checkbox({\n message: 'Which AI platforms do you use? (space to select)',\n choices: allPlatforms.map(p => ({\n name: p.name,\n value: p.name,\n checked: p.name !== 'Windsurf',\n })),\n });\n\n const selectedPlatforms = allPlatforms.filter(p => selectedNames.includes(p.name));\n\n printBlank();\n if (selectedPlatforms.length > 0) {\n printInfo('Adding t2000 to your AI platforms...');\n printBlank();\n await installMcpForPlatforms(selectedPlatforms);\n } else {\n printInfo('Skipped — you can add MCP later with: t2000 mcp install');\n }\n\n printBlank();\n step++;\n\n // ── Step 3: Safeguards ──\n console.log(` ${pc.bold(`Step ${step} of ${totalSteps}`)} — Set safeguards`);\n printBlank();\n\n const maxPerTx = await input({\n message: 'Max per transaction ($):',\n default: '500',\n });\n const maxDaily = await input({\n message: 'Max daily sends ($):',\n default: '1000',\n });\n\n const enforcer = new SafeguardEnforcer(CONFIG_DIR);\n enforcer.load();\n enforcer.set('maxPerTx', Number(maxPerTx));\n enforcer.set('maxDailySend', Number(maxDaily));\n\n printSuccess('Safeguards configured');\n printBlank();\n\n // ── Done ──\n const platformList = selectedPlatforms.map(p => p.name).join(' / ');\n\n console.log(` ┌─────────────────────────────────────────┐`);\n console.log(` │ ${pc.green('✓ You\\'re all set')} │`);\n console.log(` │ │`);\n\n if (selectedPlatforms.length > 0) {\n console.log(` │ ${pc.bold('Next steps:')} │`);\n console.log(` │ 1. Restart ${platformList.length > 20 ? 'your AI platform' : platformList}${' '.repeat(Math.max(0, 23 - Math.min(platformList.length, 20)))}│`);\n console.log(` │ 2. Ask: ${pc.cyan('\"What\\'s my t2000 balance?\"')} │`);\n console.log(` │ │`);\n } else {\n console.log(` │ Use the CLI directly: │`);\n console.log(` │ ${pc.cyan('t2000 balance')} │`);\n console.log(` │ ${pc.cyan('t2000 invest buy 100 SUI')} │`);\n console.log(` │ │`);\n }\n\n console.log(` │ Deposit USDC to get started: │`);\n console.log(` │ ${pc.yellow(address)} │`);\n console.log(` └─────────────────────────────────────────┘`);\n console.log('');\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import { password, confirm } from '@inquirer/prompts';\nimport { readFile, writeFile, unlink, mkdir } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst SESSION_PATH = resolve(homedir(), '.t2000', '.session');\nconst MIN_PIN_LENGTH = 4;\n\nexport async function askPin(message = 'Enter PIN:'): Promise<string> {\n const value = await password({ message });\n if (!value || value.length < MIN_PIN_LENGTH) {\n throw new Error(`PIN must be at least ${MIN_PIN_LENGTH} characters`);\n }\n return value;\n}\n\nexport async function askPinConfirm(): Promise<string> {\n const pin = await password({ message: `Create PIN (min ${MIN_PIN_LENGTH} chars):` });\n if (!pin || pin.length < MIN_PIN_LENGTH) {\n throw new Error(`PIN must be at least ${MIN_PIN_LENGTH} characters`);\n }\n\n const confirm_ = await password({ message: 'Confirm PIN:' });\n if (pin !== confirm_) {\n throw new Error('PINs do not match');\n }\n\n return pin;\n}\n\nexport async function askConfirm(message: string): Promise<boolean> {\n return confirm({ message });\n}\n\nexport function getPinFromEnv(): string | undefined {\n return process.env.T2000_PIN ?? process.env.T2000_PASSPHRASE;\n}\n\nasync function readSession(): Promise<string | undefined> {\n try {\n const content = await readFile(SESSION_PATH, 'utf-8');\n return content.trim() || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function saveSession(pin: string): Promise<void> {\n await mkdir(resolve(homedir(), '.t2000'), { recursive: true });\n await writeFile(SESSION_PATH, pin, { mode: 0o600 });\n}\n\nexport async function clearSession(): Promise<void> {\n try {\n await unlink(SESSION_PATH);\n } catch {\n // already gone\n }\n}\n\nexport async function resolvePin(opts?: { confirm?: boolean; skipSession?: boolean }): Promise<string> {\n const envPin = getPinFromEnv();\n if (envPin) return envPin;\n\n if (!opts?.skipSession) {\n const sessionPin = await readSession();\n if (sessionPin) return sessionPin;\n }\n\n const pin = opts?.confirm ? await askPinConfirm() : await askPin();\n\n if (!opts?.skipSession) {\n await saveSession(pin);\n }\n return pin;\n}\n\n/** @deprecated Use resolvePin() */\nexport const askPassphrase = askPin;\n/** @deprecated Use resolvePin() */\nexport const askPassphraseConfirm = askPinConfirm;\n/** @deprecated Use getPinFromEnv() */\nexport const getPassphraseFromEnv = getPinFromEnv;\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\nimport { truncateAddress, formatUsd } from '@t2000/sdk';\n\nconst KNOWN_ASSETS = new Set(['USDC', 'USDT', 'USDE', 'USDSUI', 'SUI']);\n\nfunction parseSendArgs(args: string[]): { amount: number; asset: string; recipient: string } {\n const filtered = args.filter(a => a.toLowerCase() !== 'to');\n if (filtered.length >= 3 && KNOWN_ASSETS.has(filtered[1].toUpperCase())) {\n return { amount: parseFloat(filtered[0]), asset: filtered[1].toUpperCase(), recipient: filtered[2] };\n }\n if (filtered.length >= 2) {\n return { amount: parseFloat(filtered[0]), asset: 'USDC', recipient: filtered[filtered.length - 1] };\n }\n throw new Error('Usage: t2000 send <amount> [asset] [to] <address_or_contact>');\n}\n\nexport function registerSend(program: Command) {\n program\n .command('send')\n .argument('<amount>', 'Amount to send')\n .argument('[args...]', 'Asset, \"to\" keyword, and recipient address or contact name')\n .description('Send USDC (or other asset) to an address or contact name')\n .option('--key <path>', 'Key file path')\n .action(async (amount: string, args: string[], opts: { key?: string }) => {\n try {\n const { amount: parsedAmount, asset, recipient } = parseSendArgs([amount, ...args]);\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.send({\n to: recipient,\n amount: parsedAmount,\n asset,\n });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n const displayTo = result.contactName\n ? `${result.contactName} (${truncateAddress(result.to)})`\n : truncateAddress(result.to);\n printSuccess(`Sent ${formatUsd(result.amount)} ${asset.toUpperCase()} → ${displayTo}`);\n printKeyValue('Gas', `${result.gasCost.toFixed(4)} ${result.gasCostUnit} (${result.gasMethod})`);\n printKeyValue('Balance', formatUsd(result.balance.available) + ' USDC');\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printHeader, printSeparator, printLine } from '../output.js';\n\ninterface LimitsData {\n maxWithdraw: string;\n maxBorrow: string;\n healthFactor: number | null;\n}\n\nasync function fetchLimits(agent: T2000): Promise<LimitsData> {\n const [maxWithdraw, maxBorrow, hf] = await Promise.all([\n agent.maxWithdraw(),\n agent.maxBorrow(),\n agent.healthFactor(),\n ]);\n\n return {\n maxWithdraw: maxWithdraw.maxAmount.toFixed(2),\n maxBorrow: maxBorrow.maxAmount.toFixed(2),\n healthFactor: hf.borrowed >= 0.01 ? hf.healthFactor : null,\n };\n}\n\nexport function registerBalance(program: Command) {\n program\n .command('balance')\n .description('Show wallet balance')\n .option('--key <path>', 'Key file path')\n .option('--show-limits', 'Include maxWithdraw, maxBorrow, and health factor')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const bal = await agent.balance();\n\n const limits = opts.showLimits ? await fetchLimits(agent) : undefined;\n\n if (isJsonMode()) {\n const output = limits\n ? { ...bal, limits }\n : bal;\n printJson(output);\n return;\n }\n\n printBlank();\n\n const stables = bal.stables ?? {};\n const usdcAmount = stables.USDC ?? 0;\n const otherStables = Object.entries(stables).filter(([k, v]) => k !== 'USDC' && v >= 0.01);\n\n printKeyValue('Available', `${formatUsd(usdcAmount)} ${pc.dim('(checking — USDC)')}`);\n for (const [symbol, amount] of otherStables) {\n printLine(` ${pc.dim(symbol)} ${formatUsd(amount)} ${pc.dim(`(use: t2000 save all — auto-converts to USDC)`)}`);\n }\n\n if (bal.savings > 0.01) {\n const positions = await agent.positions();\n const saves = positions.positions.filter(p => p.type === 'save');\n const borrows = positions.positions.filter(p => p.type === 'borrow');\n const weightedApy = saves.length > 0\n ? saves.reduce((sum, p) => sum + (p.amountUsd ?? p.amount) * p.apy, 0) / saves.reduce((sum, p) => sum + (p.amountUsd ?? p.amount), 0)\n : 0;\n const dailyEarning = bal.savings * (weightedApy / 100) / 365;\n printKeyValue('Savings', `${formatUsd(bal.savings)} ${pc.dim(`(earning ${weightedApy.toFixed(2)}% APY)`)}`);\n if (bal.debt > 0.01) {\n const borrowApy = borrows.length > 0\n ? borrows.reduce((sum, p) => sum + (p.amountUsd ?? p.amount) * p.apy, 0) / borrows.reduce((sum, p) => sum + (p.amountUsd ?? p.amount), 0)\n : 0;\n printKeyValue('Credit', `${pc.red(`-${formatUsd(bal.debt)}`)} ${pc.dim(`(${borrowApy.toFixed(2)}% APY)`)}`);\n }\n if (bal.investment > 0.01) {\n const pnlColor = bal.investmentPnL >= 0 ? pc.green : pc.red;\n const pnlSign = bal.investmentPnL >= 0 ? '+' : '';\n const pnlPct = bal.investment > 0 ? ((bal.investmentPnL / (bal.investment - bal.investmentPnL)) * 100) : 0;\n let earningInfo = '';\n try {\n const portfolio = await agent.getPortfolio();\n const earningPositions = portfolio.positions.filter(p => p.earning && p.earningApy);\n if (earningPositions.length > 0) {\n const avgApy = earningPositions.reduce((s, p) => s + (p.earningApy ?? 0) * p.currentValue, 0)\n / earningPositions.reduce((s, p) => s + p.currentValue, 0);\n earningInfo = `, earning ${avgApy.toFixed(1)}% APY`;\n }\n } catch { /* skip */ }\n printKeyValue('Investment', `${formatUsd(bal.investment)} ${pnlColor(`(${pnlSign}${pnlPct.toFixed(1)}%${earningInfo})`)}`);\n } else {\n printKeyValue('Investment', pc.dim('—'));\n }\n printSeparator();\n printKeyValue('Total', `${formatUsd(bal.total)}`);\n if (dailyEarning >= 0.005) {\n printLine(` ${pc.dim(`Earning ~${formatUsd(dailyEarning)}/day`)}`);\n }\n } else {\n if (bal.debt > 0.01) {\n printKeyValue('Credit', `${pc.red(`-${formatUsd(bal.debt)}`)}`);\n }\n if (bal.savings > 0.005) {\n printKeyValue('Savings', `${formatUsd(bal.savings)}`);\n }\n if (bal.investment > 0.01) {\n const pnlColor = bal.investmentPnL >= 0 ? pc.green : pc.red;\n const pnlSign = bal.investmentPnL >= 0 ? '+' : '';\n const pnlPct = bal.investment > 0 ? ((bal.investmentPnL / (bal.investment - bal.investmentPnL)) * 100) : 0;\n let earningInfo = '';\n try {\n const portfolio = await agent.getPortfolio();\n const earningPositions = portfolio.positions.filter(p => p.earning && p.earningApy);\n if (earningPositions.length > 0) {\n const avgApy = earningPositions.reduce((s, p) => s + (p.earningApy ?? 0) * p.currentValue, 0)\n / earningPositions.reduce((s, p) => s + p.currentValue, 0);\n earningInfo = `, earning ${avgApy.toFixed(1)}% APY`;\n }\n } catch { /* skip */ }\n printKeyValue('Investment', `${formatUsd(bal.investment)} ${pnlColor(`(${pnlSign}${pnlPct.toFixed(1)}%${earningInfo})`)}`);\n } else {\n printKeyValue('Investment', pc.dim('—'));\n }\n printSeparator();\n printKeyValue('Total', `${formatUsd(bal.total)}`);\n }\n\n if (limits) {\n printBlank();\n printHeader('Limits');\n printKeyValue('Max withdraw', `${formatUsd(Number(limits.maxWithdraw))} USDC`, 4);\n printKeyValue('Max borrow', `${formatUsd(Number(limits.maxBorrow))} USDC`, 4);\n const hfDisplay = limits.healthFactor !== null\n ? limits.healthFactor.toFixed(2)\n : `${pc.green('∞')} ${pc.dim('(no active loan)')}`;\n printKeyValue('Health factor', hfDisplay, 4);\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerAddress(program: Command) {\n program\n .command('address')\n .description('Show wallet address')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n if (isJsonMode()) {\n printJson({ address: agent.address() });\n return;\n }\n\n printBlank();\n printKeyValue('Address', agent.address());\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printHeader, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerDeposit(program: Command) {\n program\n .command('deposit')\n .description('Show funding instructions')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const info = await agent.deposit();\n\n if (isJsonMode()) {\n printJson(info);\n return;\n }\n\n printHeader('Fund your wallet');\n console.log(info.instructions);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, truncateAddress } from '@t2000/sdk';\nimport type { TransactionRecord } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printHeader, printBlank, printJson, isJsonMode, handleError, printLine, printInfo, printDivider, printKeyValue, explorerUrl } from '../output.js';\n\nconst ACTION_LABELS: Record<string, string> = {\n send: '↗ send',\n lending: '🏦 lend',\n swap: '🔄 swap',\n transaction: '📦 tx',\n};\n\nfunction relativeTime(ts: number): string {\n const diff = Date.now() - ts;\n const mins = Math.floor(diff / 60_000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n return new Date(ts).toLocaleDateString();\n}\n\nfunction formatAmount(tx: TransactionRecord): string {\n if (!tx.amount) return '';\n return pc.bold(`${tx.amount.toFixed(tx.amount < 0.01 ? 4 : 2)} ${tx.asset ?? ''}`);\n}\n\nfunction printTxSummary(tx: TransactionRecord) {\n const label = ACTION_LABELS[tx.action] ?? `📦 ${tx.action}`;\n const time = tx.timestamp ? relativeTime(tx.timestamp) : '';\n const amount = formatAmount(tx);\n const recipient = tx.recipient ? pc.dim(`→ ${truncateAddress(tx.recipient)}`) : '';\n const link = pc.dim(explorerUrl(tx.digest));\n\n printLine(`${label} ${amount} ${recipient}`);\n printLine(` ${pc.dim(truncateAddress(tx.digest))} ${pc.dim(time)}`);\n printLine(` ${link}`);\n}\n\nfunction printTxDetail(tx: TransactionRecord) {\n printHeader('Transaction Detail');\n\n const label = ACTION_LABELS[tx.action] ?? `📦 ${tx.action}`;\n printKeyValue('Type', label);\n printKeyValue('Digest', tx.digest);\n if (tx.amount) printKeyValue('Amount', `${tx.amount.toFixed(tx.amount < 0.01 ? 6 : 4)} ${tx.asset ?? ''}`);\n if (tx.recipient) printKeyValue('Recipient', tx.recipient);\n if (tx.timestamp) {\n printKeyValue('Time', `${new Date(tx.timestamp).toLocaleString()} (${relativeTime(tx.timestamp)})`);\n }\n if (tx.gasCost !== undefined) printKeyValue('Gas', `${tx.gasCost.toFixed(6)} SUI`);\n printBlank();\n printKeyValue('Explorer', explorerUrl(tx.digest));\n printBlank();\n}\n\nexport function registerHistory(program: Command) {\n program\n .command('history')\n .description('Show transaction history, or detail for a specific digest')\n .argument('[digest]', 'Transaction digest to view details')\n .option('--limit <n>', 'Number of transactions', '20')\n .option('--key <path>', 'Key file path')\n .action(async (digest: string | undefined, opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n if (digest) {\n const tx = await agent.transactionDetail(digest);\n if (!tx) {\n handleError(new Error(`Transaction not found: ${digest}`));\n return;\n }\n if (isJsonMode()) {\n printJson(tx);\n return;\n }\n printTxDetail(tx);\n return;\n }\n\n const txns = await agent.history({ limit: parseInt(opts.limit, 10) });\n\n if (isJsonMode()) {\n printJson(txns);\n return;\n }\n\n printHeader('Transaction History');\n\n if (txns.length === 0) {\n printInfo('No transactions yet.');\n } else {\n for (const tx of txns) {\n printTxSummary(tx);\n printBlank();\n }\n }\n\n printDivider();\n printInfo(`${txns.length} transaction${txns.length === 1 ? '' : 's'} shown`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin, askConfirm } from '../prompts.js';\nimport { printSuccess, printBlank, printInfo, printJson, isJsonMode, handleError, printError } from '../output.js';\n\nconst LOCKFILE = resolve(homedir(), '.t2000', '.pin-lock');\nconst MAX_ATTEMPTS = 5;\nconst LOCKOUT_MS = 5 * 60 * 1000;\n\ninterface LockState {\n attempts: number;\n lockedUntil: number;\n}\n\nasync function getLockState(): Promise<LockState> {\n try {\n const data = JSON.parse(await readFile(LOCKFILE, 'utf-8'));\n return data as LockState;\n } catch {\n return { attempts: 0, lockedUntil: 0 };\n }\n}\n\nasync function setLockState(state: LockState): Promise<void> {\n await mkdir(resolve(homedir(), '.t2000'), { recursive: true });\n await writeFile(LOCKFILE, JSON.stringify(state), { mode: 0o600 });\n}\n\nexport function registerExport(program: Command) {\n program\n .command('export')\n .description('Export private key (raw Ed25519 hex)')\n .option('--key <path>', 'Key file path')\n .option('--yes', 'Skip confirmation')\n .action(async (opts) => {\n try {\n const lock = await getLockState();\n if (lock.lockedUntil > Date.now()) {\n const remainSec = Math.ceil((lock.lockedUntil - Date.now()) / 1000);\n printError(`Too many failed PIN attempts. Try again in ${remainSec}s.`);\n return;\n }\n\n if (!opts.yes && !isJsonMode()) {\n const proceed = await askConfirm(\n 'WARNING: This will display your raw private key. Anyone with this key controls your wallet. Continue?',\n );\n if (!proceed) return;\n }\n\n const pin = await resolvePin();\n\n let agent;\n try {\n agent = await T2000.create({ pin, keyPath: opts.key });\n } catch (error) {\n const msg = error instanceof Error ? error.message : '';\n if (msg.includes('Invalid PIN')) {\n const newAttempts = lock.attempts + 1;\n if (newAttempts >= MAX_ATTEMPTS) {\n await setLockState({ attempts: newAttempts, lockedUntil: Date.now() + LOCKOUT_MS });\n printError(`Invalid PIN. Account locked for 5 minutes (${newAttempts} failed attempts).`);\n } else {\n await setLockState({ attempts: newAttempts, lockedUntil: 0 });\n printError(`Invalid PIN. ${MAX_ATTEMPTS - newAttempts} attempts remaining.`);\n }\n return;\n }\n throw error;\n }\n\n await setLockState({ attempts: 0, lockedUntil: 0 });\n\n const hex = agent.exportKey();\n\n if (isJsonMode()) {\n printJson({ privateKey: hex, format: 'ed25519_hex' });\n return;\n }\n\n printBlank();\n printSuccess('Private key (Ed25519, hex):');\n console.log(` ${hex}`);\n printBlank();\n printInfo('Not a BIP39 mnemonic. Store securely and never share.');\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, keypairFromPrivateKey, saveKey } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\nimport { password } from '@inquirer/prompts';\n\nexport function registerImport(program: Command) {\n program\n .command('import')\n .description('Import a wallet from private key')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n let privateKey: string;\n if (process.env.T2000_PRIVATE_KEY) {\n privateKey = process.env.T2000_PRIVATE_KEY;\n } else {\n privateKey = await password({ message: 'Enter private key (hex):' });\n }\n\n if (!privateKey) throw new Error('Private key is required');\n\n const pin = await resolvePin({ confirm: true });\n\n const keypair = keypairFromPrivateKey(privateKey);\n const address = keypair.getPublicKey().toSuiAddress();\n await saveKey(keypair, pin, opts.key);\n\n if (isJsonMode()) {\n printJson({ address, imported: true });\n return;\n }\n\n printBlank();\n printSuccess('Wallet imported (encrypted)');\n printKeyValue('Address', address);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerSave(program: Command) {\n const action = async (amountStr: string, opts: { key?: string; protocol?: string }) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n let gasManagerUsdc = 0;\n agent.on('gasAutoTopUp', (data) => {\n gasManagerUsdc = data.usdcSpent;\n });\n\n const result = await agent.save({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n\n if (gasManagerUsdc > 0) {\n printSuccess(`Gas manager: ${pc.yellow(formatUsd(gasManagerUsdc))} USDC → SUI`);\n }\n\n const protocolName = opts.protocol ?? 'best rate';\n printSuccess(`Saved ${pc.yellow(formatUsd(result.amount))} USDC to ${protocolName}`);\n\n if (result.fee > 0) {\n const feeRate = (result.fee / result.amount * 100).toFixed(1);\n printSuccess(`Protocol fee: ${pc.dim(`${formatUsd(result.fee)} USDC (${feeRate}%)`)}`);\n }\n\n printSuccess(`Current APY: ${pc.green(`${result.apy.toFixed(2)}%`)}`);\n\n printSuccess(`Savings balance: ${pc.yellow(formatUsd(result.savingsBalance))} USDC`);\n\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n };\n\n program\n .command('save')\n .description('Deposit USDC into savings')\n .argument('<amount>', 'Amount to save (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(action);\n\n program\n .command('supply')\n .description('Deposit USDC into savings (alias for save)')\n .argument('<amount>', 'Amount to save (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(action);\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerWithdraw(program: Command) {\n program\n .command('withdraw')\n .description('Withdraw USDC from savings')\n .argument('<amount>', 'Amount to withdraw (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(async (amountStr, opts) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.withdraw({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Withdrew ${formatUsd(result.amount)} USDC`);\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printWarning, explorerUrl } from '../output.js';\n\nexport function registerBorrow(program: Command) {\n program\n .command('borrow')\n .description('Borrow USDC against savings collateral')\n .argument('<amount>', 'Amount to borrow')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, opts) => {\n try {\n const amount = parseFloat(amountStr);\n if (isNaN(amount) || amount <= 0) {\n throw new Error('Amount must be a positive number');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const maxResult = await agent.maxBorrow();\n if (amount > maxResult.maxAmount) {\n printWarning(`Max safe borrow: ${formatUsd(maxResult.maxAmount)} (HF ${maxResult.currentHF.toFixed(2)} → min 1.5)`);\n return;\n }\n\n const result = await agent.borrow({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Borrowed ${formatUsd(amount)} USDC`);\n printKeyValue('Health Factor', result.healthFactor.toFixed(2));\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerRepay(program: Command) {\n program\n .command('repay')\n .description('Repay borrowed USDC')\n .argument('<amount>', 'Amount to repay (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, opts) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.repay({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Repaid ${formatUsd(result.amount)} USDC`);\n printKeyValue('Remaining Debt', formatUsd(result.remainingDebt));\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printSuccess, printWarning, printError } from '../output.js';\n\nexport function registerHealth(program: Command) {\n program\n .command('health')\n .description('Check savings health factor')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const hf = await agent.healthFactor();\n\n if (isJsonMode()) {\n printJson(hf);\n return;\n }\n\n printBlank();\n\n const noActiveLoan = hf.borrowed < 0.01;\n const hfStr = (hf.healthFactor === Infinity || noActiveLoan) ? '∞' : hf.healthFactor.toFixed(2);\n if (hf.healthFactor >= 2.0) {\n printSuccess(`Health Factor: ${hfStr} (healthy)`);\n } else if (hf.healthFactor >= 1.5) {\n printWarning(`Health Factor: ${hfStr} (moderate)`);\n } else if (hf.healthFactor >= 1.2) {\n printWarning(`Health Factor: ${hfStr} (low)`);\n } else {\n printError(`Health Factor: ${hfStr} (CRITICAL)`);\n }\n\n printBlank();\n printKeyValue('Supplied', `${formatUsd(hf.supplied)} USDC`);\n printKeyValue('Borrowed', `${formatUsd(hf.borrowed)} USDC`);\n printKeyValue('Max Borrow', `${formatUsd(hf.maxBorrow)} USDC`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, SUPPORTED_ASSETS, INVESTMENT_ASSETS, STABLE_ASSETS } from '@t2000/sdk';\nimport type { SupportedAsset } from '@t2000/sdk';\n\nconst INVEST_ASSETS = Object.keys(INVESTMENT_ASSETS) as SupportedAsset[];\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine, printDivider } from '../output.js';\n\nexport function registerRates(program: Command) {\n program\n .command('rates')\n .description('Show current APY rates across protocols and stablecoins')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const allRates = await agent.allRatesAcrossAssets();\n\n if (isJsonMode()) {\n printJson(allRates);\n return;\n }\n\n printBlank();\n\n if (allRates.length > 0) {\n const best = allRates.reduce((a, b) => b.rates.saveApy > a.rates.saveApy ? b : a);\n const bestDisplay = SUPPORTED_ASSETS[best.asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? best.asset;\n printLine(pc.bold(pc.green(`Best yield: ${best.rates.saveApy.toFixed(2)}% APY`)) + pc.dim(` (${bestDisplay} on ${best.protocol})`));\n printBlank();\n }\n\n for (const asset of STABLE_ASSETS) {\n const assetRates = allRates.filter(r => r.asset === asset);\n if (assetRates.length === 0) continue;\n\n const display = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? asset;\n printLine(pc.bold(display));\n printDivider();\n for (const entry of assetRates) {\n printKeyValue(entry.protocol, `Save ${entry.rates.saveApy.toFixed(2)}% Borrow ${entry.rates.borrowApy.toFixed(2)}%`);\n }\n printBlank();\n }\n\n const investRates = allRates.filter(r => INVEST_ASSETS.includes(r.asset as SupportedAsset));\n if (investRates.length > 0) {\n printLine(pc.bold('Investment Assets'));\n printDivider();\n for (const asset of INVEST_ASSETS) {\n const assetRates = investRates.filter(r => r.asset === asset);\n if (assetRates.length === 0) continue;\n const display = SUPPORTED_ASSETS[asset]?.displayName ?? asset;\n for (const entry of assetRates) {\n printKeyValue(`${display} (${entry.protocol})`, `Lend ${entry.rates.saveApy.toFixed(2)}%`);\n }\n }\n printBlank();\n }\n\n if (allRates.length === 0) {\n printInfo('No protocol rates available');\n printBlank();\n }\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd, formatAssetAmount } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine, printDivider } from '../output.js';\n\nexport function registerPositions(program: Command) {\n program\n .command('positions')\n .description('Show savings & borrow positions across all protocols and assets')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.positions();\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n let hasRewards = false;\n const rewardsByKey = new Map<string, boolean>();\n try {\n const pending = await agent.getPendingRewards();\n for (const r of pending) {\n rewardsByKey.set(`${r.protocol}:${r.asset}`, true);\n hasRewards = true;\n }\n } catch { /* skip */ }\n\n printBlank();\n if (result.positions.length === 0) {\n printInfo('No positions. Use `t2000 save <amount>` to start earning.');\n } else {\n const saves = result.positions.filter(p => p.type === 'save');\n const borrows = result.positions.filter(p => p.type === 'borrow');\n\n if (saves.length > 0) {\n printLine(pc.bold('Savings'));\n printDivider();\n for (const pos of saves) {\n const earning = rewardsByKey.has(`${pos.protocol}:${pos.asset}`)\n ? ` ${pc.yellow('+rewards')}`\n : '';\n const usd = formatUsd(pos.amountUsd ?? pos.amount);\n printKeyValue(pos.protocol, `${formatAssetAmount(pos.amount, pos.asset)} ${pos.asset} (${usd}) @ ${pos.apy.toFixed(2)}% APY${earning}`);\n }\n const totalSaved = saves.reduce((s, p) => s + (p.amountUsd ?? p.amount), 0);\n if (saves.length > 1) {\n printKeyValue('Total', formatUsd(totalSaved));\n }\n if (hasRewards) {\n printLine(` ${pc.dim('Run claim-rewards to collect and convert to USDC')}`);\n }\n printBlank();\n }\n\n if (borrows.length > 0) {\n printLine(pc.bold('Borrows'));\n printDivider();\n for (const pos of borrows) {\n const usd = formatUsd(pos.amountUsd ?? pos.amount);\n printKeyValue(pos.protocol, `${formatAssetAmount(pos.amount, pos.asset)} ${pos.asset} (${usd}) @ ${pos.apy.toFixed(2)}% APY`);\n }\n const totalBorrowed = borrows.reduce((s, p) => s + (p.amountUsd ?? p.amount), 0);\n if (borrows.length > 1) {\n printKeyValue('Total', formatUsd(totalBorrowed));\n }\n printBlank();\n }\n }\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd, formatAssetAmount } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printLine } from '../output.js';\n\nexport function registerEarnings(program: Command) {\n program\n .command('earnings')\n .description('Show yield earned to date')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.earnings();\n const pos = await agent.positions();\n const savePositions = pos.positions.filter((p) => p.type === 'save');\n\n if (isJsonMode()) {\n printJson({ ...result, positions: savePositions });\n return;\n }\n\n printBlank();\n printKeyValue('Total Saved', formatUsd(result.supplied));\n\n if (savePositions.length > 0) {\n for (const p of savePositions) {\n printLine(` ${pc.dim('•')} ${formatAssetAmount(p.amount, p.asset)} ${p.asset} (${formatUsd(p.amountUsd ?? p.amount)}) on ${p.protocol} @ ${p.apy.toFixed(2)}% APY`);\n }\n }\n\n printKeyValue('Blended APY', `${result.currentApy.toFixed(2)}%`);\n printKeyValue('Daily Yield', `~${formatUsd(result.dailyEarning)}/day`);\n printKeyValue('Est. Earned', `~${formatUsd(result.totalYieldEarned)}`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd, formatAssetAmount } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine } from '../output.js';\n\nexport function registerFundStatus(program: Command) {\n program\n .command('fund-status')\n .description('Full savings summary')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.fundStatus();\n const pos = await agent.positions();\n const savePositions = pos.positions.filter((p) => p.type === 'save');\n\n if (isJsonMode()) {\n printJson({ ...result, positions: savePositions });\n return;\n }\n\n printBlank();\n if (result.supplied > 0) {\n printSuccess('Savings: ACTIVE');\n } else {\n printInfo('Savings: INACTIVE — run `t2000 save <amount>` to start earning');\n }\n printBlank();\n printKeyValue('Total Saved', formatUsd(result.supplied));\n\n if (savePositions.length > 0) {\n for (const p of savePositions) {\n printLine(` ${pc.dim('•')} ${formatAssetAmount(p.amount, p.asset)} ${p.asset} (${formatUsd(p.amountUsd ?? p.amount)}) on ${p.protocol} @ ${p.apy.toFixed(2)}% APY`);\n }\n }\n\n printKeyValue('Blended APY', `${result.apy.toFixed(2)}%`);\n printKeyValue('Earned today', `~${formatUsd(result.earnedToday)}`);\n printKeyValue('Earned all time', `~${formatUsd(result.earnedAllTime)}`);\n printKeyValue('Monthly projected', `~${formatUsd(result.projectedMonthly)}/month`);\n printBlank();\n if (result.supplied > 0) {\n printInfo('Withdraw anytime: t2000 withdraw <amount>');\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { SafeguardEnforcer } from '@t2000/sdk';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printSuccess, printInfo, printHeader, printDivider } from '../output.js';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.json');\n\nconst SAFEGUARD_KEYS = new Set(['locked', 'maxPerTx', 'maxDailySend', 'dailyUsed', 'dailyResetDate', 'alertThreshold', 'maxLeverage', 'maxPositionSize']);\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let current = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!(part in current) || typeof current[part] !== 'object' || current[part] === null) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = value;\n}\n\nfunction loadConfig(): Record<string, unknown> {\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nfunction saveConfig(config: Record<string, unknown>): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + '\\n');\n}\n\nfunction formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\nexport function registerConfig(program: Command) {\n const configCmd = program\n .command('config')\n .description('Show or set configuration');\n\n configCmd\n .command('show')\n .description('Show safeguard settings')\n .action(() => {\n try {\n const enforcer = new SafeguardEnforcer(CONFIG_DIR);\n enforcer.load();\n const config = enforcer.getConfig();\n\n if (isJsonMode()) {\n printJson({\n locked: config.locked,\n maxPerTx: config.maxPerTx,\n maxDailySend: config.maxDailySend,\n dailyUsed: config.dailyUsed,\n });\n return;\n }\n\n printHeader('Agent Safeguards');\n printDivider();\n printKeyValue('Locked', config.locked ? 'Yes' : 'No');\n printKeyValue('Per-transaction', config.maxPerTx > 0 ? formatUsd(config.maxPerTx) : 'Unlimited');\n printKeyValue('Daily send limit', config.maxDailySend > 0\n ? `${formatUsd(config.maxDailySend)} (${formatUsd(config.dailyUsed)} used today)`\n : 'Unlimited');\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n configCmd\n .command('get')\n .argument('[key]', 'Config key to get, supports dot notation (e.g. llm.provider)')\n .action((key?: string) => {\n try {\n const config = loadConfig();\n\n if (key) {\n const value = key.includes('.') ? getNestedValue(config, key) : config[key];\n if (isJsonMode()) {\n printJson({ [key]: value });\n return;\n }\n printBlank();\n const display = typeof value === 'object' ? JSON.stringify(value) : String(value ?? '(not set)');\n printKeyValue(key, display);\n } else {\n if (isJsonMode()) {\n printJson(config);\n return;\n }\n printBlank();\n if (Object.keys(config).length === 0) {\n printInfo('No configuration set.');\n } else {\n for (const [k, v] of Object.entries(config)) {\n const display = typeof v === 'object' ? JSON.stringify(v) : String(v);\n printKeyValue(k, display);\n }\n }\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n configCmd\n .command('set')\n .argument('<key>', 'Config key, supports dot notation (e.g. llm.provider)')\n .argument('<value>', 'Config value')\n .action((key: string, value: string) => {\n try {\n const leafKey = key.includes('.') ? key.split('.').pop()! : key;\n\n if (SAFEGUARD_KEYS.has(leafKey) && !key.includes('.')) {\n const enforcer = new SafeguardEnforcer(CONFIG_DIR);\n enforcer.load();\n\n let parsed: unknown = value;\n if (value === 'true') parsed = true;\n else if (value === 'false') parsed = false;\n else if (!isNaN(Number(value)) && value.trim() !== '') parsed = Number(value);\n\n enforcer.set(key, parsed);\n\n if (isJsonMode()) {\n printJson({ [key]: parsed });\n return;\n }\n\n printBlank();\n printSuccess(`Set ${key} = ${String(parsed)}`);\n printBlank();\n return;\n }\n\n const config = loadConfig();\n\n let parsed: unknown = value;\n if (value === 'true') parsed = true;\n else if (value === 'false') parsed = false;\n else if (!isNaN(Number(value)) && value.trim() !== '') parsed = Number(value);\n // Handle JSON arrays (e.g. allowedUsers)\n if (value.startsWith('[') || value.startsWith('{')) {\n try { parsed = JSON.parse(value); } catch { /* keep as string */ }\n }\n\n if (key.includes('.')) {\n setNestedValue(config, key, parsed);\n } else {\n config[key] = parsed;\n }\n saveConfig(config);\n\n if (isJsonMode()) {\n printJson({ [key]: parsed });\n return;\n }\n\n printBlank();\n printSuccess(`Set ${key} = ${String(parsed)}`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { randomBytes } from 'node:crypto';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { handleError } from '../output.js';\nimport { streamSSE } from 'hono/streaming';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\nconst TOKEN_PATH = join(CONFIG_DIR, 'config.json');\n\nfunction generateToken(): string {\n return `t2k_${randomBytes(24).toString('hex')}`;\n}\n\nfunction saveToken(token: string): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n let config: Record<string, unknown> = {};\n try {\n config = JSON.parse(readFileSync(TOKEN_PATH, 'utf-8'));\n } catch { /* empty */ }\n config.authToken = token;\n writeFileSync(TOKEN_PATH, JSON.stringify(config, null, 2) + '\\n');\n}\n\nfunction envelope(data: unknown) {\n return { success: true, data, timestamp: Math.floor(Date.now() / 1000) };\n}\n\nfunction errorResponse(code: string, message: string, data?: unknown, retryable = false) {\n return {\n success: false,\n error: { code, message, data, retryable },\n timestamp: Math.floor(Date.now() / 1000),\n };\n}\n\nexport function registerServe(program: Command) {\n program\n .command('serve')\n .description('Start HTTP API server')\n .option('--port <port>', 'Port number', '3001')\n .option('--rate-limit <rps>', 'Max requests per second', '10')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { port: string; rateLimit: string; key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const port = parseInt(opts.port, 10);\n const rateLimit = parseInt(opts.rateLimit, 10);\n\n const token = generateToken();\n saveToken(token);\n\n const app = buildApp(agent, token, rateLimit);\n\n serve({ fetch: app.fetch, port });\n\n console.log(` ✓ API server running on http://localhost:${port}`);\n console.log(` ✓ Auth token: ${token}`);\n console.log('');\n console.log(' Endpoints:');\n console.log(' GET /v1/balance POST /v1/send');\n console.log(' GET /v1/address POST /v1/save');\n console.log(' GET /v1/history POST /v1/withdraw');\n console.log(' GET /v1/earnings POST /v1/borrow');\n console.log(' GET /v1/rates POST /v1/repay');\n console.log(' GET /v1/health-factor');\n console.log(' GET /v1/positions');\n console.log(' GET /v1/events (SSE)');\n console.log('');\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction buildApp(agent: T2000, authToken: string, rateLimit: number): Hono {\n const app = new Hono();\n\n app.use('*', cors());\n\n // Rate limiting (sliding window)\n const requestLog: number[] = [];\n app.use('/v1/*', async (c, next) => {\n const now = Date.now();\n const windowMs = 1000;\n while (requestLog.length > 0 && requestLog[0]! < now - windowMs) {\n requestLog.shift();\n }\n if (requestLog.length >= rateLimit) {\n c.status(429);\n c.header('Retry-After', '1');\n return c.json(errorResponse('RATE_LIMITED', 'Too many requests', null, true));\n }\n requestLog.push(now);\n await next();\n });\n\n // Bearer auth\n app.use('/v1/*', async (c, next) => {\n const auth = c.req.header('Authorization');\n if (!auth || auth !== `Bearer ${authToken}`) {\n c.status(401);\n return c.json(errorResponse('UNAUTHORIZED', 'Invalid or missing Bearer token'));\n }\n await next();\n });\n\n // --- GET endpoints ---\n\n app.get('/v1/address', (c) => {\n return c.json(envelope({ address: agent.address }));\n });\n\n app.get('/v1/balance', async (c) => {\n try {\n const balance = await agent.balance();\n return c.json(envelope(balance));\n } catch (err) {\n return c.json(errorResponse('BALANCE_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/history', async (c) => {\n try {\n const limit = parseInt(c.req.query('limit') ?? '20', 10);\n const history = await agent.history({ limit });\n return c.json(envelope(history));\n } catch (err) {\n return c.json(errorResponse('HISTORY_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/deposit', (c) => {\n return c.json(envelope({\n address: agent.address,\n network: 'mainnet',\n instructions: 'Send USDC to this address on Sui mainnet.',\n }));\n });\n\n app.get('/v1/earnings', async (c) => {\n try {\n const earnings = await agent.earnings();\n return c.json(envelope(earnings));\n } catch (err) {\n return c.json(errorResponse('EARNINGS_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/rates', async (c) => {\n try {\n const rates = await agent.rates();\n return c.json(envelope(rates));\n } catch (err) {\n return c.json(errorResponse('RATES_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/health-factor', async (c) => {\n try {\n const hf = await agent.healthFactor();\n return c.json(envelope(hf));\n } catch (err) {\n return c.json(errorResponse('HEALTH_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/max-withdraw', async (c) => {\n try {\n const result = await agent.maxWithdraw();\n return c.json(envelope(result));\n } catch (err) {\n return c.json(errorResponse('MAX_WITHDRAW_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/max-borrow', async (c) => {\n try {\n const result = await agent.maxBorrow();\n return c.json(envelope(result));\n } catch (err) {\n return c.json(errorResponse('MAX_BORROW_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/positions', async (c) => {\n try {\n const positions = await agent.positions();\n return c.json(envelope(positions));\n } catch (err) {\n return c.json(errorResponse('POSITIONS_ERROR', errMsg(err)), 500);\n }\n });\n\n // --- POST endpoints ---\n\n app.post('/v1/send', async (c) => {\n try {\n const body = await c.req.json();\n const { to, amount, asset } = body as { to: string; amount: number; asset?: string };\n if (!to || !amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: to, amount'));\n }\n const result = await agent.send({ to, amount, asset: asset ?? 'USDC' });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/save', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/supply', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/withdraw', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number | 'all' };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.withdraw({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/borrow', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.borrow({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/repay', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number | 'all' };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.repay({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n // --- SSE endpoint ---\n\n app.get('/v1/events', async (c) => {\n const subscribeParam = c.req.query('subscribe') ?? 'yield,balanceChange,healthWarning';\n const subscriptions = new Set(subscribeParam.split(',').map((s) => s.trim()));\n\n return streamSSE(c, async (stream) => {\n const handlers: Array<{ event: string; off: () => void }> = [];\n\n for (const eventName of subscriptions) {\n const handler = (data: unknown) => {\n stream.writeSSE({ event: eventName, data: JSON.stringify(data) }).catch(() => {});\n };\n agent.on(eventName as never, handler as never);\n handlers.push({\n event: eventName,\n off: () => agent.off(eventName as never, handler as never),\n });\n }\n\n // Keep alive\n const keepAlive = setInterval(() => {\n stream.writeSSE({ event: 'ping', data: '{}' }).catch(() => {});\n }, 30_000);\n\n stream.onAbort(() => {\n clearInterval(keepAlive);\n for (const h of handlers) h.off();\n });\n\n // Block forever — SSE streams stay open\n await new Promise<void>(() => {});\n });\n });\n\n return app;\n}\n\nfunction errMsg(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nfunction handleApiError(err: unknown) {\n const t2kErr = err as { code?: string; message?: string; data?: unknown };\n return errorResponse(\n t2kErr.code ?? 'UNKNOWN',\n t2kErr.message ?? errMsg(err),\n t2kErr.data,\n isRetryable(t2kErr.code),\n );\n}\n\nfunction getStatusCode(err: unknown): number {\n const code = (err as { code?: string }).code;\n if (!code) return 500;\n if (code === 'INSUFFICIENT_BALANCE') return 400;\n if (code === 'INVALID_ADDRESS') return 400;\n if (code === 'WITHDRAW_WOULD_LIQUIDATE') return 400;\n if (code === 'NO_COLLATERAL') return 400;\n return 500;\n}\n\nfunction isRetryable(code?: string): boolean {\n if (!code) return false;\n return ['RPC_ERROR', 'RPC_UNREACHABLE', 'SPONSOR_UNAVAILABLE', 'AUTO_TOPUP_FAILED'].includes(code);\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printBlank,\n printJson,\n printInfo,\n isJsonMode,\n handleError,\n} from '../output.js';\n\nexport function registerPay(program: Command) {\n program\n .command('pay <url>')\n .description('Pay for an MPP-protected API resource')\n .option('--key <path>', 'Key file path')\n .option('--method <method>', 'HTTP method (GET, POST, PUT)', 'GET')\n .option('--data <json>', 'Request body for POST/PUT')\n .option('--header <key=value>', 'Additional HTTP header (repeatable)', collectHeaders, {})\n .option('--max-price <amount>', 'Max USDC price to auto-approve', '1.00')\n .action(async (url: string, opts: {\n key?: string;\n method: string;\n data?: string;\n header: Record<string, string>;\n maxPrice: string;\n }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const startTime = Date.now();\n const method = opts.data && opts.method === 'GET' ? 'POST' : opts.method;\n\n if (!isJsonMode()) {\n printBlank();\n printInfo(`→ ${method} ${url}`);\n }\n\n const maxPrice = parseFloat(opts.maxPrice);\n if (isNaN(maxPrice) || maxPrice <= 0) {\n throw new Error(`Invalid --max-price: \"${opts.maxPrice}\". Must be a positive number.`);\n }\n\n const result = await agent.pay({\n url,\n method,\n headers: opts.header,\n body: opts.data,\n maxPrice,\n });\n\n const elapsed = Date.now() - startTime;\n\n if (!isJsonMode()) {\n if (result.paid && result.receipt) {\n printSuccess(`Paid via MPP (tx: ${result.receipt.reference.slice(0, 10)}...)`);\n }\n printInfo(`← ${result.status} OK ${pc.dim(`[${elapsed}ms]`)}`);\n }\n\n if (isJsonMode()) {\n printJson({\n status: result.status,\n url,\n elapsed,\n paid: result.paid,\n cost: result.cost,\n receipt: result.receipt,\n body: result.body,\n });\n } else {\n printBlank();\n if (typeof result.body === 'string') {\n console.log(result.body);\n } else {\n console.log(JSON.stringify(result.body, null, 2));\n }\n printBlank();\n }\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction collectHeaders(value: string, previous: Record<string, string>): Record<string, string> {\n const [key, ...rest] = value.split('=');\n if (key && rest.length > 0) {\n previous[key.trim()] = rest.join('=').trim();\n }\n return previous;\n}\n","import type { Command } from 'commander';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { SafeguardEnforcer } from '@t2000/sdk';\nimport { clearSession, resolvePin, saveSession } from '../prompts.js';\nimport { printSuccess, printBlank, printJson, printInfo, isJsonMode, handleError, printError } from '../output.js';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\n\nexport function registerLock(program: Command) {\n program\n .command('lock')\n .description('Lock agent — freeze all operations')\n .action(async () => {\n try {\n const enforcer = new SafeguardEnforcer(CONFIG_DIR);\n enforcer.load();\n enforcer.lock();\n await clearSession();\n\n if (isJsonMode()) {\n printJson({ locked: true });\n return;\n }\n\n printBlank();\n printSuccess('Agent locked. All operations frozen.');\n printInfo('Run: t2000 unlock (requires PIN)');\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n program\n .command('unlock')\n .description('Unlock agent — resume operations')\n .action(async () => {\n try {\n const { T2000 } = await import('@t2000/sdk');\n const MAX_ATTEMPTS = 3;\n\n let pin: string | undefined;\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n pin = await resolvePin({ skipSession: true });\n if (!pin) {\n throw new Error('PIN required to unlock agent');\n }\n\n try {\n await T2000.create({ pin });\n break;\n } catch (error) {\n const msg = error instanceof Error ? error.message : '';\n if (msg.includes('Invalid PIN')) {\n const remaining = MAX_ATTEMPTS - attempt;\n if (remaining > 0) {\n printError(`Invalid PIN. ${remaining} attempt${remaining > 1 ? 's' : ''} remaining.`);\n pin = undefined;\n continue;\n }\n printError('Invalid PIN. No attempts remaining.');\n return;\n }\n throw error;\n }\n }\n\n if (!pin) return;\n\n await saveSession(pin);\n\n const enforcer = new SafeguardEnforcer(CONFIG_DIR);\n enforcer.load();\n enforcer.unlock();\n\n if (isJsonMode()) {\n printJson({ locked: false });\n return;\n }\n\n const config = enforcer.getConfig();\n printBlank();\n printSuccess('Agent unlocked. Operations resumed.');\n if (config.maxPerTx > 0 || config.maxDailySend > 0) {\n const limits: string[] = [];\n if (config.maxPerTx > 0) limits.push(`maxPerTx=$${config.maxPerTx}`);\n if (config.maxDailySend > 0) limits.push(`maxDailySend=$${config.maxDailySend}`);\n printInfo(`Active safeguards: ${limits.join(', ')}`);\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, MIST_PER_SUI } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printError,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printHeader,\n printInfo,\n printLine,\n printDivider,\n explorerUrl,\n} from '../output.js';\nimport pc from 'picocolors';\n\nfunction formatSui(mist: bigint): string {\n return (Number(mist) / Number(MIST_PER_SUI)).toFixed(2);\n}\n\nexport function registerSentinel(program: Command) {\n const sentinel = program\n .command('sentinel')\n .description('Interact with Sui Sentinel — attack AI agents, earn bounties');\n\n sentinel\n .command('list')\n .description('List active sentinels with prize pools')\n .action(async () => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin });\n const sentinels = await agent.sentinelList();\n\n if (isJsonMode()) {\n printJson(sentinels.map((s) => ({\n ...s,\n attackFee: s.attackFee.toString(),\n prizePool: s.prizePool.toString(),\n })));\n return;\n }\n\n if (sentinels.length === 0) {\n printBlank();\n printInfo('No active sentinels found.');\n printBlank();\n return;\n }\n\n printHeader('Active Sentinels');\n\n sentinels.forEach((s) => {\n const pool = `${formatSui(s.prizePool)} SUI`.padEnd(12);\n const fee = `${formatSui(s.attackFee)} SUI`.padEnd(12);\n printLine(` ${s.name}`);\n printLine(` ${pc.dim(`Pool: ${pool}Fee: ${fee}Attacks: ${s.totalAttacks}`)}`);\n printLine(` ${pc.dim(s.objectId)}`);\n printBlank();\n });\n\n printBlank();\n printInfo(`${sentinels.length} active sentinel${sentinels.length === 1 ? '' : 's'}`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n sentinel\n .command('info')\n .description('Show details for a sentinel')\n .argument('<id>', 'Sentinel object ID')\n .action(async (id: string) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin });\n const s = await agent.sentinelInfo(id);\n\n if (isJsonMode()) {\n printJson({\n ...s,\n attackFee: s.attackFee.toString(),\n prizePool: s.prizePool.toString(),\n });\n return;\n }\n\n printHeader(s.name);\n printKeyValue('Object ID', s.objectId);\n printKeyValue('Agent ID', s.id);\n printKeyValue('Model', s.model);\n printKeyValue('State', s.state);\n printKeyValue('Attack Fee', `${formatSui(s.attackFee)} SUI`);\n printKeyValue('Prize Pool', `${formatSui(s.prizePool)} SUI`);\n printKeyValue('Total Attacks', String(s.totalAttacks));\n printKeyValue('Breaches', String(s.successfulBreaches));\n if (s.systemPrompt) {\n printBlank();\n printKeyValue('System Prompt', '');\n printLine(` ${pc.dim(s.systemPrompt.slice(0, 500))}`);\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n sentinel\n .command('attack')\n .description('Attack a sentinel with a prompt (costs SUI)')\n .argument('<id>', 'Sentinel object ID')\n .argument('[prompt]', 'Attack prompt')\n .option('--fee <sui>', 'Override attack fee in SUI')\n .option('--key <path>', 'Key file path')\n .action(async (id: string, prompt: string | undefined, opts: { fee?: string; key?: string }) => {\n try {\n if (!prompt) {\n throw new Error('Prompt is required. Usage: t2000 sentinel attack <id> \"your prompt\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const feeMist = opts.fee\n ? BigInt(Math.round(parseFloat(opts.fee) * Number(MIST_PER_SUI)))\n : undefined;\n\n if (isJsonMode()) {\n const result = await agent.sentinelAttack(id, prompt, feeMist);\n printJson({\n ...result,\n verdict: {\n ...result.verdict,\n },\n });\n return;\n }\n\n printBlank();\n printLine(` ${pc.dim('⏳')} Requesting attack...`);\n\n const result = await agent.sentinelAttack(id, prompt, feeMist);\n\n printBlank();\n if (result.won) {\n printSuccess(`BREACHED! (score: ${result.verdict.score}/100)`);\n } else {\n printError(`DEFENDED (score: ${result.verdict.score}/100)`);\n }\n\n printBlank();\n printKeyValue('Agent', result.verdict.agentResponse.slice(0, 200));\n printKeyValue('Jury', result.verdict.juryResponse.slice(0, 200));\n if (result.verdict.funResponse) {\n printKeyValue('Fun', result.verdict.funResponse.slice(0, 200));\n }\n printBlank();\n printKeyValue('Fee Paid', `${result.feePaid} SUI`);\n printKeyValue('Request Tx', explorerUrl(result.requestTx));\n printKeyValue('Settle Tx', explorerUrl(result.settleTx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, MIST_PER_SUI, listSentinels, formatUsd } from '@t2000/sdk';\nimport type { SentinelAgent } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printHeader,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printDivider,\n printLine,\n printInfo,\n} from '../output.js';\nimport pc from 'picocolors';\n\nfunction mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nfunction bestTarget(sentinels: SentinelAgent[]): SentinelAgent | undefined {\n const withPool = sentinels.filter((s) => s.prizePool > 0n && s.attackFee > 0n);\n if (withPool.length === 0) return undefined;\n return withPool.sort((a, b) => {\n const ratioA = Number(a.prizePool) / Number(a.attackFee);\n const ratioB = Number(b.prizePool) / Number(b.attackFee);\n return ratioB - ratioA;\n })[0];\n}\n\nexport function registerEarn(program: Command) {\n program\n .command('earn')\n .description('Show all earning opportunities — savings yield + sentinel bounties')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const [positionsResult, portfolioResult, ratesResult, sentinels] = await Promise.allSettled([\n agent.positions(),\n agent.getPortfolio(),\n agent.allRates('USDC'),\n listSentinels(),\n ]);\n\n const posData = positionsResult.status === 'fulfilled' ? positionsResult.value : null;\n const portfolio = portfolioResult.status === 'fulfilled' ? portfolioResult.value : null;\n const ratesData = ratesResult.status === 'fulfilled' ? ratesResult.value : null;\n const agents = sentinels.status === 'fulfilled' ? sentinels.value : null;\n const savePositions = posData?.positions.filter((p) => p.type === 'save') ?? [];\n const totalSaved = savePositions.reduce((s, p) => s + p.amount, 0);\n const earningInvestments = portfolio?.positions.filter((p) => p.earning && p.currentValue > 0) ?? [];\n const bestSaveApy = ratesData?.length\n ? Math.max(...ratesData.map(r => r.rates.saveApy))\n : 0;\n\n if (isJsonMode()) {\n const best = agents ? bestTarget(agents) : undefined;\n const totalPool = agents\n ? agents.reduce((sum, s) => sum + mistToSui(s.prizePool), 0)\n : 0;\n const cheapest = agents\n ? Math.min(...agents.map((s) => mistToSui(s.attackFee)))\n : 0;\n\n printJson({\n savings: savePositions.map((p) => ({\n protocol: p.protocol,\n asset: p.asset,\n amount: p.amount,\n apy: p.apy,\n })),\n totalSaved,\n availableRates: ratesData?.map(r => ({\n protocol: r.protocol,\n asset: 'USDC',\n saveApy: r.rates.saveApy,\n })) ?? [],\n investments: earningInvestments.map((p) => ({\n asset: p.asset,\n amount: p.totalAmount,\n value: p.currentValue,\n protocol: p.earningProtocol,\n apy: p.earningApy,\n })),\n sentinel: agents\n ? {\n activeSentinels: agents.length,\n totalPrizePool: Number(totalPool.toFixed(2)),\n cheapestFee: Number(cheapest.toFixed(2)),\n bestTarget: best\n ? {\n name: best.name,\n objectId: best.objectId,\n prizePool: mistToSui(best.prizePool),\n attackFee: mistToSui(best.attackFee),\n ratio: Number((Number(best.prizePool) / Number(best.attackFee)).toFixed(1)),\n }\n : null,\n }\n : null,\n });\n return;\n }\n\n printHeader('Earning Opportunities');\n\n // --- Savings section ---\n printLine(pc.bold('SAVINGS') + pc.dim(' — Passive Yield'));\n printDivider();\n\n if (savePositions.length > 0) {\n for (const pos of savePositions) {\n const dailyYield = (pos.amount * pos.apy / 100) / 365;\n printKeyValue(pos.protocol, `${formatUsd(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(2)}% APY`);\n if (dailyYield > 0.0001) {\n const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` : formatUsd(dailyYield);\n const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` : formatUsd(dailyYield * 30);\n printLine(pc.dim(` ~${dailyStr}/day · ~${monthlyStr}/month`));\n }\n }\n if (savePositions.length > 1) {\n printBlank();\n printKeyValue('Total Saved', formatUsd(totalSaved));\n }\n } else if (ratesData && ratesData.length > 0) {\n const sorted = [...ratesData].sort((a, b) => b.rates.saveApy - a.rates.saveApy);\n for (const r of sorted) {\n printKeyValue(r.protocol, `USDC @ ${r.rates.saveApy.toFixed(2)}% APY`);\n }\n const example = 100;\n const daily = (example * bestSaveApy / 100) / 365;\n const monthly = daily * 30;\n printLine(pc.dim(` Save $${example} → ~$${daily.toFixed(2)}/day · ~$${monthly.toFixed(2)}/month`));\n printBlank();\n printInfo('No savings yet — run `t2000 save <amount>` to start');\n } else if (posData) {\n printInfo('No savings yet — run `t2000 save <amount>` to start');\n } else {\n printInfo('Savings data unavailable');\n }\n\n // --- Investment yield section ---\n if (earningInvestments.length > 0) {\n printBlank();\n printLine(pc.bold('INVESTMENTS') + pc.dim(' — Earning Yield'));\n printDivider();\n\n let totalInvestValue = 0;\n for (const pos of earningInvestments) {\n const dailyYield = (pos.currentValue * (pos.earningApy ?? 0) / 100) / 365;\n const apyStr = pos.earningApy ? `${pos.earningApy.toFixed(2)}%` : '—';\n printKeyValue(\n `${pos.asset} via ${pos.earningProtocol ?? 'unknown'}`,\n `${formatUsd(pos.currentValue)} (${pos.totalAmount.toFixed(4)} ${pos.asset}) @ ${apyStr} APY`,\n );\n if (dailyYield > 0.0001) {\n const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` : formatUsd(dailyYield);\n const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` : formatUsd(dailyYield * 30);\n printLine(pc.dim(` ~${dailyStr}/day · ~${monthlyStr}/month`));\n }\n totalInvestValue += pos.currentValue;\n }\n\n if (earningInvestments.length > 1) {\n printBlank();\n printKeyValue('Total Earning', formatUsd(totalInvestValue));\n }\n }\n\n printBlank();\n\n // --- Sentinel section ---\n printLine(pc.bold('SENTINEL BOUNTIES') + pc.dim(' — Active Red Teaming'));\n printDivider();\n\n if (agents && agents.length > 0) {\n const totalPool = agents.reduce((sum, s) => sum + mistToSui(s.prizePool), 0);\n const cheapest = Math.min(...agents.map((s) => mistToSui(s.attackFee)));\n const best = bestTarget(agents);\n\n printKeyValue('Active', `${agents.length} sentinels`);\n printKeyValue('Prize Pools', `${totalPool.toFixed(2)} SUI available`);\n printKeyValue('Cheapest Fee', `${cheapest.toFixed(2)} SUI`);\n\n if (best) {\n const ratio = (Number(best.prizePool) / Number(best.attackFee)).toFixed(1);\n printKeyValue('Best Target', `${best.name} — ${mistToSui(best.prizePool).toFixed(2)} SUI pool (${ratio}x ratio)`);\n }\n } else if (agents) {\n printInfo('No active bounties right now');\n } else {\n printInfo('Sentinel data unavailable');\n }\n\n printBlank();\n\n // --- Quick actions ---\n printLine(pc.bold('Quick Actions'));\n printDivider();\n printLine(` ${pc.dim('t2000 save <amount> [asset]')} Save stablecoins for yield`);\n printLine(` ${pc.dim('t2000 invest earn <asset>')} Earn yield on investments`);\n printLine(` ${pc.dim('t2000 sentinel list')} Browse sentinel bounties`);\n printLine(` ${pc.dim('t2000 sentinel attack <id>')} Attack a sentinel`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd, SUPPORTED_ASSETS } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printInfo,\n printWarning,\n printLine,\n printDivider,\n explorerUrl,\n} from '../output.js';\n\nexport function registerRebalance(program: Command) {\n program\n .command('rebalance')\n .description('Optimize yield — move savings to the best rate across protocols and stablecoins')\n .option('--key <path>', 'Key file path')\n .option('--dry-run', 'Show what would happen without executing')\n .option('--min-diff <pct>', 'Minimum APY difference to trigger (default: 0.5)', '0.5')\n .option('--max-break-even <days>', 'Max break-even days for cross-asset moves (default: 30)', '30')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const minYieldDiff = parseFloat(opts.minDiff ?? '0.5');\n const maxBreakEven = parseInt(opts.maxBreakEven ?? '30', 10);\n\n const plan = await agent.rebalance({\n dryRun: true,\n minYieldDiff,\n maxBreakEven,\n });\n\n if (isJsonMode()) {\n if (opts.dryRun) {\n printJson(plan);\n } else {\n const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });\n printJson(result);\n }\n return;\n }\n\n printBlank();\n\n if (plan.steps.length === 0) {\n const diff = plan.newApy - plan.currentApy;\n if (diff < minYieldDiff) {\n printInfo(`Already optimized — ${plan.currentApy.toFixed(2)}% APY on ${plan.fromProtocol}`);\n printLine(pc.dim(` Best available: ${plan.newApy.toFixed(2)}% (${displayAsset(plan.toAsset)} on ${plan.toProtocol})`));\n printLine(pc.dim(` Difference: ${diff.toFixed(2)}% (below ${minYieldDiff}% threshold)`));\n } else if (plan.breakEvenDays > maxBreakEven && plan.estimatedSwapCost > 0) {\n printInfo(`Skipped — break-even of ${plan.breakEvenDays} days exceeds ${maxBreakEven}-day limit`);\n printLine(pc.dim(` ${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}%) → ${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}%)`));\n } else {\n printInfo('Already at the best rate. Nothing to rebalance.');\n }\n printBlank();\n return;\n }\n\n printLine(pc.bold('Rebalance Plan'));\n printDivider();\n printKeyValue('From', `${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}% APY)`);\n printKeyValue('To', `${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}% APY)`);\n printKeyValue('Amount', formatUsd(plan.amount));\n printBlank();\n\n printLine(pc.bold('Economics'));\n printDivider();\n printKeyValue('APY Gain', `+${(plan.newApy - plan.currentApy).toFixed(2)}%`);\n printKeyValue('Annual Gain', `${formatUsd(plan.annualGain)}/year`);\n if (plan.estimatedSwapCost > 0) {\n printKeyValue('Swap Cost', `~${formatUsd(plan.estimatedSwapCost)}`);\n printKeyValue('Break-even', `${plan.breakEvenDays} days`);\n }\n printBlank();\n\n if (plan.steps.length > 0) {\n printLine(pc.bold('Steps'));\n printDivider();\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i];\n const num = `${i + 1}.`;\n if (step.action === 'withdraw') {\n printLine(` ${num} Withdraw ${formatUsd(step.amount)} ${displayAsset(step.fromAsset ?? '')} from ${step.protocol}`);\n } else if (step.action === 'swap') {\n printLine(` ${num} Swap ${displayAsset(step.fromAsset ?? '')} → ${displayAsset(step.toAsset ?? '')} (~${formatUsd(step.estimatedOutput ?? 0)})`);\n } else if (step.action === 'deposit') {\n printLine(` ${num} Deposit ${formatUsd(step.amount)} ${displayAsset(step.toAsset ?? '')} into ${step.protocol}`);\n }\n }\n printBlank();\n }\n\n if (opts.dryRun) {\n printLine(pc.bold(pc.yellow('DRY RUN — Preview only, no transactions executed')));\n printLine(pc.dim(' Run `t2000 rebalance` to execute.'));\n printBlank();\n return;\n }\n\n const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });\n\n if (result.executed) {\n printSuccess(`Rebalanced ${formatUsd(result.amount)} → ${result.newApy.toFixed(2)}% APY`);\n for (const digest of result.txDigests) {\n printKeyValue('Tx', explorerUrl(digest));\n }\n printKeyValue('Gas', `${result.totalGasCost.toFixed(4)} SUI`);\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction displayAsset(asset: string): string {\n return SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? asset;\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd, SUPPORTED_ASSETS } from '@t2000/sdk';\n\nfunction resolveAssetName(input: string): string {\n const upper = input.toUpperCase();\n for (const key of Object.keys(SUPPORTED_ASSETS)) {\n if (key.toUpperCase() === upper) return key;\n }\n return input;\n}\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerExchange(program: Command) {\n program\n .command('exchange <amount> <from> <to>')\n .description('Exchange between tokens (e.g. USDC ⇌ SUI) via Cetus DEX')\n .option('--key <path>', 'Key file path')\n .option('--slippage <pct>', 'Max slippage percentage (default: 3)', '3')\n .action(async (amount: string, from: string, to: string, opts: { key?: string; slippage?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const fromAsset = resolveAssetName(from);\n const toAsset = resolveAssetName(to);\n const parsedAmount = parseFloat(amount);\n\n if (isNaN(parsedAmount) || parsedAmount <= 0) {\n throw new Error('Amount must be a positive number');\n }\n\n const result = await agent.exchange({\n from: fromAsset,\n to: toAsset,\n amount: parsedAmount,\n maxSlippage: parseFloat(opts.slippage ?? '3') / 100,\n });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n const fromDisplay = SUPPORTED_ASSETS[fromAsset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? fromAsset;\n const toDisplay = SUPPORTED_ASSETS[toAsset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? toAsset;\n const toDecimals = toAsset === 'SUI' ? 4 : 2;\n\n printBlank();\n const fromStr = ['USDC', 'USDT', 'USDE'].includes(fromAsset) ? formatUsd(parsedAmount) : parsedAmount.toFixed(4);\n printSuccess(`Exchanged ${fromStr} ${fromDisplay} → ${result.toAmount.toFixed(toDecimals)} ${toDisplay}`);\n printKeyValue('Tx', explorerUrl(result.tx));\n printKeyValue('Gas', `${result.gasCost.toFixed(4)} SUI (${result.gasMethod})`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { existsSync } from 'node:fs';\nimport { printSuccess, printBlank, printInfo, printJson, isJsonMode, handleError } from '../output.js';\n\nconst MCP_CONFIG = {\n command: 't2000',\n args: ['mcp'],\n};\n\ninterface McpConfigFile {\n mcpServers?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nfunction getPlatformConfigs(): { name: string; path: string }[] {\n const home = homedir();\n return [\n {\n name: 'Claude Desktop',\n path: join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json'),\n },\n {\n name: 'Cursor',\n path: join(home, '.cursor', 'mcp.json'),\n },\n {\n name: 'Windsurf',\n path: join(home, '.codeium', 'windsurf', 'mcp_config.json'),\n },\n ];\n}\n\nasync function readJsonFile(path: string): Promise<McpConfigFile> {\n try {\n const content = await readFile(path, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n}\n\nasync function writeJsonFile(path: string, data: McpConfigFile): Promise<void> {\n const dir = dirname(path);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(path, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\n}\n\nexport function registerMcp(program: Command) {\n const mcp = program\n .command('mcp')\n .description('MCP server for AI platforms');\n\n mcp\n .command('start', { isDefault: true })\n .description('Start MCP server (stdio transport)')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n let mod: { startMcpServer: (opts?: { keyPath?: string }) => Promise<void> };\n try {\n mod = await import('@t2000/mcp' as string);\n } catch {\n console.error(\n 'MCP server not installed. Run:\\n npm install -g @t2000/mcp',\n );\n process.exit(1);\n }\n await mod.startMcpServer({ keyPath: opts.key });\n });\n\n mcp\n .command('install')\n .description('Auto-configure MCP in Claude Desktop, Cursor, and Windsurf')\n .action(async () => {\n try {\n const platforms = getPlatformConfigs();\n const results: { name: string; status: 'added' | 'exists' }[] = [];\n\n for (const platform of platforms) {\n const config = await readJsonFile(platform.path);\n\n if (config.mcpServers && (config.mcpServers as Record<string, unknown>)['t2000']) {\n results.push({ name: platform.name, status: 'exists' });\n continue;\n }\n\n config.mcpServers = {\n ...(config.mcpServers ?? {}),\n t2000: MCP_CONFIG,\n };\n\n await writeJsonFile(platform.path, config);\n results.push({ name: platform.name, status: 'added' });\n }\n\n if (isJsonMode()) {\n printJson({ installed: results });\n return;\n }\n\n printBlank();\n for (const r of results) {\n if (r.status === 'exists') {\n printInfo(`${r.name} already configured`);\n } else {\n printSuccess(`${r.name} configured`);\n }\n }\n printBlank();\n printInfo('Restart your AI platform to activate.');\n printInfo('Then ask: \"what\\'s my t2000 balance?\"');\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n mcp\n .command('uninstall')\n .description('Remove t2000 MCP config from Claude Desktop, Cursor, and Windsurf')\n .action(async () => {\n try {\n const platforms = getPlatformConfigs();\n const results: { name: string; removed: boolean }[] = [];\n\n for (const platform of platforms) {\n if (!existsSync(platform.path)) {\n results.push({ name: platform.name, removed: false });\n continue;\n }\n\n const config = await readJsonFile(platform.path);\n\n if (!config.mcpServers || !(config.mcpServers as Record<string, unknown>)['t2000']) {\n results.push({ name: platform.name, removed: false });\n continue;\n }\n\n delete (config.mcpServers as Record<string, unknown>)['t2000'];\n await writeJsonFile(platform.path, config);\n results.push({ name: platform.name, removed: true });\n }\n\n if (isJsonMode()) {\n printJson({ uninstalled: results });\n return;\n }\n\n printBlank();\n for (const r of results) {\n if (r.removed) {\n printSuccess(`${r.name} removed`);\n } else {\n printInfo(`${r.name} not configured (skipped)`);\n }\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ContactManager, truncateAddress } from '@t2000/sdk';\nimport { printSuccess, printError, printHeader, printLine, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerContacts(program: Command) {\n const contacts = program\n .command('contacts')\n .description('Manage contacts (send by name instead of address)');\n\n contacts\n .command('add <name> <address>')\n .description('Add or update a contact')\n .action((name: string, address: string) => {\n try {\n const manager = new ContactManager();\n const result = manager.add(name, address);\n\n if (isJsonMode()) {\n const contact = manager.get(name)!;\n printJson({ action: result.action, name: contact.name, address: contact.address });\n return;\n }\n\n const contact = manager.get(name)!;\n printBlank();\n printSuccess(`${result.action === 'added' ? 'Added' : 'Updated'} ${contact.name} (${truncateAddress(contact.address)})`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n contacts\n .command('remove <name>')\n .description('Remove a contact')\n .action((name: string) => {\n try {\n const manager = new ContactManager();\n const removed = manager.remove(name);\n\n if (isJsonMode()) {\n printJson({ removed, name });\n return;\n }\n\n printBlank();\n if (removed) {\n printSuccess(`Removed ${name}`);\n } else {\n printError(`Contact \"${name}\" not found`);\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n contacts\n .command('list', { isDefault: true })\n .description('List all contacts')\n .action(() => {\n try {\n const manager = new ContactManager();\n const list = manager.list();\n\n if (isJsonMode()) {\n printJson(list);\n return;\n }\n\n if (list.length === 0) {\n printBlank();\n printLine('No contacts yet.');\n printLine('Add one: t2000 contacts add Tom 0x...');\n printBlank();\n return;\n }\n\n printHeader('Contacts');\n\n const maxNameLen = Math.max(...list.map((c) => c.name.length));\n for (const contact of list) {\n const padded = contact.name.padEnd(maxNameLen + 4);\n printLine(`${padded}${truncateAddress(contact.address)}`);\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd, formatAssetAmount, DEFAULT_STRATEGIES, INVESTMENT_ASSETS } from '@t2000/sdk';\nimport type { InvestmentAsset } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl, printHeader, printSeparator, printInfo, printLine } from '../output.js';\n\nexport function registerInvest(program: Command) {\n const investCmd = program\n .command('invest')\n .description('Buy or sell investment assets');\n\n investCmd\n .command('buy <amount> <asset>')\n .description('Invest USD amount in an asset')\n .option('--key <path>', 'Key file path')\n .option('--slippage <pct>', 'Max slippage percent', '3')\n .action(async (amount: string, asset: string, opts: { key?: string; slippage: string }) => {\n try {\n const parsed = parseFloat(amount);\n if (isNaN(parsed) || parsed <= 0 || !isFinite(parsed)) {\n console.error(pc.red(' ✗ Amount must be greater than $0'));\n process.exitCode = 1;\n return;\n }\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.investBuy({\n asset: asset.toUpperCase() as InvestmentAsset,\n usdAmount: parsed,\n maxSlippage: parseFloat(opts.slippage) / 100,\n });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n const sym = asset.toUpperCase();\n printSuccess(`Bought ${formatAssetAmount(result.amount, sym)} ${sym} at ${formatUsd(result.price)}`);\n printKeyValue('Invested', formatUsd(result.usdValue));\n printKeyValue('Portfolio', `${formatAssetAmount(result.position.totalAmount, sym)} ${sym} (avg ${formatUsd(result.position.avgPrice)})`);\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n investCmd\n .command('sell <amount> <asset>')\n .description('Sell USD amount of an asset (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--slippage <pct>', 'Max slippage percent', '3')\n .action(async (amount: string, asset: string, opts: { key?: string; slippage: string }) => {\n try {\n const isAll = amount.toLowerCase() === 'all';\n if (!isAll) {\n const parsed = parseFloat(amount);\n if (isNaN(parsed) || parsed <= 0 || !isFinite(parsed)) {\n console.error(pc.red(' ✗ Amount must be greater than $0'));\n process.exitCode = 1;\n return;\n }\n }\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const sym = asset.toUpperCase();\n\n const strategyAmount = agent.portfolio.getStrategyAmountForAsset(sym);\n const directAmount = agent.portfolio.getDirectAmount(sym);\n if (isAll && strategyAmount > 0) {\n console.log(pc.yellow(` ⚠ This will sell ALL ${sym} including ${formatAssetAmount(strategyAmount, sym)} from strategies`));\n console.log(pc.dim(` To sell only strategy positions: t2000 invest strategy sell <strategy-name>`));\n }\n\n const usdAmount = isAll ? 'all' as const : parseFloat(amount);\n const result = await agent.investSell({\n asset: sym as InvestmentAsset,\n usdAmount,\n maxSlippage: parseFloat(opts.slippage) / 100,\n });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n printSuccess(`Sold ${formatAssetAmount(result.amount, sym)} ${sym} at ${formatUsd(result.price)}`);\n printKeyValue('Proceeds', formatUsd(result.usdValue));\n if (result.realizedPnL !== undefined) {\n const pnlColor = result.realizedPnL >= 0 ? pc.green : pc.red;\n const pnlSign = result.realizedPnL >= 0 ? '+' : '';\n printKeyValue('Realized P&L', pnlColor(`${pnlSign}${formatUsd(result.realizedPnL)}`));\n }\n if (result.position.totalAmount > 0) {\n printKeyValue('Remaining', `${formatAssetAmount(result.position.totalAmount, sym)} ${sym} (avg ${formatUsd(result.position.avgPrice)})`);\n }\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n investCmd\n .command('sell-all')\n .description('Sell ALL investment positions (direct + strategies)')\n .option('--key <path>', 'Key file path')\n .option('--slippage <pct>', 'Max slippage percent', '3')\n .action(async (opts: { key?: string; slippage: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const positions = agent.portfolio.getPositions();\n\n if (positions.length === 0) {\n if (isJsonMode()) { printJson({ sold: [] }); return; }\n printBlank();\n printInfo('No investment positions to sell');\n printBlank();\n return;\n }\n\n if (isJsonMode()) {\n const results = [];\n for (const pos of positions) {\n const result = await agent.investSell({\n asset: pos.asset as InvestmentAsset,\n usdAmount: 'all',\n maxSlippage: parseFloat(opts.slippage) / 100,\n });\n results.push(result);\n }\n printJson(results);\n return;\n }\n\n printBlank();\n printHeader('Selling all positions');\n printSeparator();\n let totalProceeds = 0;\n let totalPnL = 0;\n for (const pos of positions) {\n try {\n const result = await agent.investSell({\n asset: pos.asset as InvestmentAsset,\n usdAmount: 'all',\n maxSlippage: parseFloat(opts.slippage) / 100,\n });\n const pnl = result.realizedPnL ?? 0;\n const pnlColor = pnl >= 0 ? pc.green : pc.red;\n const pnlSign = pnl >= 0 ? '+' : '';\n printKeyValue(pos.asset, `${formatUsd(result.usdValue)} ${pnlColor(`${pnlSign}${formatUsd(pnl)}`)}`);\n totalProceeds += result.usdValue;\n totalPnL += pnl;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(pc.yellow(` ⚠ ${pos.asset}: ${msg}`));\n }\n }\n printSeparator();\n printKeyValue('Total proceeds', formatUsd(totalProceeds));\n const rpnlColor = totalPnL >= 0 ? pc.green : pc.red;\n const rpnlSign = totalPnL >= 0 ? '+' : '';\n printKeyValue('Realized P&L', rpnlColor(`${rpnlSign}${formatUsd(totalPnL)}`));\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n investCmd\n .command('earn <asset>')\n .description('Deposit invested asset into best-rate lending protocol')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Force a specific protocol (navi, suilend)')\n .action(async (asset: string, opts: { key?: string; protocol?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.investEarn({\n asset: asset.toUpperCase() as InvestmentAsset,\n protocol: opts.protocol?.toLowerCase(),\n });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n const sym = asset.toUpperCase();\n if (result.amount === 0 && !result.tx) {\n printSuccess(`${sym} is already fully earning via ${result.protocol} (${result.apy.toFixed(1)}% APY)`);\n } else {\n printSuccess(`${sym} deposited into ${result.protocol} (${result.apy.toFixed(1)}% APY)`);\n printKeyValue('Amount', `${formatAssetAmount(result.amount, sym)} ${sym}`);\n printKeyValue('Protocol', result.protocol);\n printKeyValue('APY', `${result.apy.toFixed(2)}%`);\n printKeyValue('Tx', explorerUrl(result.tx));\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n investCmd\n .command('unearn <asset>')\n .description('Withdraw invested asset from lending (keeps in portfolio)')\n .option('--key <path>', 'Key file path')\n .action(async (asset: string, opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.investUnearn({\n asset: asset.toUpperCase() as InvestmentAsset,\n });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n const sym = asset.toUpperCase();\n printSuccess(`Withdrew ${formatAssetAmount(result.amount, sym)} ${sym} from ${result.protocol}`);\n printKeyValue('Status', `${sym} remains in investment portfolio (locked)`);\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n investCmd\n .command('rebalance')\n .description('Move earning positions to better-rate protocols')\n .option('--key <path>', 'Key file path')\n .option('--dry-run', 'Preview moves without executing')\n .option('--min-diff <pct>', 'Minimum APY difference to trigger move', '0.1')\n .action(async (opts: { key?: string; dryRun?: boolean; minDiff?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.investRebalance({\n dryRun: opts.dryRun,\n minYieldDiff: opts.minDiff ? parseFloat(opts.minDiff) : undefined,\n });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n\n if (result.moves.length === 0) {\n printInfo('All earning positions are already on the best rate');\n if (result.skipped.length > 0) {\n for (const s of result.skipped) {\n printLine(` ${s.asset}: ${s.apy.toFixed(2)}% on ${s.protocol} (best: ${s.bestApy.toFixed(2)}% — ${s.reason.replace(/_/g, ' ')})`);\n }\n }\n printBlank();\n return;\n }\n\n if (opts.dryRun) {\n printHeader('Rebalance Preview');\n for (const m of result.moves) {\n printLine(` ${m.asset}: ${m.fromProtocol} (${m.oldApy.toFixed(2)}%) → ${m.toProtocol} (${m.newApy.toFixed(2)}%)`);\n printLine(` Gain: +${(m.newApy - m.oldApy).toFixed(2)}% APY`);\n }\n } else {\n printSuccess('Rebalanced earning positions');\n printSeparator();\n for (const m of result.moves) {\n printLine(` ${m.asset}: ${m.fromProtocol} (${m.oldApy.toFixed(2)}%) → ${m.toProtocol} (${m.newApy.toFixed(2)}%)`);\n printKeyValue('Amount', `${formatAssetAmount(m.amount, m.asset)} ${m.asset}`);\n printKeyValue('APY gain', `+${(m.newApy - m.oldApy).toFixed(2)}%`);\n if (m.txDigests.length > 0) {\n printKeyValue('Tx', explorerUrl(m.txDigests[m.txDigests.length - 1]));\n }\n }\n printSeparator();\n printKeyValue('Gas', `${result.totalGasCost.toFixed(6)} SUI`);\n }\n\n if (result.skipped.length > 0) {\n printBlank();\n for (const s of result.skipped) {\n printLine(` ${s.asset}: kept on ${s.protocol} (${s.reason.replace(/_/g, ' ')})`);\n }\n }\n\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n // -- Strategy subcommands --\n\n const strategyCmd = investCmd\n .command('strategy')\n .description('Manage investment strategies');\n\n strategyCmd\n .command('list')\n .description('List available strategies')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const all = agent.strategies.getAll();\n\n if (isJsonMode()) { printJson(all); return; }\n\n printBlank();\n printHeader('Investment Strategies');\n printSeparator();\n for (const [key, def] of Object.entries(all)) {\n const allocs = Object.entries(def.allocations).map(([a, p]) => `${a} ${p}%`).join(', ');\n const tag = def.custom ? pc.dim(' (custom)') : '';\n printKeyValue(key, `${allocs}${tag}`);\n printLine(` ${pc.dim(def.description)}`);\n }\n printSeparator();\n\n const hasPositions = Object.keys(all).some((k) => agent.portfolio.hasStrategyPositions(k));\n if (!hasPositions) {\n printInfo('Buy into a strategy: t2000 invest strategy buy bluechip 100');\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n strategyCmd\n .command('buy <name> <amount>')\n .description('Buy into a strategy')\n .option('--key <path>', 'Key file path')\n .option('--dry-run', 'Preview allocation without executing')\n .action(async (name: string, amount: string, opts: { key?: string; dryRun?: boolean }) => {\n try {\n const parsed = parseFloat(amount);\n if (isNaN(parsed) || parsed <= 0) {\n console.error(pc.red(' ✗ Amount must be greater than $0'));\n process.exitCode = 1;\n return;\n }\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.investStrategy({ strategy: name.toLowerCase(), usdAmount: parsed, dryRun: opts.dryRun });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n if (opts.dryRun) {\n printHeader(`Strategy: ${name} — Dry Run (${formatUsd(parsed)})`);\n printSeparator();\n for (const buy of result.buys) {\n printKeyValue(buy.asset, `${formatUsd(buy.usdAmount)} → ~${formatAssetAmount(buy.amount, buy.asset)} ${buy.asset} @ ${formatUsd(buy.price)}`);\n }\n printSeparator();\n printInfo('Run without --dry-run to execute');\n } else {\n const txDigests = [...new Set(result.buys.map(b => b.tx))];\n const isSingleTx = txDigests.length === 1;\n printSuccess(`Invested ${formatUsd(parsed)} in ${name} strategy`);\n printSeparator();\n for (const buy of result.buys) {\n printKeyValue(buy.asset, `${formatAssetAmount(buy.amount, buy.asset)} @ ${formatUsd(buy.price)}`);\n }\n printSeparator();\n printKeyValue('Total invested', formatUsd(result.totalInvested));\n if (isSingleTx) {\n printKeyValue('Tx', explorerUrl(txDigests[0]));\n } else {\n for (const buy of result.buys) {\n printLine(` ${pc.dim(`${buy.asset}: ${explorerUrl(buy.tx)}`)}`);\n }\n }\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n strategyCmd\n .command('sell <name>')\n .description('Sell all positions in a strategy')\n .option('--key <path>', 'Key file path')\n .action(async (name: string, opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.sellStrategy({ strategy: name.toLowerCase() });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n printSuccess(`Sold all ${name} strategy positions`);\n printSeparator();\n for (const sell of result.sells) {\n const pnlColor = sell.realizedPnL >= 0 ? pc.green : pc.red;\n const pnlSign = sell.realizedPnL >= 0 ? '+' : '';\n printKeyValue(sell.asset, `${formatAssetAmount(sell.amount, sell.asset)} → ${formatUsd(sell.usdValue)} ${pnlColor(`${pnlSign}${formatUsd(sell.realizedPnL)}`)}`);\n }\n if (result.failed && result.failed.length > 0) {\n for (const f of result.failed) {\n console.error(pc.yellow(` ⚠ ${f.asset}: ${f.reason}`));\n }\n }\n printSeparator();\n printKeyValue('Total proceeds', formatUsd(result.totalProceeds));\n const rpnlColor = result.realizedPnL >= 0 ? pc.green : pc.red;\n const rpnlSign = result.realizedPnL >= 0 ? '+' : '';\n printKeyValue('Realized P&L', rpnlColor(`${rpnlSign}${formatUsd(result.realizedPnL)}`));\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n strategyCmd\n .command('status <name>')\n .description('Show current status and weights of a strategy')\n .option('--key <path>', 'Key file path')\n .action(async (name: string, opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const status = await agent.getStrategyStatus(name.toLowerCase());\n\n if (isJsonMode()) { printJson(status); return; }\n\n printBlank();\n printHeader(`Strategy: ${status.definition.name}`);\n printSeparator();\n\n if (status.positions.length === 0) {\n printInfo('No positions yet. Buy in with: t2000 invest strategy buy ' + name + ' 100');\n } else {\n for (const pos of status.positions) {\n const target = status.definition.allocations[pos.asset] ?? 0;\n const actual = status.currentWeights[pos.asset] ?? 0;\n const drift = actual - target;\n const driftColor = Math.abs(drift) > 3 ? pc.yellow : pc.dim;\n const pnlColor = pos.unrealizedPnL >= 0 ? pc.green : pc.red;\n const pnlSign = pos.unrealizedPnL >= 0 ? '+' : '';\n printKeyValue(\n pos.asset,\n `${formatAssetAmount(pos.totalAmount, pos.asset)} ${formatUsd(pos.currentValue)} ${pnlColor(`${pnlSign}${formatUsd(pos.unrealizedPnL)}`)} ${driftColor(`${actual.toFixed(0)}% / ${target}% target`)}`,\n );\n }\n printSeparator();\n printKeyValue('Total value', formatUsd(status.totalValue));\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n strategyCmd\n .command('rebalance <name>')\n .description('Rebalance a strategy to target weights')\n .option('--key <path>', 'Key file path')\n .action(async (name: string, opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.rebalanceStrategy({ strategy: name.toLowerCase() });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n if (result.trades.length === 0) {\n printInfo(`Strategy '${name}' is already balanced (within 3% threshold)`);\n } else {\n printSuccess(`Rebalanced ${name} strategy`);\n printSeparator();\n for (const t of result.trades) {\n const action = t.action === 'buy' ? pc.green('BUY') : pc.red('SELL');\n printKeyValue(t.asset, `${action} ${formatUsd(t.usdAmount)} (${formatAssetAmount(t.amount, t.asset)})`);\n }\n printSeparator();\n printInfo('Weights: ' + Object.entries(result.afterWeights).map(([a, w]) => `${a} ${w.toFixed(0)}%`).join(', '));\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n strategyCmd\n .command('create <name>')\n .description('Create a custom strategy')\n .requiredOption('--alloc <pairs...>', 'Allocations e.g. SUI:40 BTC:20 ETH:20 GOLD:20')\n .option('--description <desc>', 'Strategy description')\n .action(async (name: string, opts: { alloc: string[]; description?: string }) => {\n try {\n const allocations: Record<string, number> = {};\n for (const pair of opts.alloc) {\n const [asset, pctStr] = pair.split(':');\n if (!asset || !pctStr) {\n console.error(pc.red(` ✗ Invalid allocation: '${pair}'. Use ASSET:PCT format (e.g. SUI:60)`));\n process.exitCode = 1;\n return;\n }\n allocations[asset.toUpperCase()] = parseFloat(pctStr);\n }\n const pin = await resolvePin();\n const agent = await T2000.create({ pin });\n const definition = agent.strategies.create({ name, allocations, description: opts.description });\n\n if (isJsonMode()) { printJson(definition); return; }\n\n printBlank();\n printSuccess(`Created strategy '${name}'`);\n const allocs = Object.entries(definition.allocations).map(([a, p]) => `${a} ${p}%`).join(', ');\n printKeyValue('Allocations', allocs);\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n strategyCmd\n .command('delete <name>')\n .description('Delete a custom strategy')\n .option('--key <path>', 'Key file path')\n .action(async (name: string, opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n if (agent.portfolio.hasStrategyPositions(name.toLowerCase())) {\n console.error(pc.red(` ✗ Strategy '${name}' has open positions. Sell first: t2000 invest strategy sell ${name}`));\n process.exitCode = 1;\n return;\n }\n\n agent.strategies.delete(name.toLowerCase());\n\n if (isJsonMode()) { printJson({ deleted: name }); return; }\n\n printBlank();\n printSuccess(`Deleted strategy '${name}'`);\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n // -- Auto-Invest subcommands --\n\n const autoCmd = investCmd\n .command('auto')\n .description('Dollar-cost averaging (DCA) schedules');\n\n autoCmd\n .command('setup <amount> <frequency> [target]')\n .description('Create a DCA schedule (target = strategy name or asset)')\n .option('--key <path>', 'Key file path')\n .option('--day <num>', 'Day of week (1-7) or month (1-28)')\n .action(async (amount: string, frequency: string, target: string | undefined, opts: { key?: string; day?: string }) => {\n try {\n const parsed = parseFloat(amount);\n if (isNaN(parsed) || parsed < 1) {\n console.error(pc.red(' ✗ Amount must be at least $1'));\n process.exitCode = 1;\n return;\n }\n if (!['daily', 'weekly', 'monthly'].includes(frequency)) {\n console.error(pc.red(' ✗ Frequency must be daily, weekly, or monthly'));\n process.exitCode = 1;\n return;\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const allStrategies = agent.strategies.getAll();\n const isStrategy = target ? target.toLowerCase() in allStrategies : false;\n const isAsset = target ? target.toUpperCase() in INVESTMENT_ASSETS : false;\n\n if (target && !isStrategy && !isAsset) {\n console.error(pc.red(` ✗ '${target}' is not a valid strategy or asset`));\n process.exitCode = 1;\n return;\n }\n\n const dayNum = opts.day ? parseInt(opts.day, 10) : undefined;\n const schedule = agent.setupAutoInvest({\n amount: parsed,\n frequency: frequency as 'daily' | 'weekly' | 'monthly',\n strategy: isStrategy ? target!.toLowerCase() : undefined,\n asset: isAsset ? target!.toUpperCase() : undefined,\n dayOfWeek: frequency === 'weekly' ? dayNum : undefined,\n dayOfMonth: frequency === 'monthly' ? dayNum : undefined,\n });\n\n if (isJsonMode()) { printJson(schedule); return; }\n\n printBlank();\n const targetLabel = schedule.strategy ?? schedule.asset ?? 'unknown';\n printSuccess(`Auto-invest created: ${formatUsd(schedule.amount)} ${schedule.frequency} → ${targetLabel}`);\n printKeyValue('Schedule ID', schedule.id);\n printKeyValue('Next run', new Date(schedule.nextRun).toLocaleDateString());\n printInfo('Run manually: t2000 invest auto run');\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n autoCmd\n .command('status')\n .description('Show all DCA schedules')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const status = agent.getAutoInvestStatus();\n\n if (isJsonMode()) { printJson(status); return; }\n\n printBlank();\n if (status.schedules.length === 0) {\n printInfo('No auto-invest schedules. Set one up: t2000 invest auto setup 50 weekly bluechip');\n printBlank();\n return;\n }\n\n printHeader('Auto-Invest Schedules');\n printSeparator();\n for (const s of status.schedules) {\n const target = s.strategy ?? s.asset ?? '?';\n const statusTag = s.enabled ? pc.green('active') : pc.dim('paused');\n printKeyValue(s.id, `${formatUsd(s.amount)} ${s.frequency} → ${target} ${statusTag}`);\n printLine(` ${pc.dim(`Next: ${new Date(s.nextRun).toLocaleDateString()} · Runs: ${s.runCount} · Total: ${formatUsd(s.totalInvested)}`)}`);\n }\n printSeparator();\n\n if (status.pendingRuns.length > 0) {\n printInfo(`${status.pendingRuns.length} pending run(s). Execute: t2000 invest auto run`);\n } else {\n printInfo('All schedules up to date');\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n autoCmd\n .command('run')\n .description('Execute pending DCA purchases')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const status = agent.getAutoInvestStatus();\n if (status.pendingRuns.length === 0) {\n if (isJsonMode()) { printJson({ executed: [], skipped: [] }); return; }\n printBlank();\n printInfo('No pending auto-invest runs. All schedules are up to date.');\n printBlank();\n return;\n }\n\n const result = await agent.runAutoInvest();\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n if (result.executed.length > 0) {\n printSuccess(`Executed ${result.executed.length} auto-invest run(s)`);\n for (const exec of result.executed) {\n const target = exec.strategy ?? exec.asset ?? '?';\n printKeyValue(target, formatUsd(exec.amount));\n }\n }\n if (result.skipped.length > 0) {\n for (const skip of result.skipped) {\n printLine(` ${pc.yellow('⚠')} Skipped ${skip.scheduleId}: ${skip.reason}`);\n }\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n autoCmd\n .command('stop <id>')\n .description('Stop an auto-invest schedule')\n .option('--key <path>', 'Key file path')\n .action(async (id: string, opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n agent.stopAutoInvest(id);\n\n if (isJsonMode()) { printJson({ stopped: id }); return; }\n\n printBlank();\n printSuccess(`Stopped auto-invest schedule ${id}`);\n printBlank();\n } catch (error) { handleError(error); }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd, formatAssetAmount } from '@t2000/sdk';\nimport type { InvestmentPosition } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printHeader, printSeparator, printInfo, printLine } from '../output.js';\n\nfunction printPositionLine(pos: InvestmentPosition, rewardKeys?: Set<string>) {\n if (pos.currentPrice === 0 && pos.totalAmount > 0) {\n printKeyValue(\n pos.asset,\n `${formatAssetAmount(pos.totalAmount, pos.asset)} Avg: ${formatUsd(pos.avgPrice)} Now: ${pc.yellow('unavailable')}`,\n );\n } else {\n const pnlColor = pos.unrealizedPnL >= 0 ? pc.green : pc.red;\n const pnlSign = pos.unrealizedPnL >= 0 ? '+' : '';\n let yieldSuffix = '';\n if (pos.earning && pos.earningApy) {\n const hasRewards = rewardKeys?.has(`${pos.earningProtocol}:${pos.asset}`);\n const rewardTag = hasRewards ? ` ${pc.yellow('+rewards')}` : '';\n yieldSuffix = ` ${pc.cyan(`${pos.earningApy.toFixed(1)}% APY (${pos.earningProtocol})`)}${rewardTag}`;\n }\n printKeyValue(\n pos.asset,\n `${formatAssetAmount(pos.totalAmount, pos.asset)} Avg: ${formatUsd(pos.avgPrice)} Now: ${formatUsd(pos.currentPrice)} ${pnlColor(`${pnlSign}${formatUsd(pos.unrealizedPnL)} (${pnlSign}${pos.unrealizedPnLPct.toFixed(1)}%)`)}${yieldSuffix}`,\n );\n }\n}\n\nexport function registerPortfolio(program: Command) {\n program\n .command('portfolio')\n .description('Show investment portfolio')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const portfolio = await agent.getPortfolio();\n\n if (isJsonMode()) { printJson(portfolio); return; }\n\n const rewardKeys = new Set<string>();\n try {\n const pending = await agent.getPendingRewards();\n for (const r of pending) rewardKeys.add(`${r.protocol}:${r.asset}`);\n } catch { /* skip */ }\n\n printBlank();\n\n const hasDirectPositions = portfolio.positions.length > 0;\n const hasStrategyPositions = portfolio.strategyPositions && Object.keys(portfolio.strategyPositions).length > 0;\n\n if (!hasDirectPositions && !hasStrategyPositions) {\n printInfo('No investments yet. Try: t2000 invest buy 100 SUI');\n printBlank();\n return;\n }\n\n printHeader('Investment Portfolio');\n\n if (hasStrategyPositions) {\n for (const [key, positions] of Object.entries(portfolio.strategyPositions!)) {\n let stratLabel = key;\n try {\n const def = agent.strategies.get(key);\n stratLabel = def.name;\n } catch { /* use key */ }\n printLine(` ${pc.bold(pc.cyan(`▸ ${stratLabel}`))}`);\n printSeparator();\n for (const pos of positions) {\n printPositionLine(pos, rewardKeys);\n }\n const stratValue = positions.reduce((s, p) => s + p.currentValue, 0);\n printLine(` ${pc.dim(`Subtotal: ${formatUsd(stratValue)}`)}`);\n printBlank();\n }\n }\n\n if (hasDirectPositions) {\n if (hasStrategyPositions) {\n printLine(` ${pc.bold(pc.cyan('▸ Direct'))}`);\n }\n printSeparator();\n for (const pos of portfolio.positions) {\n printPositionLine(pos, rewardKeys);\n }\n if (hasStrategyPositions) {\n const directValue = portfolio.positions.reduce((s, p) => s + p.currentValue, 0);\n printLine(` ${pc.dim(`Subtotal: ${formatUsd(directValue)}`)}`);\n }\n }\n\n printSeparator();\n\n const hasPriceUnavailable = portfolio.positions.some(p => p.currentPrice === 0 && p.totalAmount > 0);\n if (hasPriceUnavailable) {\n printInfo(pc.yellow('⚠ Price data unavailable for some assets. Values may be inaccurate.'));\n }\n\n printKeyValue('Total invested', formatUsd(portfolio.totalInvested));\n printKeyValue('Current value', formatUsd(portfolio.totalValue));\n\n const upnlColor = portfolio.unrealizedPnL >= 0 ? pc.green : pc.red;\n const upnlSign = portfolio.unrealizedPnL >= 0 ? '+' : '';\n printKeyValue('Unrealized P&L', upnlColor(`${upnlSign}${formatUsd(portfolio.unrealizedPnL)} (${upnlSign}${portfolio.unrealizedPnLPct.toFixed(1)}%)`));\n\n if (portfolio.realizedPnL !== 0) {\n const rpnlColor = portfolio.realizedPnL >= 0 ? pc.green : pc.red;\n const rpnlSign = portfolio.realizedPnL >= 0 ? '+' : '';\n printKeyValue('Realized P&L', rpnlColor(`${rpnlSign}${formatUsd(portfolio.realizedPnL)}`));\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printSeparator, printLine } from '../output.js';\n\nexport function registerClaimRewards(program: Command) {\n program\n .command('claim-rewards')\n .description('Claim pending protocol rewards')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.claimRewards();\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n\n if (result.rewards.length === 0) {\n printLine(` ${pc.dim('No rewards to claim')}`);\n printBlank();\n return;\n }\n\n const protocols = [...new Set(result.rewards.map(r => r.protocol))];\n printLine(` ${pc.green('✓')} Claimed and converted rewards to USDC`);\n printSeparator();\n\n const received = result.usdcReceived;\n if (received >= 0.01) {\n printKeyValue('Received', `${pc.green(formatUsd(received))} USDC`);\n } else if (received > 0) {\n printKeyValue('Received', `${pc.green('< $0.01')} USDC`);\n } else {\n printKeyValue('Received', `${pc.dim('< $0.01 USDC (rewards are still accruing)')}`);\n }\n printKeyValue('Source', protocols.join(', '));\n\n if (result.tx) {\n printKeyValue('Tx', `https://suiscan.xyz/mainnet/tx/${result.tx}`);\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, getGasStatus } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printHeader,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printDivider,\n printInfo,\n printLine,\n} from '../output.js';\n\nexport function registerGas(program: Command) {\n program\n .command('gas')\n .description('Check gas station status and wallet gas balance')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const address = agent.address();\n\n const [status, bal] = await Promise.allSettled([\n getGasStatus(address),\n agent.balance(),\n ]);\n\n const gasStatus = status.status === 'fulfilled' ? status.value : null;\n const balData = bal.status === 'fulfilled' ? bal.value : null;\n\n if (isJsonMode()) {\n printJson({\n gasStation: gasStatus ?? { error: status.status === 'rejected' ? String((status as PromiseRejectedResult).reason) : 'unavailable' },\n wallet: balData ? { sui: balData.gasReserve.sui, available: balData.available } : null,\n });\n return;\n }\n\n printHeader('Gas Status');\n\n if (gasStatus) {\n const cbStatus = gasStatus.circuitBreaker\n ? pc.red('TRIPPED — sponsorship paused')\n : pc.green('OK');\n printKeyValue('Gas Station', cbStatus);\n printKeyValue('SUI Price (TWAP)', `$${gasStatus.suiPrice.toFixed(4)}`);\n if (gasStatus.bootstrapRemaining !== undefined) {\n printKeyValue('Bootstrap', `${gasStatus.bootstrapUsed}/10 used (${gasStatus.bootstrapRemaining} remaining)`);\n }\n } else {\n printKeyValue('Gas Station', pc.red('unreachable'));\n const reason = status.status === 'rejected'\n ? (status as PromiseRejectedResult).reason\n : 'unknown';\n printLine(` ${pc.dim(reason instanceof Error ? reason.message : String(reason))}`);\n }\n\n printDivider();\n\n if (balData) {\n const suiBal = balData.gasReserve.sui;\n const suiColor = suiBal < 0.05 ? pc.red : pc.green;\n printKeyValue('SUI (gas)', suiColor(`${suiBal.toFixed(4)} SUI`));\n if (suiBal < 0.05) {\n printLine(` ${pc.yellow('⚠')} Below gas threshold (0.05 SUI) — transactions will need sponsorship`);\n }\n printKeyValue('Available', `$${balData.available.toFixed(2)}`);\n } else {\n printKeyValue('Wallet', pc.dim('could not fetch balances'));\n }\n\n printBlank();\n\n if (gasStatus && !gasStatus.circuitBreaker && (balData?.gasReserve.sui ?? 0) >= 0.05) {\n printLine(` ${pc.green('✓')} Gas is healthy — transactions should succeed`);\n } else if (gasStatus && !gasStatus.circuitBreaker) {\n printLine(` ${pc.yellow('⚠')} Low SUI but gas station is online — sponsorship available`);\n } else {\n printLine(` ${pc.red('✗')} Gas station issues detected — fund wallet with SUI directly`);\n printInfo('Send SUI to your address: t2000 address');\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","#!/usr/bin/env node\nimport { createProgram } from './program.js';\n\nconst program = createProgram();\nprogram.parse();\n"],"mappings":"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","names":["pc","readFile","writeFile","mkdir","homedir","homedir","readFile","mkdir","writeFile","program","password","pc","T2000","program","T2000","pc","T2000","formatUsd","program","T2000","formatUsd","pc","T2000","program","T2000","T2000","program","T2000","pc","T2000","truncateAddress","pc","truncateAddress","program","T2000","readFile","writeFile","mkdir","resolve","homedir","T2000","resolve","homedir","readFile","mkdir","writeFile","program","T2000","password","program","pc","T2000","formatUsd","program","T2000","pc","formatUsd","T2000","formatUsd","program","T2000","formatUsd","T2000","formatUsd","program","T2000","formatUsd","T2000","formatUsd","program","T2000","formatUsd","T2000","formatUsd","program","T2000","formatUsd","pc","T2000","program","T2000","pc","pc","T2000","formatUsd","program","T2000","pc","formatUsd","pc","T2000","formatUsd","formatAssetAmount","program","T2000","formatUsd","pc","formatAssetAmount","pc","T2000","formatUsd","formatAssetAmount","program","T2000","formatUsd","pc","formatAssetAmount","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","SafeguardEnforcer","CONFIG_DIR","join","homedir","CONFIG_PATH","readFileSync","existsSync","mkdirSync","writeFileSync","formatUsd","program","SafeguardEnforcer","parsed","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","T2000","CONFIG_DIR","join","homedir","existsSync","mkdirSync","readFileSync","writeFileSync","program","T2000","pc","T2000","program","T2000","pc","join","homedir","SafeguardEnforcer","CONFIG_DIR","join","homedir","program","SafeguardEnforcer","T2000","MAX_ATTEMPTS","T2000","pc","program","T2000","result","T2000","MIST_PER_SUI","formatUsd","pc","MIST_PER_SUI","program","T2000","formatUsd","pc","T2000","formatUsd","SUPPORTED_ASSETS","program","T2000","result","pc","formatUsd","SUPPORTED_ASSETS","T2000","formatUsd","SUPPORTED_ASSETS","SUPPORTED_ASSETS","program","T2000","formatUsd","readFile","writeFile","mkdir","join","dirname","homedir","existsSync","homedir","join","readFile","dirname","existsSync","mkdir","writeFile","program","platform","truncateAddress","program","contact","truncateAddress","pc","T2000","formatUsd","formatAssetAmount","INVESTMENT_ASSETS","program","pc","T2000","formatAssetAmount","formatUsd","INVESTMENT_ASSETS","pc","T2000","formatUsd","formatAssetAmount","formatAssetAmount","formatUsd","pc","program","T2000","pc","T2000","formatUsd","program","T2000","pc","formatUsd","pc","T2000","program","T2000","pc","require","program"]}
1
+ {"version":3,"sources":["../src/program.ts","../src/output.ts","../src/commands/init.ts","../src/prompts.ts","../src/commands/send.ts","../src/commands/balance.ts","../src/commands/address.ts","../src/commands/deposit.ts","../src/commands/history.ts","../src/commands/exportKey.ts","../src/commands/importKey.ts","../src/commands/save.ts","../src/commands/withdraw.ts","../src/commands/borrow.ts","../src/commands/repay.ts","../src/commands/health.ts","../src/commands/rates.ts","../src/commands/positions.ts","../src/commands/earnings.ts","../src/commands/fundStatus.ts","../src/commands/config.ts","../src/commands/serve.ts","../src/commands/pay.ts","../src/commands/lock.ts","../src/commands/sentinel.ts","../src/commands/earn.ts","../src/commands/rebalance.ts","../src/commands/exchange.ts","../src/commands/swap.ts","../src/commands/mcp.ts","../src/commands/contacts.ts","../src/commands/invest.ts","../src/commands/portfolio.ts","../src/commands/claimRewards.ts","../src/commands/gas.ts","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createRequire } from 'node:module';\nimport { setJsonMode } from './output.js';\n\nconst require = createRequire(import.meta.url);\nconst { version: CLI_VERSION } = require('../package.json') as { version: string };\nimport { registerInit } from './commands/init.js';\nimport { registerSend } from './commands/send.js';\nimport { registerBalance } from './commands/balance.js';\nimport { registerAddress } from './commands/address.js';\nimport { registerDeposit } from './commands/deposit.js';\nimport { registerHistory } from './commands/history.js';\nimport { registerExport } from './commands/exportKey.js';\nimport { registerImport } from './commands/importKey.js';\nimport { registerSave } from './commands/save.js';\nimport { registerWithdraw } from './commands/withdraw.js';\nimport { registerBorrow } from './commands/borrow.js';\nimport { registerRepay } from './commands/repay.js';\nimport { registerHealth } from './commands/health.js';\nimport { registerRates } from './commands/rates.js';\nimport { registerPositions } from './commands/positions.js';\nimport { registerEarnings } from './commands/earnings.js';\nimport { registerFundStatus } from './commands/fundStatus.js';\nimport { registerConfig } from './commands/config.js';\nimport { registerServe } from './commands/serve.js';\nimport { registerPay } from './commands/pay.js';\nimport { registerLock } from './commands/lock.js';\nimport { registerSentinel } from './commands/sentinel.js';\nimport { registerEarn } from './commands/earn.js';\nimport { registerRebalance } from './commands/rebalance.js';\nimport { registerExchange } from './commands/exchange.js';\nimport { registerSwap } from './commands/swap.js';\nimport { registerMcp } from './commands/mcp.js';\nimport { registerContacts } from './commands/contacts.js';\nimport { registerInvest } from './commands/invest.js';\nimport { registerPortfolio } from './commands/portfolio.js';\nimport { registerClaimRewards } from './commands/claimRewards.js';\nimport { registerGas } from './commands/gas.js';\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('t2000')\n .description('A bank account for AI agents')\n .version(`${CLI_VERSION} (beta)`)\n .option('--json', 'Output in JSON format')\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n if (opts.json) setJsonMode(true);\n })\n .addHelpText('after', `\nExamples:\n $ t2000 init Create a new agent bank account\n $ t2000 balance Show wallet balance\n $ t2000 save 100 Save $100 to earn yield\n $ t2000 send 50 to 0xabc... Send $50 USDC\n $ t2000 borrow 200 Borrow $200 against savings\n $ t2000 pay openai ... Pay for an API via MPP gateway\n $ t2000 buy 100 BTC Buy $100 of BTC\n $ t2000 sell 0.001 BTC Sell BTC for USDC\n $ t2000 swap 100 USDC SUI Swap between any tokens\n $ t2000 mcp install Install MCP for AI platforms`);\n\n registerInit(program);\n registerSend(program);\n registerBalance(program);\n registerAddress(program);\n registerDeposit(program);\n registerHistory(program);\n registerExport(program);\n registerImport(program);\n registerSave(program);\n registerWithdraw(program);\n registerBorrow(program);\n registerRepay(program);\n registerHealth(program);\n registerRates(program);\n registerPositions(program);\n registerEarnings(program);\n registerFundStatus(program);\n registerConfig(program);\n registerServe(program);\n registerPay(program);\n registerLock(program);\n registerSentinel(program);\n registerEarn(program);\n registerRebalance(program);\n registerSwap(program);\n registerExchange(program);\n registerMcp(program);\n registerContacts(program);\n registerInvest(program);\n registerPortfolio(program);\n registerClaimRewards(program);\n registerGas(program);\n\n return program;\n}\n","import pc from 'picocolors';\n\nlet jsonMode = false;\n\nexport function setJsonMode(enabled: boolean) {\n jsonMode = enabled;\n}\n\nexport function isJsonMode(): boolean {\n return jsonMode;\n}\n\nexport function printJson(data: unknown) {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function printSuccess(message: string) {\n if (jsonMode) return;\n console.log(` ${pc.green('✓')} ${message}`);\n}\n\nexport function printError(message: string) {\n if (jsonMode) return;\n console.error(` ${pc.red('✗')} ${message}`);\n}\n\nexport function printWarning(message: string) {\n if (jsonMode) return;\n console.log(` ${pc.yellow('⚠')} ${message}`);\n}\n\nexport function printInfo(message: string) {\n if (jsonMode) return;\n console.log(` ${pc.dim(message)}`);\n}\n\nexport function printHeader(title: string) {\n if (jsonMode) return;\n console.log();\n console.log(` ${pc.bold(title)}`);\n console.log();\n}\n\nexport function printKeyValue(key: string, value: string, indent = 2) {\n if (jsonMode) return;\n const pad = ' '.repeat(indent);\n console.log(`${pad}${pc.dim(key + ':')} ${value}`);\n}\n\nexport function printBlank() {\n if (jsonMode) return;\n console.log();\n}\n\nexport function printDivider(width = 53) {\n if (jsonMode) return;\n console.log(` ${pc.dim('─'.repeat(width))}`);\n}\n\nexport function printLine(text: string) {\n if (jsonMode) return;\n console.log(` ${text}`);\n}\n\n\nexport function printSeparator() {\n if (jsonMode) return;\n console.log(` ${pc.dim('──────────────────────────────────────')}`);\n}\n\nexport function explorerUrl(txHash: string, network = 'mainnet'): string {\n const base = network === 'testnet'\n ? 'https://suiscan.xyz/testnet/tx'\n : 'https://suiscan.xyz/mainnet/tx';\n const suffix = '';\n return `${base}/${txHash}${suffix}`;\n}\n\nexport function handleError(error: unknown) {\n if (jsonMode) {\n const data = error instanceof Error && 'toJSON' in error\n ? (error as { toJSON(): unknown }).toJSON()\n : { error: 'UNKNOWN', message: String(error) };\n printJson(data);\n } else {\n const msg = error instanceof Error ? error.message : String(error);\n printError(msg);\n }\n process.exit(1);\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, walletExists, SafeguardEnforcer } from '@t2000/sdk';\nimport { saveSession } from '../prompts.js';\nimport {\n printSuccess, printBlank, printInfo, printLine, handleError,\n} from '../output.js';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport { homedir, platform } from 'node:os';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.json');\n\nfunction loadConfig(): Record<string, unknown> {\n try { return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8')); } catch { return {}; }\n}\n\nfunction saveConfig(config: Record<string, unknown>): void {\n if (!existsSync(CONFIG_DIR)) mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + '\\n');\n}\n\ninterface McpPlatform {\n name: string;\n path: string;\n}\n\nfunction getMcpPlatforms(): McpPlatform[] {\n const home = homedir();\n const isMac = platform() === 'darwin';\n return [\n {\n name: 'Claude Desktop',\n path: isMac\n ? join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json')\n : join(home, 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json'),\n },\n {\n name: 'Cursor',\n path: join(home, '.cursor', 'mcp.json'),\n },\n {\n name: 'Windsurf',\n path: join(home, '.codeium', 'windsurf', 'mcp_config.json'),\n },\n ];\n}\n\nasync function installMcpForPlatforms(platforms: McpPlatform[]): Promise<void> {\n const mcpConfig = { command: 't2000', args: ['mcp'] };\n\n for (const p of platforms) {\n let config: Record<string, unknown> = {};\n try {\n config = JSON.parse(await readFile(p.path, 'utf-8'));\n } catch { /* file doesn't exist yet */ }\n\n const servers = (config.mcpServers as Record<string, unknown>) ?? {};\n if (servers['t2000']) {\n printSuccess(`${p.name} already configured`);\n continue;\n }\n\n config.mcpServers = { ...servers, t2000: mcpConfig };\n const dir = dirname(p.path);\n if (!existsSync(dir)) await mkdir(dir, { recursive: true });\n await writeFile(p.path, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n printSuccess(`${p.name} configured`);\n }\n}\n\nexport function registerInit(program: Command) {\n program\n .command('init')\n .description('Create a new agent bank account — guided setup with MCP + safeguards')\n .option('--key <path>', 'Key file path')\n .option('--no-sponsor', 'Skip gas sponsorship')\n .action(async (opts: { key?: string; sponsor?: boolean }) => {\n try {\n const { checkbox, input, password } = await import('@inquirer/prompts');\n\n console.log('');\n console.log(` ┌─────────────────────────────────────────┐`);\n console.log(` │ ${pc.bold('Welcome to t2000')} │`);\n console.log(` │ A bank account for AI agents │`);\n console.log(` └─────────────────────────────────────────┘`);\n console.log('');\n\n const hasWallet = await walletExists(opts.key);\n let address = '';\n const isReturning = hasWallet;\n const totalSteps = isReturning ? 2 : 3;\n let step = 1;\n\n // ── Step 1: Wallet ──\n if (isReturning) {\n printSuccess('Existing wallet detected');\n\n const pin = await password({ message: 'Enter your PIN:' });\n if (!pin || pin.length < 4) throw new Error('PIN must be at least 4 characters');\n\n const agent = await T2000.create({ pin, keyPath: opts.key });\n address = agent.address();\n await saveSession(pin);\n printSuccess(`Wallet unlocked (${address.slice(0, 6)}...${address.slice(-4)})`);\n } else {\n console.log(` ${pc.bold(`Step ${step} of ${totalSteps}`)} — Create wallet`);\n printBlank();\n\n const pin = await password({ message: `Create PIN (min 4 chars):` });\n if (!pin || pin.length < 4) throw new Error('PIN must be at least 4 characters');\n const pinConfirm = await password({ message: 'Confirm PIN:' });\n if (pin !== pinConfirm) throw new Error('PINs do not match');\n\n printBlank();\n printInfo('Creating agent wallet...');\n\n const { address: addr, sponsored } = await T2000.init({ pin, keyPath: opts.key, sponsored: opts.sponsor });\n address = addr;\n await saveSession(pin);\n\n printSuccess('Keypair generated');\n printSuccess(`Network ${pc.dim('Sui mainnet')}`);\n printSuccess(`Gas sponsorship ${pc.dim(sponsored ? 'enabled' : 'disabled')}`);\n\n printBlank();\n printInfo('Setting up accounts...');\n printLine(\n ` ${pc.green('✓')} Checking ` +\n `${pc.green('✓')} Savings ` +\n `${pc.green('✓')} Credit ` +\n `${pc.green('✓')} Exchange ` +\n `${pc.green('✓')} Investment`\n );\n\n printBlank();\n printLine(` 🎉 ${pc.green('Bank account created')}`);\n printLine(` Address: ${pc.yellow(address.slice(0, 6) + '...' + address.slice(-4))}`);\n printBlank();\n step++;\n }\n\n // ── Step 2: MCP platforms ──\n console.log(` ${pc.bold(`Step ${step} of ${totalSteps}`)} — Connect AI platforms`);\n printBlank();\n\n const allPlatforms = getMcpPlatforms();\n\n const selectedNames = await checkbox({\n message: 'Which AI platforms do you use? (space to select)',\n choices: allPlatforms.map(p => ({\n name: p.name,\n value: p.name,\n checked: p.name !== 'Windsurf',\n })),\n });\n\n const selectedPlatforms = allPlatforms.filter(p => selectedNames.includes(p.name));\n\n printBlank();\n if (selectedPlatforms.length > 0) {\n printInfo('Adding t2000 to your AI platforms...');\n printBlank();\n await installMcpForPlatforms(selectedPlatforms);\n } else {\n printInfo('Skipped — you can add MCP later with: t2000 mcp install');\n }\n\n printBlank();\n step++;\n\n // ── Step 3: Safeguards ──\n console.log(` ${pc.bold(`Step ${step} of ${totalSteps}`)} — Set safeguards`);\n printBlank();\n\n const maxPerTx = await input({\n message: 'Max per transaction ($):',\n default: '500',\n });\n const maxDaily = await input({\n message: 'Max daily sends ($):',\n default: '1000',\n });\n\n const enforcer = new SafeguardEnforcer(CONFIG_DIR);\n enforcer.load();\n enforcer.set('maxPerTx', Number(maxPerTx));\n enforcer.set('maxDailySend', Number(maxDaily));\n\n printSuccess('Safeguards configured');\n printBlank();\n\n // ── Done ──\n const platformList = selectedPlatforms.map(p => p.name).join(' / ');\n\n console.log(` ┌─────────────────────────────────────────┐`);\n console.log(` │ ${pc.green('✓ You\\'re all set')} │`);\n console.log(` │ │`);\n\n if (selectedPlatforms.length > 0) {\n console.log(` │ ${pc.bold('Next steps:')} │`);\n console.log(` │ 1. Restart ${platformList.length > 20 ? 'your AI platform' : platformList}${' '.repeat(Math.max(0, 23 - Math.min(platformList.length, 20)))}│`);\n console.log(` │ 2. Ask: ${pc.cyan('\"What\\'s my t2000 balance?\"')} │`);\n console.log(` │ │`);\n } else {\n console.log(` │ Use the CLI directly: │`);\n console.log(` │ ${pc.cyan('t2000 balance')} │`);\n console.log(` │ ${pc.cyan('t2000 buy 100 BTC')} │`);\n console.log(` │ │`);\n }\n\n console.log(` │ Deposit USDC to get started: │`);\n console.log(` │ ${pc.yellow(address)} │`);\n console.log(` └─────────────────────────────────────────┘`);\n console.log('');\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import { password, confirm } from '@inquirer/prompts';\nimport { readFile, writeFile, unlink, mkdir } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst SESSION_PATH = resolve(homedir(), '.t2000', '.session');\nconst MIN_PIN_LENGTH = 4;\n\nexport async function askPin(message = 'Enter PIN:'): Promise<string> {\n const value = await password({ message });\n if (!value || value.length < MIN_PIN_LENGTH) {\n throw new Error(`PIN must be at least ${MIN_PIN_LENGTH} characters`);\n }\n return value;\n}\n\nexport async function askPinConfirm(): Promise<string> {\n const pin = await password({ message: `Create PIN (min ${MIN_PIN_LENGTH} chars):` });\n if (!pin || pin.length < MIN_PIN_LENGTH) {\n throw new Error(`PIN must be at least ${MIN_PIN_LENGTH} characters`);\n }\n\n const confirm_ = await password({ message: 'Confirm PIN:' });\n if (pin !== confirm_) {\n throw new Error('PINs do not match');\n }\n\n return pin;\n}\n\nexport async function askConfirm(message: string): Promise<boolean> {\n return confirm({ message });\n}\n\nexport function getPinFromEnv(): string | undefined {\n return process.env.T2000_PIN ?? process.env.T2000_PASSPHRASE;\n}\n\nasync function readSession(): Promise<string | undefined> {\n try {\n const content = await readFile(SESSION_PATH, 'utf-8');\n return content.trim() || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function saveSession(pin: string): Promise<void> {\n await mkdir(resolve(homedir(), '.t2000'), { recursive: true });\n await writeFile(SESSION_PATH, pin, { mode: 0o600 });\n}\n\nexport async function clearSession(): Promise<void> {\n try {\n await unlink(SESSION_PATH);\n } catch {\n // already gone\n }\n}\n\nexport async function resolvePin(opts?: { confirm?: boolean; skipSession?: boolean }): Promise<string> {\n const envPin = getPinFromEnv();\n if (envPin) return envPin;\n\n if (!opts?.skipSession) {\n const sessionPin = await readSession();\n if (sessionPin) return sessionPin;\n }\n\n const pin = opts?.confirm ? await askPinConfirm() : await askPin();\n\n if (!opts?.skipSession) {\n await saveSession(pin);\n }\n return pin;\n}\n\n/** @deprecated Use resolvePin() */\nexport const askPassphrase = askPin;\n/** @deprecated Use resolvePin() */\nexport const askPassphraseConfirm = askPinConfirm;\n/** @deprecated Use getPinFromEnv() */\nexport const getPassphraseFromEnv = getPinFromEnv;\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\nimport { truncateAddress, formatUsd } from '@t2000/sdk';\n\nconst KNOWN_ASSETS = new Set(['USDC', 'USDT', 'USDE', 'USDSUI', 'SUI']);\n\nexport function parseSendArgs(args: string[]): { amount: number; asset: string; recipient: string } {\n const filtered = args.filter(a => a.toLowerCase() !== 'to');\n if (filtered.length >= 3 && KNOWN_ASSETS.has(filtered[1].toUpperCase())) {\n return { amount: parseFloat(filtered[0]), asset: filtered[1].toUpperCase(), recipient: filtered[2] };\n }\n if (filtered.length >= 2) {\n return { amount: parseFloat(filtered[0]), asset: 'USDC', recipient: filtered[filtered.length - 1] };\n }\n throw new Error('Usage: t2000 send <amount> [asset] [to] <address_or_contact>');\n}\n\nexport function registerSend(program: Command) {\n program\n .command('send')\n .argument('<amount>', 'Amount to send')\n .argument('[args...]', 'Asset, \"to\" keyword, and recipient address or contact name')\n .description('Send USDC (or other asset) to an address or contact name')\n .option('--key <path>', 'Key file path')\n .action(async (amount: string, args: string[], opts: { key?: string }) => {\n try {\n const { amount: parsedAmount, asset, recipient } = parseSendArgs([amount, ...args]);\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.send({\n to: recipient,\n amount: parsedAmount,\n asset,\n });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n const displayTo = result.contactName\n ? `${result.contactName} (${truncateAddress(result.to)})`\n : truncateAddress(result.to);\n printSuccess(`Sent ${formatUsd(result.amount)} ${asset.toUpperCase()} → ${displayTo}`);\n printKeyValue('Gas', `${result.gasCost.toFixed(4)} ${result.gasCostUnit} (${result.gasMethod})`);\n printKeyValue('Balance', formatUsd(result.balance.available) + ' USDC');\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printHeader, printSeparator, printLine } from '../output.js';\n\ninterface LimitsData {\n maxWithdraw: string;\n maxBorrow: string;\n healthFactor: number | null;\n}\n\nasync function fetchLimits(agent: T2000): Promise<LimitsData> {\n const [maxWithdraw, maxBorrow, hf] = await Promise.all([\n agent.maxWithdraw(),\n agent.maxBorrow(),\n agent.healthFactor(),\n ]);\n\n return {\n maxWithdraw: maxWithdraw.maxAmount.toFixed(2),\n maxBorrow: maxBorrow.maxAmount.toFixed(2),\n healthFactor: hf.borrowed >= 0.01 ? hf.healthFactor : null,\n };\n}\n\nexport function registerBalance(program: Command) {\n program\n .command('balance')\n .description('Show wallet balance')\n .option('--key <path>', 'Key file path')\n .option('--show-limits', 'Include maxWithdraw, maxBorrow, and health factor')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const bal = await agent.balance();\n\n const limits = opts.showLimits ? await fetchLimits(agent) : undefined;\n\n if (isJsonMode()) {\n const output = limits\n ? { ...bal, limits }\n : bal;\n printJson(output);\n return;\n }\n\n printBlank();\n\n const stables = bal.stables ?? {};\n const usdcAmount = stables.USDC ?? 0;\n const otherStables = Object.entries(stables).filter(([k, v]) => k !== 'USDC' && v >= 0.01);\n\n printKeyValue('Available', `${formatUsd(usdcAmount)} ${pc.dim('(checking — USDC)')}`);\n for (const [symbol, amount] of otherStables) {\n printLine(` ${pc.dim(symbol)} ${formatUsd(amount)} ${pc.dim(`(use: t2000 save all — auto-converts to USDC)`)}`);\n }\n\n if (bal.savings > 0.01) {\n const positions = await agent.positions();\n const saves = positions.positions.filter(p => p.type === 'save');\n const borrows = positions.positions.filter(p => p.type === 'borrow');\n const weightedApy = saves.length > 0\n ? saves.reduce((sum, p) => sum + (p.amountUsd ?? p.amount) * p.apy, 0) / saves.reduce((sum, p) => sum + (p.amountUsd ?? p.amount), 0)\n : 0;\n const dailyEarning = bal.savings * (weightedApy / 100) / 365;\n printKeyValue('Savings', `${formatUsd(bal.savings)} ${pc.dim(`(earning ${weightedApy.toFixed(2)}% APY)`)}`);\n if (bal.debt > 0.01) {\n const borrowApy = borrows.length > 0\n ? borrows.reduce((sum, p) => sum + (p.amountUsd ?? p.amount) * p.apy, 0) / borrows.reduce((sum, p) => sum + (p.amountUsd ?? p.amount), 0)\n : 0;\n printKeyValue('Credit', `${pc.red(`-${formatUsd(bal.debt)}`)} ${pc.dim(`(${borrowApy.toFixed(2)}% APY)`)}`);\n }\n if (bal.investment > 0.01) {\n const pnlColor = bal.investmentPnL >= 0 ? pc.green : pc.red;\n const pnlSign = bal.investmentPnL >= 0 ? '+' : '';\n const pnlPct = bal.investment > 0 ? ((bal.investmentPnL / (bal.investment - bal.investmentPnL)) * 100) : 0;\n let earningInfo = '';\n try {\n const portfolio = await agent.getPortfolio();\n const earningPositions = portfolio.positions.filter(p => p.earning && p.earningApy);\n if (earningPositions.length > 0) {\n const avgApy = earningPositions.reduce((s, p) => s + (p.earningApy ?? 0) * p.currentValue, 0)\n / earningPositions.reduce((s, p) => s + p.currentValue, 0);\n earningInfo = `, earning ${avgApy.toFixed(1)}% APY`;\n }\n } catch { /* skip */ }\n printKeyValue('Investment', `${formatUsd(bal.investment)} ${pnlColor(`(${pnlSign}${pnlPct.toFixed(1)}%${earningInfo})`)}`);\n } else {\n printKeyValue('Investment', pc.dim('—'));\n }\n printSeparator();\n printKeyValue('Total', `${formatUsd(bal.total)}`);\n if (dailyEarning >= 0.005) {\n printLine(` ${pc.dim(`Earning ~${formatUsd(dailyEarning)}/day`)}`);\n }\n } else {\n if (bal.debt > 0.01) {\n printKeyValue('Credit', `${pc.red(`-${formatUsd(bal.debt)}`)}`);\n }\n if (bal.savings > 0.005) {\n printKeyValue('Savings', `${formatUsd(bal.savings)}`);\n }\n if (bal.investment > 0.01) {\n const pnlColor = bal.investmentPnL >= 0 ? pc.green : pc.red;\n const pnlSign = bal.investmentPnL >= 0 ? '+' : '';\n const pnlPct = bal.investment > 0 ? ((bal.investmentPnL / (bal.investment - bal.investmentPnL)) * 100) : 0;\n let earningInfo = '';\n try {\n const portfolio = await agent.getPortfolio();\n const earningPositions = portfolio.positions.filter(p => p.earning && p.earningApy);\n if (earningPositions.length > 0) {\n const avgApy = earningPositions.reduce((s, p) => s + (p.earningApy ?? 0) * p.currentValue, 0)\n / earningPositions.reduce((s, p) => s + p.currentValue, 0);\n earningInfo = `, earning ${avgApy.toFixed(1)}% APY`;\n }\n } catch { /* skip */ }\n printKeyValue('Investment', `${formatUsd(bal.investment)} ${pnlColor(`(${pnlSign}${pnlPct.toFixed(1)}%${earningInfo})`)}`);\n } else {\n printKeyValue('Investment', pc.dim('—'));\n }\n printSeparator();\n printKeyValue('Total', `${formatUsd(bal.total)}`);\n }\n\n if (limits) {\n printBlank();\n printHeader('Limits');\n printKeyValue('Max withdraw', `${formatUsd(Number(limits.maxWithdraw))} USDC`, 4);\n printKeyValue('Max borrow', `${formatUsd(Number(limits.maxBorrow))} USDC`, 4);\n const hfDisplay = limits.healthFactor !== null\n ? limits.healthFactor.toFixed(2)\n : `${pc.green('∞')} ${pc.dim('(no active loan)')}`;\n printKeyValue('Health factor', hfDisplay, 4);\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerAddress(program: Command) {\n program\n .command('address')\n .description('Show wallet address')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n if (isJsonMode()) {\n printJson({ address: agent.address() });\n return;\n }\n\n printBlank();\n printKeyValue('Address', agent.address());\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printHeader, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerDeposit(program: Command) {\n program\n .command('deposit')\n .description('Show funding instructions')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const info = await agent.deposit();\n\n if (isJsonMode()) {\n printJson(info);\n return;\n }\n\n printHeader('Fund your wallet');\n console.log(info.instructions);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, truncateAddress } from '@t2000/sdk';\nimport type { TransactionRecord } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printHeader, printBlank, printJson, isJsonMode, handleError, printLine, printInfo, printDivider, printKeyValue, explorerUrl } from '../output.js';\n\nconst ACTION_LABELS: Record<string, string> = {\n send: '↗ send',\n lending: '🏦 lend',\n swap: '🔄 swap',\n transaction: '📦 tx',\n};\n\nfunction relativeTime(ts: number): string {\n const diff = Date.now() - ts;\n const mins = Math.floor(diff / 60_000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 7) return `${days}d ago`;\n return new Date(ts).toLocaleDateString();\n}\n\nfunction formatAmount(tx: TransactionRecord): string {\n if (!tx.amount) return '';\n return pc.bold(`${tx.amount.toFixed(tx.amount < 0.01 ? 4 : 2)} ${tx.asset ?? ''}`);\n}\n\nfunction printTxSummary(tx: TransactionRecord) {\n const label = ACTION_LABELS[tx.action] ?? `📦 ${tx.action}`;\n const time = tx.timestamp ? relativeTime(tx.timestamp) : '';\n const amount = formatAmount(tx);\n const recipient = tx.recipient ? pc.dim(`→ ${truncateAddress(tx.recipient)}`) : '';\n const link = pc.dim(explorerUrl(tx.digest));\n\n printLine(`${label} ${amount} ${recipient}`);\n printLine(` ${pc.dim(truncateAddress(tx.digest))} ${pc.dim(time)}`);\n printLine(` ${link}`);\n}\n\nfunction printTxDetail(tx: TransactionRecord) {\n printHeader('Transaction Detail');\n\n const label = ACTION_LABELS[tx.action] ?? `📦 ${tx.action}`;\n printKeyValue('Type', label);\n printKeyValue('Digest', tx.digest);\n if (tx.amount) printKeyValue('Amount', `${tx.amount.toFixed(tx.amount < 0.01 ? 6 : 4)} ${tx.asset ?? ''}`);\n if (tx.recipient) printKeyValue('Recipient', tx.recipient);\n if (tx.timestamp) {\n printKeyValue('Time', `${new Date(tx.timestamp).toLocaleString()} (${relativeTime(tx.timestamp)})`);\n }\n if (tx.gasCost !== undefined) printKeyValue('Gas', `${tx.gasCost.toFixed(6)} SUI`);\n printBlank();\n printKeyValue('Explorer', explorerUrl(tx.digest));\n printBlank();\n}\n\nexport function registerHistory(program: Command) {\n program\n .command('history')\n .description('Show transaction history, or detail for a specific digest')\n .argument('[digest]', 'Transaction digest to view details')\n .option('--limit <n>', 'Number of transactions', '20')\n .option('--key <path>', 'Key file path')\n .action(async (digest: string | undefined, opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n if (digest) {\n const tx = await agent.transactionDetail(digest);\n if (!tx) {\n handleError(new Error(`Transaction not found: ${digest}`));\n return;\n }\n if (isJsonMode()) {\n printJson(tx);\n return;\n }\n printTxDetail(tx);\n return;\n }\n\n const txns = await agent.history({ limit: parseInt(opts.limit, 10) });\n\n if (isJsonMode()) {\n printJson(txns);\n return;\n }\n\n printHeader('Transaction History');\n\n if (txns.length === 0) {\n printInfo('No transactions yet.');\n } else {\n for (const tx of txns) {\n printTxSummary(tx);\n printBlank();\n }\n }\n\n printDivider();\n printInfo(`${txns.length} transaction${txns.length === 1 ? '' : 's'} shown`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin, askConfirm } from '../prompts.js';\nimport { printSuccess, printBlank, printInfo, printJson, isJsonMode, handleError, printError } from '../output.js';\n\nconst LOCKFILE = resolve(homedir(), '.t2000', '.pin-lock');\nconst MAX_ATTEMPTS = 5;\nconst LOCKOUT_MS = 5 * 60 * 1000;\n\ninterface LockState {\n attempts: number;\n lockedUntil: number;\n}\n\nasync function getLockState(): Promise<LockState> {\n try {\n const data = JSON.parse(await readFile(LOCKFILE, 'utf-8'));\n return data as LockState;\n } catch {\n return { attempts: 0, lockedUntil: 0 };\n }\n}\n\nasync function setLockState(state: LockState): Promise<void> {\n await mkdir(resolve(homedir(), '.t2000'), { recursive: true });\n await writeFile(LOCKFILE, JSON.stringify(state), { mode: 0o600 });\n}\n\nexport function registerExport(program: Command) {\n program\n .command('export')\n .description('Export private key (raw Ed25519 hex)')\n .option('--key <path>', 'Key file path')\n .option('--yes', 'Skip confirmation')\n .action(async (opts) => {\n try {\n const lock = await getLockState();\n if (lock.lockedUntil > Date.now()) {\n const remainSec = Math.ceil((lock.lockedUntil - Date.now()) / 1000);\n printError(`Too many failed PIN attempts. Try again in ${remainSec}s.`);\n return;\n }\n\n if (!opts.yes && !isJsonMode()) {\n const proceed = await askConfirm(\n 'WARNING: This will display your raw private key. Anyone with this key controls your wallet. Continue?',\n );\n if (!proceed) return;\n }\n\n const pin = await resolvePin();\n\n let agent;\n try {\n agent = await T2000.create({ pin, keyPath: opts.key });\n } catch (error) {\n const msg = error instanceof Error ? error.message : '';\n if (msg.includes('Invalid PIN')) {\n const newAttempts = lock.attempts + 1;\n if (newAttempts >= MAX_ATTEMPTS) {\n await setLockState({ attempts: newAttempts, lockedUntil: Date.now() + LOCKOUT_MS });\n printError(`Invalid PIN. Account locked for 5 minutes (${newAttempts} failed attempts).`);\n } else {\n await setLockState({ attempts: newAttempts, lockedUntil: 0 });\n printError(`Invalid PIN. ${MAX_ATTEMPTS - newAttempts} attempts remaining.`);\n }\n return;\n }\n throw error;\n }\n\n await setLockState({ attempts: 0, lockedUntil: 0 });\n\n const hex = agent.exportKey();\n\n if (isJsonMode()) {\n printJson({ privateKey: hex, format: 'ed25519_hex' });\n return;\n }\n\n printBlank();\n printSuccess('Private key (Ed25519, hex):');\n console.log(` ${hex}`);\n printBlank();\n printInfo('Not a BIP39 mnemonic. Store securely and never share.');\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, keypairFromPrivateKey, saveKey } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\nimport { password } from '@inquirer/prompts';\n\nexport function registerImport(program: Command) {\n program\n .command('import')\n .description('Import a wallet from private key')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n let privateKey: string;\n if (process.env.T2000_PRIVATE_KEY) {\n privateKey = process.env.T2000_PRIVATE_KEY;\n } else {\n privateKey = await password({ message: 'Enter private key (hex):' });\n }\n\n if (!privateKey) throw new Error('Private key is required');\n\n const pin = await resolvePin({ confirm: true });\n\n const keypair = keypairFromPrivateKey(privateKey);\n const address = keypair.getPublicKey().toSuiAddress();\n await saveKey(keypair, pin, opts.key);\n\n if (isJsonMode()) {\n printJson({ address, imported: true });\n return;\n }\n\n printBlank();\n printSuccess('Wallet imported (encrypted)');\n printKeyValue('Address', address);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerSave(program: Command) {\n const action = async (amountStr: string, opts: { key?: string; protocol?: string }) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n let gasManagerUsdc = 0;\n agent.on('gasAutoTopUp', (data) => {\n gasManagerUsdc = data.usdcSpent;\n });\n\n const result = await agent.save({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n\n if (gasManagerUsdc > 0) {\n printSuccess(`Gas manager: ${pc.yellow(formatUsd(gasManagerUsdc))} USDC → SUI`);\n }\n\n const protocolName = opts.protocol ?? 'best rate';\n printSuccess(`Saved ${pc.yellow(formatUsd(result.amount))} USDC to ${protocolName}`);\n\n if (result.fee > 0) {\n const feeRate = (result.fee / result.amount * 100).toFixed(1);\n printSuccess(`Protocol fee: ${pc.dim(`${formatUsd(result.fee)} USDC (${feeRate}%)`)}`);\n }\n\n printSuccess(`Current APY: ${pc.green(`${result.apy.toFixed(2)}%`)}`);\n\n printSuccess(`Savings balance: ${pc.yellow(formatUsd(result.savingsBalance))} USDC`);\n\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n };\n\n program\n .command('save')\n .description('Deposit USDC into savings')\n .argument('<amount>', 'Amount to save (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(action);\n\n program\n .command('supply')\n .description('Deposit USDC into savings (alias for save)')\n .argument('<amount>', 'Amount to save (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(action);\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerWithdraw(program: Command) {\n program\n .command('withdraw')\n .description('Withdraw USDC from savings')\n .argument('<amount>', 'Amount to withdraw (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(async (amountStr, opts) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.withdraw({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Withdrew ${formatUsd(result.amount)} USDC`);\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printWarning, explorerUrl } from '../output.js';\n\nexport function registerBorrow(program: Command) {\n program\n .command('borrow')\n .description('Borrow USDC against savings collateral')\n .argument('<amount>', 'Amount to borrow')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, opts) => {\n try {\n const amount = parseFloat(amountStr);\n if (isNaN(amount) || amount <= 0) {\n throw new Error('Amount must be a positive number');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const maxResult = await agent.maxBorrow();\n if (amount > maxResult.maxAmount) {\n printWarning(`Max safe borrow: ${formatUsd(maxResult.maxAmount)} (HF ${maxResult.currentHF.toFixed(2)} → min 1.5)`);\n return;\n }\n\n const result = await agent.borrow({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Borrowed ${formatUsd(amount)} USDC`);\n printKeyValue('Health Factor', result.healthFactor.toFixed(2));\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerRepay(program: Command) {\n program\n .command('repay')\n .description('Repay borrowed USDC')\n .argument('<amount>', 'Amount to repay (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, opts) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.repay({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Repaid ${formatUsd(result.amount)} USDC`);\n printKeyValue('Remaining Debt', formatUsd(result.remainingDebt));\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printSuccess, printWarning, printError } from '../output.js';\n\nexport function registerHealth(program: Command) {\n program\n .command('health')\n .description('Check savings health factor')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const hf = await agent.healthFactor();\n\n if (isJsonMode()) {\n printJson(hf);\n return;\n }\n\n printBlank();\n\n const noActiveLoan = hf.borrowed < 0.01;\n const hfStr = (hf.healthFactor === Infinity || noActiveLoan) ? '∞' : hf.healthFactor.toFixed(2);\n if (hf.healthFactor >= 2.0) {\n printSuccess(`Health Factor: ${hfStr} (healthy)`);\n } else if (hf.healthFactor >= 1.5) {\n printWarning(`Health Factor: ${hfStr} (moderate)`);\n } else if (hf.healthFactor >= 1.2) {\n printWarning(`Health Factor: ${hfStr} (low)`);\n } else {\n printError(`Health Factor: ${hfStr} (CRITICAL)`);\n }\n\n printBlank();\n printKeyValue('Supplied', `${formatUsd(hf.supplied)} USDC`);\n printKeyValue('Borrowed', `${formatUsd(hf.borrowed)} USDC`);\n printKeyValue('Max Borrow', `${formatUsd(hf.maxBorrow)} USDC`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, SUPPORTED_ASSETS, INVESTMENT_ASSETS, STABLE_ASSETS } from '@t2000/sdk';\nimport type { SupportedAsset } from '@t2000/sdk';\n\nconst INVEST_ASSETS = Object.keys(INVESTMENT_ASSETS) as SupportedAsset[];\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine, printDivider } from '../output.js';\n\nexport function registerRates(program: Command) {\n program\n .command('rates')\n .description('Show current APY rates across protocols and stablecoins')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const allRates = await agent.allRatesAcrossAssets();\n\n if (isJsonMode()) {\n printJson(allRates);\n return;\n }\n\n printBlank();\n\n if (allRates.length > 0) {\n const best = allRates.reduce((a, b) => b.rates.saveApy > a.rates.saveApy ? b : a);\n const bestDisplay = SUPPORTED_ASSETS[best.asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? best.asset;\n printLine(pc.bold(pc.green(`Best yield: ${best.rates.saveApy.toFixed(2)}% APY`)) + pc.dim(` (${bestDisplay} on ${best.protocol})`));\n printBlank();\n }\n\n for (const asset of STABLE_ASSETS) {\n const assetRates = allRates.filter(r => r.asset === asset);\n if (assetRates.length === 0) continue;\n\n const display = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? asset;\n printLine(pc.bold(display));\n printDivider();\n for (const entry of assetRates) {\n printKeyValue(entry.protocol, `Save ${entry.rates.saveApy.toFixed(2)}% Borrow ${entry.rates.borrowApy.toFixed(2)}%`);\n }\n printBlank();\n }\n\n const investRates = allRates.filter(r => INVEST_ASSETS.includes(r.asset as SupportedAsset));\n if (investRates.length > 0) {\n printLine(pc.bold('Investment Assets'));\n printDivider();\n for (const asset of INVEST_ASSETS) {\n const assetRates = investRates.filter(r => r.asset === asset);\n if (assetRates.length === 0) continue;\n const display = SUPPORTED_ASSETS[asset]?.displayName ?? asset;\n for (const entry of assetRates) {\n printKeyValue(`${display} (${entry.protocol})`, `Lend ${entry.rates.saveApy.toFixed(2)}%`);\n }\n }\n printBlank();\n }\n\n if (allRates.length === 0) {\n printInfo('No protocol rates available');\n printBlank();\n }\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd, formatAssetAmount } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine, printDivider } from '../output.js';\n\nexport function registerPositions(program: Command) {\n program\n .command('positions')\n .description('Show savings & borrow positions across all protocols and assets')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.positions();\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n let hasRewards = false;\n const rewardsByKey = new Map<string, boolean>();\n try {\n const pending = await agent.getPendingRewards();\n for (const r of pending) {\n rewardsByKey.set(`${r.protocol}:${r.asset}`, true);\n hasRewards = true;\n }\n } catch { /* skip */ }\n\n printBlank();\n if (result.positions.length === 0) {\n printInfo('No positions. Use `t2000 save <amount>` to start earning.');\n } else {\n const saves = result.positions.filter(p => p.type === 'save');\n const borrows = result.positions.filter(p => p.type === 'borrow');\n\n if (saves.length > 0) {\n printLine(pc.bold('Savings'));\n printDivider();\n for (const pos of saves) {\n const earning = rewardsByKey.has(`${pos.protocol}:${pos.asset}`)\n ? ` ${pc.yellow('+rewards')}`\n : '';\n const usd = formatUsd(pos.amountUsd ?? pos.amount);\n printKeyValue(pos.protocol, `${formatAssetAmount(pos.amount, pos.asset)} ${pos.asset} (${usd}) @ ${pos.apy.toFixed(2)}% APY${earning}`);\n }\n const totalSaved = saves.reduce((s, p) => s + (p.amountUsd ?? p.amount), 0);\n if (saves.length > 1) {\n printKeyValue('Total', formatUsd(totalSaved));\n }\n if (hasRewards) {\n printLine(` ${pc.dim('Run claim-rewards to collect and convert to USDC')}`);\n }\n printBlank();\n }\n\n if (borrows.length > 0) {\n printLine(pc.bold('Borrows'));\n printDivider();\n for (const pos of borrows) {\n const usd = formatUsd(pos.amountUsd ?? pos.amount);\n printKeyValue(pos.protocol, `${formatAssetAmount(pos.amount, pos.asset)} ${pos.asset} (${usd}) @ ${pos.apy.toFixed(2)}% APY`);\n }\n const totalBorrowed = borrows.reduce((s, p) => s + (p.amountUsd ?? p.amount), 0);\n if (borrows.length > 1) {\n printKeyValue('Total', formatUsd(totalBorrowed));\n }\n printBlank();\n }\n }\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd, formatAssetAmount } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printLine } from '../output.js';\n\nexport function registerEarnings(program: Command) {\n program\n .command('earnings')\n .description('Show yield earned to date')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.earnings();\n const pos = await agent.positions();\n const savePositions = pos.positions.filter((p) => p.type === 'save');\n\n if (isJsonMode()) {\n printJson({ ...result, positions: savePositions });\n return;\n }\n\n printBlank();\n printKeyValue('Total Saved', formatUsd(result.supplied));\n\n if (savePositions.length > 0) {\n for (const p of savePositions) {\n printLine(` ${pc.dim('•')} ${formatAssetAmount(p.amount, p.asset)} ${p.asset} (${formatUsd(p.amountUsd ?? p.amount)}) on ${p.protocol} @ ${p.apy.toFixed(2)}% APY`);\n }\n }\n\n printKeyValue('Blended APY', `${result.currentApy.toFixed(2)}%`);\n printKeyValue('Daily Yield', `~${formatUsd(result.dailyEarning)}/day`);\n printKeyValue('Est. Earned', `~${formatUsd(result.totalYieldEarned)}`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd, formatAssetAmount } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine } from '../output.js';\n\nexport function registerFundStatus(program: Command) {\n program\n .command('fund-status')\n .description('Full savings summary')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.fundStatus();\n const pos = await agent.positions();\n const savePositions = pos.positions.filter((p) => p.type === 'save');\n\n if (isJsonMode()) {\n printJson({ ...result, positions: savePositions });\n return;\n }\n\n printBlank();\n if (result.supplied > 0) {\n printSuccess('Savings: ACTIVE');\n } else {\n printInfo('Savings: INACTIVE — run `t2000 save <amount>` to start earning');\n }\n printBlank();\n printKeyValue('Total Saved', formatUsd(result.supplied));\n\n if (savePositions.length > 0) {\n for (const p of savePositions) {\n printLine(` ${pc.dim('•')} ${formatAssetAmount(p.amount, p.asset)} ${p.asset} (${formatUsd(p.amountUsd ?? p.amount)}) on ${p.protocol} @ ${p.apy.toFixed(2)}% APY`);\n }\n }\n\n printKeyValue('Blended APY', `${result.apy.toFixed(2)}%`);\n printKeyValue('Earned today', `~${formatUsd(result.earnedToday)}`);\n printKeyValue('Earned all time', `~${formatUsd(result.earnedAllTime)}`);\n printKeyValue('Monthly projected', `~${formatUsd(result.projectedMonthly)}/month`);\n printBlank();\n if (result.supplied > 0) {\n printInfo('Withdraw anytime: t2000 withdraw <amount>');\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { SafeguardEnforcer } from '@t2000/sdk';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printSuccess, printInfo, printHeader, printDivider } from '../output.js';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.json');\n\nconst SAFEGUARD_KEYS = new Set(['locked', 'maxPerTx', 'maxDailySend', 'dailyUsed', 'dailyResetDate', 'alertThreshold', 'maxLeverage', 'maxPositionSize']);\n\nexport function getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current == null || typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nexport function setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n let current = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!(part in current) || typeof current[part] !== 'object' || current[part] === null) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = value;\n}\n\nfunction loadConfig(): Record<string, unknown> {\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nfunction saveConfig(config: Record<string, unknown>): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + '\\n');\n}\n\nfunction formatUsd(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\nexport function registerConfig(program: Command) {\n const configCmd = program\n .command('config')\n .description('Show or set configuration');\n\n configCmd\n .command('show')\n .description('Show safeguard settings')\n .action(() => {\n try {\n const enforcer = new SafeguardEnforcer(CONFIG_DIR);\n enforcer.load();\n const config = enforcer.getConfig();\n\n if (isJsonMode()) {\n printJson({\n locked: config.locked,\n maxPerTx: config.maxPerTx,\n maxDailySend: config.maxDailySend,\n dailyUsed: config.dailyUsed,\n });\n return;\n }\n\n printHeader('Agent Safeguards');\n printDivider();\n printKeyValue('Locked', config.locked ? 'Yes' : 'No');\n printKeyValue('Per-transaction', config.maxPerTx > 0 ? formatUsd(config.maxPerTx) : 'Unlimited');\n printKeyValue('Daily send limit', config.maxDailySend > 0\n ? `${formatUsd(config.maxDailySend)} (${formatUsd(config.dailyUsed)} used today)`\n : 'Unlimited');\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n configCmd\n .command('get')\n .argument('[key]', 'Config key to get, supports dot notation (e.g. llm.provider)')\n .action((key?: string) => {\n try {\n const config = loadConfig();\n\n if (key) {\n const value = key.includes('.') ? getNestedValue(config, key) : config[key];\n if (isJsonMode()) {\n printJson({ [key]: value });\n return;\n }\n printBlank();\n const display = typeof value === 'object' ? JSON.stringify(value) : String(value ?? '(not set)');\n printKeyValue(key, display);\n } else {\n if (isJsonMode()) {\n printJson(config);\n return;\n }\n printBlank();\n if (Object.keys(config).length === 0) {\n printInfo('No configuration set.');\n } else {\n for (const [k, v] of Object.entries(config)) {\n const display = typeof v === 'object' ? JSON.stringify(v) : String(v);\n printKeyValue(k, display);\n }\n }\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n configCmd\n .command('set')\n .argument('<key>', 'Config key, supports dot notation (e.g. llm.provider)')\n .argument('<value>', 'Config value')\n .action((key: string, value: string) => {\n try {\n const leafKey = key.includes('.') ? key.split('.').pop()! : key;\n\n if (SAFEGUARD_KEYS.has(leafKey) && !key.includes('.')) {\n const enforcer = new SafeguardEnforcer(CONFIG_DIR);\n enforcer.load();\n\n let parsed: unknown = value;\n if (value === 'true') parsed = true;\n else if (value === 'false') parsed = false;\n else if (!isNaN(Number(value)) && value.trim() !== '') parsed = Number(value);\n\n enforcer.set(key, parsed);\n\n if (isJsonMode()) {\n printJson({ [key]: parsed });\n return;\n }\n\n printBlank();\n printSuccess(`Set ${key} = ${String(parsed)}`);\n printBlank();\n return;\n }\n\n const config = loadConfig();\n\n let parsed: unknown = value;\n if (value === 'true') parsed = true;\n else if (value === 'false') parsed = false;\n else if (!isNaN(Number(value)) && value.trim() !== '') parsed = Number(value);\n // Handle JSON arrays (e.g. allowedUsers)\n if (value.startsWith('[') || value.startsWith('{')) {\n try { parsed = JSON.parse(value); } catch { /* keep as string */ }\n }\n\n if (key.includes('.')) {\n setNestedValue(config, key, parsed);\n } else {\n config[key] = parsed;\n }\n saveConfig(config);\n\n if (isJsonMode()) {\n printJson({ [key]: parsed });\n return;\n }\n\n printBlank();\n printSuccess(`Set ${key} = ${String(parsed)}`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { randomBytes } from 'node:crypto';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { handleError } from '../output.js';\nimport { streamSSE } from 'hono/streaming';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\nconst TOKEN_PATH = join(CONFIG_DIR, 'config.json');\n\nfunction generateToken(): string {\n return `t2k_${randomBytes(24).toString('hex')}`;\n}\n\nfunction saveToken(token: string): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n let config: Record<string, unknown> = {};\n try {\n config = JSON.parse(readFileSync(TOKEN_PATH, 'utf-8'));\n } catch { /* empty */ }\n config.authToken = token;\n writeFileSync(TOKEN_PATH, JSON.stringify(config, null, 2) + '\\n');\n}\n\nfunction envelope(data: unknown) {\n return { success: true, data, timestamp: Math.floor(Date.now() / 1000) };\n}\n\nfunction errorResponse(code: string, message: string, data?: unknown, retryable = false) {\n return {\n success: false,\n error: { code, message, data, retryable },\n timestamp: Math.floor(Date.now() / 1000),\n };\n}\n\nexport function registerServe(program: Command) {\n program\n .command('serve')\n .description('Start HTTP API server')\n .option('--port <port>', 'Port number', '3001')\n .option('--rate-limit <rps>', 'Max requests per second', '10')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { port: string; rateLimit: string; key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const port = parseInt(opts.port, 10);\n const rateLimit = parseInt(opts.rateLimit, 10);\n\n const token = generateToken();\n saveToken(token);\n\n const app = buildApp(agent, token, rateLimit);\n\n serve({ fetch: app.fetch, port });\n\n console.log(` ✓ API server running on http://localhost:${port}`);\n console.log(` ✓ Auth token: ${token}`);\n console.log('');\n console.log(' Endpoints:');\n console.log(' GET /v1/balance POST /v1/send');\n console.log(' GET /v1/address POST /v1/save');\n console.log(' GET /v1/history POST /v1/withdraw');\n console.log(' GET /v1/earnings POST /v1/borrow');\n console.log(' GET /v1/rates POST /v1/repay');\n console.log(' GET /v1/health-factor');\n console.log(' GET /v1/positions');\n console.log(' GET /v1/events (SSE)');\n console.log('');\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction buildApp(agent: T2000, authToken: string, rateLimit: number): Hono {\n const app = new Hono();\n\n app.use('*', cors());\n\n // Rate limiting (sliding window)\n const requestLog: number[] = [];\n app.use('/v1/*', async (c, next) => {\n const now = Date.now();\n const windowMs = 1000;\n while (requestLog.length > 0 && requestLog[0]! < now - windowMs) {\n requestLog.shift();\n }\n if (requestLog.length >= rateLimit) {\n c.status(429);\n c.header('Retry-After', '1');\n return c.json(errorResponse('RATE_LIMITED', 'Too many requests', null, true));\n }\n requestLog.push(now);\n await next();\n });\n\n // Bearer auth\n app.use('/v1/*', async (c, next) => {\n const auth = c.req.header('Authorization');\n if (!auth || auth !== `Bearer ${authToken}`) {\n c.status(401);\n return c.json(errorResponse('UNAUTHORIZED', 'Invalid or missing Bearer token'));\n }\n await next();\n });\n\n // --- GET endpoints ---\n\n app.get('/v1/address', (c) => {\n return c.json(envelope({ address: agent.address }));\n });\n\n app.get('/v1/balance', async (c) => {\n try {\n const balance = await agent.balance();\n return c.json(envelope(balance));\n } catch (err) {\n return c.json(errorResponse('BALANCE_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/history', async (c) => {\n try {\n const limit = parseInt(c.req.query('limit') ?? '20', 10);\n const history = await agent.history({ limit });\n return c.json(envelope(history));\n } catch (err) {\n return c.json(errorResponse('HISTORY_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/deposit', (c) => {\n return c.json(envelope({\n address: agent.address,\n network: 'mainnet',\n instructions: 'Send USDC to this address on Sui mainnet.',\n }));\n });\n\n app.get('/v1/earnings', async (c) => {\n try {\n const earnings = await agent.earnings();\n return c.json(envelope(earnings));\n } catch (err) {\n return c.json(errorResponse('EARNINGS_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/rates', async (c) => {\n try {\n const rates = await agent.rates();\n return c.json(envelope(rates));\n } catch (err) {\n return c.json(errorResponse('RATES_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/health-factor', async (c) => {\n try {\n const hf = await agent.healthFactor();\n return c.json(envelope(hf));\n } catch (err) {\n return c.json(errorResponse('HEALTH_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/max-withdraw', async (c) => {\n try {\n const result = await agent.maxWithdraw();\n return c.json(envelope(result));\n } catch (err) {\n return c.json(errorResponse('MAX_WITHDRAW_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/max-borrow', async (c) => {\n try {\n const result = await agent.maxBorrow();\n return c.json(envelope(result));\n } catch (err) {\n return c.json(errorResponse('MAX_BORROW_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/positions', async (c) => {\n try {\n const positions = await agent.positions();\n return c.json(envelope(positions));\n } catch (err) {\n return c.json(errorResponse('POSITIONS_ERROR', errMsg(err)), 500);\n }\n });\n\n // --- POST endpoints ---\n\n app.post('/v1/send', async (c) => {\n try {\n const body = await c.req.json();\n const { to, amount, asset } = body as { to: string; amount: number; asset?: string };\n if (!to || !amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: to, amount'));\n }\n const result = await agent.send({ to, amount, asset: asset ?? 'USDC' });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/save', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/supply', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/withdraw', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number | 'all' };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.withdraw({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/borrow', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.borrow({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/repay', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number | 'all' };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.repay({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n // --- SSE endpoint ---\n\n app.get('/v1/events', async (c) => {\n const subscribeParam = c.req.query('subscribe') ?? 'yield,balanceChange,healthWarning';\n const subscriptions = new Set(subscribeParam.split(',').map((s) => s.trim()));\n\n return streamSSE(c, async (stream) => {\n const handlers: Array<{ event: string; off: () => void }> = [];\n\n for (const eventName of subscriptions) {\n const handler = (data: unknown) => {\n stream.writeSSE({ event: eventName, data: JSON.stringify(data) }).catch(() => {});\n };\n agent.on(eventName as never, handler as never);\n handlers.push({\n event: eventName,\n off: () => agent.off(eventName as never, handler as never),\n });\n }\n\n // Keep alive\n const keepAlive = setInterval(() => {\n stream.writeSSE({ event: 'ping', data: '{}' }).catch(() => {});\n }, 30_000);\n\n stream.onAbort(() => {\n clearInterval(keepAlive);\n for (const h of handlers) h.off();\n });\n\n // Block forever — SSE streams stay open\n await new Promise<void>(() => {});\n });\n });\n\n return app;\n}\n\nfunction errMsg(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nfunction handleApiError(err: unknown) {\n const t2kErr = err as { code?: string; message?: string; data?: unknown };\n return errorResponse(\n t2kErr.code ?? 'UNKNOWN',\n t2kErr.message ?? errMsg(err),\n t2kErr.data,\n isRetryable(t2kErr.code),\n );\n}\n\nfunction getStatusCode(err: unknown): number {\n const code = (err as { code?: string }).code;\n if (!code) return 500;\n if (code === 'INSUFFICIENT_BALANCE') return 400;\n if (code === 'INVALID_ADDRESS') return 400;\n if (code === 'WITHDRAW_WOULD_LIQUIDATE') return 400;\n if (code === 'NO_COLLATERAL') return 400;\n return 500;\n}\n\nfunction isRetryable(code?: string): boolean {\n if (!code) return false;\n return ['RPC_ERROR', 'RPC_UNREACHABLE', 'SPONSOR_UNAVAILABLE', 'AUTO_TOPUP_FAILED'].includes(code);\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printBlank,\n printJson,\n printInfo,\n isJsonMode,\n handleError,\n} from '../output.js';\n\nexport function registerPay(program: Command) {\n program\n .command('pay <url>')\n .description('Pay for an MPP-protected API resource')\n .option('--key <path>', 'Key file path')\n .option('--method <method>', 'HTTP method (GET, POST, PUT)', 'GET')\n .option('--data <json>', 'Request body for POST/PUT')\n .option('--header <key=value>', 'Additional HTTP header (repeatable)', collectHeaders, {})\n .option('--max-price <amount>', 'Max USDC price to auto-approve', '1.00')\n .action(async (url: string, opts: {\n key?: string;\n method: string;\n data?: string;\n header: Record<string, string>;\n maxPrice: string;\n }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const startTime = Date.now();\n const method = opts.data && opts.method === 'GET' ? 'POST' : opts.method;\n\n if (!isJsonMode()) {\n printBlank();\n printInfo(`→ ${method} ${url}`);\n }\n\n const maxPrice = parseFloat(opts.maxPrice);\n if (isNaN(maxPrice) || maxPrice <= 0) {\n throw new Error(`Invalid --max-price: \"${opts.maxPrice}\". Must be a positive number.`);\n }\n\n const result = await agent.pay({\n url,\n method,\n headers: opts.header,\n body: opts.data,\n maxPrice,\n });\n\n const elapsed = Date.now() - startTime;\n\n if (!isJsonMode()) {\n if (result.paid && result.receipt) {\n printSuccess(`Paid via MPP (tx: ${result.receipt.reference.slice(0, 10)}...)`);\n }\n printInfo(`← ${result.status} OK ${pc.dim(`[${elapsed}ms]`)}`);\n }\n\n if (isJsonMode()) {\n printJson({\n status: result.status,\n url,\n elapsed,\n paid: result.paid,\n cost: result.cost,\n receipt: result.receipt,\n body: result.body,\n });\n } else {\n printBlank();\n if (typeof result.body === 'string') {\n console.log(result.body);\n } else {\n console.log(JSON.stringify(result.body, null, 2));\n }\n printBlank();\n }\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction collectHeaders(value: string, previous: Record<string, string>): Record<string, string> {\n const [key, ...rest] = value.split('=');\n if (key && rest.length > 0) {\n previous[key.trim()] = rest.join('=').trim();\n }\n return previous;\n}\n","import type { Command } from 'commander';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { SafeguardEnforcer } from '@t2000/sdk';\nimport { clearSession, resolvePin, saveSession } from '../prompts.js';\nimport { printSuccess, printBlank, printJson, printInfo, isJsonMode, handleError, printError } from '../output.js';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\n\nexport function registerLock(program: Command) {\n program\n .command('lock')\n .description('Lock agent — freeze all operations')\n .action(async () => {\n try {\n const enforcer = new SafeguardEnforcer(CONFIG_DIR);\n enforcer.load();\n enforcer.lock();\n await clearSession();\n\n if (isJsonMode()) {\n printJson({ locked: true });\n return;\n }\n\n printBlank();\n printSuccess('Agent locked. All operations frozen.');\n printInfo('Run: t2000 unlock (requires PIN)');\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n program\n .command('unlock')\n .description('Unlock agent — resume operations')\n .action(async () => {\n try {\n const { T2000 } = await import('@t2000/sdk');\n const MAX_ATTEMPTS = 3;\n\n let pin: string | undefined;\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n pin = await resolvePin({ skipSession: true });\n if (!pin) {\n throw new Error('PIN required to unlock agent');\n }\n\n try {\n await T2000.create({ pin });\n break;\n } catch (error) {\n const msg = error instanceof Error ? error.message : '';\n if (msg.includes('Invalid PIN')) {\n const remaining = MAX_ATTEMPTS - attempt;\n if (remaining > 0) {\n printError(`Invalid PIN. ${remaining} attempt${remaining > 1 ? 's' : ''} remaining.`);\n pin = undefined;\n continue;\n }\n printError('Invalid PIN. No attempts remaining.');\n return;\n }\n throw error;\n }\n }\n\n if (!pin) return;\n\n await saveSession(pin);\n\n const enforcer = new SafeguardEnforcer(CONFIG_DIR);\n enforcer.load();\n enforcer.unlock();\n\n if (isJsonMode()) {\n printJson({ locked: false });\n return;\n }\n\n const config = enforcer.getConfig();\n printBlank();\n printSuccess('Agent unlocked. Operations resumed.');\n if (config.maxPerTx > 0 || config.maxDailySend > 0) {\n const limits: string[] = [];\n if (config.maxPerTx > 0) limits.push(`maxPerTx=$${config.maxPerTx}`);\n if (config.maxDailySend > 0) limits.push(`maxDailySend=$${config.maxDailySend}`);\n printInfo(`Active safeguards: ${limits.join(', ')}`);\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, MIST_PER_SUI } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printError,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printHeader,\n printInfo,\n printLine,\n printDivider,\n explorerUrl,\n} from '../output.js';\nimport pc from 'picocolors';\n\nfunction formatSui(mist: bigint): string {\n return (Number(mist) / Number(MIST_PER_SUI)).toFixed(2);\n}\n\nexport function registerSentinel(program: Command) {\n const sentinel = program\n .command('sentinel')\n .description('Interact with Sui Sentinel — attack AI agents, earn bounties');\n\n sentinel\n .command('list')\n .description('List active sentinels with prize pools')\n .action(async () => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin });\n const sentinels = await agent.sentinelList();\n\n if (isJsonMode()) {\n printJson(sentinels.map((s) => ({\n ...s,\n attackFee: s.attackFee.toString(),\n prizePool: s.prizePool.toString(),\n })));\n return;\n }\n\n if (sentinels.length === 0) {\n printBlank();\n printInfo('No active sentinels found.');\n printBlank();\n return;\n }\n\n printHeader('Active Sentinels');\n\n sentinels.forEach((s) => {\n const pool = `${formatSui(s.prizePool)} SUI`.padEnd(12);\n const fee = `${formatSui(s.attackFee)} SUI`.padEnd(12);\n printLine(` ${s.name}`);\n printLine(` ${pc.dim(`Pool: ${pool}Fee: ${fee}Attacks: ${s.totalAttacks}`)}`);\n printLine(` ${pc.dim(s.objectId)}`);\n printBlank();\n });\n\n printBlank();\n printInfo(`${sentinels.length} active sentinel${sentinels.length === 1 ? '' : 's'}`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n sentinel\n .command('info')\n .description('Show details for a sentinel')\n .argument('<id>', 'Sentinel object ID')\n .action(async (id: string) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin });\n const s = await agent.sentinelInfo(id);\n\n if (isJsonMode()) {\n printJson({\n ...s,\n attackFee: s.attackFee.toString(),\n prizePool: s.prizePool.toString(),\n });\n return;\n }\n\n printHeader(s.name);\n printKeyValue('Object ID', s.objectId);\n printKeyValue('Agent ID', s.id);\n printKeyValue('Model', s.model);\n printKeyValue('State', s.state);\n printKeyValue('Attack Fee', `${formatSui(s.attackFee)} SUI`);\n printKeyValue('Prize Pool', `${formatSui(s.prizePool)} SUI`);\n printKeyValue('Total Attacks', String(s.totalAttacks));\n printKeyValue('Breaches', String(s.successfulBreaches));\n if (s.systemPrompt) {\n printBlank();\n printKeyValue('System Prompt', '');\n printLine(` ${pc.dim(s.systemPrompt.slice(0, 500))}`);\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n sentinel\n .command('attack')\n .description('Attack a sentinel with a prompt (costs SUI)')\n .argument('<id>', 'Sentinel object ID')\n .argument('[prompt]', 'Attack prompt')\n .option('--fee <sui>', 'Override attack fee in SUI')\n .option('--key <path>', 'Key file path')\n .action(async (id: string, prompt: string | undefined, opts: { fee?: string; key?: string }) => {\n try {\n if (!prompt) {\n throw new Error('Prompt is required. Usage: t2000 sentinel attack <id> \"your prompt\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const feeMist = opts.fee\n ? BigInt(Math.round(parseFloat(opts.fee) * Number(MIST_PER_SUI)))\n : undefined;\n\n if (isJsonMode()) {\n const result = await agent.sentinelAttack(id, prompt, feeMist);\n printJson({\n ...result,\n verdict: {\n ...result.verdict,\n },\n });\n return;\n }\n\n printBlank();\n printLine(` ${pc.dim('⏳')} Requesting attack...`);\n\n const result = await agent.sentinelAttack(id, prompt, feeMist);\n\n printBlank();\n if (result.won) {\n printSuccess(`BREACHED! (score: ${result.verdict.score}/100)`);\n } else {\n printError(`DEFENDED (score: ${result.verdict.score}/100)`);\n }\n\n printBlank();\n printKeyValue('Agent', result.verdict.agentResponse.slice(0, 200));\n printKeyValue('Jury', result.verdict.juryResponse.slice(0, 200));\n if (result.verdict.funResponse) {\n printKeyValue('Fun', result.verdict.funResponse.slice(0, 200));\n }\n printBlank();\n printKeyValue('Fee Paid', `${result.feePaid} SUI`);\n printKeyValue('Request Tx', explorerUrl(result.requestTx));\n printKeyValue('Settle Tx', explorerUrl(result.settleTx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, MIST_PER_SUI, listSentinels, formatUsd } from '@t2000/sdk';\nimport type { SentinelAgent } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printHeader,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printDivider,\n printLine,\n printInfo,\n} from '../output.js';\nimport pc from 'picocolors';\n\nfunction mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nfunction bestTarget(sentinels: SentinelAgent[]): SentinelAgent | undefined {\n const withPool = sentinels.filter((s) => s.prizePool > 0n && s.attackFee > 0n);\n if (withPool.length === 0) return undefined;\n return withPool.sort((a, b) => {\n const ratioA = Number(a.prizePool) / Number(a.attackFee);\n const ratioB = Number(b.prizePool) / Number(b.attackFee);\n return ratioB - ratioA;\n })[0];\n}\n\nexport function registerEarn(program: Command) {\n program\n .command('earn')\n .description('Show all earning opportunities — savings yield + sentinel bounties')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const [positionsResult, portfolioResult, ratesResult, sentinels] = await Promise.allSettled([\n agent.positions(),\n agent.getPortfolio(),\n agent.allRates('USDC'),\n listSentinels(),\n ]);\n\n const posData = positionsResult.status === 'fulfilled' ? positionsResult.value : null;\n const portfolio = portfolioResult.status === 'fulfilled' ? portfolioResult.value : null;\n const ratesData = ratesResult.status === 'fulfilled' ? ratesResult.value : null;\n const agents = sentinels.status === 'fulfilled' ? sentinels.value : null;\n const savePositions = posData?.positions.filter((p) => p.type === 'save') ?? [];\n const totalSaved = savePositions.reduce((s, p) => s + p.amount, 0);\n const earningInvestments = portfolio?.positions.filter((p) => p.earning && p.currentValue > 0) ?? [];\n const bestSaveApy = ratesData?.length\n ? Math.max(...ratesData.map(r => r.rates.saveApy))\n : 0;\n\n if (isJsonMode()) {\n const best = agents ? bestTarget(agents) : undefined;\n const totalPool = agents\n ? agents.reduce((sum, s) => sum + mistToSui(s.prizePool), 0)\n : 0;\n const cheapest = agents\n ? Math.min(...agents.map((s) => mistToSui(s.attackFee)))\n : 0;\n\n printJson({\n savings: savePositions.map((p) => ({\n protocol: p.protocol,\n asset: p.asset,\n amount: p.amount,\n apy: p.apy,\n })),\n totalSaved,\n availableRates: ratesData?.map(r => ({\n protocol: r.protocol,\n asset: 'USDC',\n saveApy: r.rates.saveApy,\n })) ?? [],\n investments: earningInvestments.map((p) => ({\n asset: p.asset,\n amount: p.totalAmount,\n value: p.currentValue,\n protocol: p.earningProtocol,\n apy: p.earningApy,\n })),\n sentinel: agents\n ? {\n activeSentinels: agents.length,\n totalPrizePool: Number(totalPool.toFixed(2)),\n cheapestFee: Number(cheapest.toFixed(2)),\n bestTarget: best\n ? {\n name: best.name,\n objectId: best.objectId,\n prizePool: mistToSui(best.prizePool),\n attackFee: mistToSui(best.attackFee),\n ratio: Number((Number(best.prizePool) / Number(best.attackFee)).toFixed(1)),\n }\n : null,\n }\n : null,\n });\n return;\n }\n\n printHeader('Earning Opportunities');\n\n // --- Savings section ---\n printLine(pc.bold('SAVINGS') + pc.dim(' — Passive Yield'));\n printDivider();\n\n if (savePositions.length > 0) {\n for (const pos of savePositions) {\n const dailyYield = (pos.amount * pos.apy / 100) / 365;\n printKeyValue(pos.protocol, `${formatUsd(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(2)}% APY`);\n if (dailyYield > 0.0001) {\n const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` : formatUsd(dailyYield);\n const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` : formatUsd(dailyYield * 30);\n printLine(pc.dim(` ~${dailyStr}/day · ~${monthlyStr}/month`));\n }\n }\n if (savePositions.length > 1) {\n printBlank();\n printKeyValue('Total Saved', formatUsd(totalSaved));\n }\n } else if (ratesData && ratesData.length > 0) {\n const sorted = [...ratesData].sort((a, b) => b.rates.saveApy - a.rates.saveApy);\n for (const r of sorted) {\n printKeyValue(r.protocol, `USDC @ ${r.rates.saveApy.toFixed(2)}% APY`);\n }\n const example = 100;\n const daily = (example * bestSaveApy / 100) / 365;\n const monthly = daily * 30;\n printLine(pc.dim(` Save $${example} → ~$${daily.toFixed(2)}/day · ~$${monthly.toFixed(2)}/month`));\n printBlank();\n printInfo('No savings yet — run `t2000 save <amount>` to start');\n } else if (posData) {\n printInfo('No savings yet — run `t2000 save <amount>` to start');\n } else {\n printInfo('Savings data unavailable');\n }\n\n // --- Investment yield section ---\n if (earningInvestments.length > 0) {\n printBlank();\n printLine(pc.bold('INVESTMENTS') + pc.dim(' — Earning Yield'));\n printDivider();\n\n let totalInvestValue = 0;\n for (const pos of earningInvestments) {\n const dailyYield = (pos.currentValue * (pos.earningApy ?? 0) / 100) / 365;\n const apyStr = pos.earningApy ? `${pos.earningApy.toFixed(2)}%` : '—';\n printKeyValue(\n `${pos.asset} via ${pos.earningProtocol ?? 'unknown'}`,\n `${formatUsd(pos.currentValue)} (${pos.totalAmount.toFixed(4)} ${pos.asset}) @ ${apyStr} APY`,\n );\n if (dailyYield > 0.0001) {\n const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` : formatUsd(dailyYield);\n const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` : formatUsd(dailyYield * 30);\n printLine(pc.dim(` ~${dailyStr}/day · ~${monthlyStr}/month`));\n }\n totalInvestValue += pos.currentValue;\n }\n\n if (earningInvestments.length > 1) {\n printBlank();\n printKeyValue('Total Earning', formatUsd(totalInvestValue));\n }\n }\n\n printBlank();\n\n // --- Sentinel section ---\n printLine(pc.bold('SENTINEL BOUNTIES') + pc.dim(' — Active Red Teaming'));\n printDivider();\n\n if (agents && agents.length > 0) {\n const totalPool = agents.reduce((sum, s) => sum + mistToSui(s.prizePool), 0);\n const cheapest = Math.min(...agents.map((s) => mistToSui(s.attackFee)));\n const best = bestTarget(agents);\n\n printKeyValue('Active', `${agents.length} sentinels`);\n printKeyValue('Prize Pools', `${totalPool.toFixed(2)} SUI available`);\n printKeyValue('Cheapest Fee', `${cheapest.toFixed(2)} SUI`);\n\n if (best) {\n const ratio = (Number(best.prizePool) / Number(best.attackFee)).toFixed(1);\n printKeyValue('Best Target', `${best.name} — ${mistToSui(best.prizePool).toFixed(2)} SUI pool (${ratio}x ratio)`);\n }\n } else if (agents) {\n printInfo('No active bounties right now');\n } else {\n printInfo('Sentinel data unavailable');\n }\n\n printBlank();\n\n // --- Quick actions ---\n printLine(pc.bold('Quick Actions'));\n printDivider();\n printLine(` ${pc.dim('t2000 save <amount> [asset]')} Save stablecoins for yield`);\n printLine(` ${pc.dim('t2000 invest earn <asset>')} Earn yield on investments`);\n printLine(` ${pc.dim('t2000 sentinel list')} Browse sentinel bounties`);\n printLine(` ${pc.dim('t2000 sentinel attack <id>')} Attack a sentinel`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd, SUPPORTED_ASSETS } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printInfo,\n printWarning,\n printLine,\n printDivider,\n explorerUrl,\n} from '../output.js';\n\nexport function registerRebalance(program: Command) {\n program\n .command('rebalance')\n .description('Optimize yield — move savings to the best rate across protocols and stablecoins')\n .option('--key <path>', 'Key file path')\n .option('--dry-run', 'Show what would happen without executing')\n .option('--min-diff <pct>', 'Minimum APY difference to trigger (default: 0.5)', '0.5')\n .option('--max-break-even <days>', 'Max break-even days for cross-asset moves (default: 30)', '30')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const minYieldDiff = parseFloat(opts.minDiff ?? '0.5');\n const maxBreakEven = parseInt(opts.maxBreakEven ?? '30', 10);\n\n const plan = await agent.rebalance({\n dryRun: true,\n minYieldDiff,\n maxBreakEven,\n });\n\n if (isJsonMode()) {\n if (opts.dryRun) {\n printJson(plan);\n } else {\n const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });\n printJson(result);\n }\n return;\n }\n\n printBlank();\n\n if (plan.steps.length === 0) {\n const diff = plan.newApy - plan.currentApy;\n if (diff < minYieldDiff) {\n printInfo(`Already optimized — ${plan.currentApy.toFixed(2)}% APY on ${plan.fromProtocol}`);\n printLine(pc.dim(` Best available: ${plan.newApy.toFixed(2)}% (${displayAsset(plan.toAsset)} on ${plan.toProtocol})`));\n printLine(pc.dim(` Difference: ${diff.toFixed(2)}% (below ${minYieldDiff}% threshold)`));\n } else if (plan.breakEvenDays > maxBreakEven && plan.estimatedSwapCost > 0) {\n printInfo(`Skipped — break-even of ${plan.breakEvenDays} days exceeds ${maxBreakEven}-day limit`);\n printLine(pc.dim(` ${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}%) → ${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}%)`));\n } else {\n printInfo('Already at the best rate. Nothing to rebalance.');\n }\n printBlank();\n return;\n }\n\n printLine(pc.bold('Rebalance Plan'));\n printDivider();\n printKeyValue('From', `${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}% APY)`);\n printKeyValue('To', `${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}% APY)`);\n printKeyValue('Amount', formatUsd(plan.amount));\n printBlank();\n\n printLine(pc.bold('Economics'));\n printDivider();\n printKeyValue('APY Gain', `+${(plan.newApy - plan.currentApy).toFixed(2)}%`);\n printKeyValue('Annual Gain', `${formatUsd(plan.annualGain)}/year`);\n if (plan.estimatedSwapCost > 0) {\n printKeyValue('Swap Cost', `~${formatUsd(plan.estimatedSwapCost)}`);\n printKeyValue('Break-even', `${plan.breakEvenDays} days`);\n }\n printBlank();\n\n if (plan.steps.length > 0) {\n printLine(pc.bold('Steps'));\n printDivider();\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i];\n const num = `${i + 1}.`;\n if (step.action === 'withdraw') {\n printLine(` ${num} Withdraw ${formatUsd(step.amount)} ${displayAsset(step.fromAsset ?? '')} from ${step.protocol}`);\n } else if (step.action === 'swap') {\n printLine(` ${num} Swap ${displayAsset(step.fromAsset ?? '')} → ${displayAsset(step.toAsset ?? '')} (~${formatUsd(step.estimatedOutput ?? 0)})`);\n } else if (step.action === 'deposit') {\n printLine(` ${num} Deposit ${formatUsd(step.amount)} ${displayAsset(step.toAsset ?? '')} into ${step.protocol}`);\n }\n }\n printBlank();\n }\n\n if (opts.dryRun) {\n printLine(pc.bold(pc.yellow('DRY RUN — Preview only, no transactions executed')));\n printLine(pc.dim(' Run `t2000 rebalance` to execute.'));\n printBlank();\n return;\n }\n\n const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });\n\n if (result.executed) {\n printSuccess(`Rebalanced ${formatUsd(result.amount)} → ${result.newApy.toFixed(2)}% APY`);\n for (const digest of result.txDigests) {\n printKeyValue('Tx', explorerUrl(digest));\n }\n printKeyValue('Gas', `${result.totalGasCost.toFixed(4)} SUI`);\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction displayAsset(asset: string): string {\n return SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? asset;\n}\n","import type { Command } from 'commander';\nimport { T2000, SUPPORTED_ASSETS } from '@t2000/sdk';\nimport pc from 'picocolors';\nimport { resolvePin } from '../prompts.js';\nimport { printJson, isJsonMode, handleError } from '../output.js';\n\nfunction resolveAssetName(input: string): string {\n const upper = input.toUpperCase();\n for (const key of Object.keys(SUPPORTED_ASSETS)) {\n if (key.toUpperCase() === upper) return key;\n }\n return input;\n}\n\n/** @deprecated Use `swap` command instead */\nexport function registerExchange(program: Command) {\n program\n .command('exchange <amount> <from> <to>')\n .description('[deprecated — use \"swap\" instead] Exchange between tokens')\n .option('--key <path>', 'Key file path')\n .option('--slippage <pct>', 'Max slippage percentage (default: 3)', '3')\n .action(async (amount: string, from: string, to: string, opts: { key?: string; slippage?: string }) => {\n try {\n console.error(pc.yellow(' ⚠ \"exchange\" is deprecated. Use \"swap\" instead: t2000 swap %s %s %s'), amount, from, to);\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const parsedAmount = parseFloat(amount);\n if (isNaN(parsedAmount) || parsedAmount <= 0) throw new Error('Amount must be a positive number');\n\n const result = await agent.swap({\n from: resolveAssetName(from),\n to: resolveAssetName(to),\n amount: parsedAmount,\n maxSlippage: parseFloat(opts.slippage ?? '3') / 100,\n });\n\n if (isJsonMode()) { printJson(result); return; }\n console.log(pc.green(' ✓ Swapped. Tx: %s'), result.tx);\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd, SUPPORTED_ASSETS } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nfunction resolveAssetName(input: string): string {\n const upper = input.toUpperCase();\n for (const key of Object.keys(SUPPORTED_ASSETS)) {\n if (key.toUpperCase() === upper) return key;\n }\n return input;\n}\n\nfunction fmtTokenAmount(amount: number, asset: string): string {\n if (['USDC', 'USDT', 'USDE'].includes(asset)) return formatUsd(amount);\n if (amount > 0 && amount < 0.001) return amount.toFixed(8);\n if (amount > 0 && amount < 1) return amount.toFixed(6);\n return amount.toFixed(4);\n}\n\nasync function executeSwap(\n from: string,\n to: string,\n amount: number,\n opts: { key?: string; slippage?: string },\n label: 'Swapped' | 'Bought' | 'Sold',\n) {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const fromAsset = resolveAssetName(from);\n const toAsset = resolveAssetName(to);\n\n const result = await agent.swap({\n from: fromAsset,\n to: toAsset,\n amount,\n maxSlippage: parseFloat(opts.slippage ?? '3') / 100,\n });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n const fromDisplay = SUPPORTED_ASSETS[fromAsset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? fromAsset;\n const toDisplay = SUPPORTED_ASSETS[toAsset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? toAsset;\n\n printBlank();\n if (label === 'Bought') {\n printSuccess(`Bought ${fmtTokenAmount(result.toAmount, toAsset)} ${toDisplay} for ${formatUsd(amount)}`);\n } else if (label === 'Sold') {\n printSuccess(`Sold ${fmtTokenAmount(amount, fromAsset)} ${fromDisplay} for ${formatUsd(result.toAmount)}`);\n } else {\n printSuccess(`Swapped ${fmtTokenAmount(amount, fromAsset)} ${fromDisplay} → ${fmtTokenAmount(result.toAmount, toAsset)} ${toDisplay}`);\n }\n printKeyValue('Tx', explorerUrl(result.tx));\n printKeyValue('Gas', `${result.gasCost.toFixed(4)} SUI (${result.gasMethod})`);\n printBlank();\n}\n\nexport function registerSwap(program: Command) {\n program\n .command('swap <amount> <from> <to>')\n .description('Swap tokens (e.g. swap 100 USDC SUI)')\n .option('--key <path>', 'Key file path')\n .option('--slippage <pct>', 'Max slippage percentage (default: 3)', '3')\n .action(async (amount: string, from: string, to: string, opts: { key?: string; slippage?: string }) => {\n try {\n const parsedAmount = parseFloat(amount);\n if (isNaN(parsedAmount) || parsedAmount <= 0) {\n throw new Error('Amount must be a positive number');\n }\n await executeSwap(from, to, parsedAmount, opts, 'Swapped');\n } catch (error) {\n handleError(error);\n }\n });\n\n program\n .command('buy <amount> <asset>')\n .description('Buy an asset with USDC (e.g. buy 100 BTC)')\n .option('--key <path>', 'Key file path')\n .option('--slippage <pct>', 'Max slippage percentage (default: 3)', '3')\n .action(async (amount: string, asset: string, opts: { key?: string; slippage?: string }) => {\n try {\n const parsedAmount = parseFloat(amount);\n if (isNaN(parsedAmount) || parsedAmount <= 0) {\n throw new Error('Amount must be a positive number');\n }\n await executeSwap('USDC', asset, parsedAmount, opts, 'Bought');\n } catch (error) {\n handleError(error);\n }\n });\n\n program\n .command('sell <amount> <asset>')\n .description('Sell an asset for USDC (e.g. sell 0.001 BTC)')\n .option('--key <path>', 'Key file path')\n .option('--slippage <pct>', 'Max slippage percentage (default: 3)', '3')\n .action(async (amount: string, asset: string, opts: { key?: string; slippage?: string }) => {\n try {\n const parsedAmount = parseFloat(amount);\n if (isNaN(parsedAmount) || parsedAmount <= 0) {\n throw new Error('Amount must be a positive number');\n }\n await executeSwap(asset, 'USDC', parsedAmount, opts, 'Sold');\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { existsSync } from 'node:fs';\nimport { printSuccess, printBlank, printInfo, printJson, isJsonMode, handleError } from '../output.js';\n\nconst MCP_CONFIG = {\n command: 't2000',\n args: ['mcp'],\n};\n\ninterface McpConfigFile {\n mcpServers?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\nfunction getPlatformConfigs(): { name: string; path: string }[] {\n const home = homedir();\n return [\n {\n name: 'Claude Desktop',\n path: join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json'),\n },\n {\n name: 'Cursor',\n path: join(home, '.cursor', 'mcp.json'),\n },\n {\n name: 'Windsurf',\n path: join(home, '.codeium', 'windsurf', 'mcp_config.json'),\n },\n ];\n}\n\nasync function readJsonFile(path: string): Promise<McpConfigFile> {\n try {\n const content = await readFile(path, 'utf-8');\n return JSON.parse(content);\n } catch {\n return {};\n }\n}\n\nasync function writeJsonFile(path: string, data: McpConfigFile): Promise<void> {\n const dir = dirname(path);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(path, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\n}\n\nexport function registerMcp(program: Command) {\n const mcp = program\n .command('mcp')\n .description('MCP server for AI platforms');\n\n mcp\n .command('start', { isDefault: true })\n .description('Start MCP server (stdio transport)')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n let mod: { startMcpServer: (opts?: { keyPath?: string }) => Promise<void> };\n try {\n mod = await import('@t2000/mcp' as string);\n } catch {\n console.error(\n 'MCP server not installed. Run:\\n npm install -g @t2000/mcp',\n );\n process.exit(1);\n }\n await mod.startMcpServer({ keyPath: opts.key });\n });\n\n mcp\n .command('install')\n .description('Auto-configure MCP in Claude Desktop, Cursor, and Windsurf')\n .action(async () => {\n try {\n const platforms = getPlatformConfigs();\n const results: { name: string; status: 'added' | 'exists' }[] = [];\n\n for (const platform of platforms) {\n const config = await readJsonFile(platform.path);\n\n if (config.mcpServers && (config.mcpServers as Record<string, unknown>)['t2000']) {\n results.push({ name: platform.name, status: 'exists' });\n continue;\n }\n\n config.mcpServers = {\n ...(config.mcpServers ?? {}),\n t2000: MCP_CONFIG,\n };\n\n await writeJsonFile(platform.path, config);\n results.push({ name: platform.name, status: 'added' });\n }\n\n if (isJsonMode()) {\n printJson({ installed: results });\n return;\n }\n\n printBlank();\n for (const r of results) {\n if (r.status === 'exists') {\n printInfo(`${r.name} already configured`);\n } else {\n printSuccess(`${r.name} configured`);\n }\n }\n printBlank();\n printInfo('Restart your AI platform to activate.');\n printInfo('Then ask: \"what\\'s my t2000 balance?\"');\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n mcp\n .command('uninstall')\n .description('Remove t2000 MCP config from Claude Desktop, Cursor, and Windsurf')\n .action(async () => {\n try {\n const platforms = getPlatformConfigs();\n const results: { name: string; removed: boolean }[] = [];\n\n for (const platform of platforms) {\n if (!existsSync(platform.path)) {\n results.push({ name: platform.name, removed: false });\n continue;\n }\n\n const config = await readJsonFile(platform.path);\n\n if (!config.mcpServers || !(config.mcpServers as Record<string, unknown>)['t2000']) {\n results.push({ name: platform.name, removed: false });\n continue;\n }\n\n delete (config.mcpServers as Record<string, unknown>)['t2000'];\n await writeJsonFile(platform.path, config);\n results.push({ name: platform.name, removed: true });\n }\n\n if (isJsonMode()) {\n printJson({ uninstalled: results });\n return;\n }\n\n printBlank();\n for (const r of results) {\n if (r.removed) {\n printSuccess(`${r.name} removed`);\n } else {\n printInfo(`${r.name} not configured (skipped)`);\n }\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { ContactManager, truncateAddress } from '@t2000/sdk';\nimport { printSuccess, printError, printHeader, printLine, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerContacts(program: Command) {\n const contacts = program\n .command('contacts')\n .description('Manage contacts (send by name instead of address)');\n\n contacts\n .command('add <name> <address>')\n .description('Add or update a contact')\n .action((name: string, address: string) => {\n try {\n const manager = new ContactManager();\n const result = manager.add(name, address);\n\n if (isJsonMode()) {\n const contact = manager.get(name)!;\n printJson({ action: result.action, name: contact.name, address: contact.address });\n return;\n }\n\n const contact = manager.get(name)!;\n printBlank();\n printSuccess(`${result.action === 'added' ? 'Added' : 'Updated'} ${contact.name} (${truncateAddress(contact.address)})`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n contacts\n .command('remove <name>')\n .description('Remove a contact')\n .action((name: string) => {\n try {\n const manager = new ContactManager();\n const removed = manager.remove(name);\n\n if (isJsonMode()) {\n printJson({ removed, name });\n return;\n }\n\n printBlank();\n if (removed) {\n printSuccess(`Removed ${name}`);\n } else {\n printError(`Contact \"${name}\" not found`);\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n contacts\n .command('list', { isDefault: true })\n .description('List all contacts')\n .action(() => {\n try {\n const manager = new ContactManager();\n const list = manager.list();\n\n if (isJsonMode()) {\n printJson(list);\n return;\n }\n\n if (list.length === 0) {\n printBlank();\n printLine('No contacts yet.');\n printLine('Add one: t2000 contacts add Tom 0x...');\n printBlank();\n return;\n }\n\n printHeader('Contacts');\n\n const maxNameLen = Math.max(...list.map((c) => c.name.length));\n for (const contact of list) {\n const padded = contact.name.padEnd(maxNameLen + 4);\n printLine(`${padded}${truncateAddress(contact.address)}`);\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd, formatAssetAmount, DEFAULT_STRATEGIES, INVESTMENT_ASSETS } from '@t2000/sdk';\nimport type { InvestmentAsset } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl, printHeader, printSeparator, printInfo, printLine } from '../output.js';\n\nexport function registerInvest(program: Command) {\n const investCmd = program\n .command('invest')\n .description('Investment strategies, DCA, and yield earning');\n\n investCmd\n .command('buy <amount> <asset>')\n .description('[deprecated — use \"buy\" instead] Buy an asset')\n .option('--key <path>', 'Key file path')\n .option('--slippage <pct>', 'Max slippage percent', '3')\n .action(async (amount: string, asset: string, opts: { key?: string; slippage: string }) => {\n try {\n console.error(pc.yellow(` ⚠ \"invest buy\" is deprecated. Use: t2000 buy ${amount} ${asset}`));\n const parsed = parseFloat(amount);\n if (isNaN(parsed) || parsed <= 0 || !isFinite(parsed)) {\n console.error(pc.red(' ✗ Amount must be greater than $0'));\n process.exitCode = 1;\n return;\n }\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.investBuy({\n asset: asset.toUpperCase() as InvestmentAsset,\n usdAmount: parsed,\n maxSlippage: parseFloat(opts.slippage) / 100,\n });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n const sym = asset.toUpperCase();\n printSuccess(`Bought ${formatAssetAmount(result.amount, sym)} ${sym} at ${formatUsd(result.price)}`);\n printKeyValue('Invested', formatUsd(result.usdValue));\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n investCmd\n .command('sell <amount> <asset>')\n .description('[deprecated — use \"sell\" instead] Sell an asset')\n .option('--key <path>', 'Key file path')\n .option('--slippage <pct>', 'Max slippage percent', '3')\n .action(async (amount: string, asset: string, opts: { key?: string; slippage: string }) => {\n try {\n console.error(pc.yellow(` ⚠ \"invest sell\" is deprecated. Use: t2000 sell ${amount} ${asset}`));\n const isAll = amount.toLowerCase() === 'all';\n if (!isAll) {\n const parsed = parseFloat(amount);\n if (isNaN(parsed) || parsed <= 0 || !isFinite(parsed)) {\n console.error(pc.red(' ✗ Amount must be greater than $0'));\n process.exitCode = 1;\n return;\n }\n }\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const sym = asset.toUpperCase();\n\n const usdAmount = isAll ? 'all' as const : parseFloat(amount);\n const result = await agent.investSell({\n asset: sym as InvestmentAsset,\n usdAmount,\n maxSlippage: parseFloat(opts.slippage) / 100,\n });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n printSuccess(`Sold ${formatAssetAmount(result.amount, sym)} ${sym} at ${formatUsd(result.price)}`);\n printKeyValue('Proceeds', formatUsd(result.usdValue));\n if (result.realizedPnL !== undefined) {\n const pnlColor = result.realizedPnL >= 0 ? pc.green : pc.red;\n const pnlSign = result.realizedPnL >= 0 ? '+' : '';\n printKeyValue('Realized P&L', pnlColor(`${pnlSign}${formatUsd(result.realizedPnL)}`));\n }\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n investCmd\n .command('earn <asset>')\n .description('Deposit invested asset into best-rate lending protocol')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Force a specific protocol (navi, suilend)')\n .action(async (asset: string, opts: { key?: string; protocol?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.investEarn({\n asset: asset.toUpperCase() as InvestmentAsset,\n protocol: opts.protocol?.toLowerCase(),\n });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n const sym = asset.toUpperCase();\n if (result.amount === 0 && !result.tx) {\n printSuccess(`${sym} is already fully earning via ${result.protocol} (${result.apy.toFixed(1)}% APY)`);\n } else {\n printSuccess(`${sym} deposited into ${result.protocol} (${result.apy.toFixed(1)}% APY)`);\n printKeyValue('Amount', `${formatAssetAmount(result.amount, sym)} ${sym}`);\n printKeyValue('Protocol', result.protocol);\n printKeyValue('APY', `${result.apy.toFixed(2)}%`);\n printKeyValue('Tx', explorerUrl(result.tx));\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n investCmd\n .command('unearn <asset>')\n .description('Withdraw invested asset from lending (keeps in portfolio)')\n .option('--key <path>', 'Key file path')\n .action(async (asset: string, opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.investUnearn({\n asset: asset.toUpperCase() as InvestmentAsset,\n });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n const sym = asset.toUpperCase();\n printSuccess(`Withdrew ${formatAssetAmount(result.amount, sym)} ${sym} from ${result.protocol}`);\n printKeyValue('Status', `${sym} withdrawn to wallet`);\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n investCmd\n .command('rebalance')\n .description('Move earning positions to better-rate protocols')\n .option('--key <path>', 'Key file path')\n .option('--dry-run', 'Preview moves without executing')\n .option('--min-diff <pct>', 'Minimum APY difference to trigger move', '0.1')\n .action(async (opts: { key?: string; dryRun?: boolean; minDiff?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.investRebalance({\n dryRun: opts.dryRun,\n minYieldDiff: opts.minDiff ? parseFloat(opts.minDiff) : undefined,\n });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n\n if (result.moves.length === 0) {\n printInfo('All earning positions are already on the best rate');\n if (result.skipped.length > 0) {\n for (const s of result.skipped) {\n printLine(` ${s.asset}: ${s.apy.toFixed(2)}% on ${s.protocol} (best: ${s.bestApy.toFixed(2)}% — ${s.reason.replace(/_/g, ' ')})`);\n }\n }\n printBlank();\n return;\n }\n\n if (opts.dryRun) {\n printHeader('Rebalance Preview');\n for (const m of result.moves) {\n printLine(` ${m.asset}: ${m.fromProtocol} (${m.oldApy.toFixed(2)}%) → ${m.toProtocol} (${m.newApy.toFixed(2)}%)`);\n printLine(` Gain: +${(m.newApy - m.oldApy).toFixed(2)}% APY`);\n }\n } else {\n printSuccess('Rebalanced earning positions');\n printSeparator();\n for (const m of result.moves) {\n printLine(` ${m.asset}: ${m.fromProtocol} (${m.oldApy.toFixed(2)}%) → ${m.toProtocol} (${m.newApy.toFixed(2)}%)`);\n printKeyValue('Amount', `${formatAssetAmount(m.amount, m.asset)} ${m.asset}`);\n printKeyValue('APY gain', `+${(m.newApy - m.oldApy).toFixed(2)}%`);\n if (m.txDigests.length > 0) {\n printKeyValue('Tx', explorerUrl(m.txDigests[m.txDigests.length - 1]));\n }\n }\n printSeparator();\n printKeyValue('Gas', `${result.totalGasCost.toFixed(6)} SUI`);\n }\n\n if (result.skipped.length > 0) {\n printBlank();\n for (const s of result.skipped) {\n printLine(` ${s.asset}: kept on ${s.protocol} (${s.reason.replace(/_/g, ' ')})`);\n }\n }\n\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n // -- Strategy subcommands --\n\n const strategyCmd = investCmd\n .command('strategy')\n .description('Manage investment strategies');\n\n strategyCmd\n .command('list')\n .description('List available strategies')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const all = agent.strategies.getAll();\n\n if (isJsonMode()) { printJson(all); return; }\n\n printBlank();\n printHeader('Investment Strategies');\n printSeparator();\n for (const [key, def] of Object.entries(all)) {\n const allocs = Object.entries(def.allocations).map(([a, p]) => `${a} ${p}%`).join(', ');\n const tag = def.custom ? pc.dim(' (custom)') : '';\n printKeyValue(key, `${allocs}${tag}`);\n printLine(` ${pc.dim(def.description)}`);\n }\n printSeparator();\n\n const hasPositions = Object.keys(all).some((k) => agent.portfolio.hasStrategyPositions(k));\n if (!hasPositions) {\n printInfo('Buy into a strategy: t2000 invest strategy buy bluechip 100');\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n strategyCmd\n .command('buy <name> <amount>')\n .description('Buy into a strategy')\n .option('--key <path>', 'Key file path')\n .option('--dry-run', 'Preview allocation without executing')\n .action(async (name: string, amount: string, opts: { key?: string; dryRun?: boolean }) => {\n try {\n const parsed = parseFloat(amount);\n if (isNaN(parsed) || parsed <= 0) {\n console.error(pc.red(' ✗ Amount must be greater than $0'));\n process.exitCode = 1;\n return;\n }\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.investStrategy({ strategy: name.toLowerCase(), usdAmount: parsed, dryRun: opts.dryRun });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n if (opts.dryRun) {\n printHeader(`Strategy: ${name} — Dry Run (${formatUsd(parsed)})`);\n printSeparator();\n for (const buy of result.buys) {\n printKeyValue(buy.asset, `${formatUsd(buy.usdAmount)} → ~${formatAssetAmount(buy.amount, buy.asset)} ${buy.asset} @ ${formatUsd(buy.price)}`);\n }\n printSeparator();\n printInfo('Run without --dry-run to execute');\n } else {\n const txDigests = [...new Set(result.buys.map(b => b.tx))];\n const isSingleTx = txDigests.length === 1;\n printSuccess(`Invested ${formatUsd(parsed)} in ${name} strategy`);\n printSeparator();\n for (const buy of result.buys) {\n printKeyValue(buy.asset, `${formatAssetAmount(buy.amount, buy.asset)} @ ${formatUsd(buy.price)}`);\n }\n printSeparator();\n printKeyValue('Total invested', formatUsd(result.totalInvested));\n if (isSingleTx) {\n printKeyValue('Tx', explorerUrl(txDigests[0]));\n } else {\n for (const buy of result.buys) {\n printLine(` ${pc.dim(`${buy.asset}: ${explorerUrl(buy.tx)}`)}`);\n }\n }\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n strategyCmd\n .command('sell <name>')\n .description('Sell all positions in a strategy')\n .option('--key <path>', 'Key file path')\n .action(async (name: string, opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.sellStrategy({ strategy: name.toLowerCase() });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n printSuccess(`Sold all ${name} strategy positions`);\n printSeparator();\n for (const sell of result.sells) {\n const pnlColor = sell.realizedPnL >= 0 ? pc.green : pc.red;\n const pnlSign = sell.realizedPnL >= 0 ? '+' : '';\n printKeyValue(sell.asset, `${formatAssetAmount(sell.amount, sell.asset)} → ${formatUsd(sell.usdValue)} ${pnlColor(`${pnlSign}${formatUsd(sell.realizedPnL)}`)}`);\n }\n if (result.failed && result.failed.length > 0) {\n for (const f of result.failed) {\n console.error(pc.yellow(` ⚠ ${f.asset}: ${f.reason}`));\n }\n }\n printSeparator();\n printKeyValue('Total proceeds', formatUsd(result.totalProceeds));\n const rpnlColor = result.realizedPnL >= 0 ? pc.green : pc.red;\n const rpnlSign = result.realizedPnL >= 0 ? '+' : '';\n printKeyValue('Realized P&L', rpnlColor(`${rpnlSign}${formatUsd(result.realizedPnL)}`));\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n strategyCmd\n .command('status <name>')\n .description('Show current status and weights of a strategy')\n .option('--key <path>', 'Key file path')\n .action(async (name: string, opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const status = await agent.getStrategyStatus(name.toLowerCase());\n\n if (isJsonMode()) { printJson(status); return; }\n\n printBlank();\n printHeader(`Strategy: ${status.definition.name}`);\n printSeparator();\n\n if (status.positions.length === 0) {\n printInfo('No positions yet. Buy in with: t2000 invest strategy buy ' + name + ' 100');\n } else {\n for (const pos of status.positions) {\n const target = status.definition.allocations[pos.asset] ?? 0;\n const actual = status.currentWeights[pos.asset] ?? 0;\n const drift = actual - target;\n const driftColor = Math.abs(drift) > 3 ? pc.yellow : pc.dim;\n const pnlColor = pos.unrealizedPnL >= 0 ? pc.green : pc.red;\n const pnlSign = pos.unrealizedPnL >= 0 ? '+' : '';\n printKeyValue(\n pos.asset,\n `${formatAssetAmount(pos.totalAmount, pos.asset)} ${formatUsd(pos.currentValue)} ${pnlColor(`${pnlSign}${formatUsd(pos.unrealizedPnL)}`)} ${driftColor(`${actual.toFixed(0)}% / ${target}% target`)}`,\n );\n }\n printSeparator();\n printKeyValue('Total value', formatUsd(status.totalValue));\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n strategyCmd\n .command('rebalance <name>')\n .description('Rebalance a strategy to target weights')\n .option('--key <path>', 'Key file path')\n .action(async (name: string, opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const result = await agent.rebalanceStrategy({ strategy: name.toLowerCase() });\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n if (result.trades.length === 0) {\n printInfo(`Strategy '${name}' is already balanced (within 3% threshold)`);\n } else {\n printSuccess(`Rebalanced ${name} strategy`);\n printSeparator();\n for (const t of result.trades) {\n const action = t.action === 'buy' ? pc.green('BUY') : pc.red('SELL');\n printKeyValue(t.asset, `${action} ${formatUsd(t.usdAmount)} (${formatAssetAmount(t.amount, t.asset)})`);\n }\n printSeparator();\n printInfo('Weights: ' + Object.entries(result.afterWeights).map(([a, w]) => `${a} ${w.toFixed(0)}%`).join(', '));\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n strategyCmd\n .command('create <name>')\n .description('Create a custom strategy')\n .requiredOption('--alloc <pairs...>', 'Allocations e.g. SUI:40 BTC:20 ETH:20 GOLD:20')\n .option('--description <desc>', 'Strategy description')\n .action(async (name: string, opts: { alloc: string[]; description?: string }) => {\n try {\n const allocations: Record<string, number> = {};\n for (const pair of opts.alloc) {\n const [asset, pctStr] = pair.split(':');\n if (!asset || !pctStr) {\n console.error(pc.red(` ✗ Invalid allocation: '${pair}'. Use ASSET:PCT format (e.g. SUI:60)`));\n process.exitCode = 1;\n return;\n }\n allocations[asset.toUpperCase()] = parseFloat(pctStr);\n }\n const pin = await resolvePin();\n const agent = await T2000.create({ pin });\n const definition = agent.strategies.create({ name, allocations, description: opts.description });\n\n if (isJsonMode()) { printJson(definition); return; }\n\n printBlank();\n printSuccess(`Created strategy '${name}'`);\n const allocs = Object.entries(definition.allocations).map(([a, p]) => `${a} ${p}%`).join(', ');\n printKeyValue('Allocations', allocs);\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n strategyCmd\n .command('delete <name>')\n .description('Delete a custom strategy')\n .option('--key <path>', 'Key file path')\n .action(async (name: string, opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n if (agent.portfolio.hasStrategyPositions(name.toLowerCase())) {\n console.error(pc.red(` ✗ Strategy '${name}' has open positions. Sell first: t2000 invest strategy sell ${name}`));\n process.exitCode = 1;\n return;\n }\n\n agent.strategies.delete(name.toLowerCase());\n\n if (isJsonMode()) { printJson({ deleted: name }); return; }\n\n printBlank();\n printSuccess(`Deleted strategy '${name}'`);\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n // -- Auto-Invest subcommands --\n\n const autoCmd = investCmd\n .command('auto')\n .description('Dollar-cost averaging (DCA) schedules');\n\n autoCmd\n .command('setup <amount> <frequency> [target]')\n .description('Create a DCA schedule (target = strategy name or asset)')\n .option('--key <path>', 'Key file path')\n .option('--day <num>', 'Day of week (1-7) or month (1-28)')\n .action(async (amount: string, frequency: string, target: string | undefined, opts: { key?: string; day?: string }) => {\n try {\n const parsed = parseFloat(amount);\n if (isNaN(parsed) || parsed < 1) {\n console.error(pc.red(' ✗ Amount must be at least $1'));\n process.exitCode = 1;\n return;\n }\n if (!['daily', 'weekly', 'monthly'].includes(frequency)) {\n console.error(pc.red(' ✗ Frequency must be daily, weekly, or monthly'));\n process.exitCode = 1;\n return;\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const allStrategies = agent.strategies.getAll();\n const isStrategy = target ? target.toLowerCase() in allStrategies : false;\n const isAsset = target ? target.toUpperCase() in INVESTMENT_ASSETS : false;\n\n if (target && !isStrategy && !isAsset) {\n console.error(pc.red(` ✗ '${target}' is not a valid strategy or asset`));\n process.exitCode = 1;\n return;\n }\n\n const dayNum = opts.day ? parseInt(opts.day, 10) : undefined;\n const schedule = agent.setupAutoInvest({\n amount: parsed,\n frequency: frequency as 'daily' | 'weekly' | 'monthly',\n strategy: isStrategy ? target!.toLowerCase() : undefined,\n asset: isAsset ? target!.toUpperCase() : undefined,\n dayOfWeek: frequency === 'weekly' ? dayNum : undefined,\n dayOfMonth: frequency === 'monthly' ? dayNum : undefined,\n });\n\n if (isJsonMode()) { printJson(schedule); return; }\n\n printBlank();\n const targetLabel = schedule.strategy ?? schedule.asset ?? 'unknown';\n printSuccess(`Auto-invest created: ${formatUsd(schedule.amount)} ${schedule.frequency} → ${targetLabel}`);\n printKeyValue('Schedule ID', schedule.id);\n printKeyValue('Next run', new Date(schedule.nextRun).toLocaleDateString());\n printInfo('Run manually: t2000 invest auto run');\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n autoCmd\n .command('status')\n .description('Show all DCA schedules')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const status = agent.getAutoInvestStatus();\n\n if (isJsonMode()) { printJson(status); return; }\n\n printBlank();\n if (status.schedules.length === 0) {\n printInfo('No auto-invest schedules. Set one up: t2000 invest auto setup 50 weekly bluechip');\n printBlank();\n return;\n }\n\n printHeader('Auto-Invest Schedules');\n printSeparator();\n for (const s of status.schedules) {\n const target = s.strategy ?? s.asset ?? '?';\n const statusTag = s.enabled ? pc.green('active') : pc.dim('paused');\n printKeyValue(s.id, `${formatUsd(s.amount)} ${s.frequency} → ${target} ${statusTag}`);\n printLine(` ${pc.dim(`Next: ${new Date(s.nextRun).toLocaleDateString()} · Runs: ${s.runCount} · Total: ${formatUsd(s.totalInvested)}`)}`);\n }\n printSeparator();\n\n if (status.pendingRuns.length > 0) {\n printInfo(`${status.pendingRuns.length} pending run(s). Execute: t2000 invest auto run`);\n } else {\n printInfo('All schedules up to date');\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n autoCmd\n .command('run')\n .description('Execute pending DCA purchases')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const status = agent.getAutoInvestStatus();\n if (status.pendingRuns.length === 0) {\n if (isJsonMode()) { printJson({ executed: [], skipped: [] }); return; }\n printBlank();\n printInfo('No pending auto-invest runs. All schedules are up to date.');\n printBlank();\n return;\n }\n\n const result = await agent.runAutoInvest();\n\n if (isJsonMode()) { printJson(result); return; }\n\n printBlank();\n if (result.executed.length > 0) {\n printSuccess(`Executed ${result.executed.length} auto-invest run(s)`);\n for (const exec of result.executed) {\n const target = exec.strategy ?? exec.asset ?? '?';\n printKeyValue(target, formatUsd(exec.amount));\n }\n }\n if (result.skipped.length > 0) {\n for (const skip of result.skipped) {\n printLine(` ${pc.yellow('⚠')} Skipped ${skip.scheduleId}: ${skip.reason}`);\n }\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n\n autoCmd\n .command('stop <id>')\n .description('Stop an auto-invest schedule')\n .option('--key <path>', 'Key file path')\n .action(async (id: string, opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n agent.stopAutoInvest(id);\n\n if (isJsonMode()) { printJson({ stopped: id }); return; }\n\n printBlank();\n printSuccess(`Stopped auto-invest schedule ${id}`);\n printBlank();\n } catch (error) { handleError(error); }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd, formatAssetAmount } from '@t2000/sdk';\nimport type { InvestmentPosition } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printHeader, printSeparator, printInfo, printLine } from '../output.js';\n\nfunction printPositionLine(pos: InvestmentPosition, rewardKeys?: Set<string>) {\n if (pos.currentPrice === 0 && pos.totalAmount > 0) {\n printKeyValue(\n pos.asset,\n `${formatAssetAmount(pos.totalAmount, pos.asset)} Avg: ${formatUsd(pos.avgPrice)} Now: ${pc.yellow('unavailable')}`,\n );\n } else {\n const pnlColor = pos.unrealizedPnL >= 0 ? pc.green : pc.red;\n const pnlSign = pos.unrealizedPnL >= 0 ? '+' : '';\n let yieldSuffix = '';\n if (pos.earning && pos.earningApy) {\n const hasRewards = rewardKeys?.has(`${pos.earningProtocol}:${pos.asset}`);\n const rewardTag = hasRewards ? ` ${pc.yellow('+rewards')}` : '';\n yieldSuffix = ` ${pc.cyan(`${pos.earningApy.toFixed(1)}% APY (${pos.earningProtocol})`)}${rewardTag}`;\n }\n printKeyValue(\n pos.asset,\n `${formatAssetAmount(pos.totalAmount, pos.asset)} Avg: ${formatUsd(pos.avgPrice)} Now: ${formatUsd(pos.currentPrice)} ${pnlColor(`${pnlSign}${formatUsd(pos.unrealizedPnL)} (${pnlSign}${pos.unrealizedPnLPct.toFixed(1)}%)`)}${yieldSuffix}`,\n );\n }\n}\n\nexport function registerPortfolio(program: Command) {\n program\n .command('portfolio')\n .description('Show investment portfolio')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const portfolio = await agent.getPortfolio();\n\n if (isJsonMode()) { printJson(portfolio); return; }\n\n const rewardKeys = new Set<string>();\n try {\n const pending = await agent.getPendingRewards();\n for (const r of pending) rewardKeys.add(`${r.protocol}:${r.asset}`);\n } catch { /* skip */ }\n\n printBlank();\n\n const hasDirectPositions = portfolio.positions.length > 0;\n const hasStrategyPositions = portfolio.strategyPositions && Object.keys(portfolio.strategyPositions).length > 0;\n\n if (!hasDirectPositions && !hasStrategyPositions) {\n printInfo('No investments yet. Try: t2000 buy 100 SUI');\n printBlank();\n return;\n }\n\n printHeader('Investment Portfolio');\n\n if (hasStrategyPositions) {\n for (const [key, positions] of Object.entries(portfolio.strategyPositions!)) {\n let stratLabel = key;\n try {\n const def = agent.strategies.get(key);\n stratLabel = def.name;\n } catch { /* use key */ }\n printLine(` ${pc.bold(pc.cyan(`▸ ${stratLabel}`))}`);\n printSeparator();\n for (const pos of positions) {\n printPositionLine(pos, rewardKeys);\n }\n const stratValue = positions.reduce((s, p) => s + p.currentValue, 0);\n printLine(` ${pc.dim(`Subtotal: ${formatUsd(stratValue)}`)}`);\n printBlank();\n }\n }\n\n if (hasDirectPositions) {\n if (hasStrategyPositions) {\n printLine(` ${pc.bold(pc.cyan('▸ Direct'))}`);\n }\n printSeparator();\n for (const pos of portfolio.positions) {\n printPositionLine(pos, rewardKeys);\n }\n if (hasStrategyPositions) {\n const directValue = portfolio.positions.reduce((s, p) => s + p.currentValue, 0);\n printLine(` ${pc.dim(`Subtotal: ${formatUsd(directValue)}`)}`);\n }\n }\n\n printSeparator();\n\n const hasPriceUnavailable = portfolio.positions.some(p => p.currentPrice === 0 && p.totalAmount > 0);\n if (hasPriceUnavailable) {\n printInfo(pc.yellow('⚠ Price data unavailable for some assets. Values may be inaccurate.'));\n }\n\n printKeyValue('Total invested', formatUsd(portfolio.totalInvested));\n printKeyValue('Current value', formatUsd(portfolio.totalValue));\n\n const upnlColor = portfolio.unrealizedPnL >= 0 ? pc.green : pc.red;\n const upnlSign = portfolio.unrealizedPnL >= 0 ? '+' : '';\n printKeyValue('Unrealized P&L', upnlColor(`${upnlSign}${formatUsd(portfolio.unrealizedPnL)} (${upnlSign}${portfolio.unrealizedPnLPct.toFixed(1)}%)`));\n\n if (portfolio.realizedPnL !== 0) {\n const rpnlColor = portfolio.realizedPnL >= 0 ? pc.green : pc.red;\n const rpnlSign = portfolio.realizedPnL >= 0 ? '+' : '';\n printKeyValue('Realized P&L', rpnlColor(`${rpnlSign}${formatUsd(portfolio.realizedPnL)}`));\n }\n printBlank();\n } catch (error) { handleError(error); }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printSeparator, printLine } from '../output.js';\n\nexport function registerClaimRewards(program: Command) {\n program\n .command('claim-rewards')\n .description('Claim pending protocol rewards')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.claimRewards();\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n\n if (result.rewards.length === 0) {\n printLine(` ${pc.dim('No rewards to claim')}`);\n printBlank();\n return;\n }\n\n const protocols = [...new Set(result.rewards.map(r => r.protocol))];\n printLine(` ${pc.green('✓')} Claimed and converted rewards to USDC`);\n printSeparator();\n\n const received = result.usdcReceived;\n if (received >= 0.01) {\n printKeyValue('Received', `${pc.green(formatUsd(received))} USDC`);\n } else if (received > 0) {\n printKeyValue('Received', `${pc.green('< $0.01')} USDC`);\n } else {\n printKeyValue('Received', `${pc.dim('< $0.01 USDC (rewards are still accruing)')}`);\n }\n printKeyValue('Source', protocols.join(', '));\n\n if (result.tx) {\n printKeyValue('Tx', `https://suiscan.xyz/mainnet/tx/${result.tx}`);\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, getGasStatus } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printHeader,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printDivider,\n printInfo,\n printLine,\n} from '../output.js';\n\nexport function registerGas(program: Command) {\n program\n .command('gas')\n .description('Check gas station status and wallet gas balance')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const address = agent.address();\n\n const [status, bal] = await Promise.allSettled([\n getGasStatus(address),\n agent.balance(),\n ]);\n\n const gasStatus = status.status === 'fulfilled' ? status.value : null;\n const balData = bal.status === 'fulfilled' ? bal.value : null;\n\n if (isJsonMode()) {\n printJson({\n gasStation: gasStatus ?? { error: status.status === 'rejected' ? String((status as PromiseRejectedResult).reason) : 'unavailable' },\n wallet: balData ? { sui: balData.gasReserve.sui, available: balData.available } : null,\n });\n return;\n }\n\n printHeader('Gas Status');\n\n if (gasStatus) {\n const cbStatus = gasStatus.circuitBreaker\n ? pc.red('TRIPPED — sponsorship paused')\n : pc.green('OK');\n printKeyValue('Gas Station', cbStatus);\n printKeyValue('SUI Price (TWAP)', `$${gasStatus.suiPrice.toFixed(4)}`);\n if (gasStatus.bootstrapRemaining !== undefined) {\n printKeyValue('Bootstrap', `${gasStatus.bootstrapUsed}/10 used (${gasStatus.bootstrapRemaining} remaining)`);\n }\n } else {\n printKeyValue('Gas Station', pc.red('unreachable'));\n const reason = status.status === 'rejected'\n ? (status as PromiseRejectedResult).reason\n : 'unknown';\n printLine(` ${pc.dim(reason instanceof Error ? reason.message : String(reason))}`);\n }\n\n printDivider();\n\n if (balData) {\n const suiBal = balData.gasReserve.sui;\n const suiColor = suiBal < 0.05 ? pc.red : pc.green;\n printKeyValue('SUI (gas)', suiColor(`${suiBal.toFixed(4)} SUI`));\n if (suiBal < 0.05) {\n printLine(` ${pc.yellow('⚠')} Below gas threshold (0.05 SUI) — transactions will need sponsorship`);\n }\n printKeyValue('Available', `$${balData.available.toFixed(2)}`);\n } else {\n printKeyValue('Wallet', pc.dim('could not fetch balances'));\n }\n\n printBlank();\n\n if (gasStatus && !gasStatus.circuitBreaker && (balData?.gasReserve.sui ?? 0) >= 0.05) {\n printLine(` ${pc.green('✓')} Gas is healthy — transactions should succeed`);\n } else if (gasStatus && !gasStatus.circuitBreaker) {\n printLine(` ${pc.yellow('⚠')} Low SUI but gas station is online — sponsorship available`);\n } else {\n printLine(` ${pc.red('✗')} Gas station issues detected — fund wallet with SUI directly`);\n printInfo('Send SUI to your address: t2000 address');\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","#!/usr/bin/env node\nimport { createProgram } from './program.js';\n\nconst program = createProgram();\nprogram.parse();\n"],"mappings":"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","names":["pc","readFile","writeFile","mkdir","homedir","homedir","readFile","mkdir","writeFile","program","password","pc","T2000","program","T2000","pc","T2000","formatUsd","program","T2000","formatUsd","pc","T2000","program","T2000","T2000","program","T2000","pc","T2000","truncateAddress","pc","truncateAddress","program","T2000","readFile","writeFile","mkdir","resolve","homedir","T2000","resolve","homedir","readFile","mkdir","writeFile","program","T2000","password","program","pc","T2000","formatUsd","program","T2000","pc","formatUsd","T2000","formatUsd","program","T2000","formatUsd","T2000","formatUsd","program","T2000","formatUsd","T2000","formatUsd","program","T2000","formatUsd","T2000","formatUsd","program","T2000","formatUsd","pc","T2000","program","T2000","pc","pc","T2000","formatUsd","program","T2000","pc","formatUsd","pc","T2000","formatUsd","formatAssetAmount","program","T2000","formatUsd","pc","formatAssetAmount","pc","T2000","formatUsd","formatAssetAmount","program","T2000","formatUsd","pc","formatAssetAmount","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","SafeguardEnforcer","CONFIG_DIR","join","homedir","CONFIG_PATH","readFileSync","existsSync","mkdirSync","writeFileSync","formatUsd","program","SafeguardEnforcer","parsed","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","T2000","CONFIG_DIR","join","homedir","existsSync","mkdirSync","readFileSync","writeFileSync","program","T2000","pc","T2000","program","T2000","pc","join","homedir","SafeguardEnforcer","CONFIG_DIR","join","homedir","program","SafeguardEnforcer","T2000","MAX_ATTEMPTS","T2000","pc","program","T2000","result","T2000","MIST_PER_SUI","formatUsd","pc","MIST_PER_SUI","program","T2000","formatUsd","pc","T2000","formatUsd","SUPPORTED_ASSETS","program","T2000","result","pc","formatUsd","SUPPORTED_ASSETS","T2000","SUPPORTED_ASSETS","pc","SUPPORTED_ASSETS","program","pc","T2000","T2000","formatUsd","SUPPORTED_ASSETS","resolveAssetName","SUPPORTED_ASSETS","formatUsd","T2000","program","readFile","writeFile","mkdir","join","dirname","homedir","existsSync","homedir","join","readFile","dirname","existsSync","mkdir","writeFile","program","platform","truncateAddress","program","contact","truncateAddress","pc","T2000","formatUsd","formatAssetAmount","INVESTMENT_ASSETS","program","pc","T2000","formatAssetAmount","formatUsd","INVESTMENT_ASSETS","pc","T2000","formatUsd","formatAssetAmount","formatAssetAmount","formatUsd","pc","program","T2000","pc","T2000","formatUsd","program","T2000","pc","formatUsd","pc","T2000","program","T2000","pc","require","program"]}