@t2000/cli 0.4.0 → 0.4.3

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 CHANGED
@@ -1438,7 +1438,7 @@ function registerEarn(program2) {
1438
1438
  // src/program.ts
1439
1439
  function createProgram() {
1440
1440
  const program2 = new Command();
1441
- program2.name("t2000").description("The first bank account for AI agents").version("0.4.0").option("--json", "Output in JSON format").hook("preAction", (thisCommand) => {
1441
+ program2.name("t2000").description("The first bank account for AI agents").version("0.4.3").option("--json", "Output in JSON format").hook("preAction", (thisCommand) => {
1442
1442
  const opts = thisCommand.optsWithGlobals();
1443
1443
  if (opts.json) setJsonMode(true);
1444
1444
  });
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/swap.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/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { setJsonMode } from './output.js';\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 { registerSwap } from './commands/swap.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';\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('t2000')\n .description('The first bank account for AI agents')\n .version('0.4.0')\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 registerSwap(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\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\nexport function printSuccessKV(key: string, value: string, keyWidth = 20) {\n if (jsonMode) return;\n const paddedKey = key.padEnd(keyWidth);\n console.log(` ${pc.green('✓')} ${paddedKey}${pc.dim(value)}`);\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 } from '@t2000/sdk';\nimport { resolvePin, saveSession } from '../prompts.js';\nimport {\n printSuccess, printBlank, printInfo, printKeyValue,\n printJson, printLine, printDivider, isJsonMode, handleError,\n} from '../output.js';\n\nexport function registerInit(program: Command) {\n program\n .command('init')\n .description('Create a new agent bank account')\n .option('--name <name>', 'Agent name')\n .option('--key <path>', 'Key file path')\n .option('--no-sponsor', 'Skip gas sponsorship')\n .action(async (opts) => {\n try {\n const pin = await resolvePin({ confirm: true });\n\n if (!isJsonMode()) {\n printBlank();\n printInfo('Creating agent wallet...');\n }\n\n const { agent, address, sponsored } = await T2000.init({\n pin,\n keyPath: opts.key,\n name: opts.name,\n sponsored: opts.sponsor,\n });\n\n if (isJsonMode()) {\n printJson({ address, sponsored });\n return;\n }\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\n printLine(\n `${pc.green('✓')} Checking ` +\n `${pc.green('✓')} Savings ` +\n `${pc.green('✓')} Credit ` +\n `${pc.green('✓')} Exchange ` +\n `${pc.green('✓')} 402 Pay`\n );\n\n printBlank();\n printLine(`🎉 ${pc.green('Bank account created')}`);\n printKeyValue('Address', pc.yellow(address));\n\n printBlank();\n printLine(`Deposit USDC on Sui network only.`);\n printDivider();\n printBlank();\n printLine(`${pc.cyan('t2000 balance')} check for funds`);\n printLine(`${pc.cyan('t2000 save all')} start earning yield`);\n printLine(`${pc.cyan('t2000 address')} show address again`);\n printBlank();\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 }): Promise<string> {\n const envPin = getPinFromEnv();\n if (envPin) return envPin;\n\n const sessionPin = await readSession();\n if (sessionPin) return sessionPin;\n\n const pin = opts?.confirm ? await askPinConfirm() : await askPin();\n await saveSession(pin);\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\nexport function registerSend(program: Command) {\n program\n .command('send <amount> <asset> [to_keyword] <address>')\n .description('Send USDC (or other asset) to an address')\n .option('--key <path>', 'Key file path')\n .action(async (amount: string, asset: string, toOrAddress: string, address: string | undefined, opts: { key?: string }) => {\n try {\n const recipient = address ?? toOrAddress;\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: parseFloat(amount),\n asset: asset.toUpperCase(),\n });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Sent ${formatUsd(result.amount)} ${asset.toUpperCase()} → ${truncateAddress(result.to)}`);\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, getRates } 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 ? 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 let apyStr = '';\n if (bal.savings > 0) {\n try {\n const rates = await getRates(agent.suiClient);\n const apy = rates.USDC.saveApy;\n apyStr = ` ${pc.dim(`(earning ${apy.toFixed(2)}% APY)`)}`;\n } catch { /* rates unavailable */ }\n }\n\n printBlank();\n printKeyValue('Available', `${formatUsd(bal.available)} USDC ${pc.dim('(checking — spendable)')}`);\n printKeyValue('Savings', `${formatUsd(bal.savings)} USDC${apyStr}`);\n printKeyValue('Gas', `${bal.gasReserve.sui.toFixed(2)} SUI ${pc.dim(`(~${formatUsd(bal.gasReserve.usdEquiv)})`)}`);\n printSeparator();\n printKeyValue('Total', `${formatUsd(bal.total)} USDC`);\n\n if (bal.savings > 0 && apyStr) {\n try {\n const rates = await getRates(agent.suiClient);\n const dailyEarning = (bal.savings * rates.USDC.saveApy / 100) / 365;\n if (dailyEarning > 0.001) {\n printLine(pc.dim(`Earning ~${formatUsd(dailyEarning)}/day`));\n }\n } catch { /* skip daily earning */ }\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 { T2000, truncateAddress } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printHeader, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerHistory(program: Command) {\n program\n .command('history')\n .description('Show transaction history')\n .option('--limit <n>', 'Number of transactions', '20')\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 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 console.log(' No transactions yet.');\n } else {\n for (const tx of txns) {\n const time = tx.timestamp ? new Date(tx.timestamp).toLocaleString() : 'unknown';\n const gas = tx.gasMethod ? ` (${tx.gasMethod})` : '';\n console.log(` ${truncateAddress(tx.digest)} ${tx.action}${gas} ${time}`);\n }\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, askConfirm } from '../prompts.js';\nimport { printSuccess, printBlank, printInfo, printJson, isJsonMode, handleError } from '../output.js';\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 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 const agent = await T2000.create({ pin, keyPath: opts.key });\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, assetStr: string | undefined, 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 asset = assetStr ?? 'USDC';\n const result = await agent.save({ amount, asset, 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 ?? 'NAVI';\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 in USDC to save (or \"all\")')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\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 in USDC to save (or \"all\")')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\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 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printWarning, 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 in USDC to withdraw (or \"all\")')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(async (amountStr, assetStr, 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 if (amount !== 'all') {\n const maxResult = await agent.maxWithdraw();\n if (amount > maxResult.maxAmount) {\n printWarning(`Max safe withdrawal: $${maxResult.maxAmount.toFixed(2)} (HF ${maxResult.currentHF.toFixed(2)} → ${maxResult.healthFactorAfter.toFixed(2)})`);\n return;\n }\n }\n\n const asset = assetStr ?? 'USDC';\n const result = await agent.withdraw({ amount, asset, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Withdrew $${result.amount.toFixed(2)} 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 } 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 in USDC to borrow')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, assetStr, 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: $${maxResult.maxAmount.toFixed(2)} (HF ${maxResult.currentHF.toFixed(2)} → min 1.5)`);\n return;\n }\n\n const asset = assetStr ?? 'USDC';\n const result = await agent.borrow({ amount, asset, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Borrowed $${amount.toFixed(2)} 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 } 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 in USDC to repay (or \"all\")')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, assetStr, 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 asset = assetStr ?? 'USDC';\n const result = await agent.repay({ amount, asset, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Repaid $${result.amount.toFixed(2)} USDC`);\n printKeyValue('Remaining Debt', `$${result.remainingDebt.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 } 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 hfStr = hf.healthFactor === Infinity ? '∞' : 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', `$${hf.supplied.toFixed(2)} USDC`);\n printKeyValue('Borrowed', `$${hf.borrowed.toFixed(2)} USDC`);\n printKeyValue('Max Borrow', `$${hf.maxBorrow.toFixed(2)} USDC`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo } from '../output.js';\n\nexport function registerRates(program: Command) {\n program\n .command('rates')\n .description('Show current APY rates across protocols')\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.allRates('USDC');\n\n if (isJsonMode()) {\n printJson(allRates);\n return;\n }\n\n printBlank();\n for (const entry of allRates) {\n printInfo(`USDC Rates ${pc.dim(`(${entry.protocol})`)}`);\n printKeyValue('Save APY', `${entry.rates.saveApy.toFixed(2)}%`);\n printKeyValue('Borrow APY', `${entry.rates.borrowApy.toFixed(2)}%`);\n printBlank();\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 { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo } from '../output.js';\n\nexport function registerPositions(program: Command) {\n program\n .command('positions')\n .description('Show savings & borrow positions')\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 printBlank();\n if (result.positions.length === 0) {\n printInfo('No positions. Use `t2000 save <amount>` to start earning.');\n } else {\n for (const pos of result.positions) {\n const label = pos.type === 'save' ? '📈 Saving' : '📉 Borrowing';\n printKeyValue(label, `$${pos.amount.toFixed(2)} ${pos.asset} (${pos.protocol})`);\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 { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printWarning, explorerUrl } from '../output.js';\n\nexport function registerSwap(program: Command) {\n program\n .command('swap')\n .description('Swap between assets (e.g. swap 10 USDC SUI)')\n .argument('<amount>', 'Amount to swap')\n .argument('<from>', 'Asset to swap from (USDC or SUI)')\n .argument('<to>', 'Asset to swap to (USDC or SUI)')\n .option('--slippage <percent>', 'Max slippage percentage', '3')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. cetus)')\n .action(async (amountStr: string, from: string, to: string, opts: { slippage?: string; key?: string; protocol?: string }) => {\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 maxSlippage = parseFloat(opts.slippage ?? '3') / 100;\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n // Show quote before confirming\n const quote = await agent.swapQuote({ from, to, amount });\n\n const result = await agent.swap({ from, to, amount, maxSlippage, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Swapped ${result.fromAmount} ${result.fromAsset} → ${result.toAmount.toFixed(4)} ${result.toAsset}`);\n if (result.priceImpact > 0.001) {\n printWarning(`Price impact: ${(result.priceImpact * 100).toFixed(2)}%`);\n }\n if (result.fee > 0) {\n printKeyValue('Fee', `$${result.fee.toFixed(4)}`);\n }\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 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError } 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\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printKeyValue('Saved', `$${result.supplied.toFixed(2)} USDC`);\n printKeyValue('APY', `${result.currentApy.toFixed(2)}%`);\n printKeyValue('Daily Yield', `~$${result.dailyEarning.toFixed(4)}/day`);\n printKeyValue('Est. Earned', `~$${result.totalYieldEarned.toFixed(4)}`);\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 { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError } 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\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n if (result.supplied > 0) {\n printSuccess('Savings: ACTIVE');\n } else {\n console.log(' Savings: INACTIVE — deposit USDC and run `t2000 save`');\n }\n printBlank();\n printKeyValue('Saved', `$${result.supplied.toFixed(2)} USDC @ ${result.apy.toFixed(1)}% APY`);\n printKeyValue('Earned today', `~$${result.earnedToday.toFixed(4)}`);\n printKeyValue('Earned all time', `~$${result.earnedAllTime.toFixed(4)}`);\n printKeyValue('Monthly projected', `~$${result.projectedMonthly.toFixed(2)}/month`);\n printBlank();\n if (result.supplied > 0) {\n console.log(' 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 { printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.json');\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\nexport function registerConfig(program: Command) {\n const configCmd = program\n .command('config')\n .description('Show or set configuration');\n\n configCmd\n .command('get')\n .argument('[key]', 'Config key to get (omit for all)')\n .action((key?: string) => {\n try {\n const config = loadConfig();\n\n if (isJsonMode()) {\n printJson(key ? { [key]: config[key] } : config);\n return;\n }\n\n printBlank();\n if (key) {\n printKeyValue(key, String(config[key] ?? '(not set)'));\n } else {\n if (Object.keys(config).length === 0) {\n console.log(' No configuration set.');\n } else {\n for (const [k, v] of Object.entries(config)) {\n printKeyValue(k, String(v));\n }\n }\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n configCmd\n .command('set')\n .argument('<key>', 'Config key')\n .argument('<value>', 'Config value')\n .action((key: string, value: string) => {\n try {\n const config = loadConfig();\n\n // Parse booleans and numbers\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 config[key] = parsed;\n saveConfig(config);\n\n if (isJsonMode()) {\n printJson({ [key]: parsed });\n return;\n }\n\n console.log(` Set ${key} = ${String(parsed)}`);\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/swap');\n console.log(' GET /v1/rates POST /v1/borrow');\n console.log(' GET /v1/health-factor POST /v1/repay');\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, asset } = body as { amount: number; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ 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/supply', async (c) => {\n try {\n const body = await c.req.json();\n const { amount, asset } = body as { amount: number; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ 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/withdraw', async (c) => {\n try {\n const body = await c.req.json();\n const { amount, asset } = body as { amount: number | 'all'; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.withdraw({ 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/swap', async (c) => {\n try {\n const body = await c.req.json();\n const { from, to, amount, maxSlippage } = body as { from: string; to: string; amount: number; maxSlippage?: number };\n if (!from || !to || !amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: from, to, amount'));\n }\n const result = await agent.swap({ from, to, amount, maxSlippage });\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, asset } = body as { amount: number; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.borrow({ 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/repay', async (c) => {\n try {\n const body = await c.req.json();\n const { amount, asset } = body as { amount: number | 'all'; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.repay({ 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 // --- 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 { x402Client } from '@t2000/x402';\nimport type { X402Wallet } from '@t2000/x402';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printBlank,\n printJson,\n printInfo,\n isJsonMode,\n handleError,\n} from '../output.js';\n\nfunction createX402Wallet(agent: T2000): X402Wallet {\n return {\n client: agent.suiClient,\n keypair: agent.signer,\n address: () => agent.address(),\n signAndExecute: async (tx) => {\n const result = await agent.suiClient.signAndExecuteTransaction({\n signer: agent.signer,\n transaction: tx as Parameters<typeof agent.suiClient.signAndExecuteTransaction>[0]['transaction'],\n });\n return { digest: result.digest };\n },\n };\n}\n\nexport function registerPay(program: Command) {\n program\n .command('pay <url>')\n .description('Pay for an x402-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 .option('--timeout <seconds>', 'Request timeout in seconds', '30')\n .option('--dry-run', 'Show what would be paid without paying')\n .action(async (url: string, opts: {\n key?: string;\n method: string;\n data?: string;\n header: Record<string, string>;\n maxPrice: string;\n timeout: string;\n dryRun?: boolean;\n }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const wallet = createX402Wallet(agent);\n const client = new x402Client(wallet);\n\n const startTime = Date.now();\n\n if (!isJsonMode()) {\n printBlank();\n printInfo(`→ ${opts.method} ${url}`);\n }\n\n const response = await client.fetch(url, {\n method: opts.method,\n headers: opts.header,\n body: opts.data,\n maxPrice: parseFloat(opts.maxPrice),\n timeout: parseInt(opts.timeout, 10) * 1000,\n dryRun: opts.dryRun,\n onPayment: (details) => {\n if (!isJsonMode()) {\n printInfo(`← 402 Payment Required: $${details.amount} USDC (Sui)`);\n printSuccess(`Paid $${details.amount} USDC (tx: ${details.txHash.slice(0, 10)}...)`);\n }\n },\n });\n\n const elapsed = Date.now() - startTime;\n\n if (!isJsonMode()) {\n printInfo(`← ${response.status} ${response.statusText || 'OK'} ${pc.dim(`[${elapsed}ms]`)}`);\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n const body = contentType.includes('application/json')\n ? await response.json()\n : await response.text();\n\n if (isJsonMode()) {\n printJson({\n status: response.status,\n url,\n elapsed,\n body,\n });\n } else {\n printBlank();\n if (typeof body === 'string') {\n console.log(body);\n } else {\n console.log(JSON.stringify(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 { clearSession } from '../prompts.js';\nimport { printSuccess, printBlank, handleError } from '../output.js';\n\nexport function registerLock(program: Command) {\n program\n .command('lock')\n .description('Clear saved session (require PIN on next command)')\n .action(async () => {\n try {\n await clearSession();\n printBlank();\n printSuccess('Session cleared — PIN required on next command');\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 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 printLine(` ${pc.red('✗')} 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 } 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 [fundResult, sentinels] = await Promise.allSettled([\n agent.fundStatus(),\n listSentinels(),\n ]);\n\n const fund = fundResult.status === 'fulfilled' ? fundResult.value : null;\n const agents = sentinels.status === 'fulfilled' ? sentinels.value : null;\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: fund\n ? {\n supplied: fund.supplied,\n apy: fund.apy,\n dailyEarning: fund.earnedToday,\n earnedAllTime: fund.earnedAllTime,\n projectedMonthly: fund.projectedMonthly,\n }\n : null,\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 (fund && fund.supplied > 0) {\n printKeyValue('Saved', `$${fund.supplied.toFixed(2)} USDC @ ${fund.apy.toFixed(1)}% APY`);\n printKeyValue('Daily Yield', `~$${fund.earnedToday.toFixed(4)}/day`);\n printKeyValue('All-time', `~$${fund.earnedAllTime.toFixed(4)}`);\n printKeyValue('Monthly Est', `~$${fund.projectedMonthly.toFixed(2)}/month`);\n } else if (fund) {\n printInfo('No savings yet — run `t2000 save <amount>` to start earning yield');\n } else {\n printInfo('Savings data unavailable');\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>')} Save USDC for yield`);\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 { createProgram } from './program.js';\n\nconst program = createProgram();\nprogram.parse();\n"],"mappings":"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","names":["pc","program","pc","T2000","program","T2000","pc","T2000","formatUsd","program","T2000","pc","formatUsd","T2000","program","T2000","T2000","program","T2000","T2000","truncateAddress","program","T2000","truncateAddress","T2000","program","T2000","password","program","pc","T2000","formatUsd","program","T2000","pc","formatUsd","T2000","program","T2000","T2000","program","T2000","T2000","program","T2000","T2000","program","T2000","pc","T2000","program","T2000","pc","T2000","program","T2000","T2000","program","T2000","T2000","program","T2000","T2000","program","T2000","homedir","homedir","program","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","T2000","CONFIG_DIR","join","homedir","existsSync","mkdirSync","readFileSync","writeFileSync","program","T2000","pc","T2000","program","T2000","pc","program","T2000","pc","program","T2000","result","T2000","MIST_PER_SUI","pc","MIST_PER_SUI","program","T2000","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/swap.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/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { setJsonMode } from './output.js';\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 { registerSwap } from './commands/swap.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';\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name('t2000')\n .description('The first bank account for AI agents')\n .version('0.4.3')\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 registerSwap(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\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\nexport function printSuccessKV(key: string, value: string, keyWidth = 20) {\n if (jsonMode) return;\n const paddedKey = key.padEnd(keyWidth);\n console.log(` ${pc.green('✓')} ${paddedKey}${pc.dim(value)}`);\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 } from '@t2000/sdk';\nimport { resolvePin, saveSession } from '../prompts.js';\nimport {\n printSuccess, printBlank, printInfo, printKeyValue,\n printJson, printLine, printDivider, isJsonMode, handleError,\n} from '../output.js';\n\nexport function registerInit(program: Command) {\n program\n .command('init')\n .description('Create a new agent bank account')\n .option('--name <name>', 'Agent name')\n .option('--key <path>', 'Key file path')\n .option('--no-sponsor', 'Skip gas sponsorship')\n .action(async (opts) => {\n try {\n const pin = await resolvePin({ confirm: true });\n\n if (!isJsonMode()) {\n printBlank();\n printInfo('Creating agent wallet...');\n }\n\n const { agent, address, sponsored } = await T2000.init({\n pin,\n keyPath: opts.key,\n name: opts.name,\n sponsored: opts.sponsor,\n });\n\n if (isJsonMode()) {\n printJson({ address, sponsored });\n return;\n }\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\n printLine(\n `${pc.green('✓')} Checking ` +\n `${pc.green('✓')} Savings ` +\n `${pc.green('✓')} Credit ` +\n `${pc.green('✓')} Exchange ` +\n `${pc.green('✓')} 402 Pay`\n );\n\n printBlank();\n printLine(`🎉 ${pc.green('Bank account created')}`);\n printKeyValue('Address', pc.yellow(address));\n\n printBlank();\n printLine(`Deposit USDC on Sui network only.`);\n printDivider();\n printBlank();\n printLine(`${pc.cyan('t2000 balance')} check for funds`);\n printLine(`${pc.cyan('t2000 save all')} start earning yield`);\n printLine(`${pc.cyan('t2000 address')} show address again`);\n printBlank();\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 }): Promise<string> {\n const envPin = getPinFromEnv();\n if (envPin) return envPin;\n\n const sessionPin = await readSession();\n if (sessionPin) return sessionPin;\n\n const pin = opts?.confirm ? await askPinConfirm() : await askPin();\n await saveSession(pin);\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\nexport function registerSend(program: Command) {\n program\n .command('send <amount> <asset> [to_keyword] <address>')\n .description('Send USDC (or other asset) to an address')\n .option('--key <path>', 'Key file path')\n .action(async (amount: string, asset: string, toOrAddress: string, address: string | undefined, opts: { key?: string }) => {\n try {\n const recipient = address ?? toOrAddress;\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: parseFloat(amount),\n asset: asset.toUpperCase(),\n });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Sent ${formatUsd(result.amount)} ${asset.toUpperCase()} → ${truncateAddress(result.to)}`);\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, getRates } 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 ? 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 let apyStr = '';\n if (bal.savings > 0) {\n try {\n const rates = await getRates(agent.suiClient);\n const apy = rates.USDC.saveApy;\n apyStr = ` ${pc.dim(`(earning ${apy.toFixed(2)}% APY)`)}`;\n } catch { /* rates unavailable */ }\n }\n\n printBlank();\n printKeyValue('Available', `${formatUsd(bal.available)} USDC ${pc.dim('(checking — spendable)')}`);\n printKeyValue('Savings', `${formatUsd(bal.savings)} USDC${apyStr}`);\n printKeyValue('Gas', `${bal.gasReserve.sui.toFixed(2)} SUI ${pc.dim(`(~${formatUsd(bal.gasReserve.usdEquiv)})`)}`);\n printSeparator();\n printKeyValue('Total', `${formatUsd(bal.total)} USDC`);\n\n if (bal.savings > 0 && apyStr) {\n try {\n const rates = await getRates(agent.suiClient);\n const dailyEarning = (bal.savings * rates.USDC.saveApy / 100) / 365;\n if (dailyEarning > 0.001) {\n printLine(pc.dim(`Earning ~${formatUsd(dailyEarning)}/day`));\n }\n } catch { /* skip daily earning */ }\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 { T2000, truncateAddress } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printHeader, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerHistory(program: Command) {\n program\n .command('history')\n .description('Show transaction history')\n .option('--limit <n>', 'Number of transactions', '20')\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 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 console.log(' No transactions yet.');\n } else {\n for (const tx of txns) {\n const time = tx.timestamp ? new Date(tx.timestamp).toLocaleString() : 'unknown';\n const gas = tx.gasMethod ? ` (${tx.gasMethod})` : '';\n console.log(` ${truncateAddress(tx.digest)} ${tx.action}${gas} ${time}`);\n }\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, askConfirm } from '../prompts.js';\nimport { printSuccess, printBlank, printInfo, printJson, isJsonMode, handleError } from '../output.js';\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 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 const agent = await T2000.create({ pin, keyPath: opts.key });\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, assetStr: string | undefined, 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 asset = assetStr ?? 'USDC';\n const result = await agent.save({ amount, asset, 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 ?? 'NAVI';\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 in USDC to save (or \"all\")')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\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 in USDC to save (or \"all\")')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\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 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printWarning, 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 in USDC to withdraw (or \"all\")')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(async (amountStr, assetStr, 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 if (amount !== 'all') {\n const maxResult = await agent.maxWithdraw();\n if (amount > maxResult.maxAmount) {\n printWarning(`Max safe withdrawal: $${maxResult.maxAmount.toFixed(2)} (HF ${maxResult.currentHF.toFixed(2)} → ${maxResult.healthFactorAfter.toFixed(2)})`);\n return;\n }\n }\n\n const asset = assetStr ?? 'USDC';\n const result = await agent.withdraw({ amount, asset, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Withdrew $${result.amount.toFixed(2)} 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 } 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 in USDC to borrow')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, assetStr, 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: $${maxResult.maxAmount.toFixed(2)} (HF ${maxResult.currentHF.toFixed(2)} → min 1.5)`);\n return;\n }\n\n const asset = assetStr ?? 'USDC';\n const result = await agent.borrow({ amount, asset, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Borrowed $${amount.toFixed(2)} 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 } 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 in USDC to repay (or \"all\")')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, assetStr, 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 asset = assetStr ?? 'USDC';\n const result = await agent.repay({ amount, asset, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Repaid $${result.amount.toFixed(2)} USDC`);\n printKeyValue('Remaining Debt', `$${result.remainingDebt.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 } 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 hfStr = hf.healthFactor === Infinity ? '∞' : 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', `$${hf.supplied.toFixed(2)} USDC`);\n printKeyValue('Borrowed', `$${hf.borrowed.toFixed(2)} USDC`);\n printKeyValue('Max Borrow', `$${hf.maxBorrow.toFixed(2)} USDC`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo } from '../output.js';\n\nexport function registerRates(program: Command) {\n program\n .command('rates')\n .description('Show current APY rates across protocols')\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.allRates('USDC');\n\n if (isJsonMode()) {\n printJson(allRates);\n return;\n }\n\n printBlank();\n for (const entry of allRates) {\n printInfo(`USDC Rates ${pc.dim(`(${entry.protocol})`)}`);\n printKeyValue('Save APY', `${entry.rates.saveApy.toFixed(2)}%`);\n printKeyValue('Borrow APY', `${entry.rates.borrowApy.toFixed(2)}%`);\n printBlank();\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 { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo } from '../output.js';\n\nexport function registerPositions(program: Command) {\n program\n .command('positions')\n .description('Show savings & borrow positions')\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 printBlank();\n if (result.positions.length === 0) {\n printInfo('No positions. Use `t2000 save <amount>` to start earning.');\n } else {\n for (const pos of result.positions) {\n const label = pos.type === 'save' ? '📈 Saving' : '📉 Borrowing';\n printKeyValue(label, `$${pos.amount.toFixed(2)} ${pos.asset} (${pos.protocol})`);\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 { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printWarning, explorerUrl } from '../output.js';\n\nexport function registerSwap(program: Command) {\n program\n .command('swap')\n .description('Swap between assets (e.g. swap 10 USDC SUI)')\n .argument('<amount>', 'Amount to swap')\n .argument('<from>', 'Asset to swap from (USDC or SUI)')\n .argument('<to>', 'Asset to swap to (USDC or SUI)')\n .option('--slippage <percent>', 'Max slippage percentage', '3')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. cetus)')\n .action(async (amountStr: string, from: string, to: string, opts: { slippage?: string; key?: string; protocol?: string }) => {\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 maxSlippage = parseFloat(opts.slippage ?? '3') / 100;\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n // Show quote before confirming\n const quote = await agent.swapQuote({ from, to, amount });\n\n const result = await agent.swap({ from, to, amount, maxSlippage, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Swapped ${result.fromAmount} ${result.fromAsset} → ${result.toAmount.toFixed(4)} ${result.toAsset}`);\n if (result.priceImpact > 0.001) {\n printWarning(`Price impact: ${(result.priceImpact * 100).toFixed(2)}%`);\n }\n if (result.fee > 0) {\n printKeyValue('Fee', `$${result.fee.toFixed(4)}`);\n }\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 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError } 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\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printKeyValue('Saved', `$${result.supplied.toFixed(2)} USDC`);\n printKeyValue('APY', `${result.currentApy.toFixed(2)}%`);\n printKeyValue('Daily Yield', `~$${result.dailyEarning.toFixed(4)}/day`);\n printKeyValue('Est. Earned', `~$${result.totalYieldEarned.toFixed(4)}`);\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 { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError } 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\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n if (result.supplied > 0) {\n printSuccess('Savings: ACTIVE');\n } else {\n console.log(' Savings: INACTIVE — deposit USDC and run `t2000 save`');\n }\n printBlank();\n printKeyValue('Saved', `$${result.supplied.toFixed(2)} USDC @ ${result.apy.toFixed(1)}% APY`);\n printKeyValue('Earned today', `~$${result.earnedToday.toFixed(4)}`);\n printKeyValue('Earned all time', `~$${result.earnedAllTime.toFixed(4)}`);\n printKeyValue('Monthly projected', `~$${result.projectedMonthly.toFixed(2)}/month`);\n printBlank();\n if (result.supplied > 0) {\n console.log(' 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 { printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.json');\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\nexport function registerConfig(program: Command) {\n const configCmd = program\n .command('config')\n .description('Show or set configuration');\n\n configCmd\n .command('get')\n .argument('[key]', 'Config key to get (omit for all)')\n .action((key?: string) => {\n try {\n const config = loadConfig();\n\n if (isJsonMode()) {\n printJson(key ? { [key]: config[key] } : config);\n return;\n }\n\n printBlank();\n if (key) {\n printKeyValue(key, String(config[key] ?? '(not set)'));\n } else {\n if (Object.keys(config).length === 0) {\n console.log(' No configuration set.');\n } else {\n for (const [k, v] of Object.entries(config)) {\n printKeyValue(k, String(v));\n }\n }\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n configCmd\n .command('set')\n .argument('<key>', 'Config key')\n .argument('<value>', 'Config value')\n .action((key: string, value: string) => {\n try {\n const config = loadConfig();\n\n // Parse booleans and numbers\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 config[key] = parsed;\n saveConfig(config);\n\n if (isJsonMode()) {\n printJson({ [key]: parsed });\n return;\n }\n\n console.log(` Set ${key} = ${String(parsed)}`);\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/swap');\n console.log(' GET /v1/rates POST /v1/borrow');\n console.log(' GET /v1/health-factor POST /v1/repay');\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, asset } = body as { amount: number; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ 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/supply', async (c) => {\n try {\n const body = await c.req.json();\n const { amount, asset } = body as { amount: number; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ 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/withdraw', async (c) => {\n try {\n const body = await c.req.json();\n const { amount, asset } = body as { amount: number | 'all'; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.withdraw({ 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/swap', async (c) => {\n try {\n const body = await c.req.json();\n const { from, to, amount, maxSlippage } = body as { from: string; to: string; amount: number; maxSlippage?: number };\n if (!from || !to || !amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: from, to, amount'));\n }\n const result = await agent.swap({ from, to, amount, maxSlippage });\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, asset } = body as { amount: number; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.borrow({ 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/repay', async (c) => {\n try {\n const body = await c.req.json();\n const { amount, asset } = body as { amount: number | 'all'; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.repay({ 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 // --- 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 { x402Client } from '@t2000/x402';\nimport type { X402Wallet } from '@t2000/x402';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printBlank,\n printJson,\n printInfo,\n isJsonMode,\n handleError,\n} from '../output.js';\n\nfunction createX402Wallet(agent: T2000): X402Wallet {\n return {\n client: agent.suiClient,\n keypair: agent.signer,\n address: () => agent.address(),\n signAndExecute: async (tx) => {\n const result = await agent.suiClient.signAndExecuteTransaction({\n signer: agent.signer,\n transaction: tx as Parameters<typeof agent.suiClient.signAndExecuteTransaction>[0]['transaction'],\n });\n return { digest: result.digest };\n },\n };\n}\n\nexport function registerPay(program: Command) {\n program\n .command('pay <url>')\n .description('Pay for an x402-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 .option('--timeout <seconds>', 'Request timeout in seconds', '30')\n .option('--dry-run', 'Show what would be paid without paying')\n .action(async (url: string, opts: {\n key?: string;\n method: string;\n data?: string;\n header: Record<string, string>;\n maxPrice: string;\n timeout: string;\n dryRun?: boolean;\n }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const wallet = createX402Wallet(agent);\n const client = new x402Client(wallet);\n\n const startTime = Date.now();\n\n if (!isJsonMode()) {\n printBlank();\n printInfo(`→ ${opts.method} ${url}`);\n }\n\n const response = await client.fetch(url, {\n method: opts.method,\n headers: opts.header,\n body: opts.data,\n maxPrice: parseFloat(opts.maxPrice),\n timeout: parseInt(opts.timeout, 10) * 1000,\n dryRun: opts.dryRun,\n onPayment: (details) => {\n if (!isJsonMode()) {\n printInfo(`← 402 Payment Required: $${details.amount} USDC (Sui)`);\n printSuccess(`Paid $${details.amount} USDC (tx: ${details.txHash.slice(0, 10)}...)`);\n }\n },\n });\n\n const elapsed = Date.now() - startTime;\n\n if (!isJsonMode()) {\n printInfo(`← ${response.status} ${response.statusText || 'OK'} ${pc.dim(`[${elapsed}ms]`)}`);\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n const body = contentType.includes('application/json')\n ? await response.json()\n : await response.text();\n\n if (isJsonMode()) {\n printJson({\n status: response.status,\n url,\n elapsed,\n body,\n });\n } else {\n printBlank();\n if (typeof body === 'string') {\n console.log(body);\n } else {\n console.log(JSON.stringify(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 { clearSession } from '../prompts.js';\nimport { printSuccess, printBlank, handleError } from '../output.js';\n\nexport function registerLock(program: Command) {\n program\n .command('lock')\n .description('Clear saved session (require PIN on next command)')\n .action(async () => {\n try {\n await clearSession();\n printBlank();\n printSuccess('Session cleared — PIN required on next command');\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 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 printLine(` ${pc.red('✗')} 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 } 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 [fundResult, sentinels] = await Promise.allSettled([\n agent.fundStatus(),\n listSentinels(),\n ]);\n\n const fund = fundResult.status === 'fulfilled' ? fundResult.value : null;\n const agents = sentinels.status === 'fulfilled' ? sentinels.value : null;\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: fund\n ? {\n supplied: fund.supplied,\n apy: fund.apy,\n dailyEarning: fund.earnedToday,\n earnedAllTime: fund.earnedAllTime,\n projectedMonthly: fund.projectedMonthly,\n }\n : null,\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 (fund && fund.supplied > 0) {\n printKeyValue('Saved', `$${fund.supplied.toFixed(2)} USDC @ ${fund.apy.toFixed(1)}% APY`);\n printKeyValue('Daily Yield', `~$${fund.earnedToday.toFixed(4)}/day`);\n printKeyValue('All-time', `~$${fund.earnedAllTime.toFixed(4)}`);\n printKeyValue('Monthly Est', `~$${fund.projectedMonthly.toFixed(2)}/month`);\n } else if (fund) {\n printInfo('No savings yet — run `t2000 save <amount>` to start earning yield');\n } else {\n printInfo('Savings data unavailable');\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>')} Save USDC for yield`);\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 { createProgram } from './program.js';\n\nconst program = createProgram();\nprogram.parse();\n"],"mappings":"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","names":["pc","program","pc","T2000","program","T2000","pc","T2000","formatUsd","program","T2000","pc","formatUsd","T2000","program","T2000","T2000","program","T2000","T2000","truncateAddress","program","T2000","truncateAddress","T2000","program","T2000","password","program","pc","T2000","formatUsd","program","T2000","pc","formatUsd","T2000","program","T2000","T2000","program","T2000","T2000","program","T2000","T2000","program","T2000","pc","T2000","program","T2000","pc","T2000","program","T2000","T2000","program","T2000","T2000","program","T2000","T2000","program","T2000","homedir","homedir","program","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","T2000","CONFIG_DIR","join","homedir","existsSync","mkdirSync","readFileSync","writeFileSync","program","T2000","pc","T2000","program","T2000","pc","program","T2000","pc","program","T2000","result","T2000","MIST_PER_SUI","pc","MIST_PER_SUI","program","T2000","program"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t2000/cli",
3
- "version": "0.4.0",
3
+ "version": "0.4.3",
4
4
  "description": "CLI bank account for AI agents on Sui — send, save, swap, borrow from your terminal",
5
5
  "type": "module",
6
6
  "bin": {
@@ -37,8 +37,8 @@
37
37
  "commander": "^13",
38
38
  "hono": "^4",
39
39
  "picocolors": "^1",
40
- "@t2000/x402": "0.2.6",
41
- "@t2000/sdk": "0.4.0"
40
+ "@t2000/sdk": "0.4.3",
41
+ "@t2000/x402": "0.2.6"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/node": "^22",