@t2000/cli 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/index.js +255 -75
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @t2000/cli
|
|
2
2
|
|
|
3
|
-
Terminal bank account for AI agents on Sui. One command to create a bank account, send USDC, earn yield, swap, borrow, and pay for APIs.
|
|
3
|
+
Terminal bank account for AI agents on Sui. One command to create a bank account, send USDC, earn yield across 4 stablecoins (USDC, USDT, USDe, USDsui), swap, borrow, auto-rebalance for optimal yield, and pay for APIs.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@t2000/cli)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
@@ -124,9 +124,10 @@ t2000 init
|
|
|
124
124
|
| `t2000 borrow <amount> [asset] [--protocol <name>]` | Borrow against savings collateral |
|
|
125
125
|
| `t2000 repay <amount> [asset] [--protocol <name>]` | Repay outstanding borrows. Use `repay all` for full repayment. |
|
|
126
126
|
| `t2000 swap <amount> <from> <to>` | Swap via Cetus DEX (e.g. `swap 5 USDC SUI`) |
|
|
127
|
+
| `t2000 rebalance [--dry-run]` | Optimize yield — move savings to best rate across protocols and stablecoins |
|
|
127
128
|
| `t2000 health` | Check savings health factor |
|
|
128
|
-
| `t2000 rates` | Best save/borrow APYs across protocols |
|
|
129
|
-
| `t2000 positions` | Open savings & borrow positions |
|
|
129
|
+
| `t2000 rates` | Best save/borrow APYs across protocols and stablecoins |
|
|
130
|
+
| `t2000 positions` | Open savings & borrow positions across all assets |
|
|
130
131
|
| `t2000 earnings` | Yield earned to date |
|
|
131
132
|
| `t2000 fund-status` | Full savings summary |
|
|
132
133
|
|
package/dist/index.js
CHANGED
|
@@ -214,7 +214,7 @@ function registerSend(program2) {
|
|
|
214
214
|
|
|
215
215
|
// src/commands/balance.ts
|
|
216
216
|
import pc3 from "picocolors";
|
|
217
|
-
import { T2000 as T20003, formatUsd as formatUsd2
|
|
217
|
+
import { T2000 as T20003, formatUsd as formatUsd2 } from "@t2000/sdk";
|
|
218
218
|
async function fetchLimits(agent) {
|
|
219
219
|
const [maxWithdraw, maxBorrow, hf] = await Promise.all([
|
|
220
220
|
agent.maxWithdraw(),
|
|
@@ -239,31 +239,21 @@ function registerBalance(program2) {
|
|
|
239
239
|
printJson(output);
|
|
240
240
|
return;
|
|
241
241
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
242
|
+
printBlank();
|
|
243
|
+
const stables = bal.stables ?? {};
|
|
244
|
+
const stableEntries = Object.entries(stables).filter(([, v]) => v > 1e-3);
|
|
245
|
+
if (stableEntries.length <= 1) {
|
|
246
|
+
printKeyValue("Available", `${formatUsd2(bal.available)} ${pc3.dim("(checking \u2014 spendable)")}`);
|
|
247
|
+
} else {
|
|
248
|
+
printKeyValue("Available", `${formatUsd2(bal.available)} ${pc3.dim("(total stablecoins)")}`);
|
|
249
|
+
for (const [symbol, amount] of stableEntries) {
|
|
250
|
+
printLine(` ${pc3.dim(symbol)} ${formatUsd2(amount)}`);
|
|
249
251
|
}
|
|
250
252
|
}
|
|
251
|
-
|
|
252
|
-
printKeyValue("Available", `${formatUsd2(bal.available)} USDC ${pc3.dim("(checking \u2014 spendable)")}`);
|
|
253
|
-
printKeyValue("Savings", `${formatUsd2(bal.savings)} USDC${apyStr}`);
|
|
253
|
+
printKeyValue("Savings", `${formatUsd2(bal.savings)}`);
|
|
254
254
|
printKeyValue("Gas", `${bal.gasReserve.sui.toFixed(2)} SUI ${pc3.dim(`(~${formatUsd2(bal.gasReserve.usdEquiv)})`)}`);
|
|
255
255
|
printSeparator();
|
|
256
|
-
printKeyValue("Total", `${formatUsd2(bal.total)}
|
|
257
|
-
if (bal.savings > 0 && apyStr) {
|
|
258
|
-
try {
|
|
259
|
-
const rates = await getRates(agent.suiClient);
|
|
260
|
-
const dailyEarning = bal.savings * rates.USDC.saveApy / 100 / 365;
|
|
261
|
-
if (dailyEarning > 1e-3) {
|
|
262
|
-
printLine(pc3.dim(`Earning ~${formatUsd2(dailyEarning)}/day`));
|
|
263
|
-
}
|
|
264
|
-
} catch {
|
|
265
|
-
}
|
|
266
|
-
}
|
|
256
|
+
printKeyValue("Total", `${formatUsd2(bal.total)}`);
|
|
267
257
|
if (limits) {
|
|
268
258
|
printBlank();
|
|
269
259
|
printHeader("Limits");
|
|
@@ -350,10 +340,34 @@ function registerHistory(program2) {
|
|
|
350
340
|
}
|
|
351
341
|
|
|
352
342
|
// src/commands/exportKey.ts
|
|
343
|
+
import { readFile as readFile2, writeFile as writeFile2, mkdir as mkdir2 } from "fs/promises";
|
|
344
|
+
import { resolve as resolve2 } from "path";
|
|
345
|
+
import { homedir as homedir2 } from "os";
|
|
353
346
|
import { T2000 as T20007 } from "@t2000/sdk";
|
|
347
|
+
var LOCKFILE = resolve2(homedir2(), ".t2000", ".pin-lock");
|
|
348
|
+
var MAX_ATTEMPTS = 5;
|
|
349
|
+
var LOCKOUT_MS = 5 * 60 * 1e3;
|
|
350
|
+
async function getLockState() {
|
|
351
|
+
try {
|
|
352
|
+
const data = JSON.parse(await readFile2(LOCKFILE, "utf-8"));
|
|
353
|
+
return data;
|
|
354
|
+
} catch {
|
|
355
|
+
return { attempts: 0, lockedUntil: 0 };
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
async function setLockState(state) {
|
|
359
|
+
await mkdir2(resolve2(homedir2(), ".t2000"), { recursive: true });
|
|
360
|
+
await writeFile2(LOCKFILE, JSON.stringify(state), { mode: 384 });
|
|
361
|
+
}
|
|
354
362
|
function registerExport(program2) {
|
|
355
363
|
program2.command("export").description("Export private key (raw Ed25519 hex)").option("--key <path>", "Key file path").option("--yes", "Skip confirmation").action(async (opts) => {
|
|
356
364
|
try {
|
|
365
|
+
const lock = await getLockState();
|
|
366
|
+
if (lock.lockedUntil > Date.now()) {
|
|
367
|
+
const remainSec = Math.ceil((lock.lockedUntil - Date.now()) / 1e3);
|
|
368
|
+
printError(`Too many failed PIN attempts. Try again in ${remainSec}s.`);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
357
371
|
if (!opts.yes && !isJsonMode()) {
|
|
358
372
|
const proceed = await askConfirm(
|
|
359
373
|
"WARNING: This will display your raw private key. Anyone with this key controls your wallet. Continue?"
|
|
@@ -361,7 +375,25 @@ function registerExport(program2) {
|
|
|
361
375
|
if (!proceed) return;
|
|
362
376
|
}
|
|
363
377
|
const pin = await resolvePin();
|
|
364
|
-
|
|
378
|
+
let agent;
|
|
379
|
+
try {
|
|
380
|
+
agent = await T20007.create({ pin, keyPath: opts.key });
|
|
381
|
+
} catch (error) {
|
|
382
|
+
const msg = error instanceof Error ? error.message : "";
|
|
383
|
+
if (msg.includes("Invalid PIN")) {
|
|
384
|
+
const newAttempts = lock.attempts + 1;
|
|
385
|
+
if (newAttempts >= MAX_ATTEMPTS) {
|
|
386
|
+
await setLockState({ attempts: newAttempts, lockedUntil: Date.now() + LOCKOUT_MS });
|
|
387
|
+
printError(`Invalid PIN. Account locked for 5 minutes (${newAttempts} failed attempts).`);
|
|
388
|
+
} else {
|
|
389
|
+
await setLockState({ attempts: newAttempts, lockedUntil: 0 });
|
|
390
|
+
printError(`Invalid PIN. ${MAX_ATTEMPTS - newAttempts} attempts remaining.`);
|
|
391
|
+
}
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
throw error;
|
|
395
|
+
}
|
|
396
|
+
await setLockState({ attempts: 0, lockedUntil: 0 });
|
|
365
397
|
const hex = agent.exportKey();
|
|
366
398
|
if (isJsonMode()) {
|
|
367
399
|
printJson({ privateKey: hex, format: "ed25519_hex" });
|
|
@@ -437,27 +469,27 @@ function registerSave(program2) {
|
|
|
437
469
|
printSuccess(`Gas manager: ${pc4.yellow(formatUsd3(gasManagerUsdc))} USDC \u2192 SUI`);
|
|
438
470
|
}
|
|
439
471
|
const protocolName = opts.protocol ?? "best rate";
|
|
440
|
-
printSuccess(`Saved ${pc4.yellow(formatUsd3(result.amount))}
|
|
472
|
+
printSuccess(`Saved ${pc4.yellow(formatUsd3(result.amount))} ${asset} to ${protocolName}`);
|
|
441
473
|
if (result.fee > 0) {
|
|
442
474
|
const feeRate = (result.fee / result.amount * 100).toFixed(1);
|
|
443
|
-
printSuccess(`Protocol fee: ${pc4.dim(`${formatUsd3(result.fee)}
|
|
475
|
+
printSuccess(`Protocol fee: ${pc4.dim(`${formatUsd3(result.fee)} ${asset} (${feeRate}%)`)}`);
|
|
444
476
|
}
|
|
445
477
|
printSuccess(`Current APY: ${pc4.green(`${result.apy.toFixed(2)}%`)}`);
|
|
446
|
-
printSuccess(`Savings balance: ${pc4.yellow(formatUsd3(result.savingsBalance))}
|
|
478
|
+
printSuccess(`Savings balance: ${pc4.yellow(formatUsd3(result.savingsBalance))} ${asset}`);
|
|
447
479
|
printKeyValue("Tx", explorerUrl(result.tx));
|
|
448
480
|
printBlank();
|
|
449
481
|
} catch (error) {
|
|
450
482
|
handleError(error);
|
|
451
483
|
}
|
|
452
484
|
};
|
|
453
|
-
program2.command("save").description("Deposit
|
|
454
|
-
program2.command("supply").description("Deposit
|
|
485
|
+
program2.command("save").description("Deposit stablecoins into savings").argument("<amount>", 'Amount to save (or "all")').argument("[asset]", "Asset symbol (default: USDC)", "USDC").option("--key <path>", "Key file path").option("--protocol <name>", "Protocol to use (e.g. navi, suilend)").action(action);
|
|
486
|
+
program2.command("supply").description("Deposit stablecoins into savings (alias for save)").argument("<amount>", 'Amount to save (or "all")').argument("[asset]", "Asset symbol (default: USDC)", "USDC").option("--key <path>", "Key file path").option("--protocol <name>", "Protocol to use (e.g. navi, suilend)").action(action);
|
|
455
487
|
}
|
|
456
488
|
|
|
457
489
|
// src/commands/withdraw.ts
|
|
458
490
|
import { T2000 as T200010 } from "@t2000/sdk";
|
|
459
491
|
function registerWithdraw(program2) {
|
|
460
|
-
program2.command("withdraw").description("Withdraw
|
|
492
|
+
program2.command("withdraw").description("Withdraw stablecoins from savings").argument("<amount>", 'Amount to withdraw (or "all")').argument("[asset]", "Asset to withdraw (USDC, USDT, USDe, USDsui)", "USDC").option("--key <path>", "Key file path").option("--protocol <name>", "Protocol to use (e.g. navi, suilend)").action(async (amountStr, assetStr, opts) => {
|
|
461
493
|
try {
|
|
462
494
|
const amount = amountStr === "all" ? "all" : parseFloat(amountStr);
|
|
463
495
|
if (amount !== "all" && (isNaN(amount) || amount <= 0)) {
|
|
@@ -472,7 +504,7 @@ function registerWithdraw(program2) {
|
|
|
472
504
|
return;
|
|
473
505
|
}
|
|
474
506
|
printBlank();
|
|
475
|
-
printSuccess(`Withdrew $${result.amount.toFixed(2)}
|
|
507
|
+
printSuccess(`Withdrew $${result.amount.toFixed(2)} ${asset}`);
|
|
476
508
|
printKeyValue("Tx", explorerUrl(result.tx));
|
|
477
509
|
printBlank();
|
|
478
510
|
} catch (error) {
|
|
@@ -484,7 +516,7 @@ function registerWithdraw(program2) {
|
|
|
484
516
|
// src/commands/borrow.ts
|
|
485
517
|
import { T2000 as T200011 } from "@t2000/sdk";
|
|
486
518
|
function registerBorrow(program2) {
|
|
487
|
-
program2.command("borrow").description("Borrow
|
|
519
|
+
program2.command("borrow").description("Borrow stablecoins against savings collateral").argument("<amount>", "Amount to borrow").argument("[asset]", "Asset to borrow (USDC, USDT, USDe, USDsui)", "USDC").option("--key <path>", "Key file path").option("--protocol <name>", "Protocol to use (e.g. navi)").action(async (amountStr, assetStr, opts) => {
|
|
488
520
|
try {
|
|
489
521
|
const amount = parseFloat(amountStr);
|
|
490
522
|
if (isNaN(amount) || amount <= 0) {
|
|
@@ -504,7 +536,7 @@ function registerBorrow(program2) {
|
|
|
504
536
|
return;
|
|
505
537
|
}
|
|
506
538
|
printBlank();
|
|
507
|
-
printSuccess(`Borrowed $${amount.toFixed(2)}
|
|
539
|
+
printSuccess(`Borrowed $${amount.toFixed(2)} ${asset}`);
|
|
508
540
|
printKeyValue("Health Factor", result.healthFactor.toFixed(2));
|
|
509
541
|
printKeyValue("Tx", explorerUrl(result.tx));
|
|
510
542
|
printBlank();
|
|
@@ -517,7 +549,7 @@ function registerBorrow(program2) {
|
|
|
517
549
|
// src/commands/repay.ts
|
|
518
550
|
import { T2000 as T200012 } from "@t2000/sdk";
|
|
519
551
|
function registerRepay(program2) {
|
|
520
|
-
program2.command("repay").description("Repay borrowed
|
|
552
|
+
program2.command("repay").description("Repay borrowed stablecoins").argument("<amount>", 'Amount to repay (or "all")').argument("[asset]", "Asset to repay (USDC, USDT, USDe, USDsui)", "USDC").option("--key <path>", "Key file path").option("--protocol <name>", "Protocol to use (e.g. navi)").action(async (amountStr, assetStr, opts) => {
|
|
521
553
|
try {
|
|
522
554
|
const amount = amountStr === "all" ? "all" : parseFloat(amountStr);
|
|
523
555
|
if (amount !== "all" && (isNaN(amount) || amount <= 0)) {
|
|
@@ -532,7 +564,7 @@ function registerRepay(program2) {
|
|
|
532
564
|
return;
|
|
533
565
|
}
|
|
534
566
|
printBlank();
|
|
535
|
-
printSuccess(`Repaid $${result.amount.toFixed(2)}
|
|
567
|
+
printSuccess(`Repaid $${result.amount.toFixed(2)} ${asset}`);
|
|
536
568
|
printKeyValue("Remaining Debt", `$${result.remainingDebt.toFixed(2)}`);
|
|
537
569
|
printKeyValue("Tx", explorerUrl(result.tx));
|
|
538
570
|
printBlank();
|
|
@@ -578,22 +610,33 @@ function registerHealth(program2) {
|
|
|
578
610
|
|
|
579
611
|
// src/commands/rates.ts
|
|
580
612
|
import pc5 from "picocolors";
|
|
581
|
-
import { T2000 as T200014 } from "@t2000/sdk";
|
|
613
|
+
import { T2000 as T200014, STABLE_ASSETS, SUPPORTED_ASSETS } from "@t2000/sdk";
|
|
582
614
|
function registerRates(program2) {
|
|
583
|
-
program2.command("rates").description("Show current APY rates across protocols").option("--key <path>", "Key file path").action(async (opts) => {
|
|
615
|
+
program2.command("rates").description("Show current APY rates across protocols and stablecoins").option("--key <path>", "Key file path").action(async (opts) => {
|
|
584
616
|
try {
|
|
585
617
|
const pin = await resolvePin();
|
|
586
618
|
const agent = await T200014.create({ pin, keyPath: opts.key });
|
|
587
|
-
const allRates = await agent.
|
|
619
|
+
const allRates = await agent.allRatesAcrossAssets();
|
|
588
620
|
if (isJsonMode()) {
|
|
589
621
|
printJson(allRates);
|
|
590
622
|
return;
|
|
591
623
|
}
|
|
592
624
|
printBlank();
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
625
|
+
if (allRates.length > 0) {
|
|
626
|
+
const best = allRates.reduce((a, b) => b.rates.saveApy > a.rates.saveApy ? b : a);
|
|
627
|
+
const bestDisplay = SUPPORTED_ASSETS[best.asset]?.displayName ?? best.asset;
|
|
628
|
+
printLine(pc5.bold(pc5.green(`Best yield: ${best.rates.saveApy.toFixed(2)}% APY`)) + pc5.dim(` (${bestDisplay} on ${best.protocol})`));
|
|
629
|
+
printBlank();
|
|
630
|
+
}
|
|
631
|
+
for (const asset of STABLE_ASSETS) {
|
|
632
|
+
const assetRates = allRates.filter((r) => r.asset === asset);
|
|
633
|
+
if (assetRates.length === 0) continue;
|
|
634
|
+
const display = SUPPORTED_ASSETS[asset]?.displayName ?? asset;
|
|
635
|
+
printLine(pc5.bold(display));
|
|
636
|
+
printDivider();
|
|
637
|
+
for (const entry of assetRates) {
|
|
638
|
+
printKeyValue(entry.protocol, `Save ${entry.rates.saveApy.toFixed(2)}% Borrow ${entry.rates.borrowApy.toFixed(2)}%`);
|
|
639
|
+
}
|
|
597
640
|
printBlank();
|
|
598
641
|
}
|
|
599
642
|
if (allRates.length === 0) {
|
|
@@ -607,9 +650,10 @@ function registerRates(program2) {
|
|
|
607
650
|
}
|
|
608
651
|
|
|
609
652
|
// src/commands/positions.ts
|
|
610
|
-
import
|
|
653
|
+
import pc6 from "picocolors";
|
|
654
|
+
import { T2000 as T200015, formatUsd as formatUsd4 } from "@t2000/sdk";
|
|
611
655
|
function registerPositions(program2) {
|
|
612
|
-
program2.command("positions").description("Show savings & borrow positions").option("--key <path>", "Key file path").action(async (opts) => {
|
|
656
|
+
program2.command("positions").description("Show savings & borrow positions across all protocols and assets").option("--key <path>", "Key file path").action(async (opts) => {
|
|
613
657
|
try {
|
|
614
658
|
const pin = await resolvePin();
|
|
615
659
|
const agent = await T200015.create({ pin, keyPath: opts.key });
|
|
@@ -622,9 +666,31 @@ function registerPositions(program2) {
|
|
|
622
666
|
if (result.positions.length === 0) {
|
|
623
667
|
printInfo("No positions. Use `t2000 save <amount>` to start earning.");
|
|
624
668
|
} else {
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
669
|
+
const saves = result.positions.filter((p) => p.type === "save");
|
|
670
|
+
const borrows = result.positions.filter((p) => p.type === "borrow");
|
|
671
|
+
if (saves.length > 0) {
|
|
672
|
+
printLine(pc6.bold("Savings"));
|
|
673
|
+
printDivider();
|
|
674
|
+
for (const pos of saves) {
|
|
675
|
+
printKeyValue(pos.protocol, `${formatUsd4(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(1)}% APY`);
|
|
676
|
+
}
|
|
677
|
+
const totalSaved = saves.reduce((s, p) => s + p.amount, 0);
|
|
678
|
+
if (saves.length > 1) {
|
|
679
|
+
printKeyValue("Total", formatUsd4(totalSaved));
|
|
680
|
+
}
|
|
681
|
+
printBlank();
|
|
682
|
+
}
|
|
683
|
+
if (borrows.length > 0) {
|
|
684
|
+
printLine(pc6.bold("Borrows"));
|
|
685
|
+
printDivider();
|
|
686
|
+
for (const pos of borrows) {
|
|
687
|
+
printKeyValue(pos.protocol, `${formatUsd4(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(1)}% APY`);
|
|
688
|
+
}
|
|
689
|
+
const totalBorrowed = borrows.reduce((s, p) => s + p.amount, 0);
|
|
690
|
+
if (borrows.length > 1) {
|
|
691
|
+
printKeyValue("Total", formatUsd4(totalBorrowed));
|
|
692
|
+
}
|
|
693
|
+
printBlank();
|
|
628
694
|
}
|
|
629
695
|
}
|
|
630
696
|
printBlank();
|
|
@@ -681,7 +747,7 @@ function registerEarnings(program2) {
|
|
|
681
747
|
return;
|
|
682
748
|
}
|
|
683
749
|
printBlank();
|
|
684
|
-
printKeyValue("Saved", `$${result.supplied.toFixed(2)}
|
|
750
|
+
printKeyValue("Saved", `$${result.supplied.toFixed(2)}`);
|
|
685
751
|
printKeyValue("APY", `${result.currentApy.toFixed(2)}%`);
|
|
686
752
|
printKeyValue("Daily Yield", `~$${result.dailyEarning.toFixed(4)}/day`);
|
|
687
753
|
printKeyValue("Est. Earned", `~$${result.totalYieldEarned.toFixed(4)}`);
|
|
@@ -708,10 +774,10 @@ function registerFundStatus(program2) {
|
|
|
708
774
|
if (result.supplied > 0) {
|
|
709
775
|
printSuccess("Savings: ACTIVE");
|
|
710
776
|
} else {
|
|
711
|
-
console.log(" Savings: INACTIVE \u2014
|
|
777
|
+
console.log(" Savings: INACTIVE \u2014 run `t2000 save <amount>` to start earning");
|
|
712
778
|
}
|
|
713
779
|
printBlank();
|
|
714
|
-
printKeyValue("Saved", `$${result.supplied.toFixed(2)}
|
|
780
|
+
printKeyValue("Saved", `$${result.supplied.toFixed(2)} @ ${result.apy.toFixed(1)}% APY`);
|
|
715
781
|
printKeyValue("Earned today", `~$${result.earnedToday.toFixed(4)}`);
|
|
716
782
|
printKeyValue("Earned all time", `~$${result.earnedAllTime.toFixed(4)}`);
|
|
717
783
|
printKeyValue("Monthly projected", `~$${result.projectedMonthly.toFixed(2)}/month`);
|
|
@@ -729,8 +795,8 @@ function registerFundStatus(program2) {
|
|
|
729
795
|
// src/commands/config.ts
|
|
730
796
|
import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
|
|
731
797
|
import { join } from "path";
|
|
732
|
-
import { homedir as
|
|
733
|
-
var CONFIG_DIR = join(
|
|
798
|
+
import { homedir as homedir3 } from "os";
|
|
799
|
+
var CONFIG_DIR = join(homedir3(), ".t2000");
|
|
734
800
|
var CONFIG_PATH = join(CONFIG_DIR, "config.json");
|
|
735
801
|
function loadConfig() {
|
|
736
802
|
try {
|
|
@@ -798,10 +864,10 @@ import { cors } from "hono/cors";
|
|
|
798
864
|
import { randomBytes } from "crypto";
|
|
799
865
|
import { readFileSync as readFileSync2, writeFileSync as writeFileSync2, mkdirSync as mkdirSync2, existsSync as existsSync2 } from "fs";
|
|
800
866
|
import { join as join2 } from "path";
|
|
801
|
-
import { homedir as
|
|
867
|
+
import { homedir as homedir4 } from "os";
|
|
802
868
|
import { T2000 as T200019 } from "@t2000/sdk";
|
|
803
869
|
import { streamSSE } from "hono/streaming";
|
|
804
|
-
var CONFIG_DIR2 = join2(
|
|
870
|
+
var CONFIG_DIR2 = join2(homedir4(), ".t2000");
|
|
805
871
|
var TOKEN_PATH = join2(CONFIG_DIR2, "config.json");
|
|
806
872
|
function generateToken() {
|
|
807
873
|
return `t2k_${randomBytes(24).toString("hex")}`;
|
|
@@ -1120,7 +1186,7 @@ function isRetryable(code) {
|
|
|
1120
1186
|
}
|
|
1121
1187
|
|
|
1122
1188
|
// src/commands/pay.ts
|
|
1123
|
-
import
|
|
1189
|
+
import pc7 from "picocolors";
|
|
1124
1190
|
import { T2000 as T200020 } from "@t2000/sdk";
|
|
1125
1191
|
import { x402Client } from "@t2000/x402";
|
|
1126
1192
|
function createX402Wallet(agent) {
|
|
@@ -1165,7 +1231,7 @@ function registerPay(program2) {
|
|
|
1165
1231
|
});
|
|
1166
1232
|
const elapsed = Date.now() - startTime;
|
|
1167
1233
|
if (!isJsonMode()) {
|
|
1168
|
-
printInfo(`\u2190 ${response.status} ${response.statusText || "OK"} ${
|
|
1234
|
+
printInfo(`\u2190 ${response.status} ${response.statusText || "OK"} ${pc7.dim(`[${elapsed}ms]`)}`);
|
|
1169
1235
|
}
|
|
1170
1236
|
const contentType = response.headers.get("content-type") ?? "";
|
|
1171
1237
|
const body = contentType.includes("application/json") ? await response.json() : await response.text();
|
|
@@ -1214,7 +1280,7 @@ function registerLock(program2) {
|
|
|
1214
1280
|
|
|
1215
1281
|
// src/commands/sentinel.ts
|
|
1216
1282
|
import { T2000 as T200021, MIST_PER_SUI } from "@t2000/sdk";
|
|
1217
|
-
import
|
|
1283
|
+
import pc8 from "picocolors";
|
|
1218
1284
|
function formatSui(mist) {
|
|
1219
1285
|
return (Number(mist) / Number(MIST_PER_SUI)).toFixed(2);
|
|
1220
1286
|
}
|
|
@@ -1244,8 +1310,8 @@ function registerSentinel(program2) {
|
|
|
1244
1310
|
const pool = `${formatSui(s.prizePool)} SUI`.padEnd(12);
|
|
1245
1311
|
const fee = `${formatSui(s.attackFee)} SUI`.padEnd(12);
|
|
1246
1312
|
printLine(` ${s.name}`);
|
|
1247
|
-
printLine(` ${
|
|
1248
|
-
printLine(` ${
|
|
1313
|
+
printLine(` ${pc8.dim(`Pool: ${pool}Fee: ${fee}Attacks: ${s.totalAttacks}`)}`);
|
|
1314
|
+
printLine(` ${pc8.dim(s.objectId)}`);
|
|
1249
1315
|
printBlank();
|
|
1250
1316
|
});
|
|
1251
1317
|
printBlank();
|
|
@@ -1280,7 +1346,7 @@ function registerSentinel(program2) {
|
|
|
1280
1346
|
if (s.systemPrompt) {
|
|
1281
1347
|
printBlank();
|
|
1282
1348
|
printKeyValue("System Prompt", "");
|
|
1283
|
-
printLine(` ${
|
|
1349
|
+
printLine(` ${pc8.dim(s.systemPrompt.slice(0, 500))}`);
|
|
1284
1350
|
}
|
|
1285
1351
|
printBlank();
|
|
1286
1352
|
} catch (error) {
|
|
@@ -1306,13 +1372,13 @@ function registerSentinel(program2) {
|
|
|
1306
1372
|
return;
|
|
1307
1373
|
}
|
|
1308
1374
|
printBlank();
|
|
1309
|
-
printLine(` ${
|
|
1375
|
+
printLine(` ${pc8.dim("\u23F3")} Requesting attack...`);
|
|
1310
1376
|
const result = await agent.sentinelAttack(id, prompt, feeMist);
|
|
1311
1377
|
printBlank();
|
|
1312
1378
|
if (result.won) {
|
|
1313
1379
|
printSuccess(`BREACHED! (score: ${result.verdict.score}/100)`);
|
|
1314
1380
|
} else {
|
|
1315
|
-
printLine(` ${
|
|
1381
|
+
printLine(` ${pc8.red("\u2717")} DEFENDED (score: ${result.verdict.score}/100)`);
|
|
1316
1382
|
}
|
|
1317
1383
|
printBlank();
|
|
1318
1384
|
printKeyValue("Agent", result.verdict.agentResponse.slice(0, 200));
|
|
@@ -1332,8 +1398,8 @@ function registerSentinel(program2) {
|
|
|
1332
1398
|
}
|
|
1333
1399
|
|
|
1334
1400
|
// src/commands/earn.ts
|
|
1335
|
-
import { T2000 as T200022, MIST_PER_SUI as MIST_PER_SUI2, listSentinels, formatUsd as
|
|
1336
|
-
import
|
|
1401
|
+
import { T2000 as T200022, MIST_PER_SUI as MIST_PER_SUI2, listSentinels, formatUsd as formatUsd5 } from "@t2000/sdk";
|
|
1402
|
+
import pc9 from "picocolors";
|
|
1337
1403
|
function mistToSui(mist) {
|
|
1338
1404
|
return Number(mist) / Number(MIST_PER_SUI2);
|
|
1339
1405
|
}
|
|
@@ -1387,21 +1453,21 @@ function registerEarn(program2) {
|
|
|
1387
1453
|
return;
|
|
1388
1454
|
}
|
|
1389
1455
|
printHeader("Earning Opportunities");
|
|
1390
|
-
printLine(
|
|
1456
|
+
printLine(pc9.bold("SAVINGS") + pc9.dim(" \u2014 Passive Yield"));
|
|
1391
1457
|
printDivider();
|
|
1392
1458
|
if (savePositions.length > 0) {
|
|
1393
1459
|
for (const pos of savePositions) {
|
|
1394
1460
|
const dailyYield = pos.amount * pos.apy / 100 / 365;
|
|
1395
|
-
printKeyValue(pos.protocol, `${
|
|
1461
|
+
printKeyValue(pos.protocol, `${formatUsd5(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(1)}% APY`);
|
|
1396
1462
|
if (dailyYield > 1e-4) {
|
|
1397
|
-
const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` :
|
|
1398
|
-
const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` :
|
|
1399
|
-
printLine(
|
|
1463
|
+
const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` : formatUsd5(dailyYield);
|
|
1464
|
+
const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` : formatUsd5(dailyYield * 30);
|
|
1465
|
+
printLine(pc9.dim(` ~${dailyStr}/day \xB7 ~${monthlyStr}/month`));
|
|
1400
1466
|
}
|
|
1401
1467
|
}
|
|
1402
1468
|
if (savePositions.length > 1) {
|
|
1403
1469
|
printBlank();
|
|
1404
|
-
printKeyValue("Total Saved",
|
|
1470
|
+
printKeyValue("Total Saved", formatUsd5(totalSaved));
|
|
1405
1471
|
}
|
|
1406
1472
|
} else if (posData) {
|
|
1407
1473
|
printInfo("No savings yet \u2014 run `t2000 save <amount>` to start earning yield");
|
|
@@ -1409,7 +1475,7 @@ function registerEarn(program2) {
|
|
|
1409
1475
|
printInfo("Savings data unavailable");
|
|
1410
1476
|
}
|
|
1411
1477
|
printBlank();
|
|
1412
|
-
printLine(
|
|
1478
|
+
printLine(pc9.bold("SENTINEL BOUNTIES") + pc9.dim(" \u2014 Active Red Teaming"));
|
|
1413
1479
|
printDivider();
|
|
1414
1480
|
if (agents && agents.length > 0) {
|
|
1415
1481
|
const totalPool = agents.reduce((sum, s) => sum + mistToSui(s.prizePool), 0);
|
|
@@ -1428,24 +1494,137 @@ function registerEarn(program2) {
|
|
|
1428
1494
|
printInfo("Sentinel data unavailable");
|
|
1429
1495
|
}
|
|
1430
1496
|
printBlank();
|
|
1431
|
-
printLine(
|
|
1497
|
+
printLine(pc9.bold("Quick Actions"));
|
|
1498
|
+
printDivider();
|
|
1499
|
+
printLine(` ${pc9.dim("t2000 save <amount> [asset]")} Save stablecoins for yield`);
|
|
1500
|
+
printLine(` ${pc9.dim("t2000 sentinel list")} Browse sentinel bounties`);
|
|
1501
|
+
printLine(` ${pc9.dim("t2000 sentinel attack <id>")} Attack a sentinel`);
|
|
1502
|
+
printBlank();
|
|
1503
|
+
} catch (error) {
|
|
1504
|
+
handleError(error);
|
|
1505
|
+
}
|
|
1506
|
+
});
|
|
1507
|
+
}
|
|
1508
|
+
|
|
1509
|
+
// src/commands/rebalance.ts
|
|
1510
|
+
import pc10 from "picocolors";
|
|
1511
|
+
import readline from "readline";
|
|
1512
|
+
import { T2000 as T200023, formatUsd as formatUsd6, SUPPORTED_ASSETS as SUPPORTED_ASSETS2 } from "@t2000/sdk";
|
|
1513
|
+
async function confirm2(message) {
|
|
1514
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
1515
|
+
return new Promise((resolve3) => {
|
|
1516
|
+
rl.question(` ${message} (y/N) `, (answer) => {
|
|
1517
|
+
rl.close();
|
|
1518
|
+
resolve3(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
|
|
1519
|
+
});
|
|
1520
|
+
});
|
|
1521
|
+
}
|
|
1522
|
+
function registerRebalance(program2) {
|
|
1523
|
+
program2.command("rebalance").description("Optimize yield \u2014 move savings to the best rate across protocols and stablecoins").option("--key <path>", "Key file path").option("--dry-run", "Show what would happen without executing").option("--min-diff <pct>", "Minimum APY difference to trigger (default: 0.5)", "0.5").option("--max-break-even <days>", "Max break-even days for cross-asset moves (default: 30)", "30").option("--yes", "Skip confirmation prompt").action(async (opts) => {
|
|
1524
|
+
try {
|
|
1525
|
+
const pin = await resolvePin();
|
|
1526
|
+
const agent = await T200023.create({ pin, keyPath: opts.key });
|
|
1527
|
+
const minYieldDiff = parseFloat(opts.minDiff ?? "0.5");
|
|
1528
|
+
const maxBreakEven = parseInt(opts.maxBreakEven ?? "30", 10);
|
|
1529
|
+
const plan = await agent.rebalance({
|
|
1530
|
+
dryRun: true,
|
|
1531
|
+
minYieldDiff,
|
|
1532
|
+
maxBreakEven
|
|
1533
|
+
});
|
|
1534
|
+
if (isJsonMode()) {
|
|
1535
|
+
if (opts.dryRun) {
|
|
1536
|
+
printJson(plan);
|
|
1537
|
+
} else {
|
|
1538
|
+
const result2 = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });
|
|
1539
|
+
printJson(result2);
|
|
1540
|
+
}
|
|
1541
|
+
return;
|
|
1542
|
+
}
|
|
1543
|
+
printBlank();
|
|
1544
|
+
if (plan.steps.length === 0) {
|
|
1545
|
+
const diff = plan.newApy - plan.currentApy;
|
|
1546
|
+
if (diff < minYieldDiff) {
|
|
1547
|
+
printInfo(`Already optimized \u2014 ${plan.currentApy.toFixed(2)}% APY on ${plan.fromProtocol}`);
|
|
1548
|
+
printLine(pc10.dim(` Best available: ${plan.newApy.toFixed(2)}% (${displayAsset(plan.toAsset)} on ${plan.toProtocol})`));
|
|
1549
|
+
printLine(pc10.dim(` Difference: ${diff.toFixed(2)}% (below ${minYieldDiff}% threshold)`));
|
|
1550
|
+
} else if (plan.breakEvenDays > maxBreakEven && plan.estimatedSwapCost > 0) {
|
|
1551
|
+
printInfo(`Skipped \u2014 break-even of ${plan.breakEvenDays} days exceeds ${maxBreakEven}-day limit`);
|
|
1552
|
+
printLine(pc10.dim(` ${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}%) \u2192 ${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}%)`));
|
|
1553
|
+
} else {
|
|
1554
|
+
printInfo("Already at the best rate. Nothing to rebalance.");
|
|
1555
|
+
}
|
|
1556
|
+
printBlank();
|
|
1557
|
+
return;
|
|
1558
|
+
}
|
|
1559
|
+
printLine(pc10.bold("Rebalance Plan"));
|
|
1432
1560
|
printDivider();
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1561
|
+
printKeyValue("From", `${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}% APY)`);
|
|
1562
|
+
printKeyValue("To", `${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}% APY)`);
|
|
1563
|
+
printKeyValue("Amount", formatUsd6(plan.amount));
|
|
1564
|
+
printBlank();
|
|
1565
|
+
printLine(pc10.bold("Economics"));
|
|
1566
|
+
printDivider();
|
|
1567
|
+
printKeyValue("APY Gain", `+${(plan.newApy - plan.currentApy).toFixed(2)}%`);
|
|
1568
|
+
printKeyValue("Annual Gain", `${formatUsd6(plan.annualGain)}/year`);
|
|
1569
|
+
if (plan.estimatedSwapCost > 0) {
|
|
1570
|
+
printKeyValue("Swap Cost", `~${formatUsd6(plan.estimatedSwapCost)}`);
|
|
1571
|
+
printKeyValue("Break-even", `${plan.breakEvenDays} days`);
|
|
1572
|
+
}
|
|
1573
|
+
printBlank();
|
|
1574
|
+
if (plan.steps.length > 0) {
|
|
1575
|
+
printLine(pc10.bold("Steps"));
|
|
1576
|
+
printDivider();
|
|
1577
|
+
for (let i = 0; i < plan.steps.length; i++) {
|
|
1578
|
+
const step = plan.steps[i];
|
|
1579
|
+
const num = `${i + 1}.`;
|
|
1580
|
+
if (step.action === "withdraw") {
|
|
1581
|
+
printLine(` ${num} Withdraw ${formatUsd6(step.amount)} ${displayAsset(step.fromAsset ?? "")} from ${step.protocol}`);
|
|
1582
|
+
} else if (step.action === "swap") {
|
|
1583
|
+
printLine(` ${num} Swap ${displayAsset(step.fromAsset ?? "")} \u2192 ${displayAsset(step.toAsset ?? "")} (~${formatUsd6(step.estimatedOutput ?? 0)})`);
|
|
1584
|
+
} else if (step.action === "deposit") {
|
|
1585
|
+
printLine(` ${num} Deposit ${formatUsd6(step.amount)} ${displayAsset(step.toAsset ?? "")} into ${step.protocol}`);
|
|
1586
|
+
}
|
|
1587
|
+
}
|
|
1588
|
+
printBlank();
|
|
1589
|
+
}
|
|
1590
|
+
if (opts.dryRun) {
|
|
1591
|
+
printLine(pc10.bold(pc10.yellow("DRY RUN \u2014 Preview only, no transactions executed")));
|
|
1592
|
+
printLine(pc10.dim(" Run `t2000 rebalance` to execute."));
|
|
1593
|
+
printBlank();
|
|
1594
|
+
return;
|
|
1595
|
+
}
|
|
1596
|
+
if (!opts.yes) {
|
|
1597
|
+
const proceed = await confirm2("Execute this rebalance?");
|
|
1598
|
+
if (!proceed) {
|
|
1599
|
+
printInfo("Cancelled.");
|
|
1600
|
+
printBlank();
|
|
1601
|
+
return;
|
|
1602
|
+
}
|
|
1603
|
+
}
|
|
1604
|
+
const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });
|
|
1605
|
+
if (result.executed) {
|
|
1606
|
+
printSuccess(`Rebalanced ${formatUsd6(result.amount)} \u2192 ${result.newApy.toFixed(2)}% APY`);
|
|
1607
|
+
for (const digest of result.txDigests) {
|
|
1608
|
+
printKeyValue("Tx", explorerUrl(digest));
|
|
1609
|
+
}
|
|
1610
|
+
printKeyValue("Gas", `${result.totalGasCost.toFixed(4)} SUI`);
|
|
1611
|
+
}
|
|
1436
1612
|
printBlank();
|
|
1437
1613
|
} catch (error) {
|
|
1438
1614
|
handleError(error);
|
|
1439
1615
|
}
|
|
1440
1616
|
});
|
|
1441
1617
|
}
|
|
1618
|
+
function displayAsset(asset) {
|
|
1619
|
+
return SUPPORTED_ASSETS2[asset]?.displayName ?? asset;
|
|
1620
|
+
}
|
|
1442
1621
|
|
|
1443
1622
|
// src/program.ts
|
|
1444
1623
|
var require2 = createRequire(import.meta.url);
|
|
1445
1624
|
var { version: CLI_VERSION } = require2("../package.json");
|
|
1446
1625
|
function createProgram() {
|
|
1447
1626
|
const program2 = new Command();
|
|
1448
|
-
program2.name("t2000").description("The first bank account for AI agents").version(CLI_VERSION).option("--json", "Output in JSON format").hook("preAction", (thisCommand) => {
|
|
1627
|
+
program2.name("t2000").description("The first bank account for AI agents").version(`${CLI_VERSION} (beta)`).option("--json", "Output in JSON format").hook("preAction", (thisCommand) => {
|
|
1449
1628
|
const opts = thisCommand.optsWithGlobals();
|
|
1450
1629
|
if (opts.json) setJsonMode(true);
|
|
1451
1630
|
});
|
|
@@ -1473,6 +1652,7 @@ function createProgram() {
|
|
|
1473
1652
|
registerLock(program2);
|
|
1474
1653
|
registerSentinel(program2);
|
|
1475
1654
|
registerEarn(program2);
|
|
1655
|
+
registerRebalance(program2);
|
|
1476
1656
|
return program2;
|
|
1477
1657
|
}
|
|
1478
1658
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/program.ts","../src/output.ts","../src/commands/init.ts","../src/prompts.ts","../src/commands/send.ts","../src/commands/balance.ts","../src/commands/address.ts","../src/commands/deposit.ts","../src/commands/history.ts","../src/commands/exportKey.ts","../src/commands/importKey.ts","../src/commands/save.ts","../src/commands/withdraw.ts","../src/commands/borrow.ts","../src/commands/repay.ts","../src/commands/health.ts","../src/commands/rates.ts","../src/commands/positions.ts","../src/commands/swap.ts","../src/commands/earnings.ts","../src/commands/fundStatus.ts","../src/commands/config.ts","../src/commands/serve.ts","../src/commands/pay.ts","../src/commands/lock.ts","../src/commands/sentinel.ts","../src/commands/earn.ts","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { 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';\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)\n .option('--json', 'Output in JSON format')\n .hook('preAction', (thisCommand) => {\n const opts = thisCommand.optsWithGlobals();\n if (opts.json) setJsonMode(true);\n });\n\n registerInit(program);\n registerSend(program);\n registerBalance(program);\n registerAddress(program);\n registerDeposit(program);\n registerHistory(program);\n registerExport(program);\n registerImport(program);\n registerSave(program);\n registerWithdraw(program);\n registerBorrow(program);\n registerRepay(program);\n registerHealth(program);\n registerRates(program);\n registerPositions(program);\n registerSwap(program);\n registerEarnings(program);\n registerFundStatus(program);\n registerConfig(program);\n registerServe(program);\n registerPay(program);\n registerLock(program);\n registerSentinel(program);\n registerEarn(program);\n\n return program;\n}\n","import pc from 'picocolors';\n\nlet jsonMode = false;\n\nexport function setJsonMode(enabled: boolean) {\n jsonMode = enabled;\n}\n\nexport function isJsonMode(): boolean {\n return jsonMode;\n}\n\nexport function printJson(data: unknown) {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function printSuccess(message: string) {\n if (jsonMode) return;\n console.log(` ${pc.green('✓')} ${message}`);\n}\n\nexport function printError(message: string) {\n if (jsonMode) return;\n console.error(` ${pc.red('✗')} ${message}`);\n}\n\nexport function printWarning(message: string) {\n if (jsonMode) return;\n console.log(` ${pc.yellow('⚠')} ${message}`);\n}\n\nexport function printInfo(message: string) {\n if (jsonMode) return;\n console.log(` ${pc.dim(message)}`);\n}\n\nexport function printHeader(title: string) {\n if (jsonMode) return;\n console.log();\n console.log(` ${pc.bold(title)}`);\n console.log();\n}\n\nexport function printKeyValue(key: string, value: string, indent = 2) {\n if (jsonMode) return;\n const pad = ' '.repeat(indent);\n console.log(`${pad}${pc.dim(key + ':')} ${value}`);\n}\n\nexport function printBlank() {\n if (jsonMode) return;\n console.log();\n}\n\nexport function printDivider(width = 53) {\n if (jsonMode) return;\n console.log(` ${pc.dim('─'.repeat(width))}`);\n}\n\nexport function printLine(text: string) {\n if (jsonMode) return;\n console.log(` ${text}`);\n}\n\nexport function printSuccessKV(key: string, value: string, keyWidth = 20) {\n if (jsonMode) return;\n const paddedKey = key.padEnd(keyWidth);\n console.log(` ${pc.green('✓')} ${paddedKey}${pc.dim(value)}`);\n}\n\nexport function printSeparator() {\n if (jsonMode) return;\n console.log(` ${pc.dim('──────────────────────────────────────')}`);\n}\n\nexport function explorerUrl(txHash: string, network = 'mainnet'): string {\n const base = network === 'testnet'\n ? 'https://suiscan.xyz/testnet/tx'\n : 'https://suiscan.xyz/mainnet/tx';\n const suffix = '';\n return `${base}/${txHash}${suffix}`;\n}\n\nexport function handleError(error: unknown) {\n if (jsonMode) {\n const data = error instanceof Error && 'toJSON' in error\n ? (error as { toJSON(): unknown }).toJSON()\n : { error: 'UNKNOWN', message: String(error) };\n printJson(data);\n } else {\n const msg = error instanceof Error ? error.message : String(error);\n printError(msg);\n }\n process.exit(1);\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin, saveSession } from '../prompts.js';\nimport {\n printSuccess, printBlank, printInfo, printKeyValue,\n printJson, printLine, printDivider, isJsonMode, handleError,\n} from '../output.js';\n\nexport function registerInit(program: Command) {\n program\n .command('init')\n .description('Create a new agent bank account')\n .option('--name <name>', 'Agent name')\n .option('--key <path>', 'Key file path')\n .option('--no-sponsor', 'Skip gas sponsorship')\n .action(async (opts) => {\n try {\n const pin = await resolvePin({ confirm: true });\n\n if (!isJsonMode()) {\n printBlank();\n printInfo('Creating agent wallet...');\n }\n\n const { agent, address, sponsored } = await T2000.init({\n pin,\n keyPath: opts.key,\n name: opts.name,\n sponsored: opts.sponsor,\n });\n\n if (isJsonMode()) {\n printJson({ address, sponsored });\n return;\n }\n\n printSuccess('Keypair generated');\n printSuccess(`Network ${pc.dim('Sui mainnet')}`);\n printSuccess(`Gas sponsorship ${pc.dim(sponsored ? 'enabled' : 'disabled')}`);\n\n printBlank();\n printInfo('Setting up accounts...');\n\n printLine(\n `${pc.green('✓')} Checking ` +\n `${pc.green('✓')} Savings ` +\n `${pc.green('✓')} Credit ` +\n `${pc.green('✓')} Exchange ` +\n `${pc.green('✓')} 402 Pay`\n );\n\n printBlank();\n printLine(`🎉 ${pc.green('Bank account created')}`);\n printKeyValue('Address', pc.yellow(address));\n\n printBlank();\n printLine(`Deposit USDC on Sui network only.`);\n printDivider();\n printBlank();\n printLine(`${pc.cyan('t2000 balance')} check for funds`);\n printLine(`${pc.cyan('t2000 save all')} start earning yield`);\n printLine(`${pc.cyan('t2000 address')} show address again`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import { password, confirm } from '@inquirer/prompts';\nimport { readFile, writeFile, unlink, mkdir } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst SESSION_PATH = resolve(homedir(), '.t2000', '.session');\nconst MIN_PIN_LENGTH = 4;\n\nexport async function askPin(message = 'Enter PIN:'): Promise<string> {\n const value = await password({ message });\n if (!value || value.length < MIN_PIN_LENGTH) {\n throw new Error(`PIN must be at least ${MIN_PIN_LENGTH} characters`);\n }\n return value;\n}\n\nexport async function askPinConfirm(): Promise<string> {\n const pin = await password({ message: `Create PIN (min ${MIN_PIN_LENGTH} chars):` });\n if (!pin || pin.length < MIN_PIN_LENGTH) {\n throw new Error(`PIN must be at least ${MIN_PIN_LENGTH} characters`);\n }\n\n const confirm_ = await password({ message: 'Confirm PIN:' });\n if (pin !== confirm_) {\n throw new Error('PINs do not match');\n }\n\n return pin;\n}\n\nexport async function askConfirm(message: string): Promise<boolean> {\n return confirm({ message });\n}\n\nexport function getPinFromEnv(): string | undefined {\n return process.env.T2000_PIN ?? process.env.T2000_PASSPHRASE;\n}\n\nasync function readSession(): Promise<string | undefined> {\n try {\n const content = await readFile(SESSION_PATH, 'utf-8');\n return content.trim() || undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function saveSession(pin: string): Promise<void> {\n await mkdir(resolve(homedir(), '.t2000'), { recursive: true });\n await writeFile(SESSION_PATH, pin, { mode: 0o600 });\n}\n\nexport async function clearSession(): Promise<void> {\n try {\n await unlink(SESSION_PATH);\n } catch {\n // already gone\n }\n}\n\nexport async function resolvePin(opts?: { confirm?: boolean }): Promise<string> {\n const envPin = getPinFromEnv();\n if (envPin) return envPin;\n\n const sessionPin = await readSession();\n if (sessionPin) return sessionPin;\n\n const pin = opts?.confirm ? await askPinConfirm() : await askPin();\n await saveSession(pin);\n return pin;\n}\n\n/** @deprecated Use resolvePin() */\nexport const askPassphrase = askPin;\n/** @deprecated Use resolvePin() */\nexport const askPassphraseConfirm = askPinConfirm;\n/** @deprecated Use getPinFromEnv() */\nexport const getPassphraseFromEnv = getPinFromEnv;\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\nimport { truncateAddress, formatUsd } from '@t2000/sdk';\n\nexport function registerSend(program: Command) {\n program\n .command('send <amount> <asset> [to_keyword] <address>')\n .description('Send USDC (or other asset) to an address')\n .option('--key <path>', 'Key file path')\n .action(async (amount: string, asset: string, toOrAddress: string, address: string | undefined, opts: { key?: string }) => {\n try {\n const recipient = address ?? toOrAddress;\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.send({\n to: recipient,\n amount: parseFloat(amount),\n asset: asset.toUpperCase(),\n });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Sent ${formatUsd(result.amount)} ${asset.toUpperCase()} → ${truncateAddress(result.to)}`);\n printKeyValue('Gas', `${result.gasCost.toFixed(4)} ${result.gasCostUnit} (${result.gasMethod})`);\n printKeyValue('Balance', formatUsd(result.balance.available) + ' USDC');\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd, getRates } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printHeader, printSeparator, printLine } from '../output.js';\n\ninterface LimitsData {\n maxWithdraw: string;\n maxBorrow: string;\n healthFactor: number | null;\n}\n\nasync function fetchLimits(agent: T2000): Promise<LimitsData> {\n const [maxWithdraw, maxBorrow, hf] = await Promise.all([\n agent.maxWithdraw(),\n agent.maxBorrow(),\n agent.healthFactor(),\n ]);\n\n return {\n maxWithdraw: maxWithdraw.maxAmount.toFixed(2),\n maxBorrow: maxBorrow.maxAmount.toFixed(2),\n healthFactor: hf.borrowed > 0 ? hf.healthFactor : null,\n };\n}\n\nexport function registerBalance(program: Command) {\n program\n .command('balance')\n .description('Show wallet balance')\n .option('--key <path>', 'Key file path')\n .option('--show-limits', 'Include maxWithdraw, maxBorrow, and health factor')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const bal = await agent.balance();\n\n const limits = opts.showLimits ? await fetchLimits(agent) : undefined;\n\n if (isJsonMode()) {\n const output = limits\n ? { ...bal, limits }\n : bal;\n printJson(output);\n return;\n }\n\n let apyStr = '';\n if (bal.savings > 0) {\n try {\n const rates = await getRates(agent.suiClient);\n const apy = rates.USDC.saveApy;\n apyStr = ` ${pc.dim(`(earning ${apy.toFixed(2)}% APY)`)}`;\n } catch { /* rates unavailable */ }\n }\n\n printBlank();\n printKeyValue('Available', `${formatUsd(bal.available)} USDC ${pc.dim('(checking — spendable)')}`);\n printKeyValue('Savings', `${formatUsd(bal.savings)} USDC${apyStr}`);\n printKeyValue('Gas', `${bal.gasReserve.sui.toFixed(2)} SUI ${pc.dim(`(~${formatUsd(bal.gasReserve.usdEquiv)})`)}`);\n printSeparator();\n printKeyValue('Total', `${formatUsd(bal.total)} USDC`);\n\n if (bal.savings > 0 && apyStr) {\n try {\n const rates = await getRates(agent.suiClient);\n const dailyEarning = (bal.savings * rates.USDC.saveApy / 100) / 365;\n if (dailyEarning > 0.001) {\n printLine(pc.dim(`Earning ~${formatUsd(dailyEarning)}/day`));\n }\n } catch { /* skip daily earning */ }\n }\n\n if (limits) {\n printBlank();\n printHeader('Limits');\n printKeyValue('Max withdraw', `${formatUsd(Number(limits.maxWithdraw))} USDC`, 4);\n printKeyValue('Max borrow', `${formatUsd(Number(limits.maxBorrow))} USDC`, 4);\n const hfDisplay = limits.healthFactor !== null\n ? limits.healthFactor.toFixed(2)\n : `${pc.green('∞')} ${pc.dim('(no active loan)')}`;\n printKeyValue('Health factor', hfDisplay, 4);\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerAddress(program: Command) {\n program\n .command('address')\n .description('Show wallet address')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n if (isJsonMode()) {\n printJson({ address: agent.address() });\n return;\n }\n\n printBlank();\n printKeyValue('Address', agent.address());\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printHeader, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerDeposit(program: Command) {\n program\n .command('deposit')\n .description('Show funding instructions')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const info = await agent.deposit();\n\n if (isJsonMode()) {\n printJson(info);\n return;\n }\n\n printHeader('Fund your wallet');\n console.log(info.instructions);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, truncateAddress } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printHeader, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerHistory(program: Command) {\n program\n .command('history')\n .description('Show transaction history')\n .option('--limit <n>', 'Number of transactions', '20')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const txns = await agent.history({ limit: parseInt(opts.limit, 10) });\n\n if (isJsonMode()) {\n printJson(txns);\n return;\n }\n\n printHeader('Transaction History');\n\n if (txns.length === 0) {\n console.log(' No transactions yet.');\n } else {\n for (const tx of txns) {\n const time = tx.timestamp ? new Date(tx.timestamp).toLocaleString() : 'unknown';\n const gas = tx.gasMethod ? ` (${tx.gasMethod})` : '';\n console.log(` ${truncateAddress(tx.digest)} ${tx.action}${gas} ${time}`);\n }\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin, askConfirm } from '../prompts.js';\nimport { printSuccess, printBlank, printInfo, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerExport(program: Command) {\n program\n .command('export')\n .description('Export private key (raw Ed25519 hex)')\n .option('--key <path>', 'Key file path')\n .option('--yes', 'Skip confirmation')\n .action(async (opts) => {\n try {\n if (!opts.yes && !isJsonMode()) {\n const proceed = await askConfirm(\n 'WARNING: This will display your raw private key. Anyone with this key controls your wallet. Continue?',\n );\n if (!proceed) return;\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const hex = agent.exportKey();\n\n if (isJsonMode()) {\n printJson({ privateKey: hex, format: 'ed25519_hex' });\n return;\n }\n\n printBlank();\n printSuccess('Private key (Ed25519, hex):');\n console.log(` ${hex}`);\n printBlank();\n printInfo('Not a BIP39 mnemonic. Store securely and never share.');\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, keypairFromPrivateKey, saveKey } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\nimport { password } from '@inquirer/prompts';\n\nexport function registerImport(program: Command) {\n program\n .command('import')\n .description('Import a wallet from private key')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n let privateKey: string;\n if (process.env.T2000_PRIVATE_KEY) {\n privateKey = process.env.T2000_PRIVATE_KEY;\n } else {\n privateKey = await password({ message: 'Enter private key (hex):' });\n }\n\n if (!privateKey) throw new Error('Private key is required');\n\n const pin = await resolvePin({ confirm: true });\n\n const keypair = keypairFromPrivateKey(privateKey);\n const address = keypair.getPublicKey().toSuiAddress();\n await saveKey(keypair, pin, opts.key);\n\n if (isJsonMode()) {\n printJson({ address, imported: true });\n return;\n }\n\n printBlank();\n printSuccess('Wallet imported (encrypted)');\n printKeyValue('Address', address);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerSave(program: Command) {\n const action = async (amountStr: string, assetStr: string | undefined, opts: { key?: string; protocol?: string }) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n let gasManagerUsdc = 0;\n agent.on('gasAutoTopUp', (data) => {\n gasManagerUsdc = data.usdcSpent;\n });\n\n const asset = assetStr ?? 'USDC';\n const result = await agent.save({ amount, asset, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n\n if (gasManagerUsdc > 0) {\n printSuccess(`Gas manager: ${pc.yellow(formatUsd(gasManagerUsdc))} USDC → SUI`);\n }\n\n const protocolName = opts.protocol ?? 'best rate';\n printSuccess(`Saved ${pc.yellow(formatUsd(result.amount))} USDC to ${protocolName}`);\n\n if (result.fee > 0) {\n const feeRate = (result.fee / result.amount * 100).toFixed(1);\n printSuccess(`Protocol fee: ${pc.dim(`${formatUsd(result.fee)} USDC (${feeRate}%)`)}`);\n }\n\n printSuccess(`Current APY: ${pc.green(`${result.apy.toFixed(2)}%`)}`);\n\n printSuccess(`Savings balance: ${pc.yellow(formatUsd(result.savingsBalance))} USDC`);\n\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n };\n\n program\n .command('save')\n .description('Deposit USDC into savings')\n .argument('<amount>', 'Amount in USDC to save (or \"all\")')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(action);\n\n program\n .command('supply')\n .description('Deposit USDC into savings (alias for save)')\n .argument('<amount>', 'Amount in USDC to save (or \"all\")')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(action);\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printWarning, explorerUrl } from '../output.js';\n\nexport function registerWithdraw(program: Command) {\n program\n .command('withdraw')\n .description('Withdraw USDC from savings')\n .argument('<amount>', 'Amount in USDC to withdraw (or \"all\")')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(async (amountStr, assetStr, opts) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const asset = assetStr ?? 'USDC';\n const result = await agent.withdraw({ amount, asset, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Withdrew $${result.amount.toFixed(2)} USDC`);\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printWarning, explorerUrl } from '../output.js';\n\nexport function registerBorrow(program: Command) {\n program\n .command('borrow')\n .description('Borrow USDC against savings collateral')\n .argument('<amount>', 'Amount in USDC to borrow')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, assetStr, opts) => {\n try {\n const amount = parseFloat(amountStr);\n if (isNaN(amount) || amount <= 0) {\n throw new Error('Amount must be a positive number');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const maxResult = await agent.maxBorrow();\n if (amount > maxResult.maxAmount) {\n printWarning(`Max safe borrow: $${maxResult.maxAmount.toFixed(2)} (HF ${maxResult.currentHF.toFixed(2)} → min 1.5)`);\n return;\n }\n\n const asset = assetStr ?? 'USDC';\n const result = await agent.borrow({ amount, asset, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Borrowed $${amount.toFixed(2)} USDC`);\n printKeyValue('Health Factor', result.healthFactor.toFixed(2));\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerRepay(program: Command) {\n program\n .command('repay')\n .description('Repay borrowed USDC')\n .argument('<amount>', 'Amount in USDC to repay (or \"all\")')\n .argument('[asset]', 'Asset symbol (default: USDC)', 'USDC')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, assetStr, opts) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const asset = assetStr ?? 'USDC';\n const result = await agent.repay({ amount, asset, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Repaid $${result.amount.toFixed(2)} USDC`);\n printKeyValue('Remaining Debt', `$${result.remainingDebt.toFixed(2)}`);\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printSuccess, printWarning, printError } from '../output.js';\n\nexport function registerHealth(program: Command) {\n program\n .command('health')\n .description('Check savings health factor')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const hf = await agent.healthFactor();\n\n if (isJsonMode()) {\n printJson(hf);\n return;\n }\n\n printBlank();\n\n const hfStr = hf.healthFactor === Infinity ? '∞' : hf.healthFactor.toFixed(2);\n if (hf.healthFactor >= 2.0) {\n printSuccess(`Health Factor: ${hfStr} (healthy)`);\n } else if (hf.healthFactor >= 1.5) {\n printWarning(`Health Factor: ${hfStr} (moderate)`);\n } else if (hf.healthFactor >= 1.2) {\n printWarning(`Health Factor: ${hfStr} (low)`);\n } else {\n printError(`Health Factor: ${hfStr} (CRITICAL)`);\n }\n\n printBlank();\n printKeyValue('Supplied', `$${hf.supplied.toFixed(2)} USDC`);\n printKeyValue('Borrowed', `$${hf.borrowed.toFixed(2)} USDC`);\n printKeyValue('Max Borrow', `$${hf.maxBorrow.toFixed(2)} USDC`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo } from '../output.js';\n\nexport function registerRates(program: Command) {\n program\n .command('rates')\n .description('Show current APY rates across protocols')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const allRates = await agent.allRates('USDC');\n\n if (isJsonMode()) {\n printJson(allRates);\n return;\n }\n\n printBlank();\n for (const entry of allRates) {\n printInfo(`USDC Rates ${pc.dim(`(${entry.protocol})`)}`);\n printKeyValue('Save APY', `${entry.rates.saveApy.toFixed(2)}%`);\n printKeyValue('Borrow APY', `${entry.rates.borrowApy.toFixed(2)}%`);\n printBlank();\n }\n if (allRates.length === 0) {\n printInfo('No protocol rates available');\n printBlank();\n }\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo } from '../output.js';\n\nexport function registerPositions(program: Command) {\n program\n .command('positions')\n .description('Show savings & borrow positions')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.positions();\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n if (result.positions.length === 0) {\n printInfo('No positions. Use `t2000 save <amount>` to start earning.');\n } else {\n for (const pos of result.positions) {\n const label = pos.type === 'save' ? '📈 Saving' : '📉 Borrowing';\n printKeyValue(label, `$${pos.amount.toFixed(2)} ${pos.asset} (${pos.protocol})`);\n }\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printWarning, explorerUrl } from '../output.js';\n\nexport function registerSwap(program: Command) {\n program\n .command('swap')\n .description('Swap between assets (e.g. swap 10 USDC SUI)')\n .argument('<amount>', 'Amount to swap')\n .argument('<from>', 'Asset to swap from (USDC or SUI)')\n .argument('<to>', 'Asset to swap to (USDC or SUI)')\n .option('--slippage <percent>', 'Max slippage percentage', '3')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. cetus)')\n .action(async (amountStr: string, from: string, to: string, opts: { slippage?: string; key?: string; protocol?: string }) => {\n try {\n const amount = parseFloat(amountStr);\n if (isNaN(amount) || amount <= 0) {\n throw new Error('Amount must be a positive number');\n }\n\n const maxSlippage = parseFloat(opts.slippage ?? '3') / 100;\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n // Show quote before confirming\n const quote = await agent.swapQuote({ from, to, amount });\n\n const result = await agent.swap({ from, to, amount, maxSlippage, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Swapped ${result.fromAmount} ${result.fromAsset} → ${result.toAmount.toFixed(4)} ${result.toAsset}`);\n if (result.priceImpact > 0.001) {\n printWarning(`Price impact: ${(result.priceImpact * 100).toFixed(2)}%`);\n }\n if (result.fee > 0) {\n printKeyValue('Fee', `$${result.fee.toFixed(4)}`);\n }\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerEarnings(program: Command) {\n program\n .command('earnings')\n .description('Show yield earned to date')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.earnings();\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printKeyValue('Saved', `$${result.supplied.toFixed(2)} USDC`);\n printKeyValue('APY', `${result.currentApy.toFixed(2)}%`);\n printKeyValue('Daily Yield', `~$${result.dailyEarning.toFixed(4)}/day`);\n printKeyValue('Est. Earned', `~$${result.totalYieldEarned.toFixed(4)}`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerFundStatus(program: Command) {\n program\n .command('fund-status')\n .description('Full savings summary')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.fundStatus();\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n if (result.supplied > 0) {\n printSuccess('Savings: ACTIVE');\n } else {\n console.log(' Savings: INACTIVE — deposit USDC and run `t2000 save`');\n }\n printBlank();\n printKeyValue('Saved', `$${result.supplied.toFixed(2)} USDC @ ${result.apy.toFixed(1)}% APY`);\n printKeyValue('Earned today', `~$${result.earnedToday.toFixed(4)}`);\n printKeyValue('Earned all time', `~$${result.earnedAllTime.toFixed(4)}`);\n printKeyValue('Monthly projected', `~$${result.projectedMonthly.toFixed(2)}/month`);\n printBlank();\n if (result.supplied > 0) {\n console.log(' Withdraw anytime: t2000 withdraw <amount>');\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.json');\n\nfunction loadConfig(): Record<string, unknown> {\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nfunction saveConfig(config: Record<string, unknown>): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + '\\n');\n}\n\nexport function registerConfig(program: Command) {\n const configCmd = program\n .command('config')\n .description('Show or set configuration');\n\n configCmd\n .command('get')\n .argument('[key]', 'Config key to get (omit for all)')\n .action((key?: string) => {\n try {\n const config = loadConfig();\n\n if (isJsonMode()) {\n printJson(key ? { [key]: config[key] } : config);\n return;\n }\n\n printBlank();\n if (key) {\n printKeyValue(key, String(config[key] ?? '(not set)'));\n } else {\n if (Object.keys(config).length === 0) {\n console.log(' No configuration set.');\n } else {\n for (const [k, v] of Object.entries(config)) {\n printKeyValue(k, String(v));\n }\n }\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n configCmd\n .command('set')\n .argument('<key>', 'Config key')\n .argument('<value>', 'Config value')\n .action((key: string, value: string) => {\n try {\n const config = loadConfig();\n\n // Parse booleans and numbers\n let parsed: unknown = value;\n if (value === 'true') parsed = true;\n else if (value === 'false') parsed = false;\n else if (!isNaN(Number(value)) && value.trim() !== '') parsed = Number(value);\n\n config[key] = parsed;\n saveConfig(config);\n\n if (isJsonMode()) {\n printJson({ [key]: parsed });\n return;\n }\n\n console.log(` Set ${key} = ${String(parsed)}`);\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { randomBytes } from 'node:crypto';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { handleError } from '../output.js';\nimport { streamSSE } from 'hono/streaming';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\nconst TOKEN_PATH = join(CONFIG_DIR, 'config.json');\n\nfunction generateToken(): string {\n return `t2k_${randomBytes(24).toString('hex')}`;\n}\n\nfunction saveToken(token: string): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n let config: Record<string, unknown> = {};\n try {\n config = JSON.parse(readFileSync(TOKEN_PATH, 'utf-8'));\n } catch { /* empty */ }\n config.authToken = token;\n writeFileSync(TOKEN_PATH, JSON.stringify(config, null, 2) + '\\n');\n}\n\nfunction envelope(data: unknown) {\n return { success: true, data, timestamp: Math.floor(Date.now() / 1000) };\n}\n\nfunction errorResponse(code: string, message: string, data?: unknown, retryable = false) {\n return {\n success: false,\n error: { code, message, data, retryable },\n timestamp: Math.floor(Date.now() / 1000),\n };\n}\n\nexport function registerServe(program: Command) {\n program\n .command('serve')\n .description('Start HTTP API server')\n .option('--port <port>', 'Port number', '3001')\n .option('--rate-limit <rps>', 'Max requests per second', '10')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { port: string; rateLimit: string; key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const port = parseInt(opts.port, 10);\n const rateLimit = parseInt(opts.rateLimit, 10);\n\n const token = generateToken();\n saveToken(token);\n\n const app = buildApp(agent, token, rateLimit);\n\n serve({ fetch: app.fetch, port });\n\n console.log(` ✓ API server running on http://localhost:${port}`);\n console.log(` ✓ Auth token: ${token}`);\n console.log('');\n console.log(' Endpoints:');\n console.log(' GET /v1/balance POST /v1/send');\n console.log(' GET /v1/address POST /v1/save');\n console.log(' GET /v1/history POST /v1/withdraw');\n console.log(' GET /v1/earnings POST /v1/swap');\n console.log(' GET /v1/rates POST /v1/borrow');\n console.log(' GET /v1/health-factor POST /v1/repay');\n console.log(' GET /v1/positions');\n console.log(' GET /v1/events (SSE)');\n console.log('');\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction buildApp(agent: T2000, authToken: string, rateLimit: number): Hono {\n const app = new Hono();\n\n app.use('*', cors());\n\n // Rate limiting (sliding window)\n const requestLog: number[] = [];\n app.use('/v1/*', async (c, next) => {\n const now = Date.now();\n const windowMs = 1000;\n while (requestLog.length > 0 && requestLog[0]! < now - windowMs) {\n requestLog.shift();\n }\n if (requestLog.length >= rateLimit) {\n c.status(429);\n c.header('Retry-After', '1');\n return c.json(errorResponse('RATE_LIMITED', 'Too many requests', null, true));\n }\n requestLog.push(now);\n await next();\n });\n\n // Bearer auth\n app.use('/v1/*', async (c, next) => {\n const auth = c.req.header('Authorization');\n if (!auth || auth !== `Bearer ${authToken}`) {\n c.status(401);\n return c.json(errorResponse('UNAUTHORIZED', 'Invalid or missing Bearer token'));\n }\n await next();\n });\n\n // --- GET endpoints ---\n\n app.get('/v1/address', (c) => {\n return c.json(envelope({ address: agent.address }));\n });\n\n app.get('/v1/balance', async (c) => {\n try {\n const balance = await agent.balance();\n return c.json(envelope(balance));\n } catch (err) {\n return c.json(errorResponse('BALANCE_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/history', async (c) => {\n try {\n const limit = parseInt(c.req.query('limit') ?? '20', 10);\n const history = await agent.history({ limit });\n return c.json(envelope(history));\n } catch (err) {\n return c.json(errorResponse('HISTORY_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/deposit', (c) => {\n return c.json(envelope({\n address: agent.address,\n network: 'mainnet',\n instructions: 'Send USDC to this address on Sui mainnet.',\n }));\n });\n\n app.get('/v1/earnings', async (c) => {\n try {\n const earnings = await agent.earnings();\n return c.json(envelope(earnings));\n } catch (err) {\n return c.json(errorResponse('EARNINGS_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/rates', async (c) => {\n try {\n const rates = await agent.rates();\n return c.json(envelope(rates));\n } catch (err) {\n return c.json(errorResponse('RATES_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/health-factor', async (c) => {\n try {\n const hf = await agent.healthFactor();\n return c.json(envelope(hf));\n } catch (err) {\n return c.json(errorResponse('HEALTH_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/max-withdraw', async (c) => {\n try {\n const result = await agent.maxWithdraw();\n return c.json(envelope(result));\n } catch (err) {\n return c.json(errorResponse('MAX_WITHDRAW_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/max-borrow', async (c) => {\n try {\n const result = await agent.maxBorrow();\n return c.json(envelope(result));\n } catch (err) {\n return c.json(errorResponse('MAX_BORROW_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/positions', async (c) => {\n try {\n const positions = await agent.positions();\n return c.json(envelope(positions));\n } catch (err) {\n return c.json(errorResponse('POSITIONS_ERROR', errMsg(err)), 500);\n }\n });\n\n // --- POST endpoints ---\n\n app.post('/v1/send', async (c) => {\n try {\n const body = await c.req.json();\n const { to, amount, asset } = body as { to: string; amount: number; asset?: string };\n if (!to || !amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: to, amount'));\n }\n const result = await agent.send({ to, amount, asset: asset ?? 'USDC' });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/save', async (c) => {\n try {\n const body = await c.req.json();\n const { amount, asset } = body as { amount: number; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ amount, asset: asset ?? 'USDC' });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/supply', async (c) => {\n try {\n const body = await c.req.json();\n const { amount, asset } = body as { amount: number; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ amount, asset: asset ?? 'USDC' });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/withdraw', async (c) => {\n try {\n const body = await c.req.json();\n const { amount, asset } = body as { amount: number | 'all'; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.withdraw({ amount, asset: asset ?? 'USDC' });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/swap', async (c) => {\n try {\n const body = await c.req.json();\n const { from, to, amount, maxSlippage } = body as { from: string; to: string; amount: number; maxSlippage?: number };\n if (!from || !to || !amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: from, to, amount'));\n }\n const result = await agent.swap({ from, to, amount, maxSlippage });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/borrow', async (c) => {\n try {\n const body = await c.req.json();\n const { amount, asset } = body as { amount: number; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.borrow({ amount, asset: asset ?? 'USDC' });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/repay', async (c) => {\n try {\n const body = await c.req.json();\n const { amount, asset } = body as { amount: number | 'all'; asset?: string };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.repay({ amount, asset: asset ?? 'USDC' });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n // --- SSE endpoint ---\n\n app.get('/v1/events', async (c) => {\n const subscribeParam = c.req.query('subscribe') ?? 'yield,balanceChange,healthWarning';\n const subscriptions = new Set(subscribeParam.split(',').map((s) => s.trim()));\n\n return streamSSE(c, async (stream) => {\n const handlers: Array<{ event: string; off: () => void }> = [];\n\n for (const eventName of subscriptions) {\n const handler = (data: unknown) => {\n stream.writeSSE({ event: eventName, data: JSON.stringify(data) }).catch(() => {});\n };\n agent.on(eventName as never, handler as never);\n handlers.push({\n event: eventName,\n off: () => agent.off(eventName as never, handler as never),\n });\n }\n\n // Keep alive\n const keepAlive = setInterval(() => {\n stream.writeSSE({ event: 'ping', data: '{}' }).catch(() => {});\n }, 30_000);\n\n stream.onAbort(() => {\n clearInterval(keepAlive);\n for (const h of handlers) h.off();\n });\n\n // Block forever — SSE streams stay open\n await new Promise<void>(() => {});\n });\n });\n\n return app;\n}\n\nfunction errMsg(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nfunction handleApiError(err: unknown) {\n const t2kErr = err as { code?: string; message?: string; data?: unknown };\n return errorResponse(\n t2kErr.code ?? 'UNKNOWN',\n t2kErr.message ?? errMsg(err),\n t2kErr.data,\n isRetryable(t2kErr.code),\n );\n}\n\nfunction getStatusCode(err: unknown): number {\n const code = (err as { code?: string }).code;\n if (!code) return 500;\n if (code === 'INSUFFICIENT_BALANCE') return 400;\n if (code === 'INVALID_ADDRESS') return 400;\n if (code === 'WITHDRAW_WOULD_LIQUIDATE') return 400;\n if (code === 'NO_COLLATERAL') return 400;\n return 500;\n}\n\nfunction isRetryable(code?: string): boolean {\n if (!code) return false;\n return ['RPC_ERROR', 'RPC_UNREACHABLE', 'SPONSOR_UNAVAILABLE', 'AUTO_TOPUP_FAILED'].includes(code);\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000 } from '@t2000/sdk';\nimport { x402Client } from '@t2000/x402';\nimport type { X402Wallet } from '@t2000/x402';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printBlank,\n printJson,\n printInfo,\n isJsonMode,\n handleError,\n} from '../output.js';\n\nfunction createX402Wallet(agent: T2000): X402Wallet {\n return {\n client: agent.suiClient,\n keypair: agent.signer,\n address: () => agent.address(),\n signAndExecute: async (tx) => {\n const result = await agent.suiClient.signAndExecuteTransaction({\n signer: agent.signer,\n transaction: tx as Parameters<typeof agent.suiClient.signAndExecuteTransaction>[0]['transaction'],\n });\n return { digest: result.digest };\n },\n };\n}\n\nexport function registerPay(program: Command) {\n program\n .command('pay <url>')\n .description('Pay for an x402-protected API resource')\n .option('--key <path>', 'Key file path')\n .option('--method <method>', 'HTTP method (GET, POST, PUT)', 'GET')\n .option('--data <json>', 'Request body for POST/PUT')\n .option('--header <key=value>', 'Additional HTTP header (repeatable)', collectHeaders, {})\n .option('--max-price <amount>', 'Max USDC price to auto-approve', '1.00')\n .option('--timeout <seconds>', 'Request timeout in seconds', '30')\n .option('--dry-run', 'Show what would be paid without paying')\n .action(async (url: string, opts: {\n key?: string;\n method: string;\n data?: string;\n header: Record<string, string>;\n maxPrice: string;\n timeout: string;\n dryRun?: boolean;\n }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const wallet = createX402Wallet(agent);\n const client = new x402Client(wallet);\n\n const startTime = Date.now();\n\n if (!isJsonMode()) {\n printBlank();\n printInfo(`→ ${opts.method} ${url}`);\n }\n\n const response = await client.fetch(url, {\n method: opts.method,\n headers: opts.header,\n body: opts.data,\n maxPrice: parseFloat(opts.maxPrice),\n timeout: parseInt(opts.timeout, 10) * 1000,\n dryRun: opts.dryRun,\n onPayment: (details) => {\n if (!isJsonMode()) {\n printInfo(`← 402 Payment Required: $${details.amount} USDC (Sui)`);\n printSuccess(`Paid $${details.amount} USDC (tx: ${details.txHash.slice(0, 10)}...)`);\n }\n },\n });\n\n const elapsed = Date.now() - startTime;\n\n if (!isJsonMode()) {\n printInfo(`← ${response.status} ${response.statusText || 'OK'} ${pc.dim(`[${elapsed}ms]`)}`);\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n const body = contentType.includes('application/json')\n ? await response.json()\n : await response.text();\n\n if (isJsonMode()) {\n printJson({\n status: response.status,\n url,\n elapsed,\n body,\n });\n } else {\n printBlank();\n if (typeof body === 'string') {\n console.log(body);\n } else {\n console.log(JSON.stringify(body, null, 2));\n }\n printBlank();\n }\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction collectHeaders(value: string, previous: Record<string, string>): Record<string, string> {\n const [key, ...rest] = value.split('=');\n if (key && rest.length > 0) {\n previous[key.trim()] = rest.join('=').trim();\n }\n return previous;\n}\n","import type { Command } from 'commander';\nimport { clearSession } from '../prompts.js';\nimport { printSuccess, printBlank, handleError } from '../output.js';\n\nexport function registerLock(program: Command) {\n program\n .command('lock')\n .description('Clear saved session (require PIN on next command)')\n .action(async () => {\n try {\n await clearSession();\n printBlank();\n printSuccess('Session cleared — PIN required on next command');\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, MIST_PER_SUI } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printHeader,\n printInfo,\n printLine,\n printDivider,\n explorerUrl,\n} from '../output.js';\nimport pc from 'picocolors';\n\nfunction formatSui(mist: bigint): string {\n return (Number(mist) / Number(MIST_PER_SUI)).toFixed(2);\n}\n\nexport function registerSentinel(program: Command) {\n const sentinel = program\n .command('sentinel')\n .description('Interact with Sui Sentinel — attack AI agents, earn bounties');\n\n sentinel\n .command('list')\n .description('List active sentinels with prize pools')\n .action(async () => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin });\n const sentinels = await agent.sentinelList();\n\n if (isJsonMode()) {\n printJson(sentinels.map((s) => ({\n ...s,\n attackFee: s.attackFee.toString(),\n prizePool: s.prizePool.toString(),\n })));\n return;\n }\n\n if (sentinels.length === 0) {\n printBlank();\n printInfo('No active sentinels found.');\n printBlank();\n return;\n }\n\n printHeader('Active Sentinels');\n\n sentinels.forEach((s) => {\n const pool = `${formatSui(s.prizePool)} SUI`.padEnd(12);\n const fee = `${formatSui(s.attackFee)} SUI`.padEnd(12);\n printLine(` ${s.name}`);\n printLine(` ${pc.dim(`Pool: ${pool}Fee: ${fee}Attacks: ${s.totalAttacks}`)}`);\n printLine(` ${pc.dim(s.objectId)}`);\n printBlank();\n });\n\n printBlank();\n printInfo(`${sentinels.length} active sentinel${sentinels.length === 1 ? '' : 's'}`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n sentinel\n .command('info')\n .description('Show details for a sentinel')\n .argument('<id>', 'Sentinel object ID')\n .action(async (id: string) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin });\n const s = await agent.sentinelInfo(id);\n\n if (isJsonMode()) {\n printJson({\n ...s,\n attackFee: s.attackFee.toString(),\n prizePool: s.prizePool.toString(),\n });\n return;\n }\n\n printHeader(s.name);\n printKeyValue('Object ID', s.objectId);\n printKeyValue('Agent ID', s.id);\n printKeyValue('Model', s.model);\n printKeyValue('State', s.state);\n printKeyValue('Attack Fee', `${formatSui(s.attackFee)} SUI`);\n printKeyValue('Prize Pool', `${formatSui(s.prizePool)} SUI`);\n printKeyValue('Total Attacks', String(s.totalAttacks));\n printKeyValue('Breaches', String(s.successfulBreaches));\n if (s.systemPrompt) {\n printBlank();\n printKeyValue('System Prompt', '');\n printLine(` ${pc.dim(s.systemPrompt.slice(0, 500))}`);\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n sentinel\n .command('attack')\n .description('Attack a sentinel with a prompt (costs SUI)')\n .argument('<id>', 'Sentinel object ID')\n .argument('[prompt]', 'Attack prompt')\n .option('--fee <sui>', 'Override attack fee in SUI')\n .option('--key <path>', 'Key file path')\n .action(async (id: string, prompt: string | undefined, opts: { fee?: string; key?: string }) => {\n try {\n if (!prompt) {\n throw new Error('Prompt is required. Usage: t2000 sentinel attack <id> \"your prompt\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const feeMist = opts.fee\n ? BigInt(Math.round(parseFloat(opts.fee) * Number(MIST_PER_SUI)))\n : undefined;\n\n if (isJsonMode()) {\n const result = await agent.sentinelAttack(id, prompt, feeMist);\n printJson({\n ...result,\n verdict: {\n ...result.verdict,\n },\n });\n return;\n }\n\n printBlank();\n printLine(` ${pc.dim('⏳')} Requesting attack...`);\n\n const result = await agent.sentinelAttack(id, prompt, feeMist);\n\n printBlank();\n if (result.won) {\n printSuccess(`BREACHED! (score: ${result.verdict.score}/100)`);\n } else {\n printLine(` ${pc.red('✗')} DEFENDED (score: ${result.verdict.score}/100)`);\n }\n\n printBlank();\n printKeyValue('Agent', result.verdict.agentResponse.slice(0, 200));\n printKeyValue('Jury', result.verdict.juryResponse.slice(0, 200));\n if (result.verdict.funResponse) {\n printKeyValue('Fun', result.verdict.funResponse.slice(0, 200));\n }\n printBlank();\n printKeyValue('Fee Paid', `${result.feePaid} SUI`);\n printKeyValue('Request Tx', explorerUrl(result.requestTx));\n printKeyValue('Settle Tx', explorerUrl(result.settleTx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, MIST_PER_SUI, listSentinels, 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)} USDC`);\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>')} Save USDC for yield`);\n printLine(` ${pc.dim('t2000 sentinel list')} Browse sentinel bounties`);\n printLine(` ${pc.dim('t2000 sentinel attack <id>')} Attack a sentinel`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import { createProgram } from './program.js';\n\nconst program = createProgram();\nprogram.parse();\n"],"mappings":"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","names":["pc","program","pc","T2000","program","T2000","pc","T2000","formatUsd","program","T2000","pc","formatUsd","T2000","program","T2000","T2000","program","T2000","T2000","truncateAddress","program","T2000","truncateAddress","T2000","program","T2000","password","program","pc","T2000","formatUsd","program","T2000","pc","formatUsd","T2000","program","T2000","T2000","program","T2000","T2000","program","T2000","T2000","program","T2000","pc","T2000","program","T2000","pc","T2000","program","T2000","T2000","program","T2000","T2000","program","T2000","T2000","program","T2000","homedir","homedir","program","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","T2000","CONFIG_DIR","join","homedir","existsSync","mkdirSync","readFileSync","writeFileSync","program","T2000","pc","T2000","program","T2000","pc","program","T2000","pc","program","T2000","result","T2000","MIST_PER_SUI","formatUsd","pc","MIST_PER_SUI","program","T2000","formatUsd","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 { 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":";;;AAAA,SAAS,eAAe;AACxB,SAAS,qBAAqB;;;ACD9B,OAAO,QAAQ;AAEf,IAAI,WAAW;AAER,SAAS,YAAY,SAAkB;AAC5C,aAAW;AACb;AAEO,SAAS,aAAsB;AACpC,SAAO;AACT;AAEO,SAAS,UAAU,MAAe;AACvC,UAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C;AAEO,SAAS,aAAa,SAAiB;AAC5C,MAAI,SAAU;AACd,UAAQ,IAAI,KAAK,GAAG,MAAM,QAAG,CAAC,IAAI,OAAO,EAAE;AAC7C;AAEO,SAAS,WAAW,SAAiB;AAC1C,MAAI,SAAU;AACd,UAAQ,MAAM,KAAK,GAAG,IAAI,QAAG,CAAC,IAAI,OAAO,EAAE;AAC7C;AAEO,SAAS,aAAa,SAAiB;AAC5C,MAAI,SAAU;AACd,UAAQ,IAAI,KAAK,GAAG,OAAO,QAAG,CAAC,IAAI,OAAO,EAAE;AAC9C;AAEO,SAAS,UAAU,SAAiB;AACzC,MAAI,SAAU;AACd,UAAQ,IAAI,KAAK,GAAG,IAAI,OAAO,CAAC,EAAE;AACpC;AAEO,SAAS,YAAY,OAAe;AACzC,MAAI,SAAU;AACd,UAAQ,IAAI;AACZ,UAAQ,IAAI,KAAK,GAAG,KAAK,KAAK,CAAC,EAAE;AACjC,UAAQ,IAAI;AACd;AAEO,SAAS,cAAc,KAAa,OAAe,SAAS,GAAG;AACpE,MAAI,SAAU;AACd,QAAM,MAAM,IAAI,OAAO,MAAM;AAC7B,UAAQ,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,MAAM,GAAG,CAAC,KAAK,KAAK,EAAE;AACpD;AAEO,SAAS,aAAa;AAC3B,MAAI,SAAU;AACd,UAAQ,IAAI;AACd;AAEO,SAAS,aAAa,QAAQ,IAAI;AACvC,MAAI,SAAU;AACd,UAAQ,IAAI,KAAK,GAAG,IAAI,SAAI,OAAO,KAAK,CAAC,CAAC,EAAE;AAC9C;AAEO,SAAS,UAAU,MAAc;AACtC,MAAI,SAAU;AACd,UAAQ,IAAI,KAAK,IAAI,EAAE;AACzB;AAQO,SAAS,iBAAiB;AAC/B,MAAI,SAAU;AACd,UAAQ,IAAI,KAAK,GAAG,IAAI,sOAAwC,CAAC,EAAE;AACrE;AAEO,SAAS,YAAY,QAAgB,UAAU,WAAmB;AACvE,QAAM,OAAO,YAAY,YACrB,mCACA;AACJ,QAAM,SAAS;AACf,SAAO,GAAG,IAAI,IAAI,MAAM,GAAG,MAAM;AACnC;AAEO,SAAS,YAAY,OAAgB;AAC1C,MAAI,UAAU;AACZ,UAAM,OAAO,iBAAiB,SAAS,YAAY,QAC9C,MAAgC,OAAO,IACxC,EAAE,OAAO,WAAW,SAAS,OAAO,KAAK,EAAE;AAC/C,cAAU,IAAI;AAAA,EAChB,OAAO;AACL,UAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,eAAW,GAAG;AAAA,EAChB;AACA,UAAQ,KAAK,CAAC;AAChB;;;AC7FA,OAAOA,SAAQ;AACf,SAAS,aAAa;;;ACFtB,SAAS,UAAU,eAAe;AAClC,SAAS,UAAU,WAAW,QAAQ,aAAa;AACnD,SAAS,eAAe;AACxB,SAAS,eAAe;AAExB,IAAM,eAAe,QAAQ,QAAQ,GAAG,UAAU,UAAU;AAC5D,IAAM,iBAAiB;AAEvB,eAAsB,OAAO,UAAU,cAA+B;AACpE,QAAM,QAAQ,MAAM,SAAS,EAAE,QAAQ,CAAC;AACxC,MAAI,CAAC,SAAS,MAAM,SAAS,gBAAgB;AAC3C,UAAM,IAAI,MAAM,wBAAwB,cAAc,aAAa;AAAA,EACrE;AACA,SAAO;AACT;AAEA,eAAsB,gBAAiC;AACrD,QAAM,MAAM,MAAM,SAAS,EAAE,SAAS,mBAAmB,cAAc,WAAW,CAAC;AACnF,MAAI,CAAC,OAAO,IAAI,SAAS,gBAAgB;AACvC,UAAM,IAAI,MAAM,wBAAwB,cAAc,aAAa;AAAA,EACrE;AAEA,QAAM,WAAW,MAAM,SAAS,EAAE,SAAS,eAAe,CAAC;AAC3D,MAAI,QAAQ,UAAU;AACpB,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACrC;AAEA,SAAO;AACT;AAEA,eAAsB,WAAW,SAAmC;AAClE,SAAO,QAAQ,EAAE,QAAQ,CAAC;AAC5B;AAEO,SAAS,gBAAoC;AAClD,SAAO,QAAQ,IAAI,aAAa,QAAQ,IAAI;AAC9C;AAEA,eAAe,cAA2C;AACxD,MAAI;AACF,UAAM,UAAU,MAAM,SAAS,cAAc,OAAO;AACpD,WAAO,QAAQ,KAAK,KAAK;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,YAAY,KAA4B;AAC5D,QAAM,MAAM,QAAQ,QAAQ,GAAG,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7D,QAAM,UAAU,cAAc,KAAK,EAAE,MAAM,IAAM,CAAC;AACpD;AAEA,eAAsB,eAA8B;AAClD,MAAI;AACF,UAAM,OAAO,YAAY;AAAA,EAC3B,QAAQ;AAAA,EAER;AACF;AAEA,eAAsB,WAAW,MAA+C;AAC9E,QAAM,SAAS,cAAc;AAC7B,MAAI,OAAQ,QAAO;AAEnB,QAAM,aAAa,MAAM,YAAY;AACrC,MAAI,WAAY,QAAO;AAEvB,QAAM,MAAM,MAAM,UAAU,MAAM,cAAc,IAAI,MAAM,OAAO;AACjE,QAAM,YAAY,GAAG;AACrB,SAAO;AACT;;;AD7DO,SAAS,aAAaC,UAAkB;AAC7C,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,OAAO,iBAAiB,YAAY,EACpC,OAAO,gBAAgB,eAAe,EACtC,OAAO,gBAAgB,sBAAsB,EAC7C,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,MAAM,MAAM,WAAW,EAAE,SAAS,KAAK,CAAC;AAE9C,UAAI,CAAC,WAAW,GAAG;AACjB,mBAAW;AACX,kBAAU,0BAA0B;AAAA,MACtC;AAEA,YAAM,EAAE,OAAO,SAAS,UAAU,IAAI,MAAM,MAAM,KAAK;AAAA,QACrD;AAAA,QACA,SAAS,KAAK;AAAA,QACd,MAAM,KAAK;AAAA,QACX,WAAW,KAAK;AAAA,MAClB,CAAC;AAED,UAAI,WAAW,GAAG;AAChB,kBAAU,EAAE,SAAS,UAAU,CAAC;AAChC;AAAA,MACF;AAEA,mBAAa,mBAAmB;AAChC,mBAAa,WAAWC,IAAG,IAAI,aAAa,CAAC,EAAE;AAC/C,mBAAa,mBAAmBA,IAAG,IAAI,YAAY,YAAY,UAAU,CAAC,EAAE;AAE5E,iBAAW;AACX,gBAAU,wBAAwB;AAElC;AAAA,QACE,GAAGA,IAAG,MAAM,QAAG,CAAC,cACbA,IAAG,MAAM,QAAG,CAAC,aACbA,IAAG,MAAM,QAAG,CAAC,YACbA,IAAG,MAAM,QAAG,CAAC,cACbA,IAAG,MAAM,QAAG,CAAC;AAAA,MAClB;AAEA,iBAAW;AACX,gBAAU,aAAMA,IAAG,MAAM,sBAAsB,CAAC,EAAE;AAClD,oBAAc,WAAWA,IAAG,OAAO,OAAO,CAAC;AAE3C,iBAAW;AACX,gBAAU,mCAAmC;AAC7C,mBAAa;AACb,iBAAW;AACX,gBAAU,GAAGA,IAAG,KAAK,eAAe,CAAC,6BAA6B;AAClE,gBAAU,GAAGA,IAAG,KAAK,gBAAgB,CAAC,gCAAgC;AACtE,gBAAU,GAAGA,IAAG,KAAK,eAAe,CAAC,gCAAgC;AACrE,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;AEnEA,SAAS,SAAAC,cAAa;AAGtB,SAAS,iBAAiB,iBAAiB;AAEpC,SAAS,aAAaC,UAAkB;AAC7C,EAAAA,SACG,QAAQ,8CAA8C,EACtD,YAAY,0CAA0C,EACtD,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAO,QAAgB,OAAe,aAAqB,SAA6B,SAA2B;AACzH,QAAI;AACF,YAAM,YAAY,WAAW;AAC7B,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,OAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,SAAS,MAAM,MAAM,KAAK;AAAA,QAC9B,IAAI;AAAA,QACJ,QAAQ,WAAW,MAAM;AAAA,QACzB,OAAO,MAAM,YAAY;AAAA,MAC3B,CAAC;AAED,UAAI,WAAW,GAAG;AAChB,kBAAU,MAAM;AAChB;AAAA,MACF;AAEA,iBAAW;AACX,mBAAa,QAAQ,UAAU,OAAO,MAAM,CAAC,IAAI,MAAM,YAAY,CAAC,WAAM,gBAAgB,OAAO,EAAE,CAAC,EAAE;AACtG,oBAAc,OAAO,GAAG,OAAO,QAAQ,QAAQ,CAAC,CAAC,IAAI,OAAO,WAAW,KAAK,OAAO,SAAS,GAAG;AAC/F,oBAAc,WAAW,UAAU,OAAO,QAAQ,SAAS,IAAI,OAAO;AACtE,oBAAc,MAAM,YAAY,OAAO,EAAE,CAAC;AAC1C,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACrCA,OAAOC,SAAQ;AACf,SAAS,SAAAC,QAAO,aAAAC,kBAAiB;AAUjC,eAAe,YAAY,OAAmC;AAC5D,QAAM,CAAC,aAAa,WAAW,EAAE,IAAI,MAAM,QAAQ,IAAI;AAAA,IACrD,MAAM,YAAY;AAAA,IAClB,MAAM,UAAU;AAAA,IAChB,MAAM,aAAa;AAAA,EACrB,CAAC;AAED,SAAO;AAAA,IACL,aAAa,YAAY,UAAU,QAAQ,CAAC;AAAA,IAC5C,WAAW,UAAU,UAAU,QAAQ,CAAC;AAAA,IACxC,cAAc,GAAG,WAAW,IAAI,GAAG,eAAe;AAAA,EACpD;AACF;AAEO,SAAS,gBAAgBC,UAAkB;AAChD,EAAAA,SACG,QAAQ,SAAS,EACjB,YAAY,qBAAqB,EACjC,OAAO,gBAAgB,eAAe,EACtC,OAAO,iBAAiB,mDAAmD,EAC3E,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,OAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,MAAM,MAAM,MAAM,QAAQ;AAEhC,YAAM,SAAS,KAAK,aAAa,MAAM,YAAY,KAAK,IAAI;AAE5D,UAAI,WAAW,GAAG;AAChB,cAAM,SAAS,SACX,EAAE,GAAG,KAAK,OAAO,IACjB;AACJ,kBAAU,MAAM;AAChB;AAAA,MACF;AAEA,iBAAW;AAEX,YAAM,UAAU,IAAI,WAAW,CAAC;AAChC,YAAM,gBAAgB,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,IAAI,IAAK;AAEzE,UAAI,cAAc,UAAU,GAAG;AAC7B,sBAAc,aAAa,GAAGC,WAAU,IAAI,SAAS,CAAC,KAAKC,IAAG,IAAI,6BAAwB,CAAC,EAAE;AAAA,MAC/F,OAAO;AACL,sBAAc,aAAa,GAAGD,WAAU,IAAI,SAAS,CAAC,KAAKC,IAAG,IAAI,qBAAqB,CAAC,EAAE;AAC1F,mBAAW,CAAC,QAAQ,MAAM,KAAK,eAAe;AAC5C,oBAAU,OAAOA,IAAG,IAAI,MAAM,CAAC,KAAKD,WAAU,MAAM,CAAC,EAAE;AAAA,QACzD;AAAA,MACF;AAEA,oBAAc,WAAW,GAAGA,WAAU,IAAI,OAAO,CAAC,EAAE;AACpD,oBAAc,OAAO,GAAG,IAAI,WAAW,IAAI,QAAQ,CAAC,CAAC,WAAWC,IAAG,IAAI,KAAKD,WAAU,IAAI,WAAW,QAAQ,CAAC,GAAG,CAAC,EAAE;AACpH,qBAAe;AACf,oBAAc,SAAS,GAAGA,WAAU,IAAI,KAAK,CAAC,EAAE;AAEhD,UAAI,QAAQ;AACV,mBAAW;AACX,oBAAY,QAAQ;AACpB,sBAAc,gBAAgB,GAAGA,WAAU,OAAO,OAAO,WAAW,CAAC,CAAC,SAAS,CAAC;AAChF,sBAAc,cAAc,GAAGA,WAAU,OAAO,OAAO,SAAS,CAAC,CAAC,SAAS,CAAC;AAC5E,cAAM,YAAY,OAAO,iBAAiB,OACtC,OAAO,aAAa,QAAQ,CAAC,IAC7B,GAAGC,IAAG,MAAM,QAAG,CAAC,KAAKA,IAAG,IAAI,kBAAkB,CAAC;AACnD,sBAAc,iBAAiB,WAAW,CAAC;AAAA,MAC7C;AAEA,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACnFA,SAAS,SAAAC,cAAa;AAIf,SAAS,gBAAgBC,UAAkB;AAChD,EAAAA,SACG,QAAQ,SAAS,EACjB,YAAY,qBAAqB,EACjC,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,OAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,UAAI,WAAW,GAAG;AAChB,kBAAU,EAAE,SAAS,MAAM,QAAQ,EAAE,CAAC;AACtC;AAAA,MACF;AAEA,iBAAW;AACX,oBAAc,WAAW,MAAM,QAAQ,CAAC;AACxC,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;AC1BA,SAAS,SAAAC,cAAa;AAIf,SAAS,gBAAgBC,UAAkB;AAChD,EAAAA,SACG,QAAQ,SAAS,EACjB,YAAY,2BAA2B,EACvC,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,OAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,OAAO,MAAM,MAAM,QAAQ;AAEjC,UAAI,WAAW,GAAG;AAChB,kBAAU,IAAI;AACd;AAAA,MACF;AAEA,kBAAY,kBAAkB;AAC9B,cAAQ,IAAI,KAAK,YAAY;AAC7B,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;AC5BA,SAAS,SAAAC,QAAO,mBAAAC,wBAAuB;AAIhC,SAAS,gBAAgBC,UAAkB;AAChD,EAAAA,SACG,QAAQ,SAAS,EACjB,YAAY,0BAA0B,EACtC,OAAO,eAAe,0BAA0B,IAAI,EACpD,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,OAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,OAAO,MAAM,MAAM,QAAQ,EAAE,OAAO,SAAS,KAAK,OAAO,EAAE,EAAE,CAAC;AAEpE,UAAI,WAAW,GAAG;AAChB,kBAAU,IAAI;AACd;AAAA,MACF;AAEA,kBAAY,qBAAqB;AAEjC,UAAI,KAAK,WAAW,GAAG;AACrB,gBAAQ,IAAI,wBAAwB;AAAA,MACtC,OAAO;AACL,mBAAW,MAAM,MAAM;AACrB,gBAAM,OAAO,GAAG,YAAY,IAAI,KAAK,GAAG,SAAS,EAAE,eAAe,IAAI;AACtE,gBAAM,MAAM,GAAG,YAAY,KAAK,GAAG,SAAS,MAAM;AAClD,kBAAQ,IAAI,KAAKC,iBAAgB,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;AAAA,QAC5E;AAAA,MACF;AAEA,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACvCA,SAAS,YAAAC,WAAU,aAAAC,YAAW,SAAAC,cAAa;AAC3C,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAAAC,cAAa;AAItB,IAAM,WAAWC,SAAQC,SAAQ,GAAG,UAAU,WAAW;AACzD,IAAM,eAAe;AACrB,IAAM,aAAa,IAAI,KAAK;AAO5B,eAAe,eAAmC;AAChD,MAAI;AACF,UAAM,OAAO,KAAK,MAAM,MAAMC,UAAS,UAAU,OAAO,CAAC;AACzD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,EAAE,UAAU,GAAG,aAAa,EAAE;AAAA,EACvC;AACF;AAEA,eAAe,aAAa,OAAiC;AAC3D,QAAMC,OAAMH,SAAQC,SAAQ,GAAG,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7D,QAAMG,WAAU,UAAU,KAAK,UAAU,KAAK,GAAG,EAAE,MAAM,IAAM,CAAC;AAClE;AAEO,SAAS,eAAeC,UAAkB;AAC/C,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,sCAAsC,EAClD,OAAO,gBAAgB,eAAe,EACtC,OAAO,SAAS,mBAAmB,EACnC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,OAAO,MAAM,aAAa;AAChC,UAAI,KAAK,cAAc,KAAK,IAAI,GAAG;AACjC,cAAM,YAAY,KAAK,MAAM,KAAK,cAAc,KAAK,IAAI,KAAK,GAAI;AAClE,mBAAW,8CAA8C,SAAS,IAAI;AACtE;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,OAAO,CAAC,WAAW,GAAG;AAC9B,cAAM,UAAU,MAAM;AAAA,UACpB;AAAA,QACF;AACA,YAAI,CAAC,QAAS;AAAA,MAChB;AAEA,YAAM,MAAM,MAAM,WAAW;AAE7B,UAAI;AACJ,UAAI;AACF,gBAAQ,MAAMC,OAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA,MACvD,SAAS,OAAO;AACd,cAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU;AACrD,YAAI,IAAI,SAAS,aAAa,GAAG;AAC/B,gBAAM,cAAc,KAAK,WAAW;AACpC,cAAI,eAAe,cAAc;AAC/B,kBAAM,aAAa,EAAE,UAAU,aAAa,aAAa,KAAK,IAAI,IAAI,WAAW,CAAC;AAClF,uBAAW,8CAA8C,WAAW,oBAAoB;AAAA,UAC1F,OAAO;AACL,kBAAM,aAAa,EAAE,UAAU,aAAa,aAAa,EAAE,CAAC;AAC5D,uBAAW,gBAAgB,eAAe,WAAW,sBAAsB;AAAA,UAC7E;AACA;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAEA,YAAM,aAAa,EAAE,UAAU,GAAG,aAAa,EAAE,CAAC;AAElD,YAAM,MAAM,MAAM,UAAU;AAE5B,UAAI,WAAW,GAAG;AAChB,kBAAU,EAAE,YAAY,KAAK,QAAQ,cAAc,CAAC;AACpD;AAAA,MACF;AAEA,iBAAW;AACX,mBAAa,6BAA6B;AAC1C,cAAQ,IAAI,KAAK,GAAG,EAAE;AACtB,iBAAW;AACX,gBAAU,uDAAuD;AACjE,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;AC5FA,SAAgB,uBAAuB,eAAe;AAGtD,SAAS,YAAAC,iBAAgB;AAElB,SAAS,eAAeC,UAAkB;AAC/C,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,kCAAkC,EAC9C,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,UAAI;AACJ,UAAI,QAAQ,IAAI,mBAAmB;AACjC,qBAAa,QAAQ,IAAI;AAAA,MAC3B,OAAO;AACL,qBAAa,MAAMD,UAAS,EAAE,SAAS,2BAA2B,CAAC;AAAA,MACrE;AAEA,UAAI,CAAC,WAAY,OAAM,IAAI,MAAM,yBAAyB;AAE1D,YAAM,MAAM,MAAM,WAAW,EAAE,SAAS,KAAK,CAAC;AAE9C,YAAM,UAAU,sBAAsB,UAAU;AAChD,YAAM,UAAU,QAAQ,aAAa,EAAE,aAAa;AACpD,YAAM,QAAQ,SAAS,KAAK,KAAK,GAAG;AAEpC,UAAI,WAAW,GAAG;AAChB,kBAAU,EAAE,SAAS,UAAU,KAAK,CAAC;AACrC;AAAA,MACF;AAEA,iBAAW;AACX,mBAAa,6BAA6B;AAC1C,oBAAc,WAAW,OAAO;AAChC,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACxCA,OAAOE,SAAQ;AACf,SAAS,SAAAC,QAAO,aAAAC,kBAAiB;AAI1B,SAAS,aAAaC,UAAkB;AAC7C,QAAM,SAAS,OAAO,WAAmB,UAA8B,SAA8C;AACjH,QAAI;AACF,YAAM,SAAyB,cAAc,QAAQ,QAAQ,WAAW,SAAS;AACjF,UAAI,WAAW,UAAU,MAAM,MAAM,KAAK,UAAU,IAAI;AACtD,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC7D;AAEA,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,OAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,UAAI,iBAAiB;AACrB,YAAM,GAAG,gBAAgB,CAAC,SAAS;AACjC,yBAAiB,KAAK;AAAA,MACxB,CAAC;AAED,YAAM,QAAQ,YAAY;AAC1B,YAAM,SAAS,MAAM,MAAM,KAAK,EAAE,QAAQ,OAAO,UAAU,KAAK,SAAS,CAAC;AAE1E,UAAI,WAAW,GAAG;AAChB,kBAAU,MAAM;AAChB;AAAA,MACF;AAEA,iBAAW;AAEX,UAAI,iBAAiB,GAAG;AACtB,qBAAa,gBAAgBC,IAAG,OAAOC,WAAU,cAAc,CAAC,CAAC,kBAAa;AAAA,MAChF;AAEA,YAAM,eAAe,KAAK,YAAY;AACtC,mBAAa,SAASD,IAAG,OAAOC,WAAU,OAAO,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO,YAAY,EAAE;AAEvF,UAAI,OAAO,MAAM,GAAG;AAClB,cAAM,WAAW,OAAO,MAAM,OAAO,SAAS,KAAK,QAAQ,CAAC;AAC5D,qBAAa,iBAAiBD,IAAG,IAAI,GAAGC,WAAU,OAAO,GAAG,CAAC,IAAI,KAAK,KAAK,OAAO,IAAI,CAAC,EAAE;AAAA,MAC3F;AAEA,mBAAa,gBAAgBD,IAAG,MAAM,GAAG,OAAO,IAAI,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE;AAEpE,mBAAa,oBAAoBA,IAAG,OAAOC,WAAU,OAAO,cAAc,CAAC,CAAC,IAAI,KAAK,EAAE;AAEvF,oBAAc,MAAM,YAAY,OAAO,EAAE,CAAC;AAC1C,iBAAW;AAAA,IACf,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,EAAAH,SACG,QAAQ,MAAM,EACd,YAAY,kCAAkC,EAC9C,SAAS,YAAY,2BAA2B,EAChD,SAAS,WAAW,gCAAgC,MAAM,EAC1D,OAAO,gBAAgB,eAAe,EACtC,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,MAAM;AAEhB,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,mDAAmD,EAC/D,SAAS,YAAY,2BAA2B,EAChD,SAAS,WAAW,gCAAgC,MAAM,EAC1D,OAAO,gBAAgB,eAAe,EACtC,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,MAAM;AAClB;;;ACvEA,SAAS,SAAAI,eAAa;AAIf,SAAS,iBAAiBC,UAAkB;AACjD,EAAAA,SACG,QAAQ,UAAU,EAClB,YAAY,mCAAmC,EAC/C,SAAS,YAAY,+BAA+B,EACpD,SAAS,WAAW,gDAAgD,MAAM,EAC1E,OAAO,gBAAgB,eAAe,EACtC,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,OAAO,WAAW,UAAU,SAAS;AAC3C,QAAI;AACF,YAAM,SAAyB,cAAc,QAAQ,QAAQ,WAAW,SAAS;AACjF,UAAI,WAAW,UAAU,MAAM,MAAM,KAAK,UAAU,IAAI;AACtD,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC7D;AAEA,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,QAAQ,YAAY;AAC1B,YAAM,SAAS,MAAM,MAAM,SAAS,EAAE,QAAQ,OAAO,UAAU,KAAK,SAAS,CAAC;AAE9E,UAAI,WAAW,GAAG;AAChB,kBAAU,MAAM;AAChB;AAAA,MACF;AAEA,iBAAW;AACX,mBAAa,aAAa,OAAO,OAAO,QAAQ,CAAC,CAAC,IAAI,KAAK,EAAE;AAC7D,oBAAc,MAAM,YAAY,OAAO,EAAE,CAAC;AAC1C,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACtCA,SAAS,SAAAC,eAAa;AAIf,SAAS,eAAeC,UAAkB;AAC/C,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,+CAA+C,EAC3D,SAAS,YAAY,kBAAkB,EACvC,SAAS,WAAW,8CAA8C,MAAM,EACxE,OAAO,gBAAgB,eAAe,EACtC,OAAO,qBAAqB,6BAA6B,EACzD,OAAO,OAAO,WAAW,UAAU,SAAS;AAC3C,QAAI;AACF,YAAM,SAAS,WAAW,SAAS;AACnC,UAAI,MAAM,MAAM,KAAK,UAAU,GAAG;AAChC,cAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD;AAEA,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,YAAY,MAAM,MAAM,UAAU;AACxC,UAAI,SAAS,UAAU,WAAW;AAChC,qBAAa,qBAAqB,UAAU,UAAU,QAAQ,CAAC,CAAC,QAAQ,UAAU,UAAU,QAAQ,CAAC,CAAC,kBAAa;AACnH;AAAA,MACF;AAEA,YAAM,QAAQ,YAAY;AAC1B,YAAM,SAAS,MAAM,MAAM,OAAO,EAAE,QAAQ,OAAO,UAAU,KAAK,SAAS,CAAC;AAE5E,UAAI,WAAW,GAAG;AAChB,kBAAU,MAAM;AAChB;AAAA,MACF;AAEA,iBAAW;AACX,mBAAa,aAAa,OAAO,QAAQ,CAAC,CAAC,IAAI,KAAK,EAAE;AACtD,oBAAc,iBAAiB,OAAO,aAAa,QAAQ,CAAC,CAAC;AAC7D,oBAAc,MAAM,YAAY,OAAO,EAAE,CAAC;AAC1C,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;AC7CA,SAAS,SAAAC,eAAa;AAIf,SAAS,cAAcC,UAAkB;AAC9C,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,4BAA4B,EACxC,SAAS,YAAY,4BAA4B,EACjD,SAAS,WAAW,6CAA6C,MAAM,EACvE,OAAO,gBAAgB,eAAe,EACtC,OAAO,qBAAqB,6BAA6B,EACzD,OAAO,OAAO,WAAW,UAAU,SAAS;AAC3C,QAAI;AACF,YAAM,SAAyB,cAAc,QAAQ,QAAQ,WAAW,SAAS;AACjF,UAAI,WAAW,UAAU,MAAM,MAAM,KAAK,UAAU,IAAI;AACtD,cAAM,IAAI,MAAM,2CAA2C;AAAA,MAC7D;AAEA,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,QAAQ,YAAY;AAC1B,YAAM,SAAS,MAAM,MAAM,MAAM,EAAE,QAAQ,OAAO,UAAU,KAAK,SAAS,CAAC;AAE3E,UAAI,WAAW,GAAG;AAChB,kBAAU,MAAM;AAChB;AAAA,MACF;AAEA,iBAAW;AACX,mBAAa,WAAW,OAAO,OAAO,QAAQ,CAAC,CAAC,IAAI,KAAK,EAAE;AAC3D,oBAAc,kBAAkB,IAAI,OAAO,cAAc,QAAQ,CAAC,CAAC,EAAE;AACrE,oBAAc,MAAM,YAAY,OAAO,EAAE,CAAC;AAC1C,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACvCA,SAAS,SAAAC,eAAa;AAIf,SAAS,eAAeC,UAAkB;AAC/C,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,6BAA6B,EACzC,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,KAAK,MAAM,MAAM,aAAa;AAEpC,UAAI,WAAW,GAAG;AAChB,kBAAU,EAAE;AACZ;AAAA,MACF;AAEA,iBAAW;AAEX,YAAM,QAAQ,GAAG,iBAAiB,WAAW,WAAM,GAAG,aAAa,QAAQ,CAAC;AAC5E,UAAI,GAAG,gBAAgB,GAAK;AAC1B,qBAAa,kBAAkB,KAAK,YAAY;AAAA,MAClD,WAAW,GAAG,gBAAgB,KAAK;AACjC,qBAAa,kBAAkB,KAAK,aAAa;AAAA,MACnD,WAAW,GAAG,gBAAgB,KAAK;AACjC,qBAAa,kBAAkB,KAAK,QAAQ;AAAA,MAC9C,OAAO;AACL,mBAAW,kBAAkB,KAAK,aAAa;AAAA,MACjD;AAEA,iBAAW;AACX,oBAAc,YAAY,IAAI,GAAG,SAAS,QAAQ,CAAC,CAAC,OAAO;AAC3D,oBAAc,YAAY,IAAI,GAAG,SAAS,QAAQ,CAAC,CAAC,OAAO;AAC3D,oBAAc,cAAc,IAAI,GAAG,UAAU,QAAQ,CAAC,CAAC,OAAO;AAC9D,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;AC3CA,OAAOC,SAAQ;AACf,SAAS,SAAAC,SAAO,eAAe,wBAAwB;AAIhD,SAAS,cAAcC,UAAkB;AAC9C,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,yDAAyD,EACrE,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,WAAW,MAAM,MAAM,qBAAqB;AAElD,UAAI,WAAW,GAAG;AAChB,kBAAU,QAAQ;AAClB;AAAA,MACF;AAEA,iBAAW;AAEX,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,OAAO,SAAS,OAAO,CAAC,GAAG,MAAM,EAAE,MAAM,UAAU,EAAE,MAAM,UAAU,IAAI,CAAC;AAChF,cAAM,cAAc,iBAAiB,KAAK,KAAsC,GAAG,eAAe,KAAK;AACvG,kBAAUC,IAAG,KAAKA,IAAG,MAAM,eAAe,KAAK,MAAM,QAAQ,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAIA,IAAG,IAAI,KAAK,WAAW,OAAO,KAAK,QAAQ,GAAG,CAAC;AAClI,mBAAW;AAAA,MACb;AAEA,iBAAW,SAAS,eAAe;AACjC,cAAM,aAAa,SAAS,OAAO,OAAK,EAAE,UAAU,KAAK;AACzD,YAAI,WAAW,WAAW,EAAG;AAE7B,cAAM,UAAU,iBAAiB,KAAK,GAAG,eAAe;AACxD,kBAAUA,IAAG,KAAK,OAAO,CAAC;AAC1B,qBAAa;AACb,mBAAW,SAAS,YAAY;AAC9B,wBAAc,MAAM,UAAU,QAAQ,MAAM,MAAM,QAAQ,QAAQ,CAAC,CAAC,aAAa,MAAM,MAAM,UAAU,QAAQ,CAAC,CAAC,GAAG;AAAA,QACtH;AACA,mBAAW;AAAA,MACb;AAEA,UAAI,SAAS,WAAW,GAAG;AACzB,kBAAU,6BAA6B;AACvC,mBAAW;AAAA,MACb;AAAA,IACF,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACpDA,OAAOC,SAAQ;AACf,SAAS,SAAAC,SAAO,aAAAC,kBAAiB;AAI1B,SAAS,kBAAkBC,UAAkB;AAClD,EAAAA,SACG,QAAQ,WAAW,EACnB,YAAY,iEAAiE,EAC7E,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,SAAS,MAAM,MAAM,UAAU;AAErC,UAAI,WAAW,GAAG;AAChB,kBAAU,MAAM;AAChB;AAAA,MACF;AAEA,iBAAW;AACX,UAAI,OAAO,UAAU,WAAW,GAAG;AACjC,kBAAU,2DAA2D;AAAA,MACvE,OAAO;AACL,cAAM,QAAQ,OAAO,UAAU,OAAO,OAAK,EAAE,SAAS,MAAM;AAC5D,cAAM,UAAU,OAAO,UAAU,OAAO,OAAK,EAAE,SAAS,QAAQ;AAEhE,YAAI,MAAM,SAAS,GAAG;AACpB,oBAAUC,IAAG,KAAK,SAAS,CAAC;AAC5B,uBAAa;AACb,qBAAW,OAAO,OAAO;AACvB,0BAAc,IAAI,UAAU,GAAGC,WAAU,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,CAAC,OAAO;AAAA,UAClG;AACA,gBAAM,aAAa,MAAM,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC;AACzD,cAAI,MAAM,SAAS,GAAG;AACpB,0BAAc,SAASA,WAAU,UAAU,CAAC;AAAA,UAC9C;AACA,qBAAW;AAAA,QACb;AAEA,YAAI,QAAQ,SAAS,GAAG;AACtB,oBAAUD,IAAG,KAAK,SAAS,CAAC;AAC5B,uBAAa;AACb,qBAAW,OAAO,SAAS;AACzB,0BAAc,IAAI,UAAU,GAAGC,WAAU,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,CAAC,OAAO;AAAA,UAClG;AACA,gBAAM,gBAAgB,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC;AAC9D,cAAI,QAAQ,SAAS,GAAG;AACtB,0BAAc,SAASA,WAAU,aAAa,CAAC;AAAA,UACjD;AACA,qBAAW;AAAA,QACb;AAAA,MACF;AACA,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;AC5DA,SAAS,SAAAC,eAAa;AAIf,SAAS,aAAaC,UAAkB;AAC7C,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,6CAA6C,EACzD,SAAS,YAAY,gBAAgB,EACrC,SAAS,UAAU,kCAAkC,EACrD,SAAS,QAAQ,gCAAgC,EACjD,OAAO,wBAAwB,2BAA2B,GAAG,EAC7D,OAAO,gBAAgB,eAAe,EACtC,OAAO,qBAAqB,8BAA8B,EAC1D,OAAO,OAAO,WAAmB,MAAc,IAAY,SAAiE;AAC3H,QAAI;AACF,YAAM,SAAS,WAAW,SAAS;AACnC,UAAI,MAAM,MAAM,KAAK,UAAU,GAAG;AAChC,cAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD;AAEA,YAAM,cAAc,WAAW,KAAK,YAAY,GAAG,IAAI;AAEvD,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAG3D,YAAM,QAAQ,MAAM,MAAM,UAAU,EAAE,MAAM,IAAI,OAAO,CAAC;AAExD,YAAM,SAAS,MAAM,MAAM,KAAK,EAAE,MAAM,IAAI,QAAQ,aAAa,UAAU,KAAK,SAAS,CAAC;AAE1F,UAAI,WAAW,GAAG;AAChB,kBAAU,MAAM;AAChB;AAAA,MACF;AAEA,iBAAW;AACX,mBAAa,WAAW,OAAO,UAAU,IAAI,OAAO,SAAS,WAAM,OAAO,SAAS,QAAQ,CAAC,CAAC,IAAI,OAAO,OAAO,EAAE;AACjH,UAAI,OAAO,cAAc,MAAO;AAC9B,qBAAa,kBAAkB,OAAO,cAAc,KAAK,QAAQ,CAAC,CAAC,GAAG;AAAA,MACxE;AACA,UAAI,OAAO,MAAM,GAAG;AAClB,sBAAc,OAAO,IAAI,OAAO,IAAI,QAAQ,CAAC,CAAC,EAAE;AAAA,MAClD;AACA,oBAAc,MAAM,YAAY,OAAO,EAAE,CAAC;AAC1C,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;AClDA,SAAS,SAAAC,eAAa;AAIf,SAAS,iBAAiBC,UAAkB;AACjD,EAAAA,SACG,QAAQ,UAAU,EAClB,YAAY,2BAA2B,EACvC,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAO,SAA2B;AACxC,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,SAAS,MAAM,MAAM,SAAS;AAEpC,UAAI,WAAW,GAAG;AAChB,kBAAU,MAAM;AAChB;AAAA,MACF;AAEA,iBAAW;AACX,oBAAc,SAAS,IAAI,OAAO,SAAS,QAAQ,CAAC,CAAC,EAAE;AACvD,oBAAc,OAAO,GAAG,OAAO,WAAW,QAAQ,CAAC,CAAC,GAAG;AACvD,oBAAc,eAAe,KAAK,OAAO,aAAa,QAAQ,CAAC,CAAC,MAAM;AACtE,oBAAc,eAAe,KAAK,OAAO,iBAAiB,QAAQ,CAAC,CAAC,EAAE;AACtE,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;AC/BA,SAAS,SAAAC,eAAa;AAIf,SAAS,mBAAmBC,UAAkB;AACnD,EAAAA,SACG,QAAQ,aAAa,EACrB,YAAY,sBAAsB,EAClC,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAO,SAA2B;AACxC,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,SAAS,MAAM,MAAM,WAAW;AAEtC,UAAI,WAAW,GAAG;AAChB,kBAAU,MAAM;AAChB;AAAA,MACF;AAEA,iBAAW;AACX,UAAI,OAAO,WAAW,GAAG;AACvB,qBAAa,iBAAiB;AAAA,MAChC,OAAO;AACL,gBAAQ,IAAI,uEAAkE;AAAA,MAChF;AACA,iBAAW;AACX,oBAAc,SAAS,IAAI,OAAO,SAAS,QAAQ,CAAC,CAAC,MAAM,OAAO,IAAI,QAAQ,CAAC,CAAC,OAAO;AACvF,oBAAc,gBAAgB,KAAK,OAAO,YAAY,QAAQ,CAAC,CAAC,EAAE;AAClE,oBAAc,mBAAmB,KAAK,OAAO,cAAc,QAAQ,CAAC,CAAC,EAAE;AACvE,oBAAc,qBAAqB,KAAK,OAAO,iBAAiB,QAAQ,CAAC,CAAC,QAAQ;AAClF,iBAAW;AACX,UAAI,OAAO,WAAW,GAAG;AACvB,gBAAQ,IAAI,6CAA6C;AAAA,MAC3D;AACA,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACzCA,SAAS,cAAc,eAAe,WAAW,kBAAkB;AACnE,SAAS,YAAY;AACrB,SAAS,WAAAC,gBAAe;AAGxB,IAAM,aAAa,KAAKC,SAAQ,GAAG,QAAQ;AAC3C,IAAM,cAAc,KAAK,YAAY,aAAa;AAElD,SAAS,aAAsC;AAC7C,MAAI;AACF,WAAO,KAAK,MAAM,aAAa,aAAa,OAAO,CAAC;AAAA,EACtD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,WAAW,QAAuC;AACzD,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,cAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AACA,gBAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,IAAI;AACnE;AAEO,SAAS,eAAeC,UAAkB;AAC/C,QAAM,YAAYA,SACf,QAAQ,QAAQ,EAChB,YAAY,2BAA2B;AAE1C,YACG,QAAQ,KAAK,EACb,SAAS,SAAS,kCAAkC,EACpD,OAAO,CAAC,QAAiB;AACxB,QAAI;AACF,YAAM,SAAS,WAAW;AAE1B,UAAI,WAAW,GAAG;AAChB,kBAAU,MAAM,EAAE,CAAC,GAAG,GAAG,OAAO,GAAG,EAAE,IAAI,MAAM;AAC/C;AAAA,MACF;AAEA,iBAAW;AACX,UAAI,KAAK;AACP,sBAAc,KAAK,OAAO,OAAO,GAAG,KAAK,WAAW,CAAC;AAAA,MACvD,OAAO;AACL,YAAI,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AACpC,kBAAQ,IAAI,yBAAyB;AAAA,QACvC,OAAO;AACL,qBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3C,0BAAc,GAAG,OAAO,CAAC,CAAC;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AACA,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AAEH,YACG,QAAQ,KAAK,EACb,SAAS,SAAS,YAAY,EAC9B,SAAS,WAAW,cAAc,EAClC,OAAO,CAAC,KAAa,UAAkB;AACtC,QAAI;AACF,YAAM,SAAS,WAAW;AAG1B,UAAI,SAAkB;AACtB,UAAI,UAAU,OAAQ,UAAS;AAAA,eACtB,UAAU,QAAS,UAAS;AAAA,eAC5B,CAAC,MAAM,OAAO,KAAK,CAAC,KAAK,MAAM,KAAK,MAAM,GAAI,UAAS,OAAO,KAAK;AAE5E,aAAO,GAAG,IAAI;AACd,iBAAW,MAAM;AAEjB,UAAI,WAAW,GAAG;AAChB,kBAAU,EAAE,CAAC,GAAG,GAAG,OAAO,CAAC;AAC3B;AAAA,MACF;AAEA,cAAQ,IAAI,SAAS,GAAG,MAAM,OAAO,MAAM,CAAC,EAAE;AAAA,IAChD,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACrFA,SAAS,aAAa;AACtB,SAAS,YAAY;AACrB,SAAS,YAAY;AACrB,SAAS,mBAAmB;AAC5B,SAAS,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,YAAW,cAAAC,mBAAkB;AACnE,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAAAC,eAAa;AAGtB,SAAS,iBAAiB;AAE1B,IAAMC,cAAaC,MAAKC,SAAQ,GAAG,QAAQ;AAC3C,IAAM,aAAaD,MAAKD,aAAY,aAAa;AAEjD,SAAS,gBAAwB;AAC/B,SAAO,OAAO,YAAY,EAAE,EAAE,SAAS,KAAK,CAAC;AAC/C;AAEA,SAAS,UAAU,OAAqB;AACtC,MAAI,CAACG,YAAWH,WAAU,GAAG;AAC3B,IAAAI,WAAUJ,aAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AACA,MAAI,SAAkC,CAAC;AACvC,MAAI;AACF,aAAS,KAAK,MAAMK,cAAa,YAAY,OAAO,CAAC;AAAA,EACvD,QAAQ;AAAA,EAAc;AACtB,SAAO,YAAY;AACnB,EAAAC,eAAc,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,IAAI;AAClE;AAEA,SAAS,SAAS,MAAe;AAC/B,SAAO,EAAE,SAAS,MAAM,MAAM,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,EAAE;AACzE;AAEA,SAAS,cAAc,MAAc,SAAiB,MAAgB,YAAY,OAAO;AACvF,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,IACxC,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AAAA,EACzC;AACF;AAEO,SAAS,cAAcC,UAAkB;AAC9C,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,uBAAuB,EACnC,OAAO,iBAAiB,eAAe,MAAM,EAC7C,OAAO,sBAAsB,2BAA2B,IAAI,EAC5D,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAO,SAA4D;AACzE,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAC3D,YAAM,OAAO,SAAS,KAAK,MAAM,EAAE;AACnC,YAAM,YAAY,SAAS,KAAK,WAAW,EAAE;AAE7C,YAAM,QAAQ,cAAc;AAC5B,gBAAU,KAAK;AAEf,YAAM,MAAM,SAAS,OAAO,OAAO,SAAS;AAE5C,YAAM,EAAE,OAAO,IAAI,OAAO,KAAK,CAAC;AAEhC,cAAQ,IAAI,mDAA8C,IAAI,EAAE;AAChE,cAAQ,IAAI,wBAAmB,KAAK,EAAE;AACtC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,cAAc;AAC1B,cAAQ,IAAI,2CAA2C;AACvD,cAAQ,IAAI,4CAA4C;AACxD,cAAQ,IAAI,gDAAgD;AAC5D,cAAQ,IAAI,4CAA4C;AACxD,cAAQ,IAAI,8CAA8C;AAC1D,cAAQ,IAAI,6CAA6C;AACzD,cAAQ,IAAI,wBAAwB;AACpC,cAAQ,IAAI,oCAAoC;AAChD,cAAQ,IAAI,EAAE;AAAA,IAChB,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;AAEA,SAAS,SAAS,OAAc,WAAmB,WAAyB;AAC1E,QAAM,MAAM,IAAI,KAAK;AAErB,MAAI,IAAI,KAAK,KAAK,CAAC;AAGnB,QAAM,aAAuB,CAAC;AAC9B,MAAI,IAAI,SAAS,OAAO,GAAG,SAAS;AAClC,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,WAAW;AACjB,WAAO,WAAW,SAAS,KAAK,WAAW,CAAC,IAAK,MAAM,UAAU;AAC/D,iBAAW,MAAM;AAAA,IACnB;AACA,QAAI,WAAW,UAAU,WAAW;AAClC,QAAE,OAAO,GAAG;AACZ,QAAE,OAAO,eAAe,GAAG;AAC3B,aAAO,EAAE,KAAK,cAAc,gBAAgB,qBAAqB,MAAM,IAAI,CAAC;AAAA,IAC9E;AACA,eAAW,KAAK,GAAG;AACnB,UAAM,KAAK;AAAA,EACb,CAAC;AAGD,MAAI,IAAI,SAAS,OAAO,GAAG,SAAS;AAClC,UAAM,OAAO,EAAE,IAAI,OAAO,eAAe;AACzC,QAAI,CAAC,QAAQ,SAAS,UAAU,SAAS,IAAI;AAC3C,QAAE,OAAO,GAAG;AACZ,aAAO,EAAE,KAAK,cAAc,gBAAgB,iCAAiC,CAAC;AAAA,IAChF;AACA,UAAM,KAAK;AAAA,EACb,CAAC;AAID,MAAI,IAAI,eAAe,CAAC,MAAM;AAC5B,WAAO,EAAE,KAAK,SAAS,EAAE,SAAS,MAAM,QAAQ,CAAC,CAAC;AAAA,EACpD,CAAC;AAED,MAAI,IAAI,eAAe,OAAO,MAAM;AAClC,QAAI;AACF,YAAM,UAAU,MAAM,MAAM,QAAQ;AACpC,aAAO,EAAE,KAAK,SAAS,OAAO,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,aAAO,EAAE,KAAK,cAAc,iBAAiB,OAAO,GAAG,CAAC,GAAG,GAAG;AAAA,IAChE;AAAA,EACF,CAAC;AAED,MAAI,IAAI,eAAe,OAAO,MAAM;AAClC,QAAI;AACF,YAAM,QAAQ,SAAS,EAAE,IAAI,MAAM,OAAO,KAAK,MAAM,EAAE;AACvD,YAAM,UAAU,MAAM,MAAM,QAAQ,EAAE,MAAM,CAAC;AAC7C,aAAO,EAAE,KAAK,SAAS,OAAO,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,aAAO,EAAE,KAAK,cAAc,iBAAiB,OAAO,GAAG,CAAC,GAAG,GAAG;AAAA,IAChE;AAAA,EACF,CAAC;AAED,MAAI,IAAI,eAAe,CAAC,MAAM;AAC5B,WAAO,EAAE,KAAK,SAAS;AAAA,MACrB,SAAS,MAAM;AAAA,MACf,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC,CAAC;AAAA,EACJ,CAAC;AAED,MAAI,IAAI,gBAAgB,OAAO,MAAM;AACnC,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,SAAS;AACtC,aAAO,EAAE,KAAK,SAAS,QAAQ,CAAC;AAAA,IAClC,SAAS,KAAK;AACZ,aAAO,EAAE,KAAK,cAAc,kBAAkB,OAAO,GAAG,CAAC,GAAG,GAAG;AAAA,IACjE;AAAA,EACF,CAAC;AAED,MAAI,IAAI,aAAa,OAAO,MAAM;AAChC,QAAI;AACF,YAAM,QAAQ,MAAM,MAAM,MAAM;AAChC,aAAO,EAAE,KAAK,SAAS,KAAK,CAAC;AAAA,IAC/B,SAAS,KAAK;AACZ,aAAO,EAAE,KAAK,cAAc,eAAe,OAAO,GAAG,CAAC,GAAG,GAAG;AAAA,IAC9D;AAAA,EACF,CAAC;AAED,MAAI,IAAI,qBAAqB,OAAO,MAAM;AACxC,QAAI;AACF,YAAM,KAAK,MAAM,MAAM,aAAa;AACpC,aAAO,EAAE,KAAK,SAAS,EAAE,CAAC;AAAA,IAC5B,SAAS,KAAK;AACZ,aAAO,EAAE,KAAK,cAAc,gBAAgB,OAAO,GAAG,CAAC,GAAG,GAAG;AAAA,IAC/D;AAAA,EACF,CAAC;AAED,MAAI,IAAI,oBAAoB,OAAO,MAAM;AACvC,QAAI;AACF,YAAM,SAAS,MAAM,MAAM,YAAY;AACvC,aAAO,EAAE,KAAK,SAAS,MAAM,CAAC;AAAA,IAChC,SAAS,KAAK;AACZ,aAAO,EAAE,KAAK,cAAc,sBAAsB,OAAO,GAAG,CAAC,GAAG,GAAG;AAAA,IACrE;AAAA,EACF,CAAC;AAED,MAAI,IAAI,kBAAkB,OAAO,MAAM;AACrC,QAAI;AACF,YAAM,SAAS,MAAM,MAAM,UAAU;AACrC,aAAO,EAAE,KAAK,SAAS,MAAM,CAAC;AAAA,IAChC,SAAS,KAAK;AACZ,aAAO,EAAE,KAAK,cAAc,oBAAoB,OAAO,GAAG,CAAC,GAAG,GAAG;AAAA,IACnE;AAAA,EACF,CAAC;AAED,MAAI,IAAI,iBAAiB,OAAO,MAAM;AACpC,QAAI;AACF,YAAM,YAAY,MAAM,MAAM,UAAU;AACxC,aAAO,EAAE,KAAK,SAAS,SAAS,CAAC;AAAA,IACnC,SAAS,KAAK;AACZ,aAAO,EAAE,KAAK,cAAc,mBAAmB,OAAO,GAAG,CAAC,GAAG,GAAG;AAAA,IAClE;AAAA,EACF,CAAC;AAID,MAAI,KAAK,YAAY,OAAO,MAAM;AAChC,QAAI;AACF,YAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,YAAM,EAAE,IAAI,QAAQ,MAAM,IAAI;AAC9B,UAAI,CAAC,MAAM,CAAC,QAAQ;AAClB,UAAE,OAAO,GAAG;AACZ,eAAO,EAAE,KAAK,cAAc,kBAAkB,sBAAsB,CAAC;AAAA,MACvE;AACA,YAAM,SAAS,MAAM,MAAM,KAAK,EAAE,IAAI,QAAQ,OAAO,SAAS,OAAO,CAAC;AACtE,aAAO,EAAE,KAAK,SAAS,MAAM,CAAC;AAAA,IAChC,SAAS,KAAK;AACZ,QAAE,OAAO,cAAc,GAAG,CAAc;AACxC,aAAO,EAAE,KAAK,eAAe,GAAG,CAAC;AAAA,IACnC;AAAA,EACF,CAAC;AAED,MAAI,KAAK,YAAY,OAAO,MAAM;AAChC,QAAI;AACF,YAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,YAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,UAAI,CAAC,QAAQ;AACX,UAAE,OAAO,GAAG;AACZ,eAAO,EAAE,KAAK,cAAc,kBAAkB,kBAAkB,CAAC;AAAA,MACnE;AACA,YAAM,SAAS,MAAM,MAAM,KAAK,EAAE,QAAQ,OAAO,SAAS,OAAO,CAAC;AAClE,aAAO,EAAE,KAAK,SAAS,MAAM,CAAC;AAAA,IAChC,SAAS,KAAK;AACZ,QAAE,OAAO,cAAc,GAAG,CAAc;AACxC,aAAO,EAAE,KAAK,eAAe,GAAG,CAAC;AAAA,IACnC;AAAA,EACF,CAAC;AAED,MAAI,KAAK,cAAc,OAAO,MAAM;AAClC,QAAI;AACF,YAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,YAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,UAAI,CAAC,QAAQ;AACX,UAAE,OAAO,GAAG;AACZ,eAAO,EAAE,KAAK,cAAc,kBAAkB,kBAAkB,CAAC;AAAA,MACnE;AACA,YAAM,SAAS,MAAM,MAAM,KAAK,EAAE,QAAQ,OAAO,SAAS,OAAO,CAAC;AAClE,aAAO,EAAE,KAAK,SAAS,MAAM,CAAC;AAAA,IAChC,SAAS,KAAK;AACZ,QAAE,OAAO,cAAc,GAAG,CAAc;AACxC,aAAO,EAAE,KAAK,eAAe,GAAG,CAAC;AAAA,IACnC;AAAA,EACF,CAAC;AAED,MAAI,KAAK,gBAAgB,OAAO,MAAM;AACpC,QAAI;AACF,YAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,YAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,UAAI,CAAC,QAAQ;AACX,UAAE,OAAO,GAAG;AACZ,eAAO,EAAE,KAAK,cAAc,kBAAkB,kBAAkB,CAAC;AAAA,MACnE;AACA,YAAM,SAAS,MAAM,MAAM,SAAS,EAAE,QAAQ,OAAO,SAAS,OAAO,CAAC;AACtE,aAAO,EAAE,KAAK,SAAS,MAAM,CAAC;AAAA,IAChC,SAAS,KAAK;AACZ,QAAE,OAAO,cAAc,GAAG,CAAc;AACxC,aAAO,EAAE,KAAK,eAAe,GAAG,CAAC;AAAA,IACnC;AAAA,EACF,CAAC;AAED,MAAI,KAAK,YAAY,OAAO,MAAM;AAChC,QAAI;AACF,YAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,YAAM,EAAE,MAAM,IAAI,QAAQ,YAAY,IAAI;AAC1C,UAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ;AAC3B,UAAE,OAAO,GAAG;AACZ,eAAO,EAAE,KAAK,cAAc,kBAAkB,4BAA4B,CAAC;AAAA,MAC7E;AACA,YAAM,SAAS,MAAM,MAAM,KAAK,EAAE,MAAM,IAAI,QAAQ,YAAY,CAAC;AACjE,aAAO,EAAE,KAAK,SAAS,MAAM,CAAC;AAAA,IAChC,SAAS,KAAK;AACZ,QAAE,OAAO,cAAc,GAAG,CAAc;AACxC,aAAO,EAAE,KAAK,eAAe,GAAG,CAAC;AAAA,IACnC;AAAA,EACF,CAAC;AAED,MAAI,KAAK,cAAc,OAAO,MAAM;AAClC,QAAI;AACF,YAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,YAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,UAAI,CAAC,QAAQ;AACX,UAAE,OAAO,GAAG;AACZ,eAAO,EAAE,KAAK,cAAc,kBAAkB,kBAAkB,CAAC;AAAA,MACnE;AACA,YAAM,SAAS,MAAM,MAAM,OAAO,EAAE,QAAQ,OAAO,SAAS,OAAO,CAAC;AACpE,aAAO,EAAE,KAAK,SAAS,MAAM,CAAC;AAAA,IAChC,SAAS,KAAK;AACZ,QAAE,OAAO,cAAc,GAAG,CAAc;AACxC,aAAO,EAAE,KAAK,eAAe,GAAG,CAAC;AAAA,IACnC;AAAA,EACF,CAAC;AAED,MAAI,KAAK,aAAa,OAAO,MAAM;AACjC,QAAI;AACF,YAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,YAAM,EAAE,QAAQ,MAAM,IAAI;AAC1B,UAAI,CAAC,QAAQ;AACX,UAAE,OAAO,GAAG;AACZ,eAAO,EAAE,KAAK,cAAc,kBAAkB,kBAAkB,CAAC;AAAA,MACnE;AACA,YAAM,SAAS,MAAM,MAAM,MAAM,EAAE,QAAQ,OAAO,SAAS,OAAO,CAAC;AACnE,aAAO,EAAE,KAAK,SAAS,MAAM,CAAC;AAAA,IAChC,SAAS,KAAK;AACZ,QAAE,OAAO,cAAc,GAAG,CAAc;AACxC,aAAO,EAAE,KAAK,eAAe,GAAG,CAAC;AAAA,IACnC;AAAA,EACF,CAAC;AAID,MAAI,IAAI,cAAc,OAAO,MAAM;AACjC,UAAM,iBAAiB,EAAE,IAAI,MAAM,WAAW,KAAK;AACnD,UAAM,gBAAgB,IAAI,IAAI,eAAe,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAE5E,WAAO,UAAU,GAAG,OAAO,WAAW;AACpC,YAAM,WAAsD,CAAC;AAE7D,iBAAW,aAAa,eAAe;AACrC,cAAM,UAAU,CAAC,SAAkB;AACjC,iBAAO,SAAS,EAAE,OAAO,WAAW,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,QAClF;AACA,cAAM,GAAG,WAAoB,OAAgB;AAC7C,iBAAS,KAAK;AAAA,UACZ,OAAO;AAAA,UACP,KAAK,MAAM,MAAM,IAAI,WAAoB,OAAgB;AAAA,QAC3D,CAAC;AAAA,MACH;AAGA,YAAM,YAAY,YAAY,MAAM;AAClC,eAAO,SAAS,EAAE,OAAO,QAAQ,MAAM,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MAC/D,GAAG,GAAM;AAET,aAAO,QAAQ,MAAM;AACnB,sBAAc,SAAS;AACvB,mBAAW,KAAK,SAAU,GAAE,IAAI;AAAA,MAClC,CAAC;AAGD,YAAM,IAAI,QAAc,MAAM;AAAA,MAAC,CAAC;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;AAEA,SAAS,OAAO,KAAsB;AACpC,SAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD;AAEA,SAAS,eAAe,KAAc;AACpC,QAAM,SAAS;AACf,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,OAAO,WAAW,OAAO,GAAG;AAAA,IAC5B,OAAO;AAAA,IACP,YAAY,OAAO,IAAI;AAAA,EACzB;AACF;AAEA,SAAS,cAAc,KAAsB;AAC3C,QAAM,OAAQ,IAA0B;AACxC,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,SAAS,uBAAwB,QAAO;AAC5C,MAAI,SAAS,kBAAmB,QAAO;AACvC,MAAI,SAAS,2BAA4B,QAAO;AAChD,MAAI,SAAS,gBAAiB,QAAO;AACrC,SAAO;AACT;AAEA,SAAS,YAAY,MAAwB;AAC3C,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,CAAC,aAAa,mBAAmB,uBAAuB,mBAAmB,EAAE,SAAS,IAAI;AACnG;;;AC7XA,OAAOC,SAAQ;AACf,SAAS,SAAAC,eAAa;AACtB,SAAS,kBAAkB;AAY3B,SAAS,iBAAiB,OAA0B;AAClD,SAAO;AAAA,IACL,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,SAAS,MAAM,MAAM,QAAQ;AAAA,IAC7B,gBAAgB,OAAO,OAAO;AAC5B,YAAM,SAAS,MAAM,MAAM,UAAU,0BAA0B;AAAA,QAC7D,QAAQ,MAAM;AAAA,QACd,aAAa;AAAA,MACf,CAAC;AACD,aAAO,EAAE,QAAQ,OAAO,OAAO;AAAA,IACjC;AAAA,EACF;AACF;AAEO,SAAS,YAAYC,UAAkB;AAC5C,EAAAA,SACG,QAAQ,WAAW,EACnB,YAAY,wCAAwC,EACpD,OAAO,gBAAgB,eAAe,EACtC,OAAO,qBAAqB,gCAAgC,KAAK,EACjE,OAAO,iBAAiB,2BAA2B,EACnD,OAAO,wBAAwB,uCAAuC,gBAAgB,CAAC,CAAC,EACxF,OAAO,wBAAwB,kCAAkC,MAAM,EACvE,OAAO,uBAAuB,8BAA8B,IAAI,EAChE,OAAO,aAAa,wCAAwC,EAC5D,OAAO,OAAO,KAAa,SAQtB;AACJ,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAC3D,YAAM,SAAS,iBAAiB,KAAK;AACrC,YAAM,SAAS,IAAI,WAAW,MAAM;AAEpC,YAAM,YAAY,KAAK,IAAI;AAE3B,UAAI,CAAC,WAAW,GAAG;AACjB,mBAAW;AACX,kBAAU,UAAK,KAAK,MAAM,IAAI,GAAG,EAAE;AAAA,MACrC;AAEA,YAAM,WAAW,MAAM,OAAO,MAAM,KAAK;AAAA,QACvC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,MAAM,KAAK;AAAA,QACX,UAAU,WAAW,KAAK,QAAQ;AAAA,QAClC,SAAS,SAAS,KAAK,SAAS,EAAE,IAAI;AAAA,QACtC,QAAQ,KAAK;AAAA,QACb,WAAW,CAAC,YAAY;AACtB,cAAI,CAAC,WAAW,GAAG;AACjB,sBAAU,iCAA4B,QAAQ,MAAM,aAAa;AACjE,yBAAa,SAAS,QAAQ,MAAM,cAAc,QAAQ,OAAO,MAAM,GAAG,EAAE,CAAC,MAAM;AAAA,UACrF;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,UAAU,KAAK,IAAI,IAAI;AAE7B,UAAI,CAAC,WAAW,GAAG;AACjB,kBAAU,UAAK,SAAS,MAAM,IAAI,SAAS,cAAc,IAAI,KAAKC,IAAG,IAAI,IAAI,OAAO,KAAK,CAAC,EAAE;AAAA,MAC9F;AAEA,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,YAAM,OAAO,YAAY,SAAS,kBAAkB,IAChD,MAAM,SAAS,KAAK,IACpB,MAAM,SAAS,KAAK;AAExB,UAAI,WAAW,GAAG;AAChB,kBAAU;AAAA,UACR,QAAQ,SAAS;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,mBAAW;AACX,YAAI,OAAO,SAAS,UAAU;AAC5B,kBAAQ,IAAI,IAAI;AAAA,QAClB,OAAO;AACL,kBAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,QAC3C;AACA,mBAAW;AAAA,MACb;AAAA,IACF,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;AAEA,SAAS,eAAe,OAAe,UAA0D;AAC/F,QAAM,CAAC,KAAK,GAAG,IAAI,IAAI,MAAM,MAAM,GAAG;AACtC,MAAI,OAAO,KAAK,SAAS,GAAG;AAC1B,aAAS,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,EAAE,KAAK;AAAA,EAC7C;AACA,SAAO;AACT;;;ACjHO,SAAS,aAAaC,UAAkB;AAC7C,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,mDAAmD,EAC/D,OAAO,YAAY;AAClB,QAAI;AACF,YAAM,aAAa;AACnB,iBAAW;AACX,mBAAa,qDAAgD;AAC7D,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACjBA,SAAS,SAAAC,SAAO,oBAAoB;AAepC,OAAOC,SAAQ;AAEf,SAAS,UAAU,MAAsB;AACvC,UAAQ,OAAO,IAAI,IAAI,OAAO,YAAY,GAAG,QAAQ,CAAC;AACxD;AAEO,SAAS,iBAAiBC,UAAkB;AACjD,QAAM,WAAWA,SACd,QAAQ,UAAU,EAClB,YAAY,mEAA8D;AAE7E,WACG,QAAQ,MAAM,EACd,YAAY,wCAAwC,EACpD,OAAO,YAAY;AAClB,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,IAAI,CAAC;AACxC,YAAM,YAAY,MAAM,MAAM,aAAa;AAE3C,UAAI,WAAW,GAAG;AAChB,kBAAU,UAAU,IAAI,CAAC,OAAO;AAAA,UAC9B,GAAG;AAAA,UACH,WAAW,EAAE,UAAU,SAAS;AAAA,UAChC,WAAW,EAAE,UAAU,SAAS;AAAA,QAClC,EAAE,CAAC;AACH;AAAA,MACF;AAEA,UAAI,UAAU,WAAW,GAAG;AAC1B,mBAAW;AACX,kBAAU,4BAA4B;AACtC,mBAAW;AACX;AAAA,MACF;AAEA,kBAAY,kBAAkB;AAE9B,gBAAU,QAAQ,CAAC,MAAM;AACvB,cAAM,OAAO,GAAG,UAAU,EAAE,SAAS,CAAC,OAAO,OAAO,EAAE;AACtD,cAAM,MAAM,GAAG,UAAU,EAAE,SAAS,CAAC,OAAO,OAAO,EAAE;AACrD,kBAAU,KAAK,EAAE,IAAI,EAAE;AACvB,kBAAU,KAAKF,IAAG,IAAI,SAAS,IAAI,QAAQ,GAAG,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE;AAC7E,kBAAU,KAAKA,IAAG,IAAI,EAAE,QAAQ,CAAC,EAAE;AACnC,mBAAW;AAAA,MACb,CAAC;AAED,iBAAW;AACX,gBAAU,GAAG,UAAU,MAAM,mBAAmB,UAAU,WAAW,IAAI,KAAK,GAAG,EAAE;AACnF,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AAEH,WACG,QAAQ,MAAM,EACd,YAAY,6BAA6B,EACzC,SAAS,QAAQ,oBAAoB,EACrC,OAAO,OAAO,OAAe;AAC5B,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAME,QAAM,OAAO,EAAE,IAAI,CAAC;AACxC,YAAM,IAAI,MAAM,MAAM,aAAa,EAAE;AAErC,UAAI,WAAW,GAAG;AAChB,kBAAU;AAAA,UACR,GAAG;AAAA,UACH,WAAW,EAAE,UAAU,SAAS;AAAA,UAChC,WAAW,EAAE,UAAU,SAAS;AAAA,QAClC,CAAC;AACD;AAAA,MACF;AAEA,kBAAY,EAAE,IAAI;AAClB,oBAAc,aAAa,EAAE,QAAQ;AACrC,oBAAc,YAAY,EAAE,EAAE;AAC9B,oBAAc,SAAS,EAAE,KAAK;AAC9B,oBAAc,SAAS,EAAE,KAAK;AAC9B,oBAAc,cAAc,GAAG,UAAU,EAAE,SAAS,CAAC,MAAM;AAC3D,oBAAc,cAAc,GAAG,UAAU,EAAE,SAAS,CAAC,MAAM;AAC3D,oBAAc,iBAAiB,OAAO,EAAE,YAAY,CAAC;AACrD,oBAAc,YAAY,OAAO,EAAE,kBAAkB,CAAC;AACtD,UAAI,EAAE,cAAc;AAClB,mBAAW;AACX,sBAAc,iBAAiB,EAAE;AACjC,kBAAU,KAAKF,IAAG,IAAI,EAAE,aAAa,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE;AAAA,MACvD;AACA,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AAEH,WACG,QAAQ,QAAQ,EAChB,YAAY,6CAA6C,EACzD,SAAS,QAAQ,oBAAoB,EACrC,SAAS,YAAY,eAAe,EACpC,OAAO,eAAe,4BAA4B,EAClD,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAO,IAAY,QAA4B,SAAyC;AAC9F,QAAI;AACF,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,qEAAqE;AAAA,MACvF;AAEA,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAME,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,UAAU,KAAK,MACjB,OAAO,KAAK,MAAM,WAAW,KAAK,GAAG,IAAI,OAAO,YAAY,CAAC,CAAC,IAC9D;AAEJ,UAAI,WAAW,GAAG;AAChB,cAAMC,UAAS,MAAM,MAAM,eAAe,IAAI,QAAQ,OAAO;AAC7D,kBAAU;AAAA,UACR,GAAGA;AAAA,UACH,SAAS;AAAA,YACP,GAAGA,QAAO;AAAA,UACZ;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAEA,iBAAW;AACX,gBAAU,KAAKH,IAAG,IAAI,QAAG,CAAC,uBAAuB;AAEjD,YAAM,SAAS,MAAM,MAAM,eAAe,IAAI,QAAQ,OAAO;AAE7D,iBAAW;AACX,UAAI,OAAO,KAAK;AACd,qBAAa,qBAAqB,OAAO,QAAQ,KAAK,OAAO;AAAA,MAC/D,OAAO;AACL,kBAAU,KAAKA,IAAG,IAAI,QAAG,CAAC,qBAAqB,OAAO,QAAQ,KAAK,OAAO;AAAA,MAC5E;AAEA,iBAAW;AACX,oBAAc,SAAS,OAAO,QAAQ,cAAc,MAAM,GAAG,GAAG,CAAC;AACjE,oBAAc,QAAQ,OAAO,QAAQ,aAAa,MAAM,GAAG,GAAG,CAAC;AAC/D,UAAI,OAAO,QAAQ,aAAa;AAC9B,sBAAc,OAAO,OAAO,QAAQ,YAAY,MAAM,GAAG,GAAG,CAAC;AAAA,MAC/D;AACA,iBAAW;AACX,oBAAc,YAAY,GAAG,OAAO,OAAO,MAAM;AACjD,oBAAc,cAAc,YAAY,OAAO,SAAS,CAAC;AACzD,oBAAc,aAAa,YAAY,OAAO,QAAQ,CAAC;AACvD,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACvKA,SAAS,SAAAI,SAAO,gBAAAC,eAAc,eAAe,aAAAC,kBAAiB;AAc9D,OAAOC,SAAQ;AAEf,SAAS,UAAU,MAAsB;AACvC,SAAO,OAAO,IAAI,IAAI,OAAOC,aAAY;AAC3C;AAEA,SAAS,WAAW,WAAuD;AACzE,QAAM,WAAW,UAAU,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,EAAE,YAAY,EAAE;AAC7E,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,SAAO,SAAS,KAAK,CAAC,GAAG,MAAM;AAC7B,UAAM,SAAS,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,SAAS;AACvD,UAAM,SAAS,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,SAAS;AACvD,WAAO,SAAS;AAAA,EAClB,CAAC,EAAE,CAAC;AACN;AAEO,SAAS,aAAaC,UAAkB;AAC7C,EAAAA,SACG,QAAQ,MAAM,EACd,YAAY,yEAAoE,EAChF,OAAO,gBAAgB,eAAe,EACtC,OAAO,OAAO,SAA2B;AACxC,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAE3D,YAAM,CAAC,iBAAiB,SAAS,IAAI,MAAM,QAAQ,WAAW;AAAA,QAC5D,MAAM,UAAU;AAAA,QAChB,cAAc;AAAA,MAChB,CAAC;AAED,YAAM,UAAU,gBAAgB,WAAW,cAAc,gBAAgB,QAAQ;AACjF,YAAM,SAAS,UAAU,WAAW,cAAc,UAAU,QAAQ;AACpE,YAAM,gBAAgB,SAAS,UAAU,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,KAAK,CAAC;AAC9E,YAAM,aAAa,cAAc,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,CAAC;AAEjE,UAAI,WAAW,GAAG;AAChB,cAAM,OAAO,SAAS,WAAW,MAAM,IAAI;AAC3C,cAAM,YAAY,SACd,OAAO,OAAO,CAAC,KAAK,MAAM,MAAM,UAAU,EAAE,SAAS,GAAG,CAAC,IACzD;AACJ,cAAM,WAAW,SACb,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,UAAU,EAAE,SAAS,CAAC,CAAC,IACrD;AAEJ,kBAAU;AAAA,UACR,SAAS,cAAc,IAAI,CAAC,OAAO;AAAA,YACjC,UAAU,EAAE;AAAA,YACZ,OAAO,EAAE;AAAA,YACT,QAAQ,EAAE;AAAA,YACV,KAAK,EAAE;AAAA,UACT,EAAE;AAAA,UACF;AAAA,UACA,UAAU,SACN;AAAA,YACE,iBAAiB,OAAO;AAAA,YACxB,gBAAgB,OAAO,UAAU,QAAQ,CAAC,CAAC;AAAA,YAC3C,aAAa,OAAO,SAAS,QAAQ,CAAC,CAAC;AAAA,YACvC,YAAY,OACR;AAAA,cACE,MAAM,KAAK;AAAA,cACX,UAAU,KAAK;AAAA,cACf,WAAW,UAAU,KAAK,SAAS;AAAA,cACnC,WAAW,UAAU,KAAK,SAAS;AAAA,cACnC,OAAO,QAAQ,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,GAAG,QAAQ,CAAC,CAAC;AAAA,YAC5E,IACA;AAAA,UACN,IACA;AAAA,QACN,CAAC;AACD;AAAA,MACF;AAEA,kBAAY,uBAAuB;AAGnC,gBAAUH,IAAG,KAAK,SAAS,IAAIA,IAAG,IAAI,uBAAkB,CAAC;AACzD,mBAAa;AAEb,UAAI,cAAc,SAAS,GAAG;AAC5B,mBAAW,OAAO,eAAe;AAC/B,gBAAM,aAAc,IAAI,SAAS,IAAI,MAAM,MAAO;AAClD,wBAAc,IAAI,UAAU,GAAGI,WAAU,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,CAAC,OAAO;AAChG,cAAI,aAAa,MAAQ;AACvB,kBAAM,WAAW,aAAa,OAAO,IAAI,WAAW,QAAQ,CAAC,CAAC,KAAKA,WAAU,UAAU;AACvF,kBAAM,aAAa,aAAa,KAAK,OAAO,KAAK,aAAa,IAAI,QAAQ,CAAC,CAAC,KAAKA,WAAU,aAAa,EAAE;AAC1G,sBAAUJ,IAAG,IAAI,QAAQ,QAAQ,cAAW,UAAU,QAAQ,CAAC;AAAA,UACjE;AAAA,QACF;AACA,YAAI,cAAc,SAAS,GAAG;AAC5B,qBAAW;AACX,wBAAc,eAAeI,WAAU,UAAU,CAAC;AAAA,QACpD;AAAA,MACF,WAAW,SAAS;AAClB,kBAAU,wEAAmE;AAAA,MAC/E,OAAO;AACL,kBAAU,0BAA0B;AAAA,MACtC;AAEA,iBAAW;AAGX,gBAAUJ,IAAG,KAAK,mBAAmB,IAAIA,IAAG,IAAI,4BAAuB,CAAC;AACxE,mBAAa;AAEb,UAAI,UAAU,OAAO,SAAS,GAAG;AAC/B,cAAM,YAAY,OAAO,OAAO,CAAC,KAAK,MAAM,MAAM,UAAU,EAAE,SAAS,GAAG,CAAC;AAC3E,cAAM,WAAW,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,UAAU,EAAE,SAAS,CAAC,CAAC;AACtE,cAAM,OAAO,WAAW,MAAM;AAE9B,sBAAc,UAAU,GAAG,OAAO,MAAM,YAAY;AACpD,sBAAc,eAAe,GAAG,UAAU,QAAQ,CAAC,CAAC,gBAAgB;AACpE,sBAAc,gBAAgB,GAAG,SAAS,QAAQ,CAAC,CAAC,MAAM;AAE1D,YAAI,MAAM;AACR,gBAAM,SAAS,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,GAAG,QAAQ,CAAC;AACzE,wBAAc,eAAe,GAAG,KAAK,IAAI,WAAM,UAAU,KAAK,SAAS,EAAE,QAAQ,CAAC,CAAC,cAAc,KAAK,UAAU;AAAA,QAClH;AAAA,MACF,WAAW,QAAQ;AACjB,kBAAU,8BAA8B;AAAA,MAC1C,OAAO;AACL,kBAAU,2BAA2B;AAAA,MACvC;AAEA,iBAAW;AAGX,gBAAUA,IAAG,KAAK,eAAe,CAAC;AAClC,mBAAa;AACb,gBAAU,KAAKA,IAAG,IAAI,6BAA6B,CAAC,iCAAiC;AACrF,gBAAU,KAAKA,IAAG,IAAI,qBAAqB,CAAC,sCAAsC;AAClF,gBAAU,KAAKA,IAAG,IAAI,4BAA4B,CAAC,wBAAwB;AAC3E,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACvJA,OAAOK,UAAQ;AACf,OAAO,cAAc;AACrB,SAAS,SAAAC,SAAO,aAAAC,YAAW,oBAAAC,yBAAwB;AAgBnD,eAAeC,SAAQ,SAAmC;AACxD,QAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AACpF,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,OAAG,SAAS,KAAK,OAAO,WAAW,CAAC,WAAW;AAC7C,SAAG,MAAM;AACT,MAAAA,SAAQ,OAAO,YAAY,MAAM,OAAO,OAAO,YAAY,MAAM,KAAK;AAAA,IACxE,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,kBAAkBC,UAAkB;AAClD,EAAAA,SACG,QAAQ,WAAW,EACnB,YAAY,sFAAiF,EAC7F,OAAO,gBAAgB,eAAe,EACtC,OAAO,aAAa,0CAA0C,EAC9D,OAAO,oBAAoB,oDAAoD,KAAK,EACpF,OAAO,2BAA2B,2DAA2D,IAAI,EACjG,OAAO,SAAS,0BAA0B,EAC1C,OAAO,OAAO,SAAS;AACtB,QAAI;AACF,YAAM,MAAM,MAAM,WAAW;AAC7B,YAAM,QAAQ,MAAMC,QAAM,OAAO,EAAE,KAAK,SAAS,KAAK,IAAI,CAAC;AAC3D,YAAM,eAAe,WAAW,KAAK,WAAW,KAAK;AACrD,YAAM,eAAe,SAAS,KAAK,gBAAgB,MAAM,EAAE;AAE3D,YAAM,OAAO,MAAM,MAAM,UAAU;AAAA,QACjC,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF,CAAC;AAED,UAAI,WAAW,GAAG;AAChB,YAAI,KAAK,QAAQ;AACf,oBAAU,IAAI;AAAA,QAChB,OAAO;AACL,gBAAMC,UAAS,MAAM,MAAM,UAAU,EAAE,QAAQ,OAAO,cAAc,aAAa,CAAC;AAClF,oBAAUA,OAAM;AAAA,QAClB;AACA;AAAA,MACF;AAEA,iBAAW;AAEX,UAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,cAAM,OAAO,KAAK,SAAS,KAAK;AAChC,YAAI,OAAO,cAAc;AACvB,oBAAU,4BAAuB,KAAK,WAAW,QAAQ,CAAC,CAAC,YAAY,KAAK,YAAY,EAAE;AAC1F,oBAAUC,KAAG,IAAI,qBAAqB,KAAK,OAAO,QAAQ,CAAC,CAAC,MAAM,aAAa,KAAK,OAAO,CAAC,OAAO,KAAK,UAAU,GAAG,CAAC;AACtH,oBAAUA,KAAG,IAAI,iBAAiB,KAAK,QAAQ,CAAC,CAAC,YAAY,YAAY,cAAc,CAAC;AAAA,QAC1F,WAAW,KAAK,gBAAgB,gBAAgB,KAAK,oBAAoB,GAAG;AAC1E,oBAAU,gCAA2B,KAAK,aAAa,iBAAiB,YAAY,YAAY;AAChG,oBAAUA,KAAG,IAAI,KAAK,aAAa,KAAK,SAAS,CAAC,OAAO,KAAK,YAAY,KAAK,KAAK,WAAW,QAAQ,CAAC,CAAC,aAAQ,aAAa,KAAK,OAAO,CAAC,OAAO,KAAK,UAAU,KAAK,KAAK,OAAO,QAAQ,CAAC,CAAC,IAAI,CAAC;AAAA,QACnM,OAAO;AACL,oBAAU,iDAAiD;AAAA,QAC7D;AACA,mBAAW;AACX;AAAA,MACF;AAEA,gBAAUA,KAAG,KAAK,gBAAgB,CAAC;AACnC,mBAAa;AACb,oBAAc,QAAQ,GAAG,aAAa,KAAK,SAAS,CAAC,OAAO,KAAK,YAAY,KAAK,KAAK,WAAW,QAAQ,CAAC,CAAC,QAAQ;AACpH,oBAAc,MAAM,GAAG,aAAa,KAAK,OAAO,CAAC,OAAO,KAAK,UAAU,KAAK,KAAK,OAAO,QAAQ,CAAC,CAAC,QAAQ;AAC1G,oBAAc,UAAUC,WAAU,KAAK,MAAM,CAAC;AAC9C,iBAAW;AAEX,gBAAUD,KAAG,KAAK,WAAW,CAAC;AAC9B,mBAAa;AACb,oBAAc,YAAY,KAAK,KAAK,SAAS,KAAK,YAAY,QAAQ,CAAC,CAAC,GAAG;AAC3E,oBAAc,eAAe,GAAGC,WAAU,KAAK,UAAU,CAAC,OAAO;AACjE,UAAI,KAAK,oBAAoB,GAAG;AAC9B,sBAAc,aAAa,IAAIA,WAAU,KAAK,iBAAiB,CAAC,EAAE;AAClE,sBAAc,cAAc,GAAG,KAAK,aAAa,OAAO;AAAA,MAC1D;AACA,iBAAW;AAEX,UAAI,KAAK,MAAM,SAAS,GAAG;AACzB,kBAAUD,KAAG,KAAK,OAAO,CAAC;AAC1B,qBAAa;AACb,iBAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AAC1C,gBAAM,OAAO,KAAK,MAAM,CAAC;AACzB,gBAAM,MAAM,GAAG,IAAI,CAAC;AACpB,cAAI,KAAK,WAAW,YAAY;AAC9B,sBAAU,KAAK,GAAG,aAAaC,WAAU,KAAK,MAAM,CAAC,IAAI,aAAa,KAAK,aAAa,EAAE,CAAC,SAAS,KAAK,QAAQ,EAAE;AAAA,UACrH,WAAW,KAAK,WAAW,QAAQ;AACjC,sBAAU,KAAK,GAAG,SAAS,aAAa,KAAK,aAAa,EAAE,CAAC,WAAM,aAAa,KAAK,WAAW,EAAE,CAAC,MAAMA,WAAU,KAAK,mBAAmB,CAAC,CAAC,GAAG;AAAA,UAClJ,WAAW,KAAK,WAAW,WAAW;AACpC,sBAAU,KAAK,GAAG,YAAYA,WAAU,KAAK,MAAM,CAAC,IAAI,aAAa,KAAK,WAAW,EAAE,CAAC,SAAS,KAAK,QAAQ,EAAE;AAAA,UAClH;AAAA,QACF;AACA,mBAAW;AAAA,MACb;AAEA,UAAI,KAAK,QAAQ;AACf,kBAAUD,KAAG,KAAKA,KAAG,OAAO,uDAAkD,CAAC,CAAC;AAChF,kBAAUA,KAAG,IAAI,qCAAqC,CAAC;AACvD,mBAAW;AACX;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,KAAK;AACb,cAAM,UAAU,MAAML,SAAQ,yBAAyB;AACvD,YAAI,CAAC,SAAS;AACZ,oBAAU,YAAY;AACtB,qBAAW;AACX;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,MAAM,UAAU,EAAE,QAAQ,OAAO,cAAc,aAAa,CAAC;AAElF,UAAI,OAAO,UAAU;AACnB,qBAAa,cAAcM,WAAU,OAAO,MAAM,CAAC,WAAM,OAAO,OAAO,QAAQ,CAAC,CAAC,OAAO;AACxF,mBAAW,UAAU,OAAO,WAAW;AACrC,wBAAc,MAAM,YAAY,MAAM,CAAC;AAAA,QACzC;AACA,sBAAc,OAAO,GAAG,OAAO,aAAa,QAAQ,CAAC,CAAC,MAAM;AAAA,MAC9D;AAEA,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAOC,kBAAiB,KAAsC,GAAG,eAAe;AAClF;;;A3BhJA,IAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,EAAE,SAAS,YAAY,IAAIA,SAAQ,iBAAiB;AA2BnD,SAAS,gBAAyB;AACvC,QAAMC,WAAU,IAAI,QAAQ;AAE5B,EAAAA,SACG,KAAK,OAAO,EACZ,YAAY,sCAAsC,EAClD,QAAQ,GAAG,WAAW,SAAS,EAC/B,OAAO,UAAU,uBAAuB,EACxC,KAAK,aAAa,CAAC,gBAAgB;AAClC,UAAM,OAAO,YAAY,gBAAgB;AACzC,QAAI,KAAK,KAAM,aAAY,IAAI;AAAA,EACjC,CAAC;AAEH,eAAaA,QAAO;AACpB,eAAaA,QAAO;AACpB,kBAAgBA,QAAO;AACvB,kBAAgBA,QAAO;AACvB,kBAAgBA,QAAO;AACvB,kBAAgBA,QAAO;AACvB,iBAAeA,QAAO;AACtB,iBAAeA,QAAO;AACtB,eAAaA,QAAO;AACpB,mBAAiBA,QAAO;AACxB,iBAAeA,QAAO;AACtB,gBAAcA,QAAO;AACrB,iBAAeA,QAAO;AACtB,gBAAcA,QAAO;AACrB,oBAAkBA,QAAO;AACzB,eAAaA,QAAO;AACpB,mBAAiBA,QAAO;AACxB,qBAAmBA,QAAO;AAC1B,iBAAeA,QAAO;AACtB,gBAAcA,QAAO;AACrB,cAAYA,QAAO;AACnB,eAAaA,QAAO;AACpB,mBAAiBA,QAAO;AACxB,eAAaA,QAAO;AACpB,oBAAkBA,QAAO;AAEzB,SAAOA;AACT;;;A4BtEA,IAAM,UAAU,cAAc;AAC9B,QAAQ,MAAM;","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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t2000/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
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,11 +37,11 @@
|
|
|
37
37
|
"commander": "^13",
|
|
38
38
|
"hono": "^4",
|
|
39
39
|
"picocolors": "^1",
|
|
40
|
-
"@t2000/
|
|
41
|
-
"@t2000/
|
|
40
|
+
"@t2000/sdk": "0.8.0",
|
|
41
|
+
"@t2000/x402": "0.3.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@types/node": "^
|
|
44
|
+
"@types/node": "^20",
|
|
45
45
|
"eslint": "^9",
|
|
46
46
|
"tsup": "^8",
|
|
47
47
|
"typescript": "^5"
|