@t2000/cli 0.10.0 → 0.10.2

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 CHANGED
@@ -79,11 +79,11 @@ t2000 init
79
79
  Tx: https://suiscan.xyz/mainnet/tx/0xf9a0...
80
80
 
81
81
  ❯ t2000 balance
82
- Available: $85.00 USDC (checking — spendable)
83
- Savings: $0.00 USDC
82
+ Available: $85.00 (checking — spendable)
83
+ Savings: $0.00
84
84
  Gas: 0.31 SUI (~$0.28)
85
85
  ──────────────────────────────────────
86
- Total: $85.28 USDC
86
+ Total: $85.28
87
87
  ```
88
88
 
89
89
  30 seconds. Send → save → borrow → pay → repay → withdraw.
@@ -120,6 +120,7 @@ t2000 init
120
120
  | `t2000 borrow <amount>` | Borrow USDC against savings collateral |
121
121
  | `t2000 repay <amount>` | Repay outstanding USDC borrows. Use `repay all` for full repayment. |
122
122
  | `t2000 rebalance [--dry-run]` | Optimize yield — move savings to best rate across protocols and stablecoins internally |
123
+ | `t2000 exchange <amount> <from> <to>` | Exchange tokens via Cetus DEX (e.g. `t2000 exchange 5 USDC SUI`). Options: `--slippage <pct>` (default: 3%) |
123
124
  | `t2000 health` | Check savings health factor |
124
125
  | `t2000 rates` | Best save/borrow APYs across protocols and all stablecoins |
125
126
  | `t2000 positions` | Open savings & borrow positions across all assets |
@@ -227,7 +228,7 @@ All multi-step operations (save with auto-convert, withdraw with auto-swap, reba
227
228
  |-----------|-----|
228
229
  | Save | 0.1% |
229
230
  | Borrow | 0.05% |
230
- | Swap (internal) | **Free** |
231
+ | Exchange | **Free** |
231
232
  | Withdraw | Free |
232
233
  | Repay | Free |
233
234
  | Send | Free |
package/dist/index.js CHANGED
@@ -250,10 +250,24 @@ function registerBalance(program2) {
250
250
  printLine(` ${pc3.dim(symbol)} ${formatUsd2(amount)}`);
251
251
  }
252
252
  }
253
- printKeyValue("Savings", `${formatUsd2(bal.savings)}`);
254
- printKeyValue("Gas", `${bal.gasReserve.sui.toFixed(2)} SUI ${pc3.dim(`(~${formatUsd2(bal.gasReserve.usdEquiv)})`)}`);
255
- printSeparator();
256
- printKeyValue("Total", `${formatUsd2(bal.total)}`);
253
+ if (bal.savings > 0.01) {
254
+ const positions = await agent.positions();
255
+ const saves = positions.positions.filter((p) => p.type === "save");
256
+ const weightedApy = saves.length > 0 ? saves.reduce((sum, p) => sum + p.amount * p.apy, 0) / saves.reduce((sum, p) => sum + p.amount, 0) : 0;
257
+ const dailyEarning = bal.savings * (weightedApy / 100) / 365;
258
+ printKeyValue("Savings", `${formatUsd2(bal.savings)} ${pc3.dim(`(earning ${weightedApy.toFixed(2)}% APY)`)}`);
259
+ printKeyValue("Gas", `${bal.gasReserve.sui.toFixed(2)} SUI ${pc3.dim(`(~${formatUsd2(bal.gasReserve.usdEquiv)})`)}`);
260
+ printSeparator();
261
+ printKeyValue("Total", `${formatUsd2(bal.total)}`);
262
+ if (dailyEarning >= 5e-3) {
263
+ printLine(` ${pc3.dim(`Earning ~${formatUsd2(dailyEarning)}/day`)}`);
264
+ }
265
+ } else {
266
+ printKeyValue("Savings", `${formatUsd2(bal.savings)}`);
267
+ printKeyValue("Gas", `${bal.gasReserve.sui.toFixed(2)} SUI ${pc3.dim(`(~${formatUsd2(bal.gasReserve.usdEquiv)})`)}`);
268
+ printSeparator();
269
+ printKeyValue("Total", `${formatUsd2(bal.total)}`);
270
+ }
257
271
  if (limits) {
258
272
  printBlank();
259
273
  printHeader("Limits");
@@ -324,12 +338,12 @@ function registerHistory(program2) {
324
338
  }
325
339
  printHeader("Transaction History");
326
340
  if (txns.length === 0) {
327
- console.log(" No transactions yet.");
341
+ printInfo("No transactions yet.");
328
342
  } else {
329
343
  for (const tx of txns) {
330
344
  const time = tx.timestamp ? new Date(tx.timestamp).toLocaleString() : "unknown";
331
345
  const gas = tx.gasMethod ? ` (${tx.gasMethod})` : "";
332
- console.log(` ${truncateAddress2(tx.digest)} ${tx.action}${gas} ${time}`);
346
+ printLine(`${truncateAddress2(tx.digest)} ${tx.action}${gas} ${time}`);
333
347
  }
334
348
  }
335
349
  printBlank();
@@ -486,7 +500,7 @@ function registerSave(program2) {
486
500
  }
487
501
 
488
502
  // src/commands/withdraw.ts
489
- import { T2000 as T200010 } from "@t2000/sdk";
503
+ import { T2000 as T200010, formatUsd as formatUsd4 } from "@t2000/sdk";
490
504
  function registerWithdraw(program2) {
491
505
  program2.command("withdraw").description("Withdraw USDC from savings").argument("<amount>", 'Amount to withdraw (or "all")').option("--key <path>", "Key file path").option("--protocol <name>", "Protocol to use (e.g. navi, suilend)").action(async (amountStr, opts) => {
492
506
  try {
@@ -502,7 +516,7 @@ function registerWithdraw(program2) {
502
516
  return;
503
517
  }
504
518
  printBlank();
505
- printSuccess(`Withdrew $${result.amount.toFixed(2)} USDC`);
519
+ printSuccess(`Withdrew ${formatUsd4(result.amount)} USDC`);
506
520
  printKeyValue("Tx", explorerUrl(result.tx));
507
521
  printBlank();
508
522
  } catch (error) {
@@ -512,7 +526,7 @@ function registerWithdraw(program2) {
512
526
  }
513
527
 
514
528
  // src/commands/borrow.ts
515
- import { T2000 as T200011 } from "@t2000/sdk";
529
+ import { T2000 as T200011, formatUsd as formatUsd5 } from "@t2000/sdk";
516
530
  function registerBorrow(program2) {
517
531
  program2.command("borrow").description("Borrow USDC against savings collateral").argument("<amount>", "Amount to borrow").option("--key <path>", "Key file path").option("--protocol <name>", "Protocol to use (e.g. navi)").action(async (amountStr, opts) => {
518
532
  try {
@@ -524,7 +538,7 @@ function registerBorrow(program2) {
524
538
  const agent = await T200011.create({ pin, keyPath: opts.key });
525
539
  const maxResult = await agent.maxBorrow();
526
540
  if (amount > maxResult.maxAmount) {
527
- printWarning(`Max safe borrow: $${maxResult.maxAmount.toFixed(2)} (HF ${maxResult.currentHF.toFixed(2)} \u2192 min 1.5)`);
541
+ printWarning(`Max safe borrow: ${formatUsd5(maxResult.maxAmount)} (HF ${maxResult.currentHF.toFixed(2)} \u2192 min 1.5)`);
528
542
  return;
529
543
  }
530
544
  const result = await agent.borrow({ amount, protocol: opts.protocol });
@@ -533,7 +547,7 @@ function registerBorrow(program2) {
533
547
  return;
534
548
  }
535
549
  printBlank();
536
- printSuccess(`Borrowed $${amount.toFixed(2)} USDC`);
550
+ printSuccess(`Borrowed ${formatUsd5(amount)} USDC`);
537
551
  printKeyValue("Health Factor", result.healthFactor.toFixed(2));
538
552
  printKeyValue("Tx", explorerUrl(result.tx));
539
553
  printBlank();
@@ -544,7 +558,7 @@ function registerBorrow(program2) {
544
558
  }
545
559
 
546
560
  // src/commands/repay.ts
547
- import { T2000 as T200012 } from "@t2000/sdk";
561
+ import { T2000 as T200012, formatUsd as formatUsd6 } from "@t2000/sdk";
548
562
  function registerRepay(program2) {
549
563
  program2.command("repay").description("Repay borrowed USDC").argument("<amount>", 'Amount to repay (or "all")').option("--key <path>", "Key file path").option("--protocol <name>", "Protocol to use (e.g. navi)").action(async (amountStr, opts) => {
550
564
  try {
@@ -560,8 +574,8 @@ function registerRepay(program2) {
560
574
  return;
561
575
  }
562
576
  printBlank();
563
- printSuccess(`Repaid $${result.amount.toFixed(2)} USDC`);
564
- printKeyValue("Remaining Debt", `$${result.remainingDebt.toFixed(2)}`);
577
+ printSuccess(`Repaid ${formatUsd6(result.amount)} USDC`);
578
+ printKeyValue("Remaining Debt", formatUsd6(result.remainingDebt));
565
579
  printKeyValue("Tx", explorerUrl(result.tx));
566
580
  printBlank();
567
581
  } catch (error) {
@@ -571,7 +585,7 @@ function registerRepay(program2) {
571
585
  }
572
586
 
573
587
  // src/commands/health.ts
574
- import { T2000 as T200013 } from "@t2000/sdk";
588
+ import { T2000 as T200013, formatUsd as formatUsd7 } from "@t2000/sdk";
575
589
  function registerHealth(program2) {
576
590
  program2.command("health").description("Check savings health factor").option("--key <path>", "Key file path").action(async (opts) => {
577
591
  try {
@@ -594,9 +608,9 @@ function registerHealth(program2) {
594
608
  printError(`Health Factor: ${hfStr} (CRITICAL)`);
595
609
  }
596
610
  printBlank();
597
- printKeyValue("Supplied", `$${hf.supplied.toFixed(2)} USDC`);
598
- printKeyValue("Borrowed", `$${hf.borrowed.toFixed(2)} USDC`);
599
- printKeyValue("Max Borrow", `$${hf.maxBorrow.toFixed(2)} USDC`);
611
+ printKeyValue("Supplied", `${formatUsd7(hf.supplied)} USDC`);
612
+ printKeyValue("Borrowed", `${formatUsd7(hf.borrowed)} USDC`);
613
+ printKeyValue("Max Borrow", `${formatUsd7(hf.maxBorrow)} USDC`);
600
614
  printBlank();
601
615
  } catch (error) {
602
616
  handleError(error);
@@ -648,7 +662,7 @@ function registerRates(program2) {
648
662
 
649
663
  // src/commands/positions.ts
650
664
  import pc6 from "picocolors";
651
- import { T2000 as T200015, formatUsd as formatUsd4 } from "@t2000/sdk";
665
+ import { T2000 as T200015, formatUsd as formatUsd8 } from "@t2000/sdk";
652
666
  function registerPositions(program2) {
653
667
  program2.command("positions").description("Show savings & borrow positions across all protocols and assets").option("--key <path>", "Key file path").action(async (opts) => {
654
668
  try {
@@ -669,11 +683,11 @@ function registerPositions(program2) {
669
683
  printLine(pc6.bold("Savings"));
670
684
  printDivider();
671
685
  for (const pos of saves) {
672
- printKeyValue(pos.protocol, `${formatUsd4(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(1)}% APY`);
686
+ printKeyValue(pos.protocol, `${formatUsd8(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(2)}% APY`);
673
687
  }
674
688
  const totalSaved = saves.reduce((s, p) => s + p.amount, 0);
675
689
  if (saves.length > 1) {
676
- printKeyValue("Total", formatUsd4(totalSaved));
690
+ printKeyValue("Total", formatUsd8(totalSaved));
677
691
  }
678
692
  printBlank();
679
693
  }
@@ -681,16 +695,15 @@ function registerPositions(program2) {
681
695
  printLine(pc6.bold("Borrows"));
682
696
  printDivider();
683
697
  for (const pos of borrows) {
684
- printKeyValue(pos.protocol, `${formatUsd4(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(1)}% APY`);
698
+ printKeyValue(pos.protocol, `${formatUsd8(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(2)}% APY`);
685
699
  }
686
700
  const totalBorrowed = borrows.reduce((s, p) => s + p.amount, 0);
687
701
  if (borrows.length > 1) {
688
- printKeyValue("Total", formatUsd4(totalBorrowed));
702
+ printKeyValue("Total", formatUsd8(totalBorrowed));
689
703
  }
690
704
  printBlank();
691
705
  }
692
706
  }
693
- printBlank();
694
707
  } catch (error) {
695
708
  handleError(error);
696
709
  }
@@ -699,7 +712,7 @@ function registerPositions(program2) {
699
712
 
700
713
  // src/commands/earnings.ts
701
714
  import pc7 from "picocolors";
702
- import { T2000 as T200016 } from "@t2000/sdk";
715
+ import { T2000 as T200016, formatUsd as formatUsd9 } from "@t2000/sdk";
703
716
  function registerEarnings(program2) {
704
717
  program2.command("earnings").description("Show yield earned to date").option("--key <path>", "Key file path").action(async (opts) => {
705
718
  try {
@@ -713,15 +726,15 @@ function registerEarnings(program2) {
713
726
  return;
714
727
  }
715
728
  printBlank();
716
- printKeyValue("Total Saved", `$${result.supplied.toFixed(2)}`);
729
+ printKeyValue("Total Saved", formatUsd9(result.supplied));
717
730
  if (savePositions.length > 0) {
718
731
  for (const p of savePositions) {
719
- console.log(` ${pc7.dim("\u2022")} $${p.amount.toFixed(2)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(1)}% APY`);
732
+ printLine(` ${pc7.dim("\u2022")} ${formatUsd9(p.amount)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(2)}% APY`);
720
733
  }
721
734
  }
722
735
  printKeyValue("Blended APY", `${result.currentApy.toFixed(2)}%`);
723
- printKeyValue("Daily Yield", `~$${result.dailyEarning.toFixed(4)}/day`);
724
- printKeyValue("Est. Earned", `~$${result.totalYieldEarned.toFixed(4)}`);
736
+ printKeyValue("Daily Yield", `~${formatUsd9(result.dailyEarning)}/day`);
737
+ printKeyValue("Est. Earned", `~${formatUsd9(result.totalYieldEarned)}`);
725
738
  printBlank();
726
739
  } catch (error) {
727
740
  handleError(error);
@@ -731,7 +744,7 @@ function registerEarnings(program2) {
731
744
 
732
745
  // src/commands/fundStatus.ts
733
746
  import pc8 from "picocolors";
734
- import { T2000 as T200017 } from "@t2000/sdk";
747
+ import { T2000 as T200017, formatUsd as formatUsd10 } from "@t2000/sdk";
735
748
  function registerFundStatus(program2) {
736
749
  program2.command("fund-status").description("Full savings summary").option("--key <path>", "Key file path").action(async (opts) => {
737
750
  try {
@@ -748,22 +761,22 @@ function registerFundStatus(program2) {
748
761
  if (result.supplied > 0) {
749
762
  printSuccess("Savings: ACTIVE");
750
763
  } else {
751
- console.log(" Savings: INACTIVE \u2014 run `t2000 save <amount>` to start earning");
764
+ printInfo("Savings: INACTIVE \u2014 run `t2000 save <amount>` to start earning");
752
765
  }
753
766
  printBlank();
754
- printKeyValue("Total Saved", `$${result.supplied.toFixed(2)}`);
767
+ printKeyValue("Total Saved", formatUsd10(result.supplied));
755
768
  if (savePositions.length > 0) {
756
769
  for (const p of savePositions) {
757
- console.log(` ${pc8.dim("\u2022")} $${p.amount.toFixed(2)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(1)}% APY`);
770
+ printLine(` ${pc8.dim("\u2022")} ${formatUsd10(p.amount)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(2)}% APY`);
758
771
  }
759
772
  }
760
- printKeyValue("Blended APY", `${result.apy.toFixed(1)}%`);
761
- printKeyValue("Earned today", `~$${result.earnedToday.toFixed(4)}`);
762
- printKeyValue("Earned all time", `~$${result.earnedAllTime.toFixed(4)}`);
763
- printKeyValue("Monthly projected", `~$${result.projectedMonthly.toFixed(2)}/month`);
773
+ printKeyValue("Blended APY", `${result.apy.toFixed(2)}%`);
774
+ printKeyValue("Earned today", `~${formatUsd10(result.earnedToday)}`);
775
+ printKeyValue("Earned all time", `~${formatUsd10(result.earnedAllTime)}`);
776
+ printKeyValue("Monthly projected", `~${formatUsd10(result.projectedMonthly)}/month`);
764
777
  printBlank();
765
778
  if (result.supplied > 0) {
766
- console.log(" Withdraw anytime: t2000 withdraw <amount>");
779
+ printInfo("Withdraw anytime: t2000 withdraw <amount>");
767
780
  }
768
781
  printBlank();
769
782
  } catch (error) {
@@ -805,7 +818,7 @@ function registerConfig(program2) {
805
818
  printKeyValue(key, String(config[key] ?? "(not set)"));
806
819
  } else {
807
820
  if (Object.keys(config).length === 0) {
808
- console.log(" No configuration set.");
821
+ printInfo("No configuration set.");
809
822
  } else {
810
823
  for (const [k, v] of Object.entries(config)) {
811
824
  printKeyValue(k, String(v));
@@ -830,7 +843,9 @@ function registerConfig(program2) {
830
843
  printJson({ [key]: parsed });
831
844
  return;
832
845
  }
833
- console.log(` Set ${key} = ${String(parsed)}`);
846
+ printBlank();
847
+ printSuccess(`Set ${key} = ${String(parsed)}`);
848
+ printBlank();
834
849
  } catch (error) {
835
850
  handleError(error);
836
851
  }
@@ -1343,7 +1358,7 @@ function registerSentinel(program2) {
1343
1358
  if (result.won) {
1344
1359
  printSuccess(`BREACHED! (score: ${result.verdict.score}/100)`);
1345
1360
  } else {
1346
- printLine(` ${pc10.red("\u2717")} DEFENDED (score: ${result.verdict.score}/100)`);
1361
+ printError(`DEFENDED (score: ${result.verdict.score}/100)`);
1347
1362
  }
1348
1363
  printBlank();
1349
1364
  printKeyValue("Agent", result.verdict.agentResponse.slice(0, 200));
@@ -1363,7 +1378,7 @@ function registerSentinel(program2) {
1363
1378
  }
1364
1379
 
1365
1380
  // src/commands/earn.ts
1366
- import { T2000 as T200021, MIST_PER_SUI as MIST_PER_SUI2, listSentinels, formatUsd as formatUsd5 } from "@t2000/sdk";
1381
+ import { T2000 as T200021, MIST_PER_SUI as MIST_PER_SUI2, listSentinels, formatUsd as formatUsd11 } from "@t2000/sdk";
1367
1382
  import pc11 from "picocolors";
1368
1383
  function mistToSui(mist) {
1369
1384
  return Number(mist) / Number(MIST_PER_SUI2);
@@ -1423,16 +1438,16 @@ function registerEarn(program2) {
1423
1438
  if (savePositions.length > 0) {
1424
1439
  for (const pos of savePositions) {
1425
1440
  const dailyYield = pos.amount * pos.apy / 100 / 365;
1426
- printKeyValue(pos.protocol, `${formatUsd5(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(1)}% APY`);
1441
+ printKeyValue(pos.protocol, `${formatUsd11(pos.amount)} ${pos.asset} @ ${pos.apy.toFixed(2)}% APY`);
1427
1442
  if (dailyYield > 1e-4) {
1428
- const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` : formatUsd5(dailyYield);
1429
- const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` : formatUsd5(dailyYield * 30);
1443
+ const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` : formatUsd11(dailyYield);
1444
+ const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` : formatUsd11(dailyYield * 30);
1430
1445
  printLine(pc11.dim(` ~${dailyStr}/day \xB7 ~${monthlyStr}/month`));
1431
1446
  }
1432
1447
  }
1433
1448
  if (savePositions.length > 1) {
1434
1449
  printBlank();
1435
- printKeyValue("Total Saved", formatUsd5(totalSaved));
1450
+ printKeyValue("Total Saved", formatUsd11(totalSaved));
1436
1451
  }
1437
1452
  } else if (posData) {
1438
1453
  printInfo("No savings yet \u2014 run `t2000 save <amount>` to start earning yield");
@@ -1473,7 +1488,7 @@ function registerEarn(program2) {
1473
1488
 
1474
1489
  // src/commands/rebalance.ts
1475
1490
  import pc12 from "picocolors";
1476
- import { T2000 as T200022, formatUsd as formatUsd6, SUPPORTED_ASSETS as SUPPORTED_ASSETS2 } from "@t2000/sdk";
1491
+ import { T2000 as T200022, formatUsd as formatUsd12, SUPPORTED_ASSETS as SUPPORTED_ASSETS2 } from "@t2000/sdk";
1477
1492
  function registerRebalance(program2) {
1478
1493
  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").action(async (opts) => {
1479
1494
  try {
@@ -1515,14 +1530,14 @@ function registerRebalance(program2) {
1515
1530
  printDivider();
1516
1531
  printKeyValue("From", `${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}% APY)`);
1517
1532
  printKeyValue("To", `${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}% APY)`);
1518
- printKeyValue("Amount", formatUsd6(plan.amount));
1533
+ printKeyValue("Amount", formatUsd12(plan.amount));
1519
1534
  printBlank();
1520
1535
  printLine(pc12.bold("Economics"));
1521
1536
  printDivider();
1522
1537
  printKeyValue("APY Gain", `+${(plan.newApy - plan.currentApy).toFixed(2)}%`);
1523
- printKeyValue("Annual Gain", `${formatUsd6(plan.annualGain)}/year`);
1538
+ printKeyValue("Annual Gain", `${formatUsd12(plan.annualGain)}/year`);
1524
1539
  if (plan.estimatedSwapCost > 0) {
1525
- printKeyValue("Swap Cost", `~${formatUsd6(plan.estimatedSwapCost)}`);
1540
+ printKeyValue("Swap Cost", `~${formatUsd12(plan.estimatedSwapCost)}`);
1526
1541
  printKeyValue("Break-even", `${plan.breakEvenDays} days`);
1527
1542
  }
1528
1543
  printBlank();
@@ -1533,11 +1548,11 @@ function registerRebalance(program2) {
1533
1548
  const step = plan.steps[i];
1534
1549
  const num = `${i + 1}.`;
1535
1550
  if (step.action === "withdraw") {
1536
- printLine(` ${num} Withdraw ${formatUsd6(step.amount)} ${displayAsset(step.fromAsset ?? "")} from ${step.protocol}`);
1551
+ printLine(` ${num} Withdraw ${formatUsd12(step.amount)} ${displayAsset(step.fromAsset ?? "")} from ${step.protocol}`);
1537
1552
  } else if (step.action === "swap") {
1538
- printLine(` ${num} Swap ${displayAsset(step.fromAsset ?? "")} \u2192 ${displayAsset(step.toAsset ?? "")} (~${formatUsd6(step.estimatedOutput ?? 0)})`);
1553
+ printLine(` ${num} Swap ${displayAsset(step.fromAsset ?? "")} \u2192 ${displayAsset(step.toAsset ?? "")} (~${formatUsd12(step.estimatedOutput ?? 0)})`);
1539
1554
  } else if (step.action === "deposit") {
1540
- printLine(` ${num} Deposit ${formatUsd6(step.amount)} ${displayAsset(step.toAsset ?? "")} into ${step.protocol}`);
1555
+ printLine(` ${num} Deposit ${formatUsd12(step.amount)} ${displayAsset(step.toAsset ?? "")} into ${step.protocol}`);
1541
1556
  }
1542
1557
  }
1543
1558
  printBlank();
@@ -1550,7 +1565,7 @@ function registerRebalance(program2) {
1550
1565
  }
1551
1566
  const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });
1552
1567
  if (result.executed) {
1553
- printSuccess(`Rebalanced ${formatUsd6(result.amount)} \u2192 ${result.newApy.toFixed(2)}% APY`);
1568
+ printSuccess(`Rebalanced ${formatUsd12(result.amount)} \u2192 ${result.newApy.toFixed(2)}% APY`);
1554
1569
  for (const digest of result.txDigests) {
1555
1570
  printKeyValue("Tx", explorerUrl(digest));
1556
1571
  }
@@ -1566,6 +1581,44 @@ function displayAsset(asset) {
1566
1581
  return SUPPORTED_ASSETS2[asset]?.displayName ?? asset;
1567
1582
  }
1568
1583
 
1584
+ // src/commands/exchange.ts
1585
+ import { T2000 as T200023, formatUsd as formatUsd13, SUPPORTED_ASSETS as SUPPORTED_ASSETS3 } from "@t2000/sdk";
1586
+ function registerExchange(program2) {
1587
+ program2.command("exchange <amount> <from> <to>").description("Exchange between tokens (e.g. USDC \u21CC SUI) via Cetus DEX").option("--key <path>", "Key file path").option("--slippage <pct>", "Max slippage percentage (default: 3)", "3").action(async (amount, from, to, opts) => {
1588
+ try {
1589
+ const pin = await resolvePin();
1590
+ const agent = await T200023.create({ pin, keyPath: opts.key });
1591
+ const fromAsset = from.toUpperCase();
1592
+ const toAsset = to.toUpperCase();
1593
+ const parsedAmount = parseFloat(amount);
1594
+ if (isNaN(parsedAmount) || parsedAmount <= 0) {
1595
+ throw new Error("Amount must be a positive number");
1596
+ }
1597
+ const result = await agent.exchange({
1598
+ from: fromAsset,
1599
+ to: toAsset,
1600
+ amount: parsedAmount,
1601
+ maxSlippage: parseFloat(opts.slippage ?? "3")
1602
+ });
1603
+ if (isJsonMode()) {
1604
+ printJson(result);
1605
+ return;
1606
+ }
1607
+ const fromDisplay = SUPPORTED_ASSETS3[fromAsset]?.displayName ?? fromAsset;
1608
+ const toDisplay = SUPPORTED_ASSETS3[toAsset]?.displayName ?? toAsset;
1609
+ const toDecimals = toAsset === "SUI" ? 4 : 2;
1610
+ printBlank();
1611
+ const fromStr = ["USDC", "USDT", "USDE"].includes(fromAsset) ? formatUsd13(parsedAmount) : parsedAmount.toFixed(4);
1612
+ printSuccess(`Exchanged ${fromStr} ${fromDisplay} \u2192 ${result.toAmount.toFixed(toDecimals)} ${toDisplay}`);
1613
+ printKeyValue("Tx", explorerUrl(result.tx));
1614
+ printKeyValue("Gas", `${result.gasCost.toFixed(4)} SUI (${result.gasMethod})`);
1615
+ printBlank();
1616
+ } catch (error) {
1617
+ handleError(error);
1618
+ }
1619
+ });
1620
+ }
1621
+
1569
1622
  // src/program.ts
1570
1623
  var require2 = createRequire(import.meta.url);
1571
1624
  var { version: CLI_VERSION } = require2("../package.json");
@@ -1599,6 +1652,7 @@ function createProgram() {
1599
1652
  registerSentinel(program2);
1600
1653
  registerEarn(program2);
1601
1654
  registerRebalance(program2);
1655
+ registerExchange(program2);
1602
1656
  return program2;
1603
1657
  }
1604
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/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 { 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 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, opts: { key?: string; protocol?: string }) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n let gasManagerUsdc = 0;\n agent.on('gasAutoTopUp', (data) => {\n gasManagerUsdc = data.usdcSpent;\n });\n\n const result = await agent.save({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n\n if (gasManagerUsdc > 0) {\n printSuccess(`Gas manager: ${pc.yellow(formatUsd(gasManagerUsdc))} USDC → SUI`);\n }\n\n const protocolName = opts.protocol ?? 'best rate';\n printSuccess(`Saved ${pc.yellow(formatUsd(result.amount))} USDC to ${protocolName}`);\n\n if (result.fee > 0) {\n const feeRate = (result.fee / result.amount * 100).toFixed(1);\n printSuccess(`Protocol fee: ${pc.dim(`${formatUsd(result.fee)} USDC (${feeRate}%)`)}`);\n }\n\n printSuccess(`Current APY: ${pc.green(`${result.apy.toFixed(2)}%`)}`);\n\n printSuccess(`Savings balance: ${pc.yellow(formatUsd(result.savingsBalance))} USDC`);\n\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n };\n\n program\n .command('save')\n .description('Deposit USDC into savings')\n .argument('<amount>', 'Amount to save (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(action);\n\n program\n .command('supply')\n .description('Deposit USDC into savings (alias for save)')\n .argument('<amount>', 'Amount to save (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(action);\n}\n","import type { Command } from 'commander';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerWithdraw(program: Command) {\n program\n .command('withdraw')\n .description('Withdraw USDC from savings')\n .argument('<amount>', 'Amount to withdraw (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(async (amountStr, opts) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.withdraw({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Withdrew $${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 to borrow')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, opts) => {\n try {\n const amount = parseFloat(amountStr);\n if (isNaN(amount) || amount <= 0) {\n throw new Error('Amount must be a positive number');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const maxResult = await agent.maxBorrow();\n if (amount > maxResult.maxAmount) {\n printWarning(`Max safe borrow: $${maxResult.maxAmount.toFixed(2)} (HF ${maxResult.currentHF.toFixed(2)} → min 1.5)`);\n return;\n }\n\n const result = await agent.borrow({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Borrowed $${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 to repay (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, opts) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.repay({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Repaid $${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, SUPPORTED_ASSETS } from '@t2000/sdk';\nimport type { SupportedAsset } from '@t2000/sdk';\n\nconst STABLE_ASSETS = (Object.keys(SUPPORTED_ASSETS) as SupportedAsset[]).filter(k => k !== 'SUI');\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine, printDivider } from '../output.js';\n\nexport function registerRates(program: Command) {\n program\n .command('rates')\n .description('Show current APY rates across protocols and stablecoins')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const allRates = await agent.allRatesAcrossAssets();\n\n if (isJsonMode()) {\n printJson(allRates);\n return;\n }\n\n printBlank();\n\n if (allRates.length > 0) {\n const best = allRates.reduce((a, b) => b.rates.saveApy > a.rates.saveApy ? b : a);\n const bestDisplay = SUPPORTED_ASSETS[best.asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? best.asset;\n printLine(pc.bold(pc.green(`Best yield: ${best.rates.saveApy.toFixed(2)}% APY`)) + pc.dim(` (${bestDisplay} on ${best.protocol})`));\n printBlank();\n }\n\n for (const asset of STABLE_ASSETS) {\n const assetRates = allRates.filter(r => r.asset === asset);\n if (assetRates.length === 0) continue;\n\n const display = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? asset;\n printLine(pc.bold(display));\n printDivider();\n for (const entry of assetRates) {\n printKeyValue(entry.protocol, `Save ${entry.rates.saveApy.toFixed(2)}% Borrow ${entry.rates.borrowApy.toFixed(2)}%`);\n }\n printBlank();\n }\n\n 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 pc from 'picocolors';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerEarnings(program: Command) {\n program\n .command('earnings')\n .description('Show yield earned to date')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.earnings();\n const pos = await agent.positions();\n const savePositions = pos.positions.filter((p) => p.type === 'save');\n\n if (isJsonMode()) {\n printJson({ ...result, positions: savePositions });\n return;\n }\n\n printBlank();\n printKeyValue('Total Saved', `$${result.supplied.toFixed(2)}`);\n\n if (savePositions.length > 0) {\n for (const p of savePositions) {\n console.log(` ${pc.dim('•')} $${p.amount.toFixed(2)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(1)}% APY`);\n }\n }\n\n printKeyValue('Blended APY', `${result.currentApy.toFixed(2)}%`);\n printKeyValue('Daily Yield', `~$${result.dailyEarning.toFixed(4)}/day`);\n printKeyValue('Est. Earned', `~$${result.totalYieldEarned.toFixed(4)}`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nexport function registerFundStatus(program: Command) {\n program\n .command('fund-status')\n .description('Full savings summary')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.fundStatus();\n const pos = await agent.positions();\n const savePositions = pos.positions.filter((p) => p.type === 'save');\n\n if (isJsonMode()) {\n printJson({ ...result, positions: savePositions });\n return;\n }\n\n printBlank();\n if (result.supplied > 0) {\n printSuccess('Savings: ACTIVE');\n } else {\n console.log(' Savings: INACTIVE — run `t2000 save <amount>` to start earning');\n }\n printBlank();\n printKeyValue('Total Saved', `$${result.supplied.toFixed(2)}`);\n\n if (savePositions.length > 0) {\n for (const p of savePositions) {\n console.log(` ${pc.dim('•')} $${p.amount.toFixed(2)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(1)}% APY`);\n }\n }\n\n printKeyValue('Blended APY', `${result.apy.toFixed(1)}%`);\n printKeyValue('Earned today', `~$${result.earnedToday.toFixed(4)}`);\n printKeyValue('Earned all time', `~$${result.earnedAllTime.toFixed(4)}`);\n printKeyValue('Monthly projected', `~$${result.projectedMonthly.toFixed(2)}/month`);\n printBlank();\n if (result.supplied > 0) {\n console.log(' Withdraw anytime: t2000 withdraw <amount>');\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError } from '../output.js';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\nconst CONFIG_PATH = join(CONFIG_DIR, 'config.json');\n\nfunction loadConfig(): Record<string, unknown> {\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nfunction saveConfig(config: Record<string, unknown>): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + '\\n');\n}\n\nexport function registerConfig(program: Command) {\n const configCmd = program\n .command('config')\n .description('Show or set configuration');\n\n configCmd\n .command('get')\n .argument('[key]', 'Config key to get (omit for all)')\n .action((key?: string) => {\n try {\n const config = loadConfig();\n\n if (isJsonMode()) {\n printJson(key ? { [key]: config[key] } : config);\n return;\n }\n\n printBlank();\n if (key) {\n printKeyValue(key, String(config[key] ?? '(not set)'));\n } else {\n if (Object.keys(config).length === 0) {\n console.log(' No configuration set.');\n } else {\n for (const [k, v] of Object.entries(config)) {\n printKeyValue(k, String(v));\n }\n }\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n configCmd\n .command('set')\n .argument('<key>', 'Config key')\n .argument('<value>', 'Config value')\n .action((key: string, value: string) => {\n try {\n const config = loadConfig();\n\n // Parse booleans and numbers\n let parsed: unknown = value;\n if (value === 'true') parsed = true;\n else if (value === 'false') parsed = false;\n else if (!isNaN(Number(value)) && value.trim() !== '') parsed = Number(value);\n\n config[key] = parsed;\n saveConfig(config);\n\n if (isJsonMode()) {\n printJson({ [key]: parsed });\n return;\n }\n\n console.log(` Set ${key} = ${String(parsed)}`);\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { randomBytes } from 'node:crypto';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { handleError } from '../output.js';\nimport { streamSSE } from 'hono/streaming';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\nconst TOKEN_PATH = join(CONFIG_DIR, 'config.json');\n\nfunction generateToken(): string {\n return `t2k_${randomBytes(24).toString('hex')}`;\n}\n\nfunction saveToken(token: string): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n let config: Record<string, unknown> = {};\n try {\n config = JSON.parse(readFileSync(TOKEN_PATH, 'utf-8'));\n } catch { /* empty */ }\n config.authToken = token;\n writeFileSync(TOKEN_PATH, JSON.stringify(config, null, 2) + '\\n');\n}\n\nfunction envelope(data: unknown) {\n return { success: true, data, timestamp: Math.floor(Date.now() / 1000) };\n}\n\nfunction errorResponse(code: string, message: string, data?: unknown, retryable = false) {\n return {\n success: false,\n error: { code, message, data, retryable },\n timestamp: Math.floor(Date.now() / 1000),\n };\n}\n\nexport function registerServe(program: Command) {\n program\n .command('serve')\n .description('Start HTTP API server')\n .option('--port <port>', 'Port number', '3001')\n .option('--rate-limit <rps>', 'Max requests per second', '10')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { port: string; rateLimit: string; key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const port = parseInt(opts.port, 10);\n const rateLimit = parseInt(opts.rateLimit, 10);\n\n const token = generateToken();\n saveToken(token);\n\n const app = buildApp(agent, token, rateLimit);\n\n serve({ fetch: app.fetch, port });\n\n console.log(` ✓ API server running on http://localhost:${port}`);\n console.log(` ✓ Auth token: ${token}`);\n console.log('');\n console.log(' Endpoints:');\n console.log(' GET /v1/balance POST /v1/send');\n console.log(' GET /v1/address POST /v1/save');\n console.log(' GET /v1/history POST /v1/withdraw');\n console.log(' GET /v1/earnings POST /v1/borrow');\n console.log(' GET /v1/rates POST /v1/repay');\n console.log(' GET /v1/health-factor');\n console.log(' GET /v1/positions');\n console.log(' GET /v1/events (SSE)');\n console.log('');\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction buildApp(agent: T2000, authToken: string, rateLimit: number): Hono {\n const app = new Hono();\n\n app.use('*', cors());\n\n // Rate limiting (sliding window)\n const requestLog: number[] = [];\n app.use('/v1/*', async (c, next) => {\n const now = Date.now();\n const windowMs = 1000;\n while (requestLog.length > 0 && requestLog[0]! < now - windowMs) {\n requestLog.shift();\n }\n if (requestLog.length >= rateLimit) {\n c.status(429);\n c.header('Retry-After', '1');\n return c.json(errorResponse('RATE_LIMITED', 'Too many requests', null, true));\n }\n requestLog.push(now);\n await next();\n });\n\n // Bearer auth\n app.use('/v1/*', async (c, next) => {\n const auth = c.req.header('Authorization');\n if (!auth || auth !== `Bearer ${authToken}`) {\n c.status(401);\n return c.json(errorResponse('UNAUTHORIZED', 'Invalid or missing Bearer token'));\n }\n await next();\n });\n\n // --- GET endpoints ---\n\n app.get('/v1/address', (c) => {\n return c.json(envelope({ address: agent.address }));\n });\n\n app.get('/v1/balance', async (c) => {\n try {\n const balance = await agent.balance();\n return c.json(envelope(balance));\n } catch (err) {\n return c.json(errorResponse('BALANCE_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/history', async (c) => {\n try {\n const limit = parseInt(c.req.query('limit') ?? '20', 10);\n const history = await agent.history({ limit });\n return c.json(envelope(history));\n } catch (err) {\n return c.json(errorResponse('HISTORY_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/deposit', (c) => {\n return c.json(envelope({\n address: agent.address,\n network: 'mainnet',\n instructions: 'Send USDC to this address on Sui mainnet.',\n }));\n });\n\n app.get('/v1/earnings', async (c) => {\n try {\n const earnings = await agent.earnings();\n return c.json(envelope(earnings));\n } catch (err) {\n return c.json(errorResponse('EARNINGS_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/rates', async (c) => {\n try {\n const rates = await agent.rates();\n return c.json(envelope(rates));\n } catch (err) {\n return c.json(errorResponse('RATES_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/health-factor', async (c) => {\n try {\n const hf = await agent.healthFactor();\n return c.json(envelope(hf));\n } catch (err) {\n return c.json(errorResponse('HEALTH_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/max-withdraw', async (c) => {\n try {\n const result = await agent.maxWithdraw();\n return c.json(envelope(result));\n } catch (err) {\n return c.json(errorResponse('MAX_WITHDRAW_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/max-borrow', async (c) => {\n try {\n const result = await agent.maxBorrow();\n return c.json(envelope(result));\n } catch (err) {\n return c.json(errorResponse('MAX_BORROW_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/positions', async (c) => {\n try {\n const positions = await agent.positions();\n return c.json(envelope(positions));\n } catch (err) {\n return c.json(errorResponse('POSITIONS_ERROR', errMsg(err)), 500);\n }\n });\n\n // --- POST endpoints ---\n\n app.post('/v1/send', async (c) => {\n try {\n const body = await c.req.json();\n const { to, amount, asset } = body as { to: string; amount: number; asset?: string };\n if (!to || !amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: to, amount'));\n }\n const result = await agent.send({ to, amount, asset: asset ?? 'USDC' });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/save', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/supply', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/withdraw', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number | 'all' };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.withdraw({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/borrow', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.borrow({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/repay', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number | 'all' };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.repay({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n // --- SSE endpoint ---\n\n app.get('/v1/events', async (c) => {\n const subscribeParam = c.req.query('subscribe') ?? 'yield,balanceChange,healthWarning';\n const subscriptions = new Set(subscribeParam.split(',').map((s) => s.trim()));\n\n return streamSSE(c, async (stream) => {\n const handlers: Array<{ event: string; off: () => void }> = [];\n\n for (const eventName of subscriptions) {\n const handler = (data: unknown) => {\n stream.writeSSE({ event: eventName, data: JSON.stringify(data) }).catch(() => {});\n };\n agent.on(eventName as never, handler as never);\n handlers.push({\n event: eventName,\n off: () => agent.off(eventName as never, handler as never),\n });\n }\n\n // Keep alive\n const keepAlive = setInterval(() => {\n stream.writeSSE({ event: 'ping', data: '{}' }).catch(() => {});\n }, 30_000);\n\n stream.onAbort(() => {\n clearInterval(keepAlive);\n for (const h of handlers) h.off();\n });\n\n // Block forever — SSE streams stay open\n await new Promise<void>(() => {});\n });\n });\n\n return app;\n}\n\nfunction errMsg(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nfunction handleApiError(err: unknown) {\n const t2kErr = err as { code?: string; message?: string; data?: unknown };\n return errorResponse(\n t2kErr.code ?? 'UNKNOWN',\n t2kErr.message ?? errMsg(err),\n t2kErr.data,\n isRetryable(t2kErr.code),\n );\n}\n\nfunction getStatusCode(err: unknown): number {\n const code = (err as { code?: string }).code;\n if (!code) return 500;\n if (code === 'INSUFFICIENT_BALANCE') return 400;\n if (code === 'INVALID_ADDRESS') return 400;\n if (code === 'WITHDRAW_WOULD_LIQUIDATE') return 400;\n if (code === 'NO_COLLATERAL') return 400;\n return 500;\n}\n\nfunction isRetryable(code?: string): boolean {\n if (!code) return false;\n return ['RPC_ERROR', 'RPC_UNREACHABLE', 'SPONSOR_UNAVAILABLE', 'AUTO_TOPUP_FAILED'].includes(code);\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000 } from '@t2000/sdk';\nimport { 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 { T2000, formatUsd, SUPPORTED_ASSETS } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printInfo,\n printWarning,\n printLine,\n printDivider,\n explorerUrl,\n} from '../output.js';\n\nexport function registerRebalance(program: Command) {\n program\n .command('rebalance')\n .description('Optimize yield — move savings to the best rate across protocols and stablecoins')\n .option('--key <path>', 'Key file path')\n .option('--dry-run', 'Show what would happen without executing')\n .option('--min-diff <pct>', 'Minimum APY difference to trigger (default: 0.5)', '0.5')\n .option('--max-break-even <days>', 'Max break-even days for cross-asset moves (default: 30)', '30')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const minYieldDiff = parseFloat(opts.minDiff ?? '0.5');\n const maxBreakEven = parseInt(opts.maxBreakEven ?? '30', 10);\n\n const plan = await agent.rebalance({\n dryRun: true,\n minYieldDiff,\n maxBreakEven,\n });\n\n if (isJsonMode()) {\n if (opts.dryRun) {\n printJson(plan);\n } else {\n const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });\n printJson(result);\n }\n return;\n }\n\n printBlank();\n\n if (plan.steps.length === 0) {\n const diff = plan.newApy - plan.currentApy;\n if (diff < minYieldDiff) {\n printInfo(`Already optimized — ${plan.currentApy.toFixed(2)}% APY on ${plan.fromProtocol}`);\n printLine(pc.dim(` Best available: ${plan.newApy.toFixed(2)}% (${displayAsset(plan.toAsset)} on ${plan.toProtocol})`));\n printLine(pc.dim(` Difference: ${diff.toFixed(2)}% (below ${minYieldDiff}% threshold)`));\n } else if (plan.breakEvenDays > maxBreakEven && plan.estimatedSwapCost > 0) {\n printInfo(`Skipped — break-even of ${plan.breakEvenDays} days exceeds ${maxBreakEven}-day limit`);\n printLine(pc.dim(` ${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}%) → ${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}%)`));\n } else {\n printInfo('Already at the best rate. Nothing to rebalance.');\n }\n printBlank();\n return;\n }\n\n printLine(pc.bold('Rebalance Plan'));\n printDivider();\n printKeyValue('From', `${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}% APY)`);\n printKeyValue('To', `${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}% APY)`);\n printKeyValue('Amount', formatUsd(plan.amount));\n printBlank();\n\n printLine(pc.bold('Economics'));\n printDivider();\n printKeyValue('APY Gain', `+${(plan.newApy - plan.currentApy).toFixed(2)}%`);\n printKeyValue('Annual Gain', `${formatUsd(plan.annualGain)}/year`);\n if (plan.estimatedSwapCost > 0) {\n printKeyValue('Swap Cost', `~${formatUsd(plan.estimatedSwapCost)}`);\n printKeyValue('Break-even', `${plan.breakEvenDays} days`);\n }\n printBlank();\n\n if (plan.steps.length > 0) {\n printLine(pc.bold('Steps'));\n printDivider();\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i];\n const num = `${i + 1}.`;\n if (step.action === 'withdraw') {\n printLine(` ${num} Withdraw ${formatUsd(step.amount)} ${displayAsset(step.fromAsset ?? '')} from ${step.protocol}`);\n } else if (step.action === 'swap') {\n printLine(` ${num} Swap ${displayAsset(step.fromAsset ?? '')} → ${displayAsset(step.toAsset ?? '')} (~${formatUsd(step.estimatedOutput ?? 0)})`);\n } else if (step.action === 'deposit') {\n printLine(` ${num} Deposit ${formatUsd(step.amount)} ${displayAsset(step.toAsset ?? '')} into ${step.protocol}`);\n }\n }\n printBlank();\n }\n\n if (opts.dryRun) {\n printLine(pc.bold(pc.yellow('DRY RUN — Preview only, no transactions executed')));\n printLine(pc.dim(' Run `t2000 rebalance` to execute.'));\n printBlank();\n return;\n }\n\n const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });\n\n if (result.executed) {\n printSuccess(`Rebalanced ${formatUsd(result.amount)} → ${result.newApy.toFixed(2)}% APY`);\n for (const digest of result.txDigests) {\n printKeyValue('Tx', explorerUrl(digest));\n }\n printKeyValue('Gas', `${result.totalGasCost.toFixed(4)} SUI`);\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction displayAsset(asset: string): string {\n return SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? asset;\n}\n","import { 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,SAA8C;AACnF,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,SAAS,MAAM,MAAM,KAAK,EAAE,QAAQ,UAAU,KAAK,SAAS,CAAC;AAEnE,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,YAAY,YAAY,EAAE;AAEnF,UAAI,OAAO,MAAM,GAAG;AAClB,cAAM,WAAW,OAAO,MAAM,OAAO,SAAS,KAAK,QAAQ,CAAC;AAC5D,qBAAa,iBAAiBD,IAAG,IAAI,GAAGC,WAAU,OAAO,GAAG,CAAC,UAAU,OAAO,IAAI,CAAC,EAAE;AAAA,MACvF;AAEA,mBAAa,gBAAgBD,IAAG,MAAM,GAAG,OAAO,IAAI,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE;AAEpE,mBAAa,oBAAoBA,IAAG,OAAOC,WAAU,OAAO,cAAc,CAAC,CAAC,OAAO;AAEnF,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,2BAA2B,EACvC,SAAS,YAAY,2BAA2B,EAChD,OAAO,gBAAgB,eAAe,EACtC,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,MAAM;AAEhB,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,4CAA4C,EACxD,SAAS,YAAY,2BAA2B,EAChD,OAAO,gBAAgB,eAAe,EACtC,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,MAAM;AAClB;;;ACpEA,SAAS,SAAAI,eAAa;AAIf,SAAS,iBAAiBC,UAAkB;AACjD,EAAAA,SACG,QAAQ,UAAU,EAClB,YAAY,4BAA4B,EACxC,SAAS,YAAY,+BAA+B,EACpD,OAAO,gBAAgB,eAAe,EACtC,OAAO,qBAAqB,sCAAsC,EAClE,OAAO,OAAO,WAAW,SAAS;AACjC,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,SAAS,MAAM,MAAM,SAAS,EAAE,QAAQ,UAAU,KAAK,SAAS,CAAC;AAEvE,UAAI,WAAW,GAAG;AAChB,kBAAU,MAAM;AAChB;AAAA,MACF;AAEA,iBAAW;AACX,mBAAa,aAAa,OAAO,OAAO,QAAQ,CAAC,CAAC,OAAO;AACzD,oBAAc,MAAM,YAAY,OAAO,EAAE,CAAC;AAC1C,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACpCA,SAAS,SAAAC,eAAa;AAIf,SAAS,eAAeC,UAAkB;AAC/C,EAAAA,SACG,QAAQ,QAAQ,EAChB,YAAY,wCAAwC,EACpD,SAAS,YAAY,kBAAkB,EACvC,OAAO,gBAAgB,eAAe,EACtC,OAAO,qBAAqB,6BAA6B,EACzD,OAAO,OAAO,WAAW,SAAS;AACjC,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,SAAS,MAAM,MAAM,OAAO,EAAE,QAAQ,UAAU,KAAK,SAAS,CAAC;AAErE,UAAI,WAAW,GAAG;AAChB,kBAAU,MAAM;AAChB;AAAA,MACF;AAEA,iBAAW;AACX,mBAAa,aAAa,OAAO,QAAQ,CAAC,CAAC,OAAO;AAClD,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;;;AC3CA,SAAS,SAAAC,eAAa;AAIf,SAAS,cAAcC,UAAkB;AAC9C,EAAAA,SACG,QAAQ,OAAO,EACf,YAAY,qBAAqB,EACjC,SAAS,YAAY,4BAA4B,EACjD,OAAO,gBAAgB,eAAe,EACtC,OAAO,qBAAqB,6BAA6B,EACzD,OAAO,OAAO,WAAW,SAAS;AACjC,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,SAAS,MAAM,MAAM,MAAM,EAAE,QAAQ,UAAU,KAAK,SAAS,CAAC;AAEpE,UAAI,WAAW,GAAG;AAChB,kBAAU,MAAM;AAChB;AAAA,MACF;AAEA,iBAAW;AACX,mBAAa,WAAW,OAAO,OAAO,QAAQ,CAAC,CAAC,OAAO;AACvD,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;;;ACrCA,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,wBAAwB;AAGxC,IAAM,gBAAiB,OAAO,KAAK,gBAAgB,EAAuB,OAAO,OAAK,MAAM,KAAK;AAI1F,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,KAAsC,GAAG,eAAe;AACzF,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;;;ACvDA,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,OAAOC,SAAQ;AACf,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;AACpC,YAAM,MAAM,MAAM,MAAM,UAAU;AAClC,YAAM,gBAAgB,IAAI,UAAU,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAEnE,UAAI,WAAW,GAAG;AAChB,kBAAU,EAAE,GAAG,QAAQ,WAAW,cAAc,CAAC;AACjD;AAAA,MACF;AAEA,iBAAW;AACX,oBAAc,eAAe,IAAI,OAAO,SAAS,QAAQ,CAAC,CAAC,EAAE;AAE7D,UAAI,cAAc,SAAS,GAAG;AAC5B,mBAAW,KAAK,eAAe;AAC7B,kBAAQ,IAAI,OAAOC,IAAG,IAAI,QAAG,CAAC,KAAK,EAAE,OAAO,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE,QAAQ,MAAM,EAAE,IAAI,QAAQ,CAAC,CAAC,OAAO;AAAA,QACjH;AAAA,MACF;AAEA,oBAAc,eAAe,GAAG,OAAO,WAAW,QAAQ,CAAC,CAAC,GAAG;AAC/D,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;;;ACzCA,OAAOC,SAAQ;AACf,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;AACtC,YAAM,MAAM,MAAM,MAAM,UAAU;AAClC,YAAM,gBAAgB,IAAI,UAAU,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAEnE,UAAI,WAAW,GAAG;AAChB,kBAAU,EAAE,GAAG,QAAQ,WAAW,cAAc,CAAC;AACjD;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,eAAe,IAAI,OAAO,SAAS,QAAQ,CAAC,CAAC,EAAE;AAE7D,UAAI,cAAc,SAAS,GAAG;AAC5B,mBAAW,KAAK,eAAe;AAC7B,kBAAQ,IAAI,OAAOC,IAAG,IAAI,QAAG,CAAC,KAAK,EAAE,OAAO,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE,QAAQ,MAAM,EAAE,IAAI,QAAQ,CAAC,CAAC,OAAO;AAAA,QACjH;AAAA,MACF;AAEA,oBAAc,eAAe,GAAG,OAAO,IAAI,QAAQ,CAAC,CAAC,GAAG;AACxD,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;;;ACpDA,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,8CAA8C;AAC1D,cAAQ,IAAI,6CAA6C;AACzD,cAAQ,IAAI,4BAA4B;AACxC,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,OAAO,IAAI;AACnB,UAAI,CAAC,QAAQ;AACX,UAAE,OAAO,GAAG;AACZ,eAAO,EAAE,KAAK,cAAc,kBAAkB,kBAAkB,CAAC;AAAA,MACnE;AACA,YAAM,SAAS,MAAM,MAAM,KAAK,EAAE,OAAO,CAAC;AAC1C,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,OAAO,IAAI;AACnB,UAAI,CAAC,QAAQ;AACX,UAAE,OAAO,GAAG;AACZ,eAAO,EAAE,KAAK,cAAc,kBAAkB,kBAAkB,CAAC;AAAA,MACnE;AACA,YAAM,SAAS,MAAM,MAAM,KAAK,EAAE,OAAO,CAAC;AAC1C,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,OAAO,IAAI;AACnB,UAAI,CAAC,QAAQ;AACX,UAAE,OAAO,GAAG;AACZ,eAAO,EAAE,KAAK,cAAc,kBAAkB,kBAAkB,CAAC;AAAA,MACnE;AACA,YAAM,SAAS,MAAM,MAAM,SAAS,EAAE,OAAO,CAAC;AAC9C,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,OAAO,IAAI;AACnB,UAAI,CAAC,QAAQ;AACX,UAAE,OAAO,GAAG;AACZ,eAAO,EAAE,KAAK,cAAc,kBAAkB,kBAAkB,CAAC;AAAA,MACnE;AACA,YAAM,SAAS,MAAM,MAAM,OAAO,EAAE,OAAO,CAAC;AAC5C,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,OAAO,IAAI;AACnB,UAAI,CAAC,QAAQ;AACX,UAAE,OAAO,GAAG;AACZ,eAAO,EAAE,KAAK,cAAc,kBAAkB,kBAAkB,CAAC;AAAA,MACnE;AACA,YAAM,SAAS,MAAM,MAAM,MAAM,EAAE,OAAO,CAAC;AAC3C,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;;;AC7WA,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,UAAQ;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,KAAG,IAAI,SAAS,IAAI,QAAQ,GAAG,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE;AAC7E,kBAAU,KAAKA,KAAG,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,KAAG,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,KAAG,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,KAAG,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,UAAQ;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,KAAG,KAAK,SAAS,IAAIA,KAAG,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,KAAG,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,KAAG,KAAK,mBAAmB,IAAIA,KAAG,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,KAAG,KAAK,eAAe,CAAC;AAClC,mBAAa;AACb,gBAAU,KAAKA,KAAG,IAAI,6BAA6B,CAAC,iCAAiC;AACrF,gBAAU,KAAKA,KAAG,IAAI,qBAAqB,CAAC,sCAAsC;AAClF,gBAAU,KAAKA,KAAG,IAAI,4BAA4B,CAAC,wBAAwB;AAC3E,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,CAAC;AACL;;;ACvJA,OAAOK,UAAQ;AACf,SAAS,SAAAC,SAAO,aAAAC,YAAW,oBAAAC,yBAAwB;AAgB5C,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,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,YAAM,SAAS,MAAM,MAAM,UAAU,EAAE,QAAQ,OAAO,cAAc,aAAa,CAAC;AAElF,UAAI,OAAO,UAAU;AACnB,qBAAa,cAAcC,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;;;A1B3HA,IAAMC,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,EAAE,SAAS,YAAY,IAAIA,SAAQ,iBAAiB;AA0BnD,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,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;;;A2BpEA,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","pc","T2000","program","T2000","pc","pc","T2000","program","T2000","pc","homedir","homedir","program","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","T2000","CONFIG_DIR","join","homedir","existsSync","mkdirSync","readFileSync","writeFileSync","program","T2000","pc","T2000","program","T2000","pc","program","T2000","pc","program","T2000","result","T2000","MIST_PER_SUI","formatUsd","pc","MIST_PER_SUI","program","T2000","formatUsd","pc","T2000","formatUsd","SUPPORTED_ASSETS","program","T2000","result","pc","formatUsd","SUPPORTED_ASSETS","require","program"]}
1
+ {"version":3,"sources":["../src/program.ts","../src/output.ts","../src/commands/init.ts","../src/prompts.ts","../src/commands/send.ts","../src/commands/balance.ts","../src/commands/address.ts","../src/commands/deposit.ts","../src/commands/history.ts","../src/commands/exportKey.ts","../src/commands/importKey.ts","../src/commands/save.ts","../src/commands/withdraw.ts","../src/commands/borrow.ts","../src/commands/repay.ts","../src/commands/health.ts","../src/commands/rates.ts","../src/commands/positions.ts","../src/commands/earnings.ts","../src/commands/fundStatus.ts","../src/commands/config.ts","../src/commands/serve.ts","../src/commands/pay.ts","../src/commands/lock.ts","../src/commands/sentinel.ts","../src/commands/earn.ts","../src/commands/rebalance.ts","../src/commands/exchange.ts","../src/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { createRequire } from 'node:module';\nimport { setJsonMode } from './output.js';\n\nconst require = createRequire(import.meta.url);\nconst { version: CLI_VERSION } = require('../package.json') as { version: string };\nimport { registerInit } from './commands/init.js';\nimport { registerSend } from './commands/send.js';\nimport { registerBalance } from './commands/balance.js';\nimport { registerAddress } from './commands/address.js';\nimport { registerDeposit } from './commands/deposit.js';\nimport { registerHistory } from './commands/history.js';\nimport { registerExport } from './commands/exportKey.js';\nimport { registerImport } from './commands/importKey.js';\nimport { registerSave } from './commands/save.js';\nimport { registerWithdraw } from './commands/withdraw.js';\nimport { registerBorrow } from './commands/borrow.js';\nimport { registerRepay } from './commands/repay.js';\nimport { registerHealth } from './commands/health.js';\nimport { registerRates } from './commands/rates.js';\nimport { registerPositions } from './commands/positions.js';\nimport { registerEarnings } from './commands/earnings.js';\nimport { registerFundStatus } from './commands/fundStatus.js';\nimport { registerConfig } from './commands/config.js';\nimport { registerServe } from './commands/serve.js';\nimport { registerPay } from './commands/pay.js';\nimport { registerLock } from './commands/lock.js';\nimport { registerSentinel } from './commands/sentinel.js';\nimport { registerEarn } from './commands/earn.js';\nimport { registerRebalance } from './commands/rebalance.js';\nimport { registerExchange } from './commands/exchange.js';\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 registerEarnings(program);\n registerFundStatus(program);\n registerConfig(program);\n registerServe(program);\n registerPay(program);\n registerLock(program);\n registerSentinel(program);\n registerEarn(program);\n registerRebalance(program);\n registerExchange(program);\n\n return program;\n}\n","import pc from 'picocolors';\n\nlet jsonMode = false;\n\nexport function setJsonMode(enabled: boolean) {\n jsonMode = enabled;\n}\n\nexport function isJsonMode(): boolean {\n return jsonMode;\n}\n\nexport function printJson(data: unknown) {\n console.log(JSON.stringify(data, null, 2));\n}\n\nexport function printSuccess(message: string) {\n if (jsonMode) return;\n console.log(` ${pc.green('✓')} ${message}`);\n}\n\nexport function printError(message: string) {\n if (jsonMode) return;\n console.error(` ${pc.red('✗')} ${message}`);\n}\n\nexport function printWarning(message: string) {\n if (jsonMode) return;\n console.log(` ${pc.yellow('⚠')} ${message}`);\n}\n\nexport function printInfo(message: string) {\n if (jsonMode) return;\n console.log(` ${pc.dim(message)}`);\n}\n\nexport function printHeader(title: string) {\n if (jsonMode) return;\n console.log();\n console.log(` ${pc.bold(title)}`);\n console.log();\n}\n\nexport function printKeyValue(key: string, value: string, indent = 2) {\n if (jsonMode) return;\n const pad = ' '.repeat(indent);\n console.log(`${pad}${pc.dim(key + ':')} ${value}`);\n}\n\nexport function printBlank() {\n if (jsonMode) return;\n console.log();\n}\n\nexport function printDivider(width = 53) {\n if (jsonMode) return;\n console.log(` ${pc.dim('─'.repeat(width))}`);\n}\n\nexport function printLine(text: string) {\n if (jsonMode) return;\n console.log(` ${text}`);\n}\n\n\nexport function printSeparator() {\n if (jsonMode) return;\n console.log(` ${pc.dim('──────────────────────────────────────')}`);\n}\n\nexport function explorerUrl(txHash: string, network = 'mainnet'): string {\n const base = network === 'testnet'\n ? 'https://suiscan.xyz/testnet/tx'\n : 'https://suiscan.xyz/mainnet/tx';\n const suffix = '';\n return `${base}/${txHash}${suffix}`;\n}\n\nexport function handleError(error: unknown) {\n if (jsonMode) {\n const data = error instanceof Error && 'toJSON' in error\n ? (error as { toJSON(): unknown }).toJSON()\n : { error: 'UNKNOWN', message: String(error) };\n printJson(data);\n } else {\n const msg = error instanceof Error ? error.message : String(error);\n printError(msg);\n }\n process.exit(1);\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000 } 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 if (bal.savings > 0.01) {\n const positions = await agent.positions();\n const saves = positions.positions.filter(p => p.type === 'save');\n const weightedApy = saves.length > 0\n ? saves.reduce((sum, p) => sum + p.amount * p.apy, 0) / saves.reduce((sum, p) => sum + p.amount, 0)\n : 0;\n const dailyEarning = bal.savings * (weightedApy / 100) / 365;\n printKeyValue('Savings', `${formatUsd(bal.savings)} ${pc.dim(`(earning ${weightedApy.toFixed(2)}% APY)`)}`);\n printKeyValue('Gas', `${bal.gasReserve.sui.toFixed(2)} SUI ${pc.dim(`(~${formatUsd(bal.gasReserve.usdEquiv)})`)}`);\n printSeparator();\n printKeyValue('Total', `${formatUsd(bal.total)}`);\n if (dailyEarning >= 0.005) {\n printLine(` ${pc.dim(`Earning ~${formatUsd(dailyEarning)}/day`)}`);\n }\n } else {\n 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\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, printLine, printInfo } 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 printInfo('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 printLine(`${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, opts: { key?: string; protocol?: string }) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n let gasManagerUsdc = 0;\n agent.on('gasAutoTopUp', (data) => {\n gasManagerUsdc = data.usdcSpent;\n });\n\n const result = await agent.save({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n\n if (gasManagerUsdc > 0) {\n printSuccess(`Gas manager: ${pc.yellow(formatUsd(gasManagerUsdc))} USDC → SUI`);\n }\n\n const protocolName = opts.protocol ?? 'best rate';\n printSuccess(`Saved ${pc.yellow(formatUsd(result.amount))} USDC to ${protocolName}`);\n\n if (result.fee > 0) {\n const feeRate = (result.fee / result.amount * 100).toFixed(1);\n printSuccess(`Protocol fee: ${pc.dim(`${formatUsd(result.fee)} USDC (${feeRate}%)`)}`);\n }\n\n printSuccess(`Current APY: ${pc.green(`${result.apy.toFixed(2)}%`)}`);\n\n printSuccess(`Savings balance: ${pc.yellow(formatUsd(result.savingsBalance))} USDC`);\n\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n };\n\n program\n .command('save')\n .description('Deposit USDC into savings')\n .argument('<amount>', 'Amount to save (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(action);\n\n program\n .command('supply')\n .description('Deposit USDC into savings (alias for save)')\n .argument('<amount>', 'Amount to save (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(action);\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerWithdraw(program: Command) {\n program\n .command('withdraw')\n .description('Withdraw USDC from savings')\n .argument('<amount>', 'Amount to withdraw (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi, suilend)')\n .action(async (amountStr, opts) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.withdraw({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Withdrew ${formatUsd(result.amount)} USDC`);\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printWarning, explorerUrl } from '../output.js';\n\nexport function registerBorrow(program: Command) {\n program\n .command('borrow')\n .description('Borrow USDC against savings collateral')\n .argument('<amount>', 'Amount to borrow')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, opts) => {\n try {\n const amount = parseFloat(amountStr);\n if (isNaN(amount) || amount <= 0) {\n throw new Error('Amount must be a positive number');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const maxResult = await agent.maxBorrow();\n if (amount > maxResult.maxAmount) {\n printWarning(`Max safe borrow: ${formatUsd(maxResult.maxAmount)} (HF ${maxResult.currentHF.toFixed(2)} → min 1.5)`);\n return;\n }\n\n const result = await agent.borrow({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Borrowed ${formatUsd(amount)} USDC`);\n printKeyValue('Health Factor', result.healthFactor.toFixed(2));\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerRepay(program: Command) {\n program\n .command('repay')\n .description('Repay borrowed USDC')\n .argument('<amount>', 'Amount to repay (or \"all\")')\n .option('--key <path>', 'Key file path')\n .option('--protocol <name>', 'Protocol to use (e.g. navi)')\n .action(async (amountStr, opts) => {\n try {\n const amount: number | 'all' = amountStr === 'all' ? 'all' : parseFloat(amountStr);\n if (amount !== 'all' && (isNaN(amount) || amount <= 0)) {\n throw new Error('Amount must be a positive number or \"all\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.repay({ amount, protocol: opts.protocol });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n printBlank();\n printSuccess(`Repaid ${formatUsd(result.amount)} USDC`);\n printKeyValue('Remaining Debt', formatUsd(result.remainingDebt));\n printKeyValue('Tx', explorerUrl(result.tx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printSuccess, printWarning, printError } from '../output.js';\n\nexport function registerHealth(program: Command) {\n program\n .command('health')\n .description('Check savings health factor')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const hf = await agent.healthFactor();\n\n if (isJsonMode()) {\n printJson(hf);\n return;\n }\n\n printBlank();\n\n const 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', `${formatUsd(hf.supplied)} USDC`);\n printKeyValue('Borrowed', `${formatUsd(hf.borrowed)} USDC`);\n printKeyValue('Max Borrow', `${formatUsd(hf.maxBorrow)} USDC`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, SUPPORTED_ASSETS } from '@t2000/sdk';\nimport type { SupportedAsset } from '@t2000/sdk';\n\nconst STABLE_ASSETS = (Object.keys(SUPPORTED_ASSETS) as SupportedAsset[]).filter(k => k !== 'SUI');\nimport { resolvePin } from '../prompts.js';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine, printDivider } from '../output.js';\n\nexport function registerRates(program: Command) {\n program\n .command('rates')\n .description('Show current APY rates across protocols and stablecoins')\n .option('--key <path>', 'Key file path')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const allRates = await agent.allRatesAcrossAssets();\n\n if (isJsonMode()) {\n printJson(allRates);\n return;\n }\n\n printBlank();\n\n if (allRates.length > 0) {\n const best = allRates.reduce((a, b) => b.rates.saveApy > a.rates.saveApy ? b : a);\n const bestDisplay = SUPPORTED_ASSETS[best.asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? best.asset;\n printLine(pc.bold(pc.green(`Best yield: ${best.rates.saveApy.toFixed(2)}% APY`)) + pc.dim(` (${bestDisplay} on ${best.protocol})`));\n printBlank();\n }\n\n for (const asset of STABLE_ASSETS) {\n const assetRates = allRates.filter(r => r.asset === asset);\n if (assetRates.length === 0) continue;\n\n const display = SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? asset;\n printLine(pc.bold(display));\n printDivider();\n for (const entry of assetRates) {\n printKeyValue(entry.protocol, `Save ${entry.rates.saveApy.toFixed(2)}% Borrow ${entry.rates.borrowApy.toFixed(2)}%`);\n }\n printBlank();\n }\n\n 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(2)}% 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(2)}% 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 } 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, printLine } from '../output.js';\n\nexport function registerEarnings(program: Command) {\n program\n .command('earnings')\n .description('Show yield earned to date')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.earnings();\n const pos = await agent.positions();\n const savePositions = pos.positions.filter((p) => p.type === 'save');\n\n if (isJsonMode()) {\n printJson({ ...result, positions: savePositions });\n return;\n }\n\n printBlank();\n printKeyValue('Total Saved', formatUsd(result.supplied));\n\n if (savePositions.length > 0) {\n for (const p of savePositions) {\n printLine(` ${pc.dim('•')} ${formatUsd(p.amount)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(2)}% APY`);\n }\n }\n\n printKeyValue('Blended APY', `${result.currentApy.toFixed(2)}%`);\n printKeyValue('Daily Yield', `~${formatUsd(result.dailyEarning)}/day`);\n printKeyValue('Est. Earned', `~${formatUsd(result.totalYieldEarned)}`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000, formatUsd } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, printInfo, printLine } from '../output.js';\n\nexport function registerFundStatus(program: Command) {\n program\n .command('fund-status')\n .description('Full savings summary')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const result = await agent.fundStatus();\n const pos = await agent.positions();\n const savePositions = pos.positions.filter((p) => p.type === 'save');\n\n if (isJsonMode()) {\n printJson({ ...result, positions: savePositions });\n return;\n }\n\n printBlank();\n if (result.supplied > 0) {\n printSuccess('Savings: ACTIVE');\n } else {\n printInfo('Savings: INACTIVE — run `t2000 save <amount>` to start earning');\n }\n printBlank();\n printKeyValue('Total Saved', formatUsd(result.supplied));\n\n if (savePositions.length > 0) {\n for (const p of savePositions) {\n printLine(` ${pc.dim('•')} ${formatUsd(p.amount)} ${p.asset} on ${p.protocol} @ ${p.apy.toFixed(2)}% APY`);\n }\n }\n\n printKeyValue('Blended APY', `${result.apy.toFixed(2)}%`);\n printKeyValue('Earned today', `~${formatUsd(result.earnedToday)}`);\n printKeyValue('Earned all time', `~${formatUsd(result.earnedAllTime)}`);\n printKeyValue('Monthly projected', `~${formatUsd(result.projectedMonthly)}/month`);\n printBlank();\n if (result.supplied > 0) {\n printInfo('Withdraw anytime: t2000 withdraw <amount>');\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { printKeyValue, printBlank, printJson, isJsonMode, handleError, printSuccess, printInfo } 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 printInfo('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 printBlank();\n printSuccess(`Set ${key} = ${String(parsed)}`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { randomBytes } from 'node:crypto';\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { T2000 } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { handleError } from '../output.js';\nimport { streamSSE } from 'hono/streaming';\n\nconst CONFIG_DIR = join(homedir(), '.t2000');\nconst TOKEN_PATH = join(CONFIG_DIR, 'config.json');\n\nfunction generateToken(): string {\n return `t2k_${randomBytes(24).toString('hex')}`;\n}\n\nfunction saveToken(token: string): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true });\n }\n let config: Record<string, unknown> = {};\n try {\n config = JSON.parse(readFileSync(TOKEN_PATH, 'utf-8'));\n } catch { /* empty */ }\n config.authToken = token;\n writeFileSync(TOKEN_PATH, JSON.stringify(config, null, 2) + '\\n');\n}\n\nfunction envelope(data: unknown) {\n return { success: true, data, timestamp: Math.floor(Date.now() / 1000) };\n}\n\nfunction errorResponse(code: string, message: string, data?: unknown, retryable = false) {\n return {\n success: false,\n error: { code, message, data, retryable },\n timestamp: Math.floor(Date.now() / 1000),\n };\n}\n\nexport function registerServe(program: Command) {\n program\n .command('serve')\n .description('Start HTTP API server')\n .option('--port <port>', 'Port number', '3001')\n .option('--rate-limit <rps>', 'Max requests per second', '10')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { port: string; rateLimit: string; key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const port = parseInt(opts.port, 10);\n const rateLimit = parseInt(opts.rateLimit, 10);\n\n const token = generateToken();\n saveToken(token);\n\n const app = buildApp(agent, token, rateLimit);\n\n serve({ fetch: app.fetch, port });\n\n console.log(` ✓ API server running on http://localhost:${port}`);\n console.log(` ✓ Auth token: ${token}`);\n console.log('');\n console.log(' Endpoints:');\n console.log(' GET /v1/balance POST /v1/send');\n console.log(' GET /v1/address POST /v1/save');\n console.log(' GET /v1/history POST /v1/withdraw');\n console.log(' GET /v1/earnings POST /v1/borrow');\n console.log(' GET /v1/rates POST /v1/repay');\n console.log(' GET /v1/health-factor');\n console.log(' GET /v1/positions');\n console.log(' GET /v1/events (SSE)');\n console.log('');\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction buildApp(agent: T2000, authToken: string, rateLimit: number): Hono {\n const app = new Hono();\n\n app.use('*', cors());\n\n // Rate limiting (sliding window)\n const requestLog: number[] = [];\n app.use('/v1/*', async (c, next) => {\n const now = Date.now();\n const windowMs = 1000;\n while (requestLog.length > 0 && requestLog[0]! < now - windowMs) {\n requestLog.shift();\n }\n if (requestLog.length >= rateLimit) {\n c.status(429);\n c.header('Retry-After', '1');\n return c.json(errorResponse('RATE_LIMITED', 'Too many requests', null, true));\n }\n requestLog.push(now);\n await next();\n });\n\n // Bearer auth\n app.use('/v1/*', async (c, next) => {\n const auth = c.req.header('Authorization');\n if (!auth || auth !== `Bearer ${authToken}`) {\n c.status(401);\n return c.json(errorResponse('UNAUTHORIZED', 'Invalid or missing Bearer token'));\n }\n await next();\n });\n\n // --- GET endpoints ---\n\n app.get('/v1/address', (c) => {\n return c.json(envelope({ address: agent.address }));\n });\n\n app.get('/v1/balance', async (c) => {\n try {\n const balance = await agent.balance();\n return c.json(envelope(balance));\n } catch (err) {\n return c.json(errorResponse('BALANCE_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/history', async (c) => {\n try {\n const limit = parseInt(c.req.query('limit') ?? '20', 10);\n const history = await agent.history({ limit });\n return c.json(envelope(history));\n } catch (err) {\n return c.json(errorResponse('HISTORY_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/deposit', (c) => {\n return c.json(envelope({\n address: agent.address,\n network: 'mainnet',\n instructions: 'Send USDC to this address on Sui mainnet.',\n }));\n });\n\n app.get('/v1/earnings', async (c) => {\n try {\n const earnings = await agent.earnings();\n return c.json(envelope(earnings));\n } catch (err) {\n return c.json(errorResponse('EARNINGS_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/rates', async (c) => {\n try {\n const rates = await agent.rates();\n return c.json(envelope(rates));\n } catch (err) {\n return c.json(errorResponse('RATES_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/health-factor', async (c) => {\n try {\n const hf = await agent.healthFactor();\n return c.json(envelope(hf));\n } catch (err) {\n return c.json(errorResponse('HEALTH_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/max-withdraw', async (c) => {\n try {\n const result = await agent.maxWithdraw();\n return c.json(envelope(result));\n } catch (err) {\n return c.json(errorResponse('MAX_WITHDRAW_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/max-borrow', async (c) => {\n try {\n const result = await agent.maxBorrow();\n return c.json(envelope(result));\n } catch (err) {\n return c.json(errorResponse('MAX_BORROW_ERROR', errMsg(err)), 500);\n }\n });\n\n app.get('/v1/positions', async (c) => {\n try {\n const positions = await agent.positions();\n return c.json(envelope(positions));\n } catch (err) {\n return c.json(errorResponse('POSITIONS_ERROR', errMsg(err)), 500);\n }\n });\n\n // --- POST endpoints ---\n\n app.post('/v1/send', async (c) => {\n try {\n const body = await c.req.json();\n const { to, amount, asset } = body as { to: string; amount: number; asset?: string };\n if (!to || !amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: to, amount'));\n }\n const result = await agent.send({ to, amount, asset: asset ?? 'USDC' });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/save', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/supply', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.save({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/withdraw', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number | 'all' };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.withdraw({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/borrow', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.borrow({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n app.post('/v1/repay', async (c) => {\n try {\n const body = await c.req.json();\n const { amount } = body as { amount: number | 'all' };\n if (!amount) {\n c.status(400);\n return c.json(errorResponse('INVALID_PARAMS', 'Required: amount'));\n }\n const result = await agent.repay({ amount });\n return c.json(envelope(result));\n } catch (err) {\n c.status(getStatusCode(err) as 400 | 500);\n return c.json(handleApiError(err));\n }\n });\n\n // --- SSE endpoint ---\n\n app.get('/v1/events', async (c) => {\n const subscribeParam = c.req.query('subscribe') ?? 'yield,balanceChange,healthWarning';\n const subscriptions = new Set(subscribeParam.split(',').map((s) => s.trim()));\n\n return streamSSE(c, async (stream) => {\n const handlers: Array<{ event: string; off: () => void }> = [];\n\n for (const eventName of subscriptions) {\n const handler = (data: unknown) => {\n stream.writeSSE({ event: eventName, data: JSON.stringify(data) }).catch(() => {});\n };\n agent.on(eventName as never, handler as never);\n handlers.push({\n event: eventName,\n off: () => agent.off(eventName as never, handler as never),\n });\n }\n\n // Keep alive\n const keepAlive = setInterval(() => {\n stream.writeSSE({ event: 'ping', data: '{}' }).catch(() => {});\n }, 30_000);\n\n stream.onAbort(() => {\n clearInterval(keepAlive);\n for (const h of handlers) h.off();\n });\n\n // Block forever — SSE streams stay open\n await new Promise<void>(() => {});\n });\n });\n\n return app;\n}\n\nfunction errMsg(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\nfunction handleApiError(err: unknown) {\n const t2kErr = err as { code?: string; message?: string; data?: unknown };\n return errorResponse(\n t2kErr.code ?? 'UNKNOWN',\n t2kErr.message ?? errMsg(err),\n t2kErr.data,\n isRetryable(t2kErr.code),\n );\n}\n\nfunction getStatusCode(err: unknown): number {\n const code = (err as { code?: string }).code;\n if (!code) return 500;\n if (code === 'INSUFFICIENT_BALANCE') return 400;\n if (code === 'INVALID_ADDRESS') return 400;\n if (code === 'WITHDRAW_WOULD_LIQUIDATE') return 400;\n if (code === 'NO_COLLATERAL') return 400;\n return 500;\n}\n\nfunction isRetryable(code?: string): boolean {\n if (!code) return false;\n return ['RPC_ERROR', 'RPC_UNREACHABLE', 'SPONSOR_UNAVAILABLE', 'AUTO_TOPUP_FAILED'].includes(code);\n}\n","import type { Command } from 'commander';\nimport pc from 'picocolors';\nimport { T2000 } from '@t2000/sdk';\nimport { 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 printError,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printHeader,\n printInfo,\n printLine,\n printDivider,\n explorerUrl,\n} from '../output.js';\nimport pc from 'picocolors';\n\nfunction formatSui(mist: bigint): string {\n return (Number(mist) / Number(MIST_PER_SUI)).toFixed(2);\n}\n\nexport function registerSentinel(program: Command) {\n const sentinel = program\n .command('sentinel')\n .description('Interact with Sui Sentinel — attack AI agents, earn bounties');\n\n sentinel\n .command('list')\n .description('List active sentinels with prize pools')\n .action(async () => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin });\n const sentinels = await agent.sentinelList();\n\n if (isJsonMode()) {\n printJson(sentinels.map((s) => ({\n ...s,\n attackFee: s.attackFee.toString(),\n prizePool: s.prizePool.toString(),\n })));\n return;\n }\n\n if (sentinels.length === 0) {\n printBlank();\n printInfo('No active sentinels found.');\n printBlank();\n return;\n }\n\n printHeader('Active Sentinels');\n\n sentinels.forEach((s) => {\n const pool = `${formatSui(s.prizePool)} SUI`.padEnd(12);\n const fee = `${formatSui(s.attackFee)} SUI`.padEnd(12);\n printLine(` ${s.name}`);\n printLine(` ${pc.dim(`Pool: ${pool}Fee: ${fee}Attacks: ${s.totalAttacks}`)}`);\n printLine(` ${pc.dim(s.objectId)}`);\n printBlank();\n });\n\n printBlank();\n printInfo(`${sentinels.length} active sentinel${sentinels.length === 1 ? '' : 's'}`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n sentinel\n .command('info')\n .description('Show details for a sentinel')\n .argument('<id>', 'Sentinel object ID')\n .action(async (id: string) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin });\n const s = await agent.sentinelInfo(id);\n\n if (isJsonMode()) {\n printJson({\n ...s,\n attackFee: s.attackFee.toString(),\n prizePool: s.prizePool.toString(),\n });\n return;\n }\n\n printHeader(s.name);\n printKeyValue('Object ID', s.objectId);\n printKeyValue('Agent ID', s.id);\n printKeyValue('Model', s.model);\n printKeyValue('State', s.state);\n printKeyValue('Attack Fee', `${formatSui(s.attackFee)} SUI`);\n printKeyValue('Prize Pool', `${formatSui(s.prizePool)} SUI`);\n printKeyValue('Total Attacks', String(s.totalAttacks));\n printKeyValue('Breaches', String(s.successfulBreaches));\n if (s.systemPrompt) {\n printBlank();\n printKeyValue('System Prompt', '');\n printLine(` ${pc.dim(s.systemPrompt.slice(0, 500))}`);\n }\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n\n sentinel\n .command('attack')\n .description('Attack a sentinel with a prompt (costs SUI)')\n .argument('<id>', 'Sentinel object ID')\n .argument('[prompt]', 'Attack prompt')\n .option('--fee <sui>', 'Override attack fee in SUI')\n .option('--key <path>', 'Key file path')\n .action(async (id: string, prompt: string | undefined, opts: { fee?: string; key?: string }) => {\n try {\n if (!prompt) {\n throw new Error('Prompt is required. Usage: t2000 sentinel attack <id> \"your prompt\"');\n }\n\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const feeMist = opts.fee\n ? BigInt(Math.round(parseFloat(opts.fee) * Number(MIST_PER_SUI)))\n : undefined;\n\n if (isJsonMode()) {\n const result = await agent.sentinelAttack(id, prompt, feeMist);\n printJson({\n ...result,\n verdict: {\n ...result.verdict,\n },\n });\n return;\n }\n\n printBlank();\n printLine(` ${pc.dim('⏳')} Requesting attack...`);\n\n const result = await agent.sentinelAttack(id, prompt, feeMist);\n\n printBlank();\n if (result.won) {\n printSuccess(`BREACHED! (score: ${result.verdict.score}/100)`);\n } else {\n printError(`DEFENDED (score: ${result.verdict.score}/100)`);\n }\n\n printBlank();\n printKeyValue('Agent', result.verdict.agentResponse.slice(0, 200));\n printKeyValue('Jury', result.verdict.juryResponse.slice(0, 200));\n if (result.verdict.funResponse) {\n printKeyValue('Fun', result.verdict.funResponse.slice(0, 200));\n }\n printBlank();\n printKeyValue('Fee Paid', `${result.feePaid} SUI`);\n printKeyValue('Request Tx', explorerUrl(result.requestTx));\n printKeyValue('Settle Tx', explorerUrl(result.settleTx));\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import type { Command } from 'commander';\nimport { T2000, MIST_PER_SUI, listSentinels, formatUsd } from '@t2000/sdk';\nimport type { SentinelAgent } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printHeader,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printDivider,\n printLine,\n printInfo,\n} from '../output.js';\nimport pc from 'picocolors';\n\nfunction mistToSui(mist: bigint): number {\n return Number(mist) / Number(MIST_PER_SUI);\n}\n\nfunction bestTarget(sentinels: SentinelAgent[]): SentinelAgent | undefined {\n const withPool = sentinels.filter((s) => s.prizePool > 0n && s.attackFee > 0n);\n if (withPool.length === 0) return undefined;\n return withPool.sort((a, b) => {\n const ratioA = Number(a.prizePool) / Number(a.attackFee);\n const ratioB = Number(b.prizePool) / Number(b.attackFee);\n return ratioB - ratioA;\n })[0];\n}\n\nexport function registerEarn(program: Command) {\n program\n .command('earn')\n .description('Show all earning opportunities — savings yield + sentinel bounties')\n .option('--key <path>', 'Key file path')\n .action(async (opts: { key?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const [positionsResult, 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(2)}% APY`);\n if (dailyYield > 0.0001) {\n const dailyStr = dailyYield < 0.01 ? `$${dailyYield.toFixed(4)}` : formatUsd(dailyYield);\n const monthlyStr = dailyYield * 30 < 0.01 ? `$${(dailyYield * 30).toFixed(4)}` : formatUsd(dailyYield * 30);\n printLine(pc.dim(` ~${dailyStr}/day · ~${monthlyStr}/month`));\n }\n }\n if (savePositions.length > 1) {\n printBlank();\n printKeyValue('Total Saved', formatUsd(totalSaved));\n }\n } else if (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 { T2000, formatUsd, SUPPORTED_ASSETS } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport {\n printSuccess,\n printKeyValue,\n printBlank,\n printJson,\n isJsonMode,\n handleError,\n printInfo,\n printWarning,\n printLine,\n printDivider,\n explorerUrl,\n} from '../output.js';\n\nexport function registerRebalance(program: Command) {\n program\n .command('rebalance')\n .description('Optimize yield — move savings to the best rate across protocols and stablecoins')\n .option('--key <path>', 'Key file path')\n .option('--dry-run', 'Show what would happen without executing')\n .option('--min-diff <pct>', 'Minimum APY difference to trigger (default: 0.5)', '0.5')\n .option('--max-break-even <days>', 'Max break-even days for cross-asset moves (default: 30)', '30')\n .action(async (opts) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n const minYieldDiff = parseFloat(opts.minDiff ?? '0.5');\n const maxBreakEven = parseInt(opts.maxBreakEven ?? '30', 10);\n\n const plan = await agent.rebalance({\n dryRun: true,\n minYieldDiff,\n maxBreakEven,\n });\n\n if (isJsonMode()) {\n if (opts.dryRun) {\n printJson(plan);\n } else {\n const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });\n printJson(result);\n }\n return;\n }\n\n printBlank();\n\n if (plan.steps.length === 0) {\n const diff = plan.newApy - plan.currentApy;\n if (diff < minYieldDiff) {\n printInfo(`Already optimized — ${plan.currentApy.toFixed(2)}% APY on ${plan.fromProtocol}`);\n printLine(pc.dim(` Best available: ${plan.newApy.toFixed(2)}% (${displayAsset(plan.toAsset)} on ${plan.toProtocol})`));\n printLine(pc.dim(` Difference: ${diff.toFixed(2)}% (below ${minYieldDiff}% threshold)`));\n } else if (plan.breakEvenDays > maxBreakEven && plan.estimatedSwapCost > 0) {\n printInfo(`Skipped — break-even of ${plan.breakEvenDays} days exceeds ${maxBreakEven}-day limit`);\n printLine(pc.dim(` ${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}%) → ${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}%)`));\n } else {\n printInfo('Already at the best rate. Nothing to rebalance.');\n }\n printBlank();\n return;\n }\n\n printLine(pc.bold('Rebalance Plan'));\n printDivider();\n printKeyValue('From', `${displayAsset(plan.fromAsset)} on ${plan.fromProtocol} (${plan.currentApy.toFixed(2)}% APY)`);\n printKeyValue('To', `${displayAsset(plan.toAsset)} on ${plan.toProtocol} (${plan.newApy.toFixed(2)}% APY)`);\n printKeyValue('Amount', formatUsd(plan.amount));\n printBlank();\n\n printLine(pc.bold('Economics'));\n printDivider();\n printKeyValue('APY Gain', `+${(plan.newApy - plan.currentApy).toFixed(2)}%`);\n printKeyValue('Annual Gain', `${formatUsd(plan.annualGain)}/year`);\n if (plan.estimatedSwapCost > 0) {\n printKeyValue('Swap Cost', `~${formatUsd(plan.estimatedSwapCost)}`);\n printKeyValue('Break-even', `${plan.breakEvenDays} days`);\n }\n printBlank();\n\n if (plan.steps.length > 0) {\n printLine(pc.bold('Steps'));\n printDivider();\n for (let i = 0; i < plan.steps.length; i++) {\n const step = plan.steps[i];\n const num = `${i + 1}.`;\n if (step.action === 'withdraw') {\n printLine(` ${num} Withdraw ${formatUsd(step.amount)} ${displayAsset(step.fromAsset ?? '')} from ${step.protocol}`);\n } else if (step.action === 'swap') {\n printLine(` ${num} Swap ${displayAsset(step.fromAsset ?? '')} → ${displayAsset(step.toAsset ?? '')} (~${formatUsd(step.estimatedOutput ?? 0)})`);\n } else if (step.action === 'deposit') {\n printLine(` ${num} Deposit ${formatUsd(step.amount)} ${displayAsset(step.toAsset ?? '')} into ${step.protocol}`);\n }\n }\n printBlank();\n }\n\n if (opts.dryRun) {\n printLine(pc.bold(pc.yellow('DRY RUN — Preview only, no transactions executed')));\n printLine(pc.dim(' Run `t2000 rebalance` to execute.'));\n printBlank();\n return;\n }\n\n const result = await agent.rebalance({ dryRun: false, minYieldDiff, maxBreakEven });\n\n if (result.executed) {\n printSuccess(`Rebalanced ${formatUsd(result.amount)} → ${result.newApy.toFixed(2)}% APY`);\n for (const digest of result.txDigests) {\n printKeyValue('Tx', explorerUrl(digest));\n }\n printKeyValue('Gas', `${result.totalGasCost.toFixed(4)} SUI`);\n }\n\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n\nfunction displayAsset(asset: string): string {\n return SUPPORTED_ASSETS[asset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? asset;\n}\n","import type { Command } from 'commander';\nimport { T2000, formatUsd, SUPPORTED_ASSETS } from '@t2000/sdk';\nimport { resolvePin } from '../prompts.js';\nimport { printSuccess, printKeyValue, printBlank, printJson, isJsonMode, handleError, explorerUrl } from '../output.js';\n\nexport function registerExchange(program: Command) {\n program\n .command('exchange <amount> <from> <to>')\n .description('Exchange between tokens (e.g. USDC ⇌ SUI) via Cetus DEX')\n .option('--key <path>', 'Key file path')\n .option('--slippage <pct>', 'Max slippage percentage (default: 3)', '3')\n .action(async (amount: string, from: string, to: string, opts: { key?: string; slippage?: string }) => {\n try {\n const pin = await resolvePin();\n const agent = await T2000.create({ pin, keyPath: opts.key });\n\n const fromAsset = from.toUpperCase();\n const toAsset = to.toUpperCase();\n const parsedAmount = parseFloat(amount);\n\n if (isNaN(parsedAmount) || parsedAmount <= 0) {\n throw new Error('Amount must be a positive number');\n }\n\n const result = await agent.exchange({\n from: fromAsset,\n to: toAsset,\n amount: parsedAmount,\n maxSlippage: parseFloat(opts.slippage ?? '3'),\n });\n\n if (isJsonMode()) {\n printJson(result);\n return;\n }\n\n const fromDisplay = SUPPORTED_ASSETS[fromAsset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? fromAsset;\n const toDisplay = SUPPORTED_ASSETS[toAsset as keyof typeof SUPPORTED_ASSETS]?.displayName ?? toAsset;\n const toDecimals = toAsset === 'SUI' ? 4 : 2;\n\n printBlank();\n const fromStr = ['USDC', 'USDT', 'USDE'].includes(fromAsset) ? formatUsd(parsedAmount) : parsedAmount.toFixed(4);\n printSuccess(`Exchanged ${fromStr} ${fromDisplay} → ${result.toAmount.toFixed(toDecimals)} ${toDisplay}`);\n printKeyValue('Tx', explorerUrl(result.tx));\n printKeyValue('Gas', `${result.gasCost.toFixed(4)} SUI (${result.gasMethod})`);\n printBlank();\n } catch (error) {\n handleError(error);\n }\n });\n}\n","import { createProgram } from './program.js';\n\nconst program = createProgram();\nprogram.parse();\n"],"mappings":"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","names":["pc","program","pc","T2000","program","T2000","pc","T2000","formatUsd","program","T2000","formatUsd","pc","T2000","program","T2000","T2000","program","T2000","T2000","truncateAddress","program","T2000","truncateAddress","readFile","writeFile","mkdir","resolve","homedir","T2000","resolve","homedir","readFile","mkdir","writeFile","program","T2000","password","program","pc","T2000","formatUsd","program","T2000","pc","formatUsd","T2000","formatUsd","program","T2000","formatUsd","T2000","formatUsd","program","T2000","formatUsd","T2000","formatUsd","program","T2000","formatUsd","T2000","formatUsd","program","T2000","formatUsd","pc","T2000","program","T2000","pc","pc","T2000","formatUsd","program","T2000","pc","formatUsd","pc","T2000","formatUsd","program","T2000","formatUsd","pc","pc","T2000","formatUsd","program","T2000","formatUsd","pc","homedir","homedir","program","readFileSync","writeFileSync","mkdirSync","existsSync","join","homedir","T2000","CONFIG_DIR","join","homedir","existsSync","mkdirSync","readFileSync","writeFileSync","program","T2000","pc","T2000","program","T2000","pc","program","T2000","pc","program","T2000","result","T2000","MIST_PER_SUI","formatUsd","pc","MIST_PER_SUI","program","T2000","formatUsd","pc","T2000","formatUsd","SUPPORTED_ASSETS","program","T2000","result","pc","formatUsd","SUPPORTED_ASSETS","T2000","formatUsd","SUPPORTED_ASSETS","program","T2000","SUPPORTED_ASSETS","formatUsd","require","program"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t2000/cli",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "description": "CLI bank account for AI agents on Sui — send, save, borrow, rebalance from your terminal",
5
5
  "type": "module",
6
6
  "bin": {
@@ -37,8 +37,8 @@
37
37
  "commander": "^13",
38
38
  "hono": "^4",
39
39
  "picocolors": "^1",
40
- "@t2000/x402": "0.3.0",
41
- "@t2000/sdk": "0.10.0"
40
+ "@t2000/sdk": "0.10.2",
41
+ "@t2000/x402": "0.3.0"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/node": "^20",