@t2000/cli 0.8.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +47 -30
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -735,6 +735,7 @@ function registerSwap(program2) {
|
|
|
735
735
|
}
|
|
736
736
|
|
|
737
737
|
// src/commands/earnings.ts
|
|
738
|
+
import pc7 from "picocolors";
|
|
738
739
|
import { T2000 as T200017 } from "@t2000/sdk";
|
|
739
740
|
function registerEarnings(program2) {
|
|
740
741
|
program2.command("earnings").description("Show yield earned to date").option("--key <path>", "Key file path").action(async (opts) => {
|
|
@@ -742,13 +743,20 @@ function registerEarnings(program2) {
|
|
|
742
743
|
const pin = await resolvePin();
|
|
743
744
|
const agent = await T200017.create({ pin, keyPath: opts.key });
|
|
744
745
|
const result = await agent.earnings();
|
|
746
|
+
const pos = await agent.positions();
|
|
747
|
+
const savePositions = pos.positions.filter((p) => p.type === "save");
|
|
745
748
|
if (isJsonMode()) {
|
|
746
|
-
printJson(result);
|
|
749
|
+
printJson({ ...result, positions: savePositions });
|
|
747
750
|
return;
|
|
748
751
|
}
|
|
749
752
|
printBlank();
|
|
750
|
-
printKeyValue("Saved", `$${result.supplied.toFixed(2)}`);
|
|
751
|
-
|
|
753
|
+
printKeyValue("Total Saved", `$${result.supplied.toFixed(2)}`);
|
|
754
|
+
if (savePositions.length > 0) {
|
|
755
|
+
for (const p of savePositions) {
|
|
756
|
+
console.log(` ${pc7.dim("\u2022")} $${p.amount.toFixed(2)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(1)}% APY`);
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
printKeyValue("Blended APY", `${result.currentApy.toFixed(2)}%`);
|
|
752
760
|
printKeyValue("Daily Yield", `~$${result.dailyEarning.toFixed(4)}/day`);
|
|
753
761
|
printKeyValue("Est. Earned", `~$${result.totalYieldEarned.toFixed(4)}`);
|
|
754
762
|
printBlank();
|
|
@@ -759,6 +767,7 @@ function registerEarnings(program2) {
|
|
|
759
767
|
}
|
|
760
768
|
|
|
761
769
|
// src/commands/fundStatus.ts
|
|
770
|
+
import pc8 from "picocolors";
|
|
762
771
|
import { T2000 as T200018 } from "@t2000/sdk";
|
|
763
772
|
function registerFundStatus(program2) {
|
|
764
773
|
program2.command("fund-status").description("Full savings summary").option("--key <path>", "Key file path").action(async (opts) => {
|
|
@@ -766,8 +775,10 @@ function registerFundStatus(program2) {
|
|
|
766
775
|
const pin = await resolvePin();
|
|
767
776
|
const agent = await T200018.create({ pin, keyPath: opts.key });
|
|
768
777
|
const result = await agent.fundStatus();
|
|
778
|
+
const pos = await agent.positions();
|
|
779
|
+
const savePositions = pos.positions.filter((p) => p.type === "save");
|
|
769
780
|
if (isJsonMode()) {
|
|
770
|
-
printJson(result);
|
|
781
|
+
printJson({ ...result, positions: savePositions });
|
|
771
782
|
return;
|
|
772
783
|
}
|
|
773
784
|
printBlank();
|
|
@@ -777,7 +788,13 @@ function registerFundStatus(program2) {
|
|
|
777
788
|
console.log(" Savings: INACTIVE \u2014 run `t2000 save <amount>` to start earning");
|
|
778
789
|
}
|
|
779
790
|
printBlank();
|
|
780
|
-
printKeyValue("Saved", `$${result.supplied.toFixed(2)}
|
|
791
|
+
printKeyValue("Total Saved", `$${result.supplied.toFixed(2)}`);
|
|
792
|
+
if (savePositions.length > 0) {
|
|
793
|
+
for (const p of savePositions) {
|
|
794
|
+
console.log(` ${pc8.dim("\u2022")} $${p.amount.toFixed(2)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(1)}% APY`);
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
printKeyValue("Blended APY", `${result.apy.toFixed(1)}%`);
|
|
781
798
|
printKeyValue("Earned today", `~$${result.earnedToday.toFixed(4)}`);
|
|
782
799
|
printKeyValue("Earned all time", `~$${result.earnedAllTime.toFixed(4)}`);
|
|
783
800
|
printKeyValue("Monthly projected", `~$${result.projectedMonthly.toFixed(2)}/month`);
|
|
@@ -1186,7 +1203,7 @@ function isRetryable(code) {
|
|
|
1186
1203
|
}
|
|
1187
1204
|
|
|
1188
1205
|
// src/commands/pay.ts
|
|
1189
|
-
import
|
|
1206
|
+
import pc9 from "picocolors";
|
|
1190
1207
|
import { T2000 as T200020 } from "@t2000/sdk";
|
|
1191
1208
|
import { x402Client } from "@t2000/x402";
|
|
1192
1209
|
function createX402Wallet(agent) {
|
|
@@ -1231,7 +1248,7 @@ function registerPay(program2) {
|
|
|
1231
1248
|
});
|
|
1232
1249
|
const elapsed = Date.now() - startTime;
|
|
1233
1250
|
if (!isJsonMode()) {
|
|
1234
|
-
printInfo(`\u2190 ${response.status} ${response.statusText || "OK"} ${
|
|
1251
|
+
printInfo(`\u2190 ${response.status} ${response.statusText || "OK"} ${pc9.dim(`[${elapsed}ms]`)}`);
|
|
1235
1252
|
}
|
|
1236
1253
|
const contentType = response.headers.get("content-type") ?? "";
|
|
1237
1254
|
const body = contentType.includes("application/json") ? await response.json() : await response.text();
|
|
@@ -1280,7 +1297,7 @@ function registerLock(program2) {
|
|
|
1280
1297
|
|
|
1281
1298
|
// src/commands/sentinel.ts
|
|
1282
1299
|
import { T2000 as T200021, MIST_PER_SUI } from "@t2000/sdk";
|
|
1283
|
-
import
|
|
1300
|
+
import pc10 from "picocolors";
|
|
1284
1301
|
function formatSui(mist) {
|
|
1285
1302
|
return (Number(mist) / Number(MIST_PER_SUI)).toFixed(2);
|
|
1286
1303
|
}
|
|
@@ -1310,8 +1327,8 @@ function registerSentinel(program2) {
|
|
|
1310
1327
|
const pool = `${formatSui(s.prizePool)} SUI`.padEnd(12);
|
|
1311
1328
|
const fee = `${formatSui(s.attackFee)} SUI`.padEnd(12);
|
|
1312
1329
|
printLine(` ${s.name}`);
|
|
1313
|
-
printLine(` ${
|
|
1314
|
-
printLine(` ${
|
|
1330
|
+
printLine(` ${pc10.dim(`Pool: ${pool}Fee: ${fee}Attacks: ${s.totalAttacks}`)}`);
|
|
1331
|
+
printLine(` ${pc10.dim(s.objectId)}`);
|
|
1315
1332
|
printBlank();
|
|
1316
1333
|
});
|
|
1317
1334
|
printBlank();
|
|
@@ -1346,7 +1363,7 @@ function registerSentinel(program2) {
|
|
|
1346
1363
|
if (s.systemPrompt) {
|
|
1347
1364
|
printBlank();
|
|
1348
1365
|
printKeyValue("System Prompt", "");
|
|
1349
|
-
printLine(` ${
|
|
1366
|
+
printLine(` ${pc10.dim(s.systemPrompt.slice(0, 500))}`);
|
|
1350
1367
|
}
|
|
1351
1368
|
printBlank();
|
|
1352
1369
|
} catch (error) {
|
|
@@ -1372,13 +1389,13 @@ function registerSentinel(program2) {
|
|
|
1372
1389
|
return;
|
|
1373
1390
|
}
|
|
1374
1391
|
printBlank();
|
|
1375
|
-
printLine(` ${
|
|
1392
|
+
printLine(` ${pc10.dim("\u23F3")} Requesting attack...`);
|
|
1376
1393
|
const result = await agent.sentinelAttack(id, prompt, feeMist);
|
|
1377
1394
|
printBlank();
|
|
1378
1395
|
if (result.won) {
|
|
1379
1396
|
printSuccess(`BREACHED! (score: ${result.verdict.score}/100)`);
|
|
1380
1397
|
} else {
|
|
1381
|
-
printLine(` ${
|
|
1398
|
+
printLine(` ${pc10.red("\u2717")} DEFENDED (score: ${result.verdict.score}/100)`);
|
|
1382
1399
|
}
|
|
1383
1400
|
printBlank();
|
|
1384
1401
|
printKeyValue("Agent", result.verdict.agentResponse.slice(0, 200));
|
|
@@ -1399,7 +1416,7 @@ function registerSentinel(program2) {
|
|
|
1399
1416
|
|
|
1400
1417
|
// src/commands/earn.ts
|
|
1401
1418
|
import { T2000 as T200022, MIST_PER_SUI as MIST_PER_SUI2, listSentinels, formatUsd as formatUsd5 } from "@t2000/sdk";
|
|
1402
|
-
import
|
|
1419
|
+
import pc11 from "picocolors";
|
|
1403
1420
|
function mistToSui(mist) {
|
|
1404
1421
|
return Number(mist) / Number(MIST_PER_SUI2);
|
|
1405
1422
|
}
|
|
@@ -1453,7 +1470,7 @@ function registerEarn(program2) {
|
|
|
1453
1470
|
return;
|
|
1454
1471
|
}
|
|
1455
1472
|
printHeader("Earning Opportunities");
|
|
1456
|
-
printLine(
|
|
1473
|
+
printLine(pc11.bold("SAVINGS") + pc11.dim(" \u2014 Passive Yield"));
|
|
1457
1474
|
printDivider();
|
|
1458
1475
|
if (savePositions.length > 0) {
|
|
1459
1476
|
for (const pos of savePositions) {
|
|
@@ -1462,7 +1479,7 @@ function registerEarn(program2) {
|
|
|
1462
1479
|
if (dailyYield > 1e-4) {
|
|
1463
1480
|
const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` : formatUsd5(dailyYield);
|
|
1464
1481
|
const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` : formatUsd5(dailyYield * 30);
|
|
1465
|
-
printLine(
|
|
1482
|
+
printLine(pc11.dim(` ~${dailyStr}/day \xB7 ~${monthlyStr}/month`));
|
|
1466
1483
|
}
|
|
1467
1484
|
}
|
|
1468
1485
|
if (savePositions.length > 1) {
|
|
@@ -1475,7 +1492,7 @@ function registerEarn(program2) {
|
|
|
1475
1492
|
printInfo("Savings data unavailable");
|
|
1476
1493
|
}
|
|
1477
1494
|
printBlank();
|
|
1478
|
-
printLine(
|
|
1495
|
+
printLine(pc11.bold("SENTINEL BOUNTIES") + pc11.dim(" \u2014 Active Red Teaming"));
|
|
1479
1496
|
printDivider();
|
|
1480
1497
|
if (agents && agents.length > 0) {
|
|
1481
1498
|
const totalPool = agents.reduce((sum, s) => sum + mistToSui(s.prizePool), 0);
|
|
@@ -1494,11 +1511,11 @@ function registerEarn(program2) {
|
|
|
1494
1511
|
printInfo("Sentinel data unavailable");
|
|
1495
1512
|
}
|
|
1496
1513
|
printBlank();
|
|
1497
|
-
printLine(
|
|
1514
|
+
printLine(pc11.bold("Quick Actions"));
|
|
1498
1515
|
printDivider();
|
|
1499
|
-
printLine(` ${
|
|
1500
|
-
printLine(` ${
|
|
1501
|
-
printLine(` ${
|
|
1516
|
+
printLine(` ${pc11.dim("t2000 save <amount> [asset]")} Save stablecoins for yield`);
|
|
1517
|
+
printLine(` ${pc11.dim("t2000 sentinel list")} Browse sentinel bounties`);
|
|
1518
|
+
printLine(` ${pc11.dim("t2000 sentinel attack <id>")} Attack a sentinel`);
|
|
1502
1519
|
printBlank();
|
|
1503
1520
|
} catch (error) {
|
|
1504
1521
|
handleError(error);
|
|
@@ -1507,7 +1524,7 @@ function registerEarn(program2) {
|
|
|
1507
1524
|
}
|
|
1508
1525
|
|
|
1509
1526
|
// src/commands/rebalance.ts
|
|
1510
|
-
import
|
|
1527
|
+
import pc12 from "picocolors";
|
|
1511
1528
|
import readline from "readline";
|
|
1512
1529
|
import { T2000 as T200023, formatUsd as formatUsd6, SUPPORTED_ASSETS as SUPPORTED_ASSETS2 } from "@t2000/sdk";
|
|
1513
1530
|
async function confirm2(message) {
|
|
@@ -1545,24 +1562,24 @@ function registerRebalance(program2) {
|
|
|
1545
1562
|
const diff = plan.newApy - plan.currentApy;
|
|
1546
1563
|
if (diff < minYieldDiff) {
|
|
1547
1564
|
printInfo(`Already optimized \u2014 ${plan.currentApy.toFixed(2)}% APY on ${plan.fromProtocol}`);
|
|
1548
|
-
printLine(
|
|
1549
|
-
printLine(
|
|
1565
|
+
printLine(pc12.dim(` Best available: ${plan.newApy.toFixed(2)}% (${displayAsset(plan.toAsset)} on ${plan.toProtocol})`));
|
|
1566
|
+
printLine(pc12.dim(` Difference: ${diff.toFixed(2)}% (below ${minYieldDiff}% threshold)`));
|
|
1550
1567
|
} else if (plan.breakEvenDays > maxBreakEven && plan.estimatedSwapCost > 0) {
|
|
1551
1568
|
printInfo(`Skipped \u2014 break-even of ${plan.breakEvenDays} days exceeds ${maxBreakEven}-day limit`);
|
|
1552
|
-
printLine(
|
|
1569
|
+
printLine(pc12.dim(` ${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}%) \u2192 ${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}%)`));
|
|
1553
1570
|
} else {
|
|
1554
1571
|
printInfo("Already at the best rate. Nothing to rebalance.");
|
|
1555
1572
|
}
|
|
1556
1573
|
printBlank();
|
|
1557
1574
|
return;
|
|
1558
1575
|
}
|
|
1559
|
-
printLine(
|
|
1576
|
+
printLine(pc12.bold("Rebalance Plan"));
|
|
1560
1577
|
printDivider();
|
|
1561
1578
|
printKeyValue("From", `${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}% APY)`);
|
|
1562
1579
|
printKeyValue("To", `${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}% APY)`);
|
|
1563
1580
|
printKeyValue("Amount", formatUsd6(plan.amount));
|
|
1564
1581
|
printBlank();
|
|
1565
|
-
printLine(
|
|
1582
|
+
printLine(pc12.bold("Economics"));
|
|
1566
1583
|
printDivider();
|
|
1567
1584
|
printKeyValue("APY Gain", `+${(plan.newApy - plan.currentApy).toFixed(2)}%`);
|
|
1568
1585
|
printKeyValue("Annual Gain", `${formatUsd6(plan.annualGain)}/year`);
|
|
@@ -1572,7 +1589,7 @@ function registerRebalance(program2) {
|
|
|
1572
1589
|
}
|
|
1573
1590
|
printBlank();
|
|
1574
1591
|
if (plan.steps.length > 0) {
|
|
1575
|
-
printLine(
|
|
1592
|
+
printLine(pc12.bold("Steps"));
|
|
1576
1593
|
printDivider();
|
|
1577
1594
|
for (let i = 0; i < plan.steps.length; i++) {
|
|
1578
1595
|
const step = plan.steps[i];
|
|
@@ -1588,8 +1605,8 @@ function registerRebalance(program2) {
|
|
|
1588
1605
|
printBlank();
|
|
1589
1606
|
}
|
|
1590
1607
|
if (opts.dryRun) {
|
|
1591
|
-
printLine(
|
|
1592
|
-
printLine(
|
|
1608
|
+
printLine(pc12.bold(pc12.yellow("DRY RUN \u2014 Preview only, no transactions executed")));
|
|
1609
|
+
printLine(pc12.dim(" Run `t2000 rebalance` to execute."));
|
|
1593
1610
|
printBlank();
|
|
1594
1611
|
return;
|
|
1595
1612
|
}
|
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/commands/rebalance.ts","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createRequire } from 'node:module';\nimport { setJsonMode } from './output.js';\n\nconst require = createRequire(import.meta.url);\nconst { version: CLI_VERSION } = require('../package.json') as { version: string };\nimport { registerInit } from './commands/init.js';\nimport { registerSend } from './commands/send.js';\nimport { registerBalance } from './commands/balance.js';\nimport { registerAddress } from './commands/address.js';\nimport { registerDeposit } from './commands/deposit.js';\nimport { registerHistory } from './commands/history.js';\nimport { registerExport } from './commands/exportKey.js';\nimport { registerImport } from './commands/importKey.js';\nimport { registerSave } from './commands/save.js';\nimport { registerWithdraw } from './commands/withdraw.js';\nimport { registerBorrow } from './commands/borrow.js';\nimport { registerRepay } from './commands/repay.js';\nimport { registerHealth } from './commands/health.js';\nimport { registerRates } from './commands/rates.js';\nimport { registerPositions } from './commands/positions.js';\nimport { 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';\nimport { registerRebalance } from './commands/rebalance.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(`${CLI_VERSION} (beta)`)\n .option('--json', 'Output in JSON format')\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n if (opts.json) setJsonMode(true);\n });\n\n registerInit(program);\n registerSend(program);\n registerBalance(program);\n registerAddress(program);\n registerDeposit(program);\n registerHistory(program);\n registerExport(program);\n registerImport(program);\n registerSave(program);\n registerWithdraw(program);\n registerBorrow(program);\n registerRepay(program);\n registerHealth(program);\n registerRates(program);\n registerPositions(program);\n 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 registerRebalance(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 } 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 printBlank();\n\n const stables = bal.stables ?? {};\n const stableEntries = Object.entries(stables).filter(([, v]) => v > 0.001);\n\n if (stableEntries.length <= 1) {\n printKeyValue('Available', `${formatUsd(bal.available)} ${pc.dim('(checking — spendable)')}`);\n } else {\n printKeyValue('Available', `${formatUsd(bal.available)} ${pc.dim('(total stablecoins)')}`);\n for (const [symbol, amount] of stableEntries) {\n printLine(` ${pc.dim(symbol)} ${formatUsd(amount)}`);\n }\n }\n\n printKeyValue('Savings', `${formatUsd(bal.savings)}`);\n printKeyValue('Gas', `${bal.gasReserve.sui.toFixed(2)} SUI ${pc.dim(`(~${formatUsd(bal.gasReserve.usdEquiv)})`)}`);\n printSeparator();\n printKeyValue('Total', `${formatUsd(bal.total)}`);\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 { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin, askConfirm } from '../prompts.js';\nimport { printSuccess, printBlank, printInfo, printJson, isJsonMode, handleError, printError } from '../output.js';\n\nconst LOCKFILE = resolve(homedir(), '.t2000', '.pin-lock');\nconst MAX_ATTEMPTS = 5;\nconst LOCKOUT_MS = 5 * 60 * 1000;\n\ninterface LockState {\n attempts: number;\n lockedUntil: number;\n}\n\nasync function getLockState(): Promise<LockState> {\n try {\n const data = JSON.parse(await readFile(LOCKFILE, 'utf-8'));\n return data as LockState;\n } catch {\n return { attempts: 0, lockedUntil: 0 };\n }\n}\n\nasync function setLockState(state: LockState): Promise<void> {\n await mkdir(resolve(homedir(), '.t2000'), { recursive: true });\n await writeFile(LOCKFILE, JSON.stringify(state), { mode: 0o600 });\n}\n\nexport function registerExport(program: Command) {\n program\n .command('export')\n .description('Export private key (raw Ed25519 hex)')\n .option('--key <path>', 'Key file path')\n .option('--yes', 'Skip confirmation')\n .action(async (opts) => {\n try {\n const lock = await getLockState();\n if (lock.lockedUntil > Date.now()) {\n const remainSec = Math.ceil((lock.lockedUntil - Date.now()) / 1000);\n printError(`Too many failed PIN attempts. Try again in ${remainSec}s.`);\n return;\n }\n\n if (!opts.yes && !isJsonMode()) {\n const proceed = await askConfirm(\n 'WARNING: This will display your raw private key. Anyone with this key controls your wallet. Continue?',\n );\n if (!proceed) return;\n }\n\n const pin = await resolvePin();\n\n let agent;\n try {\n agent = await T2000.create({ pin, keyPath: opts.key });\n } catch (error) {\n const msg = error instanceof Error ? error.message : '';\n if (msg.includes('Invalid PIN')) {\n const newAttempts = lock.attempts + 1;\n if (newAttempts >= MAX_ATTEMPTS) {\n await setLockState({ attempts: newAttempts, lockedUntil: Date.now() + LOCKOUT_MS });\n printError(`Invalid PIN. Account locked for 5 minutes (${newAttempts} failed attempts).`);\n } else {\n await setLockState({ attempts: newAttempts, lockedUntil: 0 });\n printError(`Invalid PIN. ${MAX_ATTEMPTS - newAttempts} attempts remaining.`);\n }\n return;\n }\n throw error;\n }\n\n await setLockState({ attempts: 0, lockedUntil: 0 });\n\n const hex = agent.exportKey();\n\n if (isJsonMode()) {\n printJson({ privateKey: hex, format: 'ed25519_hex' });\n return;\n }\n\n printBlank();\n printSuccess('Private key (Ed25519, hex):');\n console.log(` ${hex}`);\n printBlank();\n printInfo('Not a BIP39 mnemonic. Store securely and never share.');\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, keypairFromPrivateKey, saveKey } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\nimport { password } from '@inquirer/prompts';\n\nexport function registerImport(program: Command) {\n program\n .command('import')\n .description('Import a wallet from private key')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n let privateKey: string;\n if (process.env.T2000_PRIVATE_KEY) {\n privateKey = process.env.T2000_PRIVATE_KEY;\n } else {\n privateKey = await password({ message: 'Enter private key (hex):' });\n }\n\n if (!privateKey) throw new Error('Private key is required');\n\n const pin = await resolvePin({ confirm: true });\n\n const keypair = keypairFromPrivateKey(privateKey);\n const address = keypair.getPublicKey().toSuiAddress();\n await saveKey(keypair, pin, opts.key);\n\n if (isJsonMode()) {\n printJson({ address, imported: true });\n return;\n }\n\n printBlank();\n printSuccess('Wallet imported (encrypted)');\n printKeyValue('Address', address);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerSave(program: Command) {\n const action = async (amountStr: string, 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 ?? 'best rate';\n printSuccess(`Saved ${pc.yellow(formatUsd(result.amount))} ${asset} 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)} ${asset} (${feeRate}%)`)}`);\n }\n\n printSuccess(`Current APY: ${pc.green(`${result.apy.toFixed(2)}%`)}`);\n\n printSuccess(`Savings balance: ${pc.yellow(formatUsd(result.savingsBalance))} ${asset}`);\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 stablecoins into savings')\n .argument('<amount>', 'Amount 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 stablecoins into savings (alias for save)')\n .argument('<amount>', 'Amount 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 stablecoins from savings')\n .argument('<amount>', 'Amount to withdraw (or \"all\")')\n .argument('[asset]', 'Asset to withdraw (USDC, USDT, USDe, USDsui)', '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 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)} ${asset}`);\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 stablecoins against savings collateral')\n .argument('<amount>', 'Amount to borrow')\n .argument('[asset]', 'Asset to borrow (USDC, USDT, USDe, USDsui)', '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)} ${asset}`);\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 stablecoins')\n .argument('<amount>', 'Amount to repay (or \"all\")')\n .argument('[asset]', 'Asset to repay (USDC, USDT, USDe, USDsui)', '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)} ${asset}`);\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, STABLE_ASSETS, SUPPORTED_ASSETS } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine, printDivider } from '../output.js';\n\nexport function registerRates(program: Command) {\n program\n .command('rates')\n .description('Show current APY rates across protocols and stablecoins')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const allRates = await agent.allRatesAcrossAssets();\n\n if (isJsonMode()) {\n printJson(allRates);\n return;\n }\n\n printBlank();\n\n if (allRates.length > 0) {\n const best = allRates.reduce((a, b) => b.rates.saveApy > a.rates.saveApy ? b : a);\n const bestDisplay = SUPPORTED_ASSETS[best.asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? best.asset;\n printLine(pc.bold(pc.green(`Best yield: ${best.rates.saveApy.toFixed(2)}% APY`)) + pc.dim(` (${bestDisplay} on ${best.protocol})`));\n printBlank();\n }\n\n for (const asset of STABLE_ASSETS) {\n const assetRates = allRates.filter(r => r.asset === asset);\n if (assetRates.length === 0) continue;\n\n const display = SUPPORTED_ASSETS[asset]?.displayName ?? asset;\n printLine(pc.bold(display));\n printDivider();\n for (const entry of assetRates) {\n printKeyValue(entry.protocol, `Save ${entry.rates.saveApy.toFixed(2)}% Borrow ${entry.rates.borrowApy.toFixed(2)}%`);\n }\n printBlank();\n }\n\n if (allRates.length === 0) {\n printInfo('No protocol rates available');\n printBlank();\n }\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine, printDivider } from '../output.js';\n\nexport function registerPositions(program: Command) {\n program\n .command('positions')\n .description('Show savings & borrow positions across all protocols and assets')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.positions();\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n if (result.positions.length === 0) {\n printInfo('No positions. Use `t2000 save <amount>` to start earning.');\n } else {\n const saves = result.positions.filter(p => p.type === 'save');\n const borrows = result.positions.filter(p => p.type === 'borrow');\n\n if (saves.length > 0) {\n printLine(pc.bold('Savings'));\n printDivider();\n for (const pos of saves) {\n printKeyValue(pos.protocol, `${formatUsd(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(1)}% APY`);\n }\n const totalSaved = saves.reduce((s, p) => s + p.amount, 0);\n if (saves.length > 1) {\n printKeyValue('Total', formatUsd(totalSaved));\n }\n printBlank();\n }\n\n if (borrows.length > 0) {\n printLine(pc.bold('Borrows'));\n printDivider();\n for (const pos of borrows) {\n printKeyValue(pos.protocol, `${formatUsd(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(1)}% APY`);\n }\n const totalBorrowed = borrows.reduce((s, p) => s + p.amount, 0);\n if (borrows.length > 1) {\n printKeyValue('Total', formatUsd(totalBorrowed));\n }\n printBlank();\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)}`);\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 — run `t2000 save <amount>` to start earning');\n }\n printBlank();\n printKeyValue('Saved', `$${result.supplied.toFixed(2)} @ ${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, formatUsd } from '@t2000/sdk';\nimport type { SentinelAgent } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printHeader,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printDivider,\n printLine,\n printInfo,\n} from '../output.js';\nimport pc from 'picocolors';\n\nfunction mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nfunction bestTarget(sentinels: SentinelAgent[]): SentinelAgent | undefined {\n const withPool = sentinels.filter((s) => s.prizePool > 0n && s.attackFee > 0n);\n if (withPool.length === 0) return undefined;\n return withPool.sort((a, b) => {\n const ratioA = Number(a.prizePool) / Number(a.attackFee);\n const ratioB = Number(b.prizePool) / Number(b.attackFee);\n return ratioB - ratioA;\n })[0];\n}\n\nexport function registerEarn(program: Command) {\n program\n .command('earn')\n .description('Show all earning opportunities — savings yield + sentinel bounties')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const [positionsResult, sentinels] = await Promise.allSettled([\n agent.positions(),\n listSentinels(),\n ]);\n\n const posData = positionsResult.status === 'fulfilled' ? positionsResult.value : null;\n const agents = sentinels.status === 'fulfilled' ? sentinels.value : null;\n const savePositions = posData?.positions.filter((p) => p.type === 'save') ?? [];\n const totalSaved = savePositions.reduce((s, p) => s + p.amount, 0);\n\n if (isJsonMode()) {\n const best = agents ? bestTarget(agents) : undefined;\n const totalPool = agents\n ? agents.reduce((sum, s) => sum + mistToSui(s.prizePool), 0)\n : 0;\n const cheapest = agents\n ? Math.min(...agents.map((s) => mistToSui(s.attackFee)))\n : 0;\n\n printJson({\n savings: savePositions.map((p) => ({\n protocol: p.protocol,\n asset: p.asset,\n amount: p.amount,\n apy: p.apy,\n })),\n totalSaved,\n sentinel: agents\n ? {\n activeSentinels: agents.length,\n totalPrizePool: Number(totalPool.toFixed(2)),\n cheapestFee: Number(cheapest.toFixed(2)),\n bestTarget: best\n ? {\n name: best.name,\n objectId: best.objectId,\n prizePool: mistToSui(best.prizePool),\n attackFee: mistToSui(best.attackFee),\n ratio: Number((Number(best.prizePool) / Number(best.attackFee)).toFixed(1)),\n }\n : null,\n }\n : null,\n });\n return;\n }\n\n printHeader('Earning Opportunities');\n\n // --- Savings section ---\n printLine(pc.bold('SAVINGS') + pc.dim(' — Passive Yield'));\n printDivider();\n\n if (savePositions.length > 0) {\n for (const pos of savePositions) {\n const dailyYield = (pos.amount * pos.apy / 100) / 365;\n printKeyValue(pos.protocol, `${formatUsd(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(1)}% APY`);\n if (dailyYield > 0.0001) {\n const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` : formatUsd(dailyYield);\n const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` : formatUsd(dailyYield * 30);\n printLine(pc.dim(` ~${dailyStr}/day · ~${monthlyStr}/month`));\n }\n }\n if (savePositions.length > 1) {\n printBlank();\n printKeyValue('Total Saved', formatUsd(totalSaved));\n }\n } else if (posData) {\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> [asset]')} Save stablecoins 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 type { Command } from 'commander';\nimport pc from 'picocolors';\nimport readline from 'readline';\nimport { T2000, formatUsd, SUPPORTED_ASSETS } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printInfo,\n printWarning,\n printLine,\n printDivider,\n explorerUrl,\n} from '../output.js';\n\nasync function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(` ${message} (y/N) `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n}\n\nexport function registerRebalance(program: Command) {\n program\n .command('rebalance')\n .description('Optimize yield — move savings to the best rate across protocols and stablecoins')\n .option('--key <path>', 'Key file path')\n .option('--dry-run', 'Show what would happen without executing')\n .option('--min-diff <pct>', 'Minimum APY difference to trigger (default: 0.5)', '0.5')\n .option('--max-break-even <days>', 'Max break-even days for cross-asset moves (default: 30)', '30')\n .option('--yes', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const minYieldDiff = parseFloat(opts.minDiff ?? '0.5');\n const maxBreakEven = parseInt(opts.maxBreakEven ?? '30', 10);\n\n const plan = await agent.rebalance({\n dryRun: true,\n minYieldDiff,\n maxBreakEven,\n });\n\n if (isJsonMode()) {\n if (opts.dryRun) {\n printJson(plan);\n } else {\n const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });\n printJson(result);\n }\n return;\n }\n\n printBlank();\n\n if (plan.steps.length === 0) {\n const diff = plan.newApy - plan.currentApy;\n if (diff < minYieldDiff) {\n printInfo(`Already optimized — ${plan.currentApy.toFixed(2)}% APY on ${plan.fromProtocol}`);\n printLine(pc.dim(` Best available: ${plan.newApy.toFixed(2)}% (${displayAsset(plan.toAsset)} on ${plan.toProtocol})`));\n printLine(pc.dim(` Difference: ${diff.toFixed(2)}% (below ${minYieldDiff}% threshold)`));\n } else if (plan.breakEvenDays > maxBreakEven && plan.estimatedSwapCost > 0) {\n printInfo(`Skipped — break-even of ${plan.breakEvenDays} days exceeds ${maxBreakEven}-day limit`);\n printLine(pc.dim(` ${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}%) → ${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}%)`));\n } else {\n printInfo('Already at the best rate. Nothing to rebalance.');\n }\n printBlank();\n return;\n }\n\n printLine(pc.bold('Rebalance Plan'));\n printDivider();\n printKeyValue('From', `${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}% APY)`);\n printKeyValue('To', `${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}% APY)`);\n printKeyValue('Amount', formatUsd(plan.amount));\n printBlank();\n\n printLine(pc.bold('Economics'));\n printDivider();\n printKeyValue('APY Gain', `+${(plan.newApy - plan.currentApy).toFixed(2)}%`);\n printKeyValue('Annual Gain', `${formatUsd(plan.annualGain)}/year`);\n if (plan.estimatedSwapCost > 0) {\n printKeyValue('Swap Cost', `~${formatUsd(plan.estimatedSwapCost)}`);\n printKeyValue('Break-even', `${plan.breakEvenDays} days`);\n }\n printBlank();\n\n if (plan.steps.length > 0) {\n printLine(pc.bold('Steps'));\n printDivider();\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i];\n const num = `${i + 1}.`;\n if (step.action === 'withdraw') {\n printLine(` ${num} Withdraw ${formatUsd(step.amount)} ${displayAsset(step.fromAsset ?? '')} from ${step.protocol}`);\n } else if (step.action === 'swap') {\n printLine(` ${num} Swap ${displayAsset(step.fromAsset ?? '')} → ${displayAsset(step.toAsset ?? '')} (~${formatUsd(step.estimatedOutput ?? 0)})`);\n } else if (step.action === 'deposit') {\n printLine(` ${num} Deposit ${formatUsd(step.amount)} ${displayAsset(step.toAsset ?? '')} into ${step.protocol}`);\n }\n }\n printBlank();\n }\n\n if (opts.dryRun) {\n printLine(pc.bold(pc.yellow('DRY RUN — Preview only, no transactions executed')));\n printLine(pc.dim(' Run `t2000 rebalance` to execute.'));\n printBlank();\n return;\n }\n\n if (!opts.yes) {\n const proceed = await confirm('Execute this rebalance?');\n if (!proceed) {\n printInfo('Cancelled.');\n printBlank();\n return;\n }\n }\n\n const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });\n\n if (result.executed) {\n printSuccess(`Rebalanced ${formatUsd(result.amount)} → ${result.newApy.toFixed(2)}% APY`);\n for (const digest of result.txDigests) {\n printKeyValue('Tx', explorerUrl(digest));\n }\n printKeyValue('Gas', `${result.totalGasCost.toFixed(4)} SUI`);\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction displayAsset(asset: string): string {\n return SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? asset;\n}\n","import { 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","formatUsd","pc","T2000","program","T2000","T2000","program","T2000","T2000","truncateAddress","program","T2000","truncateAddress","readFile","writeFile","mkdir","resolve","homedir","T2000","resolve","homedir","readFile","mkdir","writeFile","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","pc","T2000","formatUsd","program","T2000","pc","formatUsd","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","formatUsd","pc","MIST_PER_SUI","program","T2000","formatUsd","pc","T2000","formatUsd","SUPPORTED_ASSETS","confirm","resolve","program","T2000","result","pc","formatUsd","SUPPORTED_ASSETS","require","program"]}
|
|
1
|
+
{"version":3,"sources":["../src/program.ts","../src/output.ts","../src/commands/init.ts","../src/prompts.ts","../src/commands/send.ts","../src/commands/balance.ts","../src/commands/address.ts","../src/commands/deposit.ts","../src/commands/history.ts","../src/commands/exportKey.ts","../src/commands/importKey.ts","../src/commands/save.ts","../src/commands/withdraw.ts","../src/commands/borrow.ts","../src/commands/repay.ts","../src/commands/health.ts","../src/commands/rates.ts","../src/commands/positions.ts","../src/commands/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/commands/rebalance.ts","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createRequire } from 'node:module';\nimport { setJsonMode } from './output.js';\n\nconst require = createRequire(import.meta.url);\nconst { version: CLI_VERSION } = require('../package.json') as { version: string };\nimport { registerInit } from './commands/init.js';\nimport { registerSend } from './commands/send.js';\nimport { registerBalance } from './commands/balance.js';\nimport { registerAddress } from './commands/address.js';\nimport { registerDeposit } from './commands/deposit.js';\nimport { registerHistory } from './commands/history.js';\nimport { registerExport } from './commands/exportKey.js';\nimport { registerImport } from './commands/importKey.js';\nimport { registerSave } from './commands/save.js';\nimport { registerWithdraw } from './commands/withdraw.js';\nimport { registerBorrow } from './commands/borrow.js';\nimport { registerRepay } from './commands/repay.js';\nimport { registerHealth } from './commands/health.js';\nimport { registerRates } from './commands/rates.js';\nimport { registerPositions } from './commands/positions.js';\nimport { 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';\nimport { registerRebalance } from './commands/rebalance.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(`${CLI_VERSION} (beta)`)\n .option('--json', 'Output in JSON format')\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n if (opts.json) setJsonMode(true);\n });\n\n registerInit(program);\n registerSend(program);\n registerBalance(program);\n registerAddress(program);\n registerDeposit(program);\n registerHistory(program);\n registerExport(program);\n registerImport(program);\n registerSave(program);\n registerWithdraw(program);\n registerBorrow(program);\n registerRepay(program);\n registerHealth(program);\n registerRates(program);\n registerPositions(program);\n 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 registerRebalance(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 } 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 printBlank();\n\n const stables = bal.stables ?? {};\n const stableEntries = Object.entries(stables).filter(([, v]) => v > 0.001);\n\n if (stableEntries.length <= 1) {\n printKeyValue('Available', `${formatUsd(bal.available)} ${pc.dim('(checking — spendable)')}`);\n } else {\n printKeyValue('Available', `${formatUsd(bal.available)} ${pc.dim('(total stablecoins)')}`);\n for (const [symbol, amount] of stableEntries) {\n printLine(` ${pc.dim(symbol)} ${formatUsd(amount)}`);\n }\n }\n\n printKeyValue('Savings', `${formatUsd(bal.savings)}`);\n printKeyValue('Gas', `${bal.gasReserve.sui.toFixed(2)} SUI ${pc.dim(`(~${formatUsd(bal.gasReserve.usdEquiv)})`)}`);\n printSeparator();\n printKeyValue('Total', `${formatUsd(bal.total)}`);\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 { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin, askConfirm } from '../prompts.js';\nimport { printSuccess, printBlank, printInfo, printJson, isJsonMode, handleError, printError } from '../output.js';\n\nconst LOCKFILE = resolve(homedir(), '.t2000', '.pin-lock');\nconst MAX_ATTEMPTS = 5;\nconst LOCKOUT_MS = 5 * 60 * 1000;\n\ninterface LockState {\n attempts: number;\n lockedUntil: number;\n}\n\nasync function getLockState(): Promise<LockState> {\n try {\n const data = JSON.parse(await readFile(LOCKFILE, 'utf-8'));\n return data as LockState;\n } catch {\n return { attempts: 0, lockedUntil: 0 };\n }\n}\n\nasync function setLockState(state: LockState): Promise<void> {\n await mkdir(resolve(homedir(), '.t2000'), { recursive: true });\n await writeFile(LOCKFILE, JSON.stringify(state), { mode: 0o600 });\n}\n\nexport function registerExport(program: Command) {\n program\n .command('export')\n .description('Export private key (raw Ed25519 hex)')\n .option('--key <path>', 'Key file path')\n .option('--yes', 'Skip confirmation')\n .action(async (opts) => {\n try {\n const lock = await getLockState();\n if (lock.lockedUntil > Date.now()) {\n const remainSec = Math.ceil((lock.lockedUntil - Date.now()) / 1000);\n printError(`Too many failed PIN attempts. Try again in ${remainSec}s.`);\n return;\n }\n\n if (!opts.yes && !isJsonMode()) {\n const proceed = await askConfirm(\n 'WARNING: This will display your raw private key. Anyone with this key controls your wallet. Continue?',\n );\n if (!proceed) return;\n }\n\n const pin = await resolvePin();\n\n let agent;\n try {\n agent = await T2000.create({ pin, keyPath: opts.key });\n } catch (error) {\n const msg = error instanceof Error ? error.message : '';\n if (msg.includes('Invalid PIN')) {\n const newAttempts = lock.attempts + 1;\n if (newAttempts >= MAX_ATTEMPTS) {\n await setLockState({ attempts: newAttempts, lockedUntil: Date.now() + LOCKOUT_MS });\n printError(`Invalid PIN. Account locked for 5 minutes (${newAttempts} failed attempts).`);\n } else {\n await setLockState({ attempts: newAttempts, lockedUntil: 0 });\n printError(`Invalid PIN. ${MAX_ATTEMPTS - newAttempts} attempts remaining.`);\n }\n return;\n }\n throw error;\n }\n\n await setLockState({ attempts: 0, lockedUntil: 0 });\n\n const hex = agent.exportKey();\n\n if (isJsonMode()) {\n printJson({ privateKey: hex, format: 'ed25519_hex' });\n return;\n }\n\n printBlank();\n printSuccess('Private key (Ed25519, hex):');\n console.log(` ${hex}`);\n printBlank();\n printInfo('Not a BIP39 mnemonic. Store securely and never share.');\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, keypairFromPrivateKey, saveKey } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\nimport { password } from '@inquirer/prompts';\n\nexport function registerImport(program: Command) {\n program\n .command('import')\n .description('Import a wallet from private key')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n let privateKey: string;\n if (process.env.T2000_PRIVATE_KEY) {\n privateKey = process.env.T2000_PRIVATE_KEY;\n } else {\n privateKey = await password({ message: 'Enter private key (hex):' });\n }\n\n if (!privateKey) throw new Error('Private key is required');\n\n const pin = await resolvePin({ confirm: true });\n\n const keypair = keypairFromPrivateKey(privateKey);\n const address = keypair.getPublicKey().toSuiAddress();\n await saveKey(keypair, pin, opts.key);\n\n if (isJsonMode()) {\n printJson({ address, imported: true });\n return;\n }\n\n printBlank();\n printSuccess('Wallet imported (encrypted)');\n printKeyValue('Address', address);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerSave(program: Command) {\n const action = async (amountStr: string, 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 ?? 'best rate';\n printSuccess(`Saved ${pc.yellow(formatUsd(result.amount))} ${asset} 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)} ${asset} (${feeRate}%)`)}`);\n }\n\n printSuccess(`Current APY: ${pc.green(`${result.apy.toFixed(2)}%`)}`);\n\n printSuccess(`Savings balance: ${pc.yellow(formatUsd(result.savingsBalance))} ${asset}`);\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 stablecoins into savings')\n .argument('<amount>', 'Amount 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 stablecoins into savings (alias for save)')\n .argument('<amount>', 'Amount 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 stablecoins from savings')\n .argument('<amount>', 'Amount to withdraw (or \"all\")')\n .argument('[asset]', 'Asset to withdraw (USDC, USDT, USDe, USDsui)', '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 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)} ${asset}`);\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 stablecoins against savings collateral')\n .argument('<amount>', 'Amount to borrow')\n .argument('[asset]', 'Asset to borrow (USDC, USDT, USDe, USDsui)', '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)} ${asset}`);\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 stablecoins')\n .argument('<amount>', 'Amount to repay (or \"all\")')\n .argument('[asset]', 'Asset to repay (USDC, USDT, USDe, USDsui)', '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)} ${asset}`);\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, STABLE_ASSETS, SUPPORTED_ASSETS } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine, printDivider } from '../output.js';\n\nexport function registerRates(program: Command) {\n program\n .command('rates')\n .description('Show current APY rates across protocols and stablecoins')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const allRates = await agent.allRatesAcrossAssets();\n\n if (isJsonMode()) {\n printJson(allRates);\n return;\n }\n\n printBlank();\n\n if (allRates.length > 0) {\n const best = allRates.reduce((a, b) => b.rates.saveApy > a.rates.saveApy ? b : a);\n const bestDisplay = SUPPORTED_ASSETS[best.asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? best.asset;\n printLine(pc.bold(pc.green(`Best yield: ${best.rates.saveApy.toFixed(2)}% APY`)) + pc.dim(` (${bestDisplay} on ${best.protocol})`));\n printBlank();\n }\n\n for (const asset of STABLE_ASSETS) {\n const assetRates = allRates.filter(r => r.asset === asset);\n if (assetRates.length === 0) continue;\n\n const display = SUPPORTED_ASSETS[asset]?.displayName ?? asset;\n printLine(pc.bold(display));\n printDivider();\n for (const entry of assetRates) {\n printKeyValue(entry.protocol, `Save ${entry.rates.saveApy.toFixed(2)}% Borrow ${entry.rates.borrowApy.toFixed(2)}%`);\n }\n printBlank();\n }\n\n if (allRates.length === 0) {\n printInfo('No protocol rates available');\n printBlank();\n }\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine, printDivider } from '../output.js';\n\nexport function registerPositions(program: Command) {\n program\n .command('positions')\n .description('Show savings & borrow positions across all protocols and assets')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.positions();\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n if (result.positions.length === 0) {\n printInfo('No positions. Use `t2000 save <amount>` to start earning.');\n } else {\n const saves = result.positions.filter(p => p.type === 'save');\n const borrows = result.positions.filter(p => p.type === 'borrow');\n\n if (saves.length > 0) {\n printLine(pc.bold('Savings'));\n printDivider();\n for (const pos of saves) {\n printKeyValue(pos.protocol, `${formatUsd(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(1)}% APY`);\n }\n const totalSaved = saves.reduce((s, p) => s + p.amount, 0);\n if (saves.length > 1) {\n printKeyValue('Total', formatUsd(totalSaved));\n }\n printBlank();\n }\n\n if (borrows.length > 0) {\n printLine(pc.bold('Borrows'));\n printDivider();\n for (const pos of borrows) {\n printKeyValue(pos.protocol, `${formatUsd(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(1)}% APY`);\n }\n const totalBorrowed = borrows.reduce((s, p) => s + p.amount, 0);\n if (borrows.length > 1) {\n printKeyValue('Total', formatUsd(totalBorrowed));\n }\n printBlank();\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 pc from 'picocolors';\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 const pos = await agent.positions();\n const savePositions = pos.positions.filter((p) => p.type === 'save');\n\n if (isJsonMode()) {\n printJson({ ...result, positions: savePositions });\n return;\n }\n\n printBlank();\n printKeyValue('Total Saved', `$${result.supplied.toFixed(2)}`);\n\n if (savePositions.length > 0) {\n for (const p of savePositions) {\n console.log(` ${pc.dim('•')} $${p.amount.toFixed(2)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(1)}% APY`);\n }\n }\n\n printKeyValue('Blended 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 pc from 'picocolors';\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 const pos = await agent.positions();\n const savePositions = pos.positions.filter((p) => p.type === 'save');\n\n if (isJsonMode()) {\n printJson({ ...result, positions: savePositions });\n return;\n }\n\n printBlank();\n if (result.supplied > 0) {\n printSuccess('Savings: ACTIVE');\n } else {\n console.log(' Savings: INACTIVE — run `t2000 save <amount>` to start earning');\n }\n printBlank();\n printKeyValue('Total Saved', `$${result.supplied.toFixed(2)}`);\n\n if (savePositions.length > 0) {\n for (const p of savePositions) {\n console.log(` ${pc.dim('•')} $${p.amount.toFixed(2)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(1)}% APY`);\n }\n }\n\n printKeyValue('Blended APY', `${result.apy.toFixed(1)}%`);\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, formatUsd } from '@t2000/sdk';\nimport type { SentinelAgent } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printHeader,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printDivider,\n printLine,\n printInfo,\n} from '../output.js';\nimport pc from 'picocolors';\n\nfunction mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nfunction bestTarget(sentinels: SentinelAgent[]): SentinelAgent | undefined {\n const withPool = sentinels.filter((s) => s.prizePool > 0n && s.attackFee > 0n);\n if (withPool.length === 0) return undefined;\n return withPool.sort((a, b) => {\n const ratioA = Number(a.prizePool) / Number(a.attackFee);\n const ratioB = Number(b.prizePool) / Number(b.attackFee);\n return ratioB - ratioA;\n })[0];\n}\n\nexport function registerEarn(program: Command) {\n program\n .command('earn')\n .description('Show all earning opportunities — savings yield + sentinel bounties')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const [positionsResult, sentinels] = await Promise.allSettled([\n agent.positions(),\n listSentinels(),\n ]);\n\n const posData = positionsResult.status === 'fulfilled' ? positionsResult.value : null;\n const agents = sentinels.status === 'fulfilled' ? sentinels.value : null;\n const savePositions = posData?.positions.filter((p) => p.type === 'save') ?? [];\n const totalSaved = savePositions.reduce((s, p) => s + p.amount, 0);\n\n if (isJsonMode()) {\n const best = agents ? bestTarget(agents) : undefined;\n const totalPool = agents\n ? agents.reduce((sum, s) => sum + mistToSui(s.prizePool), 0)\n : 0;\n const cheapest = agents\n ? Math.min(...agents.map((s) => mistToSui(s.attackFee)))\n : 0;\n\n printJson({\n savings: savePositions.map((p) => ({\n protocol: p.protocol,\n asset: p.asset,\n amount: p.amount,\n apy: p.apy,\n })),\n totalSaved,\n sentinel: agents\n ? {\n activeSentinels: agents.length,\n totalPrizePool: Number(totalPool.toFixed(2)),\n cheapestFee: Number(cheapest.toFixed(2)),\n bestTarget: best\n ? {\n name: best.name,\n objectId: best.objectId,\n prizePool: mistToSui(best.prizePool),\n attackFee: mistToSui(best.attackFee),\n ratio: Number((Number(best.prizePool) / Number(best.attackFee)).toFixed(1)),\n }\n : null,\n }\n : null,\n });\n return;\n }\n\n printHeader('Earning Opportunities');\n\n // --- Savings section ---\n printLine(pc.bold('SAVINGS') + pc.dim(' — Passive Yield'));\n printDivider();\n\n if (savePositions.length > 0) {\n for (const pos of savePositions) {\n const dailyYield = (pos.amount * pos.apy / 100) / 365;\n printKeyValue(pos.protocol, `${formatUsd(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(1)}% APY`);\n if (dailyYield > 0.0001) {\n const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` : formatUsd(dailyYield);\n const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` : formatUsd(dailyYield * 30);\n printLine(pc.dim(` ~${dailyStr}/day · ~${monthlyStr}/month`));\n }\n }\n if (savePositions.length > 1) {\n printBlank();\n printKeyValue('Total Saved', formatUsd(totalSaved));\n }\n } else if (posData) {\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> [asset]')} Save stablecoins 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 type { Command } from 'commander';\nimport pc from 'picocolors';\nimport readline from 'readline';\nimport { T2000, formatUsd, SUPPORTED_ASSETS } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printInfo,\n printWarning,\n printLine,\n printDivider,\n explorerUrl,\n} from '../output.js';\n\nasync function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(` ${message} (y/N) `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n}\n\nexport function registerRebalance(program: Command) {\n program\n .command('rebalance')\n .description('Optimize yield — move savings to the best rate across protocols and stablecoins')\n .option('--key <path>', 'Key file path')\n .option('--dry-run', 'Show what would happen without executing')\n .option('--min-diff <pct>', 'Minimum APY difference to trigger (default: 0.5)', '0.5')\n .option('--max-break-even <days>', 'Max break-even days for cross-asset moves (default: 30)', '30')\n .option('--yes', 'Skip confirmation prompt')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const minYieldDiff = parseFloat(opts.minDiff ?? '0.5');\n const maxBreakEven = parseInt(opts.maxBreakEven ?? '30', 10);\n\n const plan = await agent.rebalance({\n dryRun: true,\n minYieldDiff,\n maxBreakEven,\n });\n\n if (isJsonMode()) {\n if (opts.dryRun) {\n printJson(plan);\n } else {\n const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });\n printJson(result);\n }\n return;\n }\n\n printBlank();\n\n if (plan.steps.length === 0) {\n const diff = plan.newApy - plan.currentApy;\n if (diff < minYieldDiff) {\n printInfo(`Already optimized — ${plan.currentApy.toFixed(2)}% APY on ${plan.fromProtocol}`);\n printLine(pc.dim(` Best available: ${plan.newApy.toFixed(2)}% (${displayAsset(plan.toAsset)} on ${plan.toProtocol})`));\n printLine(pc.dim(` Difference: ${diff.toFixed(2)}% (below ${minYieldDiff}% threshold)`));\n } else if (plan.breakEvenDays > maxBreakEven && plan.estimatedSwapCost > 0) {\n printInfo(`Skipped — break-even of ${plan.breakEvenDays} days exceeds ${maxBreakEven}-day limit`);\n printLine(pc.dim(` ${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}%) → ${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}%)`));\n } else {\n printInfo('Already at the best rate. Nothing to rebalance.');\n }\n printBlank();\n return;\n }\n\n printLine(pc.bold('Rebalance Plan'));\n printDivider();\n printKeyValue('From', `${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}% APY)`);\n printKeyValue('To', `${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}% APY)`);\n printKeyValue('Amount', formatUsd(plan.amount));\n printBlank();\n\n printLine(pc.bold('Economics'));\n printDivider();\n printKeyValue('APY Gain', `+${(plan.newApy - plan.currentApy).toFixed(2)}%`);\n printKeyValue('Annual Gain', `${formatUsd(plan.annualGain)}/year`);\n if (plan.estimatedSwapCost > 0) {\n printKeyValue('Swap Cost', `~${formatUsd(plan.estimatedSwapCost)}`);\n printKeyValue('Break-even', `${plan.breakEvenDays} days`);\n }\n printBlank();\n\n if (plan.steps.length > 0) {\n printLine(pc.bold('Steps'));\n printDivider();\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i];\n const num = `${i + 1}.`;\n if (step.action === 'withdraw') {\n printLine(` ${num} Withdraw ${formatUsd(step.amount)} ${displayAsset(step.fromAsset ?? '')} from ${step.protocol}`);\n } else if (step.action === 'swap') {\n printLine(` ${num} Swap ${displayAsset(step.fromAsset ?? '')} → ${displayAsset(step.toAsset ?? '')} (~${formatUsd(step.estimatedOutput ?? 0)})`);\n } else if (step.action === 'deposit') {\n printLine(` ${num} Deposit ${formatUsd(step.amount)} ${displayAsset(step.toAsset ?? '')} into ${step.protocol}`);\n }\n }\n printBlank();\n }\n\n if (opts.dryRun) {\n printLine(pc.bold(pc.yellow('DRY RUN — Preview only, no transactions executed')));\n printLine(pc.dim(' Run `t2000 rebalance` to execute.'));\n printBlank();\n return;\n }\n\n if (!opts.yes) {\n const proceed = await confirm('Execute this rebalance?');\n if (!proceed) {\n printInfo('Cancelled.');\n printBlank();\n return;\n }\n }\n\n const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });\n\n if (result.executed) {\n printSuccess(`Rebalanced ${formatUsd(result.amount)} → ${result.newApy.toFixed(2)}% APY`);\n for (const digest of result.txDigests) {\n printKeyValue('Tx', explorerUrl(digest));\n }\n printKeyValue('Gas', `${result.totalGasCost.toFixed(4)} SUI`);\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction displayAsset(asset: string): string {\n return SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? asset;\n}\n","import { 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","formatUsd","pc","T2000","program","T2000","T2000","program","T2000","T2000","truncateAddress","program","T2000","truncateAddress","readFile","writeFile","mkdir","resolve","homedir","T2000","resolve","homedir","readFile","mkdir","writeFile","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","pc","T2000","formatUsd","program","T2000","pc","formatUsd","T2000","program","T2000","pc","T2000","program","T2000","pc","pc","T2000","program","T2000","pc","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","formatUsd","pc","MIST_PER_SUI","program","T2000","formatUsd","pc","T2000","formatUsd","SUPPORTED_ASSETS","confirm","resolve","program","T2000","result","pc","formatUsd","SUPPORTED_ASSETS","require","program"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t2000/cli",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.1",
|
|
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,7 +37,7 @@
|
|
|
37
37
|
"commander": "^13",
|
|
38
38
|
"hono": "^4",
|
|
39
39
|
"picocolors": "^1",
|
|
40
|
-
"@t2000/sdk": "0.8.
|
|
40
|
+
"@t2000/sdk": "0.8.1",
|
|
41
41
|
"@t2000/x402": "0.3.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|