@t2000/cli 0.20.19 → 0.20.21

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.
@@ -21013,9 +21013,45 @@ function errorResult(err) {
21013
21013
  };
21014
21014
  }
21015
21015
  function registerReadTools(server, agent) {
21016
+ server.tool(
21017
+ "t2000_overview",
21018
+ "Complete account snapshot in ONE call \u2014 balance, savings positions, investment portfolio, health factor, yield earnings, fund status, and pending rewards. Use this for morning briefings, general account questions, or any time you need the full picture. Prefer this over calling t2000_balance + t2000_positions + t2000_portfolio + t2000_health + t2000_earnings individually.",
21019
+ {},
21020
+ async () => {
21021
+ try {
21022
+ const [balance, positions, portfolio, health, earnings, fundStatus, pendingRewards] = await Promise.allSettled([
21023
+ agent.balance(),
21024
+ agent.positions(),
21025
+ agent.getPortfolio(),
21026
+ agent.healthFactor(),
21027
+ agent.earnings(),
21028
+ agent.fundStatus(),
21029
+ agent.getPendingRewards()
21030
+ ]);
21031
+ const result = {
21032
+ balance: balance.status === "fulfilled" ? balance.value : null,
21033
+ positions: positions.status === "fulfilled" ? positions.value : null,
21034
+ portfolio: portfolio.status === "fulfilled" ? {
21035
+ ...portfolio.value,
21036
+ positions: portfolio.value.positions.map((p) => ({
21037
+ ...p,
21038
+ ...p.currentPrice === 0 && p.totalAmount > 0 ? { note: "price unavailable" } : {}
21039
+ }))
21040
+ } : null,
21041
+ health: health.status === "fulfilled" ? health.value : null,
21042
+ earnings: earnings.status === "fulfilled" ? earnings.value : null,
21043
+ fundStatus: fundStatus.status === "fulfilled" ? fundStatus.value : null,
21044
+ pendingRewards: pendingRewards.status === "fulfilled" ? pendingRewards.value : null
21045
+ };
21046
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
21047
+ } catch (err) {
21048
+ return errorResult(err);
21049
+ }
21050
+ }
21051
+ );
21016
21052
  server.tool(
21017
21053
  "t2000_balance",
21018
- "Get agent's current balance \u2014 available (checking), savings, credit (debt), gas reserve, and net total. All values in USD.",
21054
+ "Get agent's current balance \u2014 available (checking), savings, credit (debt), gas reserve, and net total. All values in USD. For a full account snapshot, prefer t2000_overview instead.",
21019
21055
  {},
21020
21056
  async () => {
21021
21057
  try {
@@ -21028,7 +21064,7 @@ function registerReadTools(server, agent) {
21028
21064
  );
21029
21065
  server.tool(
21030
21066
  "t2000_address",
21031
- "Get the agent's Sui wallet address.",
21067
+ "Get the agent's Sui wallet address for receiving funds.",
21032
21068
  {},
21033
21069
  async () => {
21034
21070
  try {
@@ -21041,7 +21077,7 @@ function registerReadTools(server, agent) {
21041
21077
  );
21042
21078
  server.tool(
21043
21079
  "t2000_positions",
21044
- "View current lending positions across protocols (NAVI, Suilend) \u2014 deposits, borrows, APYs.",
21080
+ "View current lending positions across protocols (NAVI, Suilend) \u2014 deposits, borrows, APYs. For a full account snapshot, prefer t2000_overview instead.",
21045
21081
  {},
21046
21082
  async () => {
21047
21083
  try {
@@ -21054,7 +21090,7 @@ function registerReadTools(server, agent) {
21054
21090
  );
21055
21091
  server.tool(
21056
21092
  "t2000_rates",
21057
- "Get best available interest rates per asset across all lending protocols.",
21093
+ "Get best available interest rates per asset across all lending protocols. Use alongside t2000_positions to compare current vs best rates. Use with t2000_rebalance (dryRun: true) to preview optimization.",
21058
21094
  {},
21059
21095
  async () => {
21060
21096
  try {
@@ -21067,7 +21103,7 @@ function registerReadTools(server, agent) {
21067
21103
  );
21068
21104
  server.tool(
21069
21105
  "t2000_health",
21070
- "Check the agent's health factor \u2014 measures how safe current borrows are. Below 1.0 risks liquidation.",
21106
+ "Check the agent's health factor \u2014 measures how safe current borrows are. Below 1.0 risks liquidation. Also shows supplied, borrowed, max borrow, and liquidation threshold.",
21071
21107
  {},
21072
21108
  async () => {
21073
21109
  try {
@@ -21080,7 +21116,7 @@ function registerReadTools(server, agent) {
21080
21116
  );
21081
21117
  server.tool(
21082
21118
  "t2000_history",
21083
- "View recent transactions (sends, saves, borrows, swaps, etc.).",
21119
+ "View recent transactions (sends, saves, borrows, swaps, investments). Use for activity summaries and weekly recaps.",
21084
21120
  { limit: external_exports.number().optional().describe("Number of transactions to return (default: 20)") },
21085
21121
  async ({ limit }) => {
21086
21122
  try {
@@ -21093,7 +21129,7 @@ function registerReadTools(server, agent) {
21093
21129
  );
21094
21130
  server.tool(
21095
21131
  "t2000_earnings",
21096
- "View yield earnings from savings positions \u2014 total earned, daily rate, current APY.",
21132
+ "View yield earnings from savings positions \u2014 total earned, daily rate, current APY. For a full account snapshot, prefer t2000_overview instead.",
21097
21133
  {},
21098
21134
  async () => {
21099
21135
  try {
@@ -21104,9 +21140,100 @@ function registerReadTools(server, agent) {
21104
21140
  }
21105
21141
  }
21106
21142
  );
21143
+ server.tool(
21144
+ "t2000_fund_status",
21145
+ "Detailed savings analytics \u2014 total supplied, current APY, earned today, earned all-time, projected monthly yield. More detailed than t2000_earnings.",
21146
+ {},
21147
+ async () => {
21148
+ try {
21149
+ const result = await agent.fundStatus();
21150
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
21151
+ } catch (err) {
21152
+ return errorResult(err);
21153
+ }
21154
+ }
21155
+ );
21156
+ server.tool(
21157
+ "t2000_pending_rewards",
21158
+ "Check pending protocol rewards from lending positions WITHOUT claiming them. Shows claimable reward tokens per protocol and asset. Use t2000_claim_rewards to actually collect and convert to USDC.",
21159
+ {},
21160
+ async () => {
21161
+ try {
21162
+ const result = await agent.getPendingRewards();
21163
+ return { content: [{ type: "text", text: JSON.stringify({ rewards: result, count: result.length }) }] };
21164
+ } catch (err) {
21165
+ return errorResult(err);
21166
+ }
21167
+ }
21168
+ );
21169
+ server.tool(
21170
+ "t2000_deposit_info",
21171
+ "Get deposit instructions \u2014 wallet address, supported networks, accepted assets. Use when the user asks how to fund or top up their account.",
21172
+ {},
21173
+ async () => {
21174
+ try {
21175
+ const result = await agent.deposit();
21176
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
21177
+ } catch (err) {
21178
+ return errorResult(err);
21179
+ }
21180
+ }
21181
+ );
21182
+ server.tool(
21183
+ "t2000_all_rates",
21184
+ 'Compare interest rates across ALL protocols side-by-side for every asset. Shows NAVI vs Suilend rates per asset. Use when the user asks "am I getting the best rate?" or wants to compare protocols.',
21185
+ {},
21186
+ async () => {
21187
+ try {
21188
+ const result = await agent.allRatesAcrossAssets();
21189
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
21190
+ } catch (err) {
21191
+ return errorResult(err);
21192
+ }
21193
+ }
21194
+ );
21195
+ server.tool(
21196
+ "t2000_sentinel_list",
21197
+ "List active Sui Sentinels \u2014 AI agents with prize pools you can attack. Shows name, attack fee, prize pool, and attack count. Use this for bounty hunting.",
21198
+ {},
21199
+ async () => {
21200
+ try {
21201
+ const sentinels = await agent.sentinelList();
21202
+ const serializable = sentinels.map((s) => ({
21203
+ ...s,
21204
+ attackFee: s.attackFee.toString(),
21205
+ attackFeeSui: Number(s.attackFee) / 1e9,
21206
+ prizePool: s.prizePool.toString(),
21207
+ prizePoolSui: Number(s.prizePool) / 1e9
21208
+ }));
21209
+ return { content: [{ type: "text", text: JSON.stringify(serializable) }] };
21210
+ } catch (err) {
21211
+ return errorResult(err);
21212
+ }
21213
+ }
21214
+ );
21215
+ server.tool(
21216
+ "t2000_sentinel_info",
21217
+ "Get detailed info about a specific Sui Sentinel \u2014 model, system prompt, prize pool, attack history. Use the sentinel ID or object ID from t2000_sentinel_list.",
21218
+ { id: external_exports.string().describe("Sentinel agent ID or object ID") },
21219
+ async ({ id }) => {
21220
+ try {
21221
+ const s = await agent.sentinelInfo(id);
21222
+ return { content: [{ type: "text", text: JSON.stringify({
21223
+ ...s,
21224
+ attackFee: s.attackFee.toString(),
21225
+ attackFeeSui: Number(s.attackFee) / 1e9,
21226
+ prizePool: s.prizePool.toString(),
21227
+ prizePoolSui: Number(s.prizePool) / 1e9
21228
+ }) }] };
21229
+ } catch (err) {
21230
+ return errorResult(err);
21231
+ }
21232
+ }
21233
+ );
21107
21234
  server.tool(
21108
21235
  "t2000_contacts",
21109
- "List saved contacts (name \u2192 address mappings). Use contact names with t2000_send instead of raw addresses.",
21236
+ "List saved contacts (name \u2192 address mappings). Use contact names with t2000_send instead of raw addresses. Use t2000_contact_add to save new contacts.",
21110
21237
  {},
21111
21238
  async () => {
21112
21239
  try {
@@ -21119,7 +21246,7 @@ function registerReadTools(server, agent) {
21119
21246
  );
21120
21247
  server.tool(
21121
21248
  "t2000_portfolio",
21122
- "Show investment portfolio \u2014 positions, cost basis, current value, unrealized/realized P&L.",
21249
+ "Show investment portfolio \u2014 positions, cost basis, current value, unrealized/realized P&L, strategy groupings. For a full account snapshot, prefer t2000_overview instead.",
21123
21250
  {},
21124
21251
  async () => {
21125
21252
  try {
@@ -21587,6 +21714,55 @@ function registerWriteTools(server, agent) {
21587
21714
  }
21588
21715
  }
21589
21716
  );
21717
+ server.tool(
21718
+ "t2000_sentinel_attack",
21719
+ "Attack a Sui Sentinel with a prompt to try to breach its defenses and win the prize pool. Costs SUI (the attack fee). Use t2000_sentinel_list to find targets first.",
21720
+ {
21721
+ id: external_exports.string().describe("Sentinel agent ID or object ID to attack"),
21722
+ prompt: external_exports.string().describe("Your attack prompt \u2014 try to make the AI do something its system prompt forbids"),
21723
+ fee: external_exports.number().optional().describe("Override attack fee in SUI (default: sentinel's listed fee)")
21724
+ },
21725
+ async ({ id, prompt, fee }) => {
21726
+ try {
21727
+ const feeMist = fee ? BigInt(Math.round(fee * 1e9)) : void 0;
21728
+ const result = await mutex.run(() => agent.sentinelAttack(id, prompt, feeMist));
21729
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
21730
+ } catch (err) {
21731
+ return errorResult(err);
21732
+ }
21733
+ }
21734
+ );
21735
+ server.tool(
21736
+ "t2000_contact_add",
21737
+ 'Save a contact name \u2192 Sui address mapping. After saving, use the name with t2000_send instead of pasting addresses. Example: save "Tom" as 0x1234... then send to "Tom".',
21738
+ {
21739
+ name: external_exports.string().describe('Contact name (e.g. "Tom", "Alice")'),
21740
+ address: external_exports.string().describe("Sui wallet address (0x...)")
21741
+ },
21742
+ async ({ name, address }) => {
21743
+ try {
21744
+ const result = agent.contacts.add(name, address);
21745
+ return { content: [{ type: "text", text: JSON.stringify({ success: true, name, address, ...result }) }] };
21746
+ } catch (err) {
21747
+ return errorResult(err);
21748
+ }
21749
+ }
21750
+ );
21751
+ server.tool(
21752
+ "t2000_contact_remove",
21753
+ "Remove a saved contact by name.",
21754
+ {
21755
+ name: external_exports.string().describe("Contact name to remove")
21756
+ },
21757
+ async ({ name }) => {
21758
+ try {
21759
+ const removed = agent.contacts.remove(name);
21760
+ return { content: [{ type: "text", text: JSON.stringify({ success: removed, name }) }] };
21761
+ } catch (err) {
21762
+ return errorResult(err);
21763
+ }
21764
+ }
21765
+ );
21590
21766
  }
21591
21767
  function registerSafetyTools(server, agent) {
21592
21768
  server.tool(
@@ -21669,20 +21845,35 @@ function registerPrompts(server) {
21669
21845
  content: {
21670
21846
  type: "text",
21671
21847
  text: [
21672
- "You are a financial assistant for a t2000 AI agent bank account.",
21848
+ "You are a financial assistant for a t2000 AI agent bank account on Sui.",
21849
+ "",
21850
+ "IMPORTANT: Call t2000_overview FIRST \u2014 it returns everything (balance, positions, portfolio, health, earnings, fund status, pending rewards) in one call.",
21851
+ "Then call t2000_rates for rate comparison across protocols.",
21673
21852
  "",
21674
- "Please provide a comprehensive financial report by:",
21675
- "1. Check the current balance (t2000_balance)",
21676
- "2. Review lending positions (t2000_positions)",
21677
- "3. Check the health factor (t2000_health)",
21678
- "4. Show yield earnings (t2000_earnings)",
21679
- "5. Review current interest rates (t2000_rates)",
21680
- "6. Check investment portfolio (t2000_portfolio)",
21681
- "7. Check for pending protocol rewards (positions with +rewards tags mean claimable rewards exist)",
21853
+ "Present a comprehensive financial report:",
21854
+ "",
21855
+ "\u{1F4CA} FINANCIAL REPORT",
21856
+ "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
21682
21857
  "",
21683
- "Summarize the agent's financial health in a clear, concise format with actionable recommendations.",
21684
- 'If any positions show claimable rewards, include "Claim rewards \u2192 run t2000_claim_rewards to collect and convert to USDC" as an action item.',
21685
- "Check if investment earning positions could move to a better-rate protocol (t2000_invest_rebalance with dryRun: true). If opportunities exist, include as a recommendation."
21858
+ "\u{1F4B0} Accounts",
21859
+ " Checking / Savings / Credit / Investment with totals",
21860
+ " Net worth",
21861
+ "",
21862
+ "\u{1F4C8} Positions",
21863
+ " Each savings position: protocol, asset, amount, APY",
21864
+ " Each investment position: asset, amount, cost basis, current value, P&L",
21865
+ "",
21866
+ "\u{1F4B8} Yield",
21867
+ " Current APY, daily/monthly/projected earnings",
21868
+ " Comparison to best available rates",
21869
+ "",
21870
+ "\u{1F6E1}\uFE0F Risk",
21871
+ " Health factor status",
21872
+ " Concentration analysis",
21873
+ "",
21874
+ "\u{1F4CB} Recommendations (max 4)",
21875
+ " Actionable items based on data",
21876
+ " Include: idle funds, rate optimization, reward claiming, debt repayment"
21686
21877
  ].join("\n")
21687
21878
  }
21688
21879
  }]
@@ -21697,17 +21888,33 @@ function registerPrompts(server) {
21697
21888
  content: {
21698
21889
  type: "text",
21699
21890
  text: [
21700
- "You are a yield optimization assistant for a t2000 AI agent bank account.",
21891
+ "You are a yield optimization assistant for a t2000 AI agent bank account on Sui.",
21892
+ "",
21893
+ "IMPORTANT: Call these tools in parallel:",
21894
+ " 1. t2000_overview \u2014 full account state including positions and pending rewards",
21895
+ " 2. t2000_rates \u2014 all available rates across protocols",
21896
+ " 3. t2000_rebalance (dryRun: true) \u2014 preview savings optimization",
21701
21897
  "",
21702
- "Please analyze the current yield strategy:",
21703
- "1. Check current positions (t2000_positions) \u2014 look for +rewards tags indicating claimable protocol rewards",
21704
- "2. Compare rates across protocols (t2000_rates)",
21705
- "3. Run a dry-run savings rebalance (t2000_rebalance with dryRun: true)",
21706
- "4. Run a dry-run investment rebalance (t2000_invest_rebalance with dryRun: true) \u2014 checks if earning positions on SUI, BTC, ETH, GOLD could move to a higher-rate protocol",
21898
+ "Present a structured yield analysis:",
21707
21899
  "",
21708
- "If a savings rebalance would improve yield, explain the trade-off (gas cost vs yield gain, break-even period) and ask if the user wants to proceed.",
21709
- "If an investment rebalance would improve yield, show which assets would move and the APY gain, then ask to proceed.",
21710
- "If any positions have claimable rewards, recommend running t2000_claim_rewards to collect and auto-convert to USDC."
21900
+ "\u{1F4CA} YIELD ANALYSIS",
21901
+ "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
21902
+ "",
21903
+ " Current [asset] on [protocol] \xB7 X.XX% APY",
21904
+ " Best [asset] on [protocol] \xB7 X.XX% APY",
21905
+ " APY gain +X.XX%",
21906
+ " Break-even X days",
21907
+ "",
21908
+ 'If a better rate exists: "Better rate available. Want me to rebalance?"',
21909
+ `If already optimal: "You're at the best available rate."`,
21910
+ "",
21911
+ "Also check:",
21912
+ " - Idle checking funds that could be earning yield",
21913
+ " - Investment assets not in lending (could use t2000_invest earn)",
21914
+ " - Claimable protocol rewards (suggest t2000_claim_rewards)",
21915
+ "",
21916
+ "On user confirmation, execute t2000_rebalance (dryRun: false).",
21917
+ "After execution, show: new APY, amount moved, transaction link."
21711
21918
  ].join("\n")
21712
21919
  }
21713
21920
  }]
@@ -21789,22 +21996,18 @@ ${context}
21789
21996
  content: {
21790
21997
  type: "text",
21791
21998
  text: [
21792
- "You are a savings advisor for a t2000 AI agent bank account.",
21999
+ "You are a savings advisor for a t2000 AI agent bank account on Sui.",
21793
22000
  "",
21794
- "Analyze the user's funds and recommend a savings strategy:",
21795
- "1. Check current balance (t2000_balance) \u2014 how much is idle in checking?",
21796
- "2. Check current positions (t2000_positions) \u2014 what's already in savings?",
21797
- "3. Compare rates across protocols (t2000_rates) \u2014 where's the best yield?",
22001
+ "IMPORTANT: Call t2000_overview and t2000_all_rates in parallel to get the full picture.",
21798
22002
  "",
21799
- "Recommend:",
21800
- "- How much to move from checking to savings (keep a reasonable buffer for gas + daily spending)",
21801
- "- Which protocol offers the best rate right now",
21802
- "- Expected annual yield on the recommended amount",
21803
- "- If they should rebalance existing savings (t2000_rebalance with dryRun: true)",
21804
- "- Whether investing in SUI or other assets could complement their savings strategy",
21805
- '- Note: investment assets (SUI, ETH) can also earn yield via t2000_invest action: "earn"',
22003
+ "Analyze and recommend:",
22004
+ " - How much idle checking can move to savings (keep ~$5 buffer for gas)",
22005
+ " - Which protocol + asset offers the best yield (compare NAVI vs Suilend, USDC vs USDe etc.)",
22006
+ " - Expected monthly/annual yield on the recommended amount",
22007
+ " - If existing savings should rebalance (t2000_rebalance with dryRun: true)",
22008
+ " - Whether investment assets could earn yield via t2000_invest earn",
21806
22009
  "",
21807
- "If they want to proceed, use t2000_save to deposit. Always preview first."
22010
+ "If they want to proceed, use t2000_save to deposit."
21808
22011
  ].join("\n")
21809
22012
  }
21810
22013
  }]
@@ -21819,28 +22022,20 @@ ${context}
21819
22022
  content: {
21820
22023
  type: "text",
21821
22024
  text: [
21822
- "You are an investment advisor for a t2000 AI agent bank account.",
22025
+ "You are an investment advisor for a t2000 AI agent bank account on Sui.",
21823
22026
  "",
21824
- "Analyze the user's investment position:",
21825
- "1. Check current balance (t2000_balance) \u2014 available checking, savings, investment value",
21826
- "2. Check investment portfolio (t2000_portfolio) \u2014 positions, cost basis, P&L, strategy grouping",
21827
- '3. List available strategies (t2000_strategy action: "list") \u2014 predefined and custom',
21828
- '4. Check DCA schedules (t2000_auto_invest action: "status") \u2014 any active recurring buys',
21829
- "5. Compare current rates (t2000_rates) \u2014 yield alternatives",
22027
+ 'IMPORTANT: Call t2000_overview FIRST, then t2000_strategy (action: "list") and t2000_auto_invest (action: "status") in parallel.',
21830
22028
  "",
21831
- "Recommend:",
21832
- "- Portfolio allocation assessment (checking vs savings vs investment)",
21833
- "- Whether a predefined strategy (bluechip, layer1, sui-heavy) suits them better than picking individual assets",
21834
- "- If strategy positions are drifting from target weights, suggest rebalancing",
21835
- "- If they have no DCA schedule, recommend setting one up for dollar-cost averaging",
21836
- '- Whether invested assets should earn yield (t2000_invest action: "earn")',
21837
- "- If assets are already earning, check for better rates (t2000_invest_rebalance with dryRun: true) \u2014 moves earning positions to higher-APY protocols automatically",
21838
- "- Risk assessment \u2014 concentration, unrealized losses, strategy drift",
22029
+ "Analyze and recommend:",
22030
+ " - Portfolio allocation (checking vs savings vs investment)",
22031
+ " - Best strategy for their profile (bluechip, all-weather, layer1, sui-heavy, safe-haven)",
22032
+ " - If strategy positions are drifting from target weights, suggest rebalancing",
22033
+ " - If no DCA schedule exists, recommend setting one up",
22034
+ " - Whether invested assets should earn yield (t2000_invest earn)",
22035
+ " - Risk: concentration, unrealized losses, strategy drift",
21839
22036
  "",
21840
- "For strategies: use t2000_strategy with dryRun: true to preview before buying.",
21841
- 'For DCA: use t2000_auto_invest action: "setup" to create recurring buys.',
21842
- "For direct investments: use t2000_invest with dryRun: true to preview.",
21843
- "For yield optimization: use t2000_invest_rebalance with dryRun: true to preview earning moves."
22037
+ "For strategies: use t2000_strategy with dryRun: true to preview.",
22038
+ 'For DCA: use t2000_auto_invest action: "setup" to create recurring buys.'
21844
22039
  ].join("\n")
21845
22040
  }
21846
22041
  }]
@@ -21855,48 +22050,37 @@ ${context}
21855
22050
  content: {
21856
22051
  type: "text",
21857
22052
  text: [
21858
- "You are a personal financial briefing assistant for a t2000 AI agent bank account.",
22053
+ "You are a personal financial briefing assistant for a t2000 AI agent bank account on Sui.",
21859
22054
  "",
21860
- "Deliver a concise morning briefing. Gather all data first, then present a single unified report.",
22055
+ "IMPORTANT: Call t2000_overview FIRST \u2014 it returns balance, positions, portfolio, health, earnings, fund status, and pending rewards in one call.",
22056
+ 'Then call t2000_auto_invest (action: "status") to check for pending DCA runs.',
22057
+ "Optionally call t2000_rebalance (dryRun: true) to check yield optimization opportunities.",
21861
22058
  "",
21862
- "Data to collect:",
21863
- "1. Current balance breakdown (t2000_balance)",
21864
- "2. Yield earnings \u2014 daily rate, total earned (t2000_earnings)",
21865
- "3. Investment portfolio \u2014 positions, P&L movement (t2000_portfolio)",
21866
- "4. Health factor \u2014 any borrow risk (t2000_health)",
21867
- '5. Pending DCA runs (t2000_auto_invest action: "status")',
21868
- "6. Recent transactions since yesterday (t2000_history with limit: 10)",
21869
- "7. Lending positions (t2000_positions) \u2014 check for +rewards tags indicating claimable rewards",
21870
- "8. Investment rebalance opportunities (t2000_invest_rebalance with dryRun: true) \u2014 any earning positions on sub-optimal protocols",
21871
- "",
21872
- "Present the briefing in this structure:",
22059
+ "Present everything as a single structured briefing. NEVER ask follow-up questions before presenting the briefing.",
21873
22060
  "",
21874
22061
  "\u2600\uFE0F MORNING BRIEFING",
21875
22062
  "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
21876
22063
  "",
21877
- "\u{1F4B0} Accounts",
21878
- " Checking / Savings / Credit / Investment totals",
21879
- " Net worth and change from yesterday if estimable",
21880
- ' If rewards are claimable, show "Rewards: claimable"',
21881
- "",
21882
- "\u{1F4C8} Portfolio",
21883
- " Each position: asset, amount, current price, unrealized P&L",
21884
- " Overall portfolio performance",
22064
+ "Show a compact account summary table:",
22065
+ " Checking $XX.XX",
22066
+ " Savings $XX.XX \xB7 X.XX% APY",
22067
+ " Credit -$XX.XX (only if borrowed)",
22068
+ " Investment $XX.XX \xB7 +X.X% (only if positions exist)",
22069
+ " Net Worth $XX.XX",
21885
22070
  "",
21886
- "\u{1F4B8} Yield",
21887
- " What you earned overnight (daily rate \xD7 time)",
21888
- " Current APY across savings and investment lending",
21889
- "",
21890
- "\u26A0\uFE0F Alerts (only if applicable)",
21891
- " Low health factor, pending DCA runs, strategy drift, large unrealized losses, claimable rewards",
22071
+ "If there are savings positions, show daily yield earned.",
22072
+ "If there are investment positions, show each asset with P&L.",
22073
+ "If pending rewards exist, mention them.",
21892
22074
  "",
21893
- "\u{1F4CB} Action Items",
21894
- " Specific, actionable next steps (max 4)",
21895
- ' e.g. "Claim rewards \u2192 run t2000_claim_rewards", "Run pending DCA", "Rebalance savings for +0.5% APY", "Rebalance investment earning \u2192 run t2000_invest_rebalance", "Health factor dropping \u2014 consider repaying"',
21896
- " If positions show +rewards, always include claiming as an action item",
21897
- " If investment rebalance shows opportunities, include as an action item",
22075
+ "\u{1F4CB} Action Items (max 4, only if applicable):",
22076
+ " - Idle funds in checking \u2192 suggest saving or investing",
22077
+ " - Outstanding debt \u2192 suggest repaying to stop interest",
22078
+ " - Pending DCA run \u2192 suggest executing",
22079
+ " - Better yield available \u2192 suggest rebalancing",
22080
+ " - Claimable rewards \u2192 suggest claiming",
22081
+ " - Low health factor \u2192 warn about liquidation risk",
21898
22082
  "",
21899
- "Keep it scannable. No fluff. Numbers first, narrative second."
22083
+ "If everything is optimized, say so. Keep it scannable \u2014 numbers first, narrative second."
21900
22084
  ].join("\n")
21901
22085
  }
21902
22086
  }]
@@ -21914,42 +22098,43 @@ ${context}
21914
22098
  content: {
21915
22099
  type: "text",
21916
22100
  text: [
21917
- "You are a financial scenario planner for a t2000 AI agent bank account.",
22101
+ "You are a financial scenario planner for a t2000 AI agent bank account on Sui.",
21918
22102
  "",
21919
22103
  scenario ? `The user wants to evaluate this scenario: "${scenario}"` : "The user wants to explore a hypothetical financial scenario. Ask them what they're considering.",
21920
22104
  "",
21921
- "Gather current state first:",
21922
- "1. Current balance (t2000_balance)",
21923
- "2. Current portfolio (t2000_portfolio)",
21924
- "3. Current positions and rates (t2000_positions, t2000_rates)",
21925
- "4. Health factor if they have borrows (t2000_health)",
22105
+ "IMPORTANT: Call t2000_overview FIRST to get the full current state (balance, positions, portfolio, health).",
22106
+ "Then preview the specific action with dryRun: true.",
22107
+ "",
22108
+ 'For INVESTMENT scenarios ("invest $X in Y" or "buy $X of strategy"):',
22109
+ ` - Call t2000_strategy (action: "list") to get allocations if it's a strategy`,
22110
+ " - Call t2000_invest or t2000_strategy with dryRun: true to preview",
22111
+ " - If the amount exceeds available checking, calculate what they'd need to withdraw from savings",
22112
+ "",
22113
+ 'For SAVINGS scenarios ("save $X" or "withdraw $X"):',
22114
+ " - Show impact on yield and health factor",
21926
22115
  "",
21927
- "Then model the scenario. For each scenario type:",
22116
+ 'For BORROW scenarios ("borrow $X"):',
22117
+ " - Show new health factor and interest cost",
21928
22118
  "",
21929
- 'INVESTMENT scenario ("invest $X in Y"):',
21930
- " - Preview the trade (t2000_invest or t2000_strategy with dryRun: true)",
21931
- " - Show: checking balance after, new portfolio allocation %, concentration risk",
21932
- " - If the asset can earn yield, show projected annual yield",
21933
- ' - Compare: "keeping $X in savings at Y% vs investing at historical volatility"',
22119
+ 'For EXCHANGE scenarios ("swap $X A to B"):',
22120
+ " - Call t2000_exchange with dryRun: true",
21934
22121
  "",
21935
- 'SAVINGS scenario ("save $X" or "withdraw $X"):',
21936
- " - Show: new savings balance, new yield rate, impact on available spending",
21937
- " - If withdrawing: impact on health factor if they have borrows",
22122
+ "ALWAYS present results as a BEFORE \u2192 AFTER comparison table:",
21938
22123
  "",
21939
- 'BORROW scenario ("borrow $X"):',
21940
- " - Show: new health factor, liquidation price, interest cost",
21941
- " - Compare: cost of borrowing vs withdrawing from savings",
22124
+ "\u{1F4CA} SCENARIO: [description]",
22125
+ " [strategy allocation breakdown if applicable]",
21942
22126
  "",
21943
- 'EXCHANGE scenario ("swap $X of A to B"):',
21944
- " - Preview the swap (t2000_exchange with dryRun: true)",
21945
- " - Show: expected output, price impact, slippage",
22127
+ " Before After",
22128
+ " Checking $XX.XX $XX.XX",
22129
+ " Savings $XX.XX $XX.XX",
22130
+ " Investment $XX.XX $XX.XX",
21946
22131
  "",
21947
- "Present results as:",
21948
- " BEFORE \u2192 AFTER comparison table",
21949
- " Risk assessment (better/worse/neutral)",
21950
- " Clear recommendation with reasoning",
22132
+ "Then add a smart recommendation:",
22133
+ " - If amount exceeds checking, suggest a smaller amount that keeps savings intact",
22134
+ " - If it would drain checking below $5, warn about gas needs",
22135
+ " - If the asset can earn yield after buying, mention it",
21951
22136
  "",
21952
- 'Always end with: "Want me to execute this?" and the exact command that would run.'
22137
+ 'End with: "Want me to go ahead?" \u2014 ready to execute on confirmation.'
21953
22138
  ].join("\n")
21954
22139
  }
21955
22140
  }]
@@ -21959,52 +22144,38 @@ ${context}
21959
22144
  "sweep",
21960
22145
  "Find idle funds in checking and optimally distribute across savings and investments for maximum yield.",
21961
22146
  {
21962
- keepBuffer: external_exports.number().optional().describe("Dollar amount to keep in checking as spending buffer (default: $20)")
22147
+ keepBuffer: external_exports.number().optional().describe("Dollar amount to keep in checking as spending buffer (default: $5)")
21963
22148
  },
21964
22149
  async ({ keepBuffer }) => {
21965
- const buffer = keepBuffer ?? 20;
22150
+ const buffer = keepBuffer ?? 5;
21966
22151
  return {
21967
22152
  messages: [{
21968
22153
  role: "user",
21969
22154
  content: {
21970
22155
  type: "text",
21971
22156
  text: [
21972
- "You are a smart money routing assistant for a t2000 AI agent bank account.",
22157
+ "You are a smart money routing assistant for a t2000 AI agent bank account on Sui.",
21973
22158
  "",
21974
- `Sweep idle checking funds into optimal earning positions. Keep $${buffer} in checking as a spending buffer.`,
22159
+ `IMPORTANT: Call t2000_overview and t2000_all_rates in parallel. Keep $${buffer} in checking as buffer.`,
21975
22160
  "",
21976
- "Step 1 \u2014 Assess current state:",
21977
- " - Check balance (t2000_balance) \u2014 how much is idle in checking?",
21978
- " - Check positions (t2000_positions) \u2014 what's already earning?",
21979
- " - Check rates (t2000_rates) \u2014 where are the best yields?",
21980
- " - Check portfolio (t2000_portfolio) \u2014 any uninvested assets not earning yield?",
22161
+ `Calculate sweep amount: available checking minus $${buffer} buffer.`,
22162
+ "If sweep amount < $1, funds are already optimized.",
21981
22163
  "",
21982
- `Step 2 \u2014 Calculate sweep amount: available checking minus $${buffer} buffer.`,
21983
- " If sweep amount is < $1, tell the user their funds are already optimized.",
22164
+ "Present a sweep plan:",
21984
22165
  "",
21985
- "Step 3 \u2014 Recommend allocation of the sweep amount:",
21986
- " - Savings: stable yield, no price risk \u2014 good for majority of idle funds",
21987
- " - Pick the highest-rate stablecoin protocol",
21988
- " - If they have investment assets not earning yield, recommend t2000_invest earn",
21989
- " - Check if rebalancing existing savings would help (t2000_rebalance dryRun: true)",
22166
+ "\u{1F9F9} SWEEP PLAN",
22167
+ "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
22168
+ `Available to sweep: $X (keeping $${buffer} buffer)`,
21990
22169
  "",
21991
- "Step 4 \u2014 Present the sweep plan:",
22170
+ "Actions (in order):",
22171
+ " 1. Save $X to best-rate protocol (show APY)",
22172
+ " 2. Earn yield on idle investment assets (if applicable)",
22173
+ " 3. Rebalance existing savings for better APY (t2000_rebalance dryRun: true)",
22174
+ " 4. Claim pending rewards (if available)",
21992
22175
  "",
21993
- " \u{1F9F9} SWEEP PLAN",
21994
- " \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
21995
- ` Available to sweep: $X (keeping $${buffer} buffer)`,
22176
+ "Projected monthly yield: $X.XX (before) \u2192 $X.XX (after)",
21996
22177
  "",
21997
- " Action 1: Save $X USDC \u2192 Protocol (Y% APY)",
21998
- " Expected: ~$X.XX/month",
21999
- " Action 2: Earn yield on X SUI \u2192 Protocol (Y% APY) [if applicable]",
22000
- " Action 3: Rebalance savings \u2192 +Y% APY [if applicable]",
22001
- " Action 4: Rebalance investment earning \u2192 move to better protocol [if t2000_invest_rebalance dryRun shows opportunity]",
22002
- " Action 5: Claim rewards \u2192 collect and convert to USDC [if positions show +rewards]",
22003
- "",
22004
- " Projected monthly yield: $X.XX (before) \u2192 $X.XX (after)",
22005
- "",
22006
- 'Ask: "Want me to execute this sweep?" Then run each action sequentially.',
22007
- "Use dryRun: true first for any action over $50."
22178
+ "Ask to confirm, then execute sequentially."
22008
22179
  ].join("\n")
22009
22180
  }
22010
22181
  }]
@@ -22020,51 +22191,24 @@ ${context}
22020
22191
  content: {
22021
22192
  type: "text",
22022
22193
  text: [
22023
- "You are a risk assessment specialist for a t2000 AI agent bank account.",
22194
+ "You are a risk assessment specialist for a t2000 AI agent bank account on Sui.",
22024
22195
  "",
22025
- "Perform a comprehensive risk analysis. Gather all data first:",
22026
- "1. Balance breakdown (t2000_balance)",
22027
- "2. Health factor (t2000_health)",
22028
- "3. All lending positions (t2000_positions)",
22029
- "4. Investment portfolio (t2000_portfolio)",
22030
- "5. Current rates (t2000_rates)",
22196
+ "IMPORTANT: Call t2000_overview FIRST \u2014 it has balance, positions, portfolio, health, everything.",
22031
22197
  "",
22032
- "Analyze and report on each risk dimension:",
22198
+ "Analyze and report:",
22033
22199
  "",
22034
22200
  "\u{1F6E1}\uFE0F RISK REPORT",
22035
22201
  "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
22036
22202
  "",
22037
- "1. LIQUIDATION RISK",
22038
- " Health factor value and status (safe / moderate / warning / critical)",
22039
- " How much the collateral can drop before liquidation",
22040
- " If HF < 2.0: specific repayment recommendation to reach safe zone",
22041
- "",
22042
- "2. CONCENTRATION RISK",
22043
- " % of total net worth in each account type (checking, savings, investment)",
22044
- " % of investments in each asset (SUI, BTC, ETH, GOLD)",
22045
- " Flag if any single position is >50% of portfolio",
22203
+ "1. LIQUIDATION RISK \u2014 Health factor, distance to liquidation",
22204
+ "2. CONCENTRATION RISK \u2014 % in each account type, % per asset",
22205
+ "3. PROTOCOL EXPOSURE \u2014 NAVI vs Suilend distribution",
22206
+ "4. UNREALIZED LOSSES \u2014 Any investment positions at a loss",
22207
+ "5. YIELD EFFICIENCY \u2014 Idle assets, sub-optimal rates",
22046
22208
  "",
22047
- "3. PROTOCOL EXPOSURE",
22048
- " Which protocols hold funds (NAVI, Suilend)",
22049
- " Total exposure per protocol",
22050
- " Flag if >80% of savings is in one protocol",
22209
+ "OVERALL: Low / Medium / High / Critical",
22051
22210
  "",
22052
- "4. UNREALIZED LOSSES",
22053
- " Any investment positions currently at a loss",
22054
- " Total unrealized P&L",
22055
- " Cost basis vs current price per position",
22056
- "",
22057
- "5. YIELD EFFICIENCY",
22058
- " Any assets sitting idle (not earning yield)",
22059
- " Checking balance vs recommended buffer",
22060
- " Investment assets not in lending (could earn via invest earn)",
22061
- " Earning positions on sub-optimal protocols (run t2000_invest_rebalance dryRun: true)",
22062
- "",
22063
- "OVERALL RISK SCORE: Low / Medium / High / Critical",
22064
- "Based on weighted combination of all factors above.",
22065
- "",
22066
- "End with max 3 specific, prioritized actions to reduce risk.",
22067
- "If overall risk is Low, say so clearly \u2014 don't invent problems."
22211
+ "End with max 3 prioritized actions. If Low risk, say so \u2014 don't invent problems."
22068
22212
  ].join("\n")
22069
22213
  }
22070
22214
  }]
@@ -22079,60 +22223,22 @@ ${context}
22079
22223
  content: {
22080
22224
  type: "text",
22081
22225
  text: [
22082
- "You are a personal finance newsletter writer for a t2000 AI agent bank account.",
22083
- "",
22084
- "Compile a weekly financial recap. Gather all data:",
22085
- "1. Current balance (t2000_balance)",
22086
- "2. Recent transactions (t2000_history with limit: 50)",
22087
- "3. Yield earnings (t2000_earnings)",
22088
- "4. Investment portfolio with P&L (t2000_portfolio)",
22089
- '5. Strategy statuses (t2000_strategy action: "list")',
22090
- '6. DCA schedule status (t2000_auto_invest action: "status")',
22091
- "7. Lending positions (t2000_positions) \u2014 check for claimable rewards",
22226
+ "You are a personal finance newsletter writer for a t2000 AI agent bank account on Sui.",
22092
22227
  "",
22093
- "Present as a weekly newsletter:",
22228
+ 'IMPORTANT: Call t2000_overview, t2000_history (limit: 50), t2000_auto_invest (action: "status") in parallel.',
22094
22229
  "",
22095
22230
  "\u{1F4CA} WEEKLY RECAP",
22096
22231
  "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
22097
22232
  "",
22098
- "\u{1F4B0} Net Worth: $X.XX",
22099
- " Checking: $X | Savings: $X | Investment: $X | Credit: -$X",
22100
- "",
22101
- "\u{1F4C8} This Week's Activity",
22102
- " Summarize transactions by type:",
22103
- " - X sends totaling $X",
22104
- " - X saves/withdrawals",
22105
- " - X investment trades",
22106
- " - X exchanges",
22107
- " Highlight the largest transaction",
22108
- "",
22109
- "\u{1F4B8} Yield Earned",
22110
- " Total yield this week (daily rate \xD7 7)",
22111
- " Breakdown by position",
22112
- " Annualized projection",
22113
- "",
22114
- "\u{1F4CA} Portfolio Performance",
22115
- " Each position: asset, P&L this week, total unrealized P&L",
22116
- " Best performer and worst performer",
22117
- " Strategy performance if applicable",
22118
- "",
22119
- "\u{1F504} DCA Status",
22120
- " Runs completed this week",
22121
- " Next scheduled run",
22122
- " Total invested via DCA to date",
22233
+ "\u{1F4B0} Net Worth: $X \u2014 Checking $X | Savings $X | Investment $X",
22234
+ "\u{1F4C8} Activity: X sends, X saves, X trades, X exchanges",
22235
+ "\u{1F4B8} Yield: $X.XX this week, X% APY, $X/month projected",
22236
+ "\u{1F4CA} Portfolio: Per-asset P&L, best & worst performer",
22237
+ "\u{1F504} DCA: Runs this week, next run, total invested",
22238
+ "\u{1F381} Rewards: Pending? Claim suggestion",
22239
+ "\u{1F449} Next Week: 1-2 actionable suggestions",
22123
22240
  "",
22124
- "\u{1F3C6} Highlight of the Week",
22125
- " One standout metric (best trade, highest yield day, milestone reached)",
22126
- "",
22127
- "\u{1F381} Rewards",
22128
- " Any pending protocol rewards (if positions show +rewards)",
22129
- " Suggest claiming if rewards are available",
22130
- "",
22131
- "\u{1F449} Next Week's Focus",
22132
- " 1-2 actionable suggestions based on trends",
22133
- " If investment earning positions can be rebalanced for better APY, mention it (t2000_invest_rebalance dryRun: true)",
22134
- "",
22135
- "Tone: confident, concise, data-driven. Like a Bloomberg brief, not a blog post."
22241
+ "Tone: confident, concise, data-driven. Bloomberg brief, not blog post."
22136
22242
  ].join("\n")
22137
22243
  }
22138
22244
  }]
@@ -22150,51 +22256,31 @@ ${context}
22150
22256
  content: {
22151
22257
  type: "text",
22152
22258
  text: [
22153
- "You are a dollar-cost averaging advisor for a t2000 AI agent bank account.",
22259
+ "You are a dollar-cost averaging advisor for a t2000 AI agent bank account on Sui.",
22154
22260
  "",
22155
- budget ? `The user has $${budget}/month to invest via DCA.` : "The user wants to set up a DCA (dollar-cost averaging) schedule. Ask them their monthly budget.",
22261
+ budget ? `The user has $${budget}/month to invest via DCA.` : "The user wants to set up a DCA schedule. Ask their monthly budget first.",
22156
22262
  "",
22157
- "Gather context:",
22158
- "1. Current balance (t2000_balance) \u2014 can they afford this monthly commitment?",
22159
- "2. Current portfolio (t2000_portfolio) \u2014 what do they already hold?",
22160
- '3. Existing DCA schedules (t2000_auto_invest action: "status")',
22161
- '4. Available strategies (t2000_strategy action: "list")',
22263
+ 'IMPORTANT: Call t2000_overview, t2000_strategy (action: "list"), t2000_auto_invest (action: "status") in parallel.',
22162
22264
  "",
22163
22265
  "Recommend a DCA plan:",
22164
22266
  "",
22165
22267
  "\u{1F4C5} DCA PLAN",
22166
22268
  "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
22167
22269
  "",
22168
- "STRATEGY SELECTION:",
22169
- " Based on their existing portfolio, recommend one of:",
22170
- " - bluechip (50% BTC, 30% ETH, 20% SUI) \u2014 large-cap crypto index",
22171
- " - all-weather (30% BTC, 20% ETH, 20% SUI, 30% GOLD) \u2014 crypto + commodities",
22172
- " - safe-haven (50% BTC, 50% GOLD) \u2014 store-of-value assets",
22173
- " - layer1 (50% ETH, 50% SUI) \u2014 smart contract platforms",
22174
- " - sui-heavy (60% SUI, 20% BTC, 20% ETH) \u2014 Sui-weighted portfolio",
22175
- " - single asset (100% SUI/BTC/ETH/GOLD) \u2014 concentrated conviction play",
22176
- " Explain WHY this strategy fits their situation.",
22177
- "",
22178
- "FREQUENCY:",
22179
- " - Weekly ($X/week) \u2014 smoothest averaging, best for volatile markets",
22180
- " - Monthly ($X/month) \u2014 simpler, lower gas costs",
22181
- " Recommend weekly for budgets > $50/month, monthly for smaller amounts.",
22270
+ "STRATEGY: Pick one based on their existing portfolio:",
22271
+ " - bluechip (50% BTC, 30% ETH, 20% SUI)",
22272
+ " - all-weather (30% BTC, 20% ETH, 20% SUI, 30% GOLD)",
22273
+ " - safe-haven (50% BTC, 50% GOLD)",
22274
+ " - layer1 (50% ETH, 50% SUI)",
22275
+ " - sui-heavy (60% SUI, 20% BTC, 20% ETH)",
22276
+ " Explain WHY this fits them.",
22182
22277
  "",
22183
- "PROJECTION (12 months):",
22184
- " Total invested: $X",
22185
- " If prices stay flat: $X (just accumulation)",
22186
- " Note: past performance doesn't predict future results",
22187
- " Key benefit: removes emotion and timing risk from investing",
22278
+ "FREQUENCY: Weekly for budgets > $50/month, monthly for smaller.",
22188
22279
  "",
22189
- "AFFORDABILITY CHECK:",
22190
- " Monthly income vs this commitment",
22191
- " Remaining checking buffer after DCA",
22192
- " Flag if DCA would eat into emergency buffer",
22280
+ "AFFORDABILITY: Check remaining buffer after DCA commitment.",
22281
+ " Flag if DCA would eat into spending buffer.",
22193
22282
  "",
22194
- "If they want to proceed:",
22195
- " Show the exact setup command:",
22196
- ' t2000_auto_invest action: "setup", amount: X, frequency: "weekly", strategy: "name"',
22197
- " Preview first, then confirm."
22283
+ 'If they agree: t2000_auto_invest action: "setup", amount, frequency, strategy.'
22198
22284
  ].join("\n")
22199
22285
  }
22200
22286
  }]
@@ -22351,6 +22437,247 @@ ${context}
22351
22437
  };
22352
22438
  }
22353
22439
  );
22440
+ server.prompt(
22441
+ "sentinel-hunt",
22442
+ "Browse sentinel bounties, pick the best target, and attack \u2014 guided bounty hunting workflow.",
22443
+ async () => ({
22444
+ messages: [{
22445
+ role: "user",
22446
+ content: {
22447
+ type: "text",
22448
+ text: [
22449
+ "You are a bounty hunting strategist for Sui Sentinel \u2014 a game where you try to jailbreak AI agents to win their prize pool.",
22450
+ "",
22451
+ "IMPORTANT: Call t2000_sentinel_list and t2000_balance in parallel.",
22452
+ "",
22453
+ "\u{1F3AF} SENTINEL BOUNTY HUNT",
22454
+ "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
22455
+ "",
22456
+ "Step 1 \u2014 Show the best targets:",
22457
+ " Rank sentinels by reward-to-fee ratio (prize pool \xF7 attack fee)",
22458
+ " Show top 5 targets in a table: Name | Fee | Prize Pool | Ratio | Attacks",
22459
+ " Highlight the best value target",
22460
+ "",
22461
+ "Step 2 \u2014 Recommend a target:",
22462
+ " Explain WHY this target is good (high ratio, fewer attempts = less refined defense)",
22463
+ " Show the attack fee and confirm the user can afford it",
22464
+ "",
22465
+ "Step 3 \u2014 Craft the attack:",
22466
+ " If the user picks a target, call t2000_sentinel_info to see its system prompt",
22467
+ " Help the user craft a jailbreak prompt based on the sentinel's system prompt",
22468
+ " Common techniques: role-play scenarios, hypotheticals, emotional appeals, format tricks",
22469
+ " WARNING: Never suggest harmful content \u2014 this is a game about creative prompt engineering",
22470
+ "",
22471
+ "Step 4 \u2014 Execute:",
22472
+ " Run t2000_sentinel_attack with the chosen id and prompt",
22473
+ " Show: score, win/lose, agent response, jury verdict, fee paid",
22474
+ " If they won: celebrate and show the prize!",
22475
+ " If they lost: analyze the response and suggest a different approach for next attempt"
22476
+ ].join("\n")
22477
+ }
22478
+ }]
22479
+ })
22480
+ );
22481
+ server.prompt(
22482
+ "onboarding",
22483
+ "New user setup guide \u2014 deposit, first save, set safeguards, explore features.",
22484
+ async () => ({
22485
+ messages: [{
22486
+ role: "user",
22487
+ content: {
22488
+ type: "text",
22489
+ text: [
22490
+ "You are a friendly onboarding guide for t2000 \u2014 an AI agent bank account on Sui.",
22491
+ "",
22492
+ "IMPORTANT: Call t2000_overview FIRST to understand their current state.",
22493
+ "",
22494
+ "\u{1F44B} WELCOME TO T2000",
22495
+ "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
22496
+ "",
22497
+ "Check their balance and adapt the flow:",
22498
+ "",
22499
+ "IF they have no funds ($0 balance):",
22500
+ " Show deposit instructions (t2000_deposit_info)",
22501
+ ' Explain: "Send USDC to your Sui address to get started"',
22502
+ " Mention: they need a small amount of SUI for gas (~$1 worth)",
22503
+ "",
22504
+ "IF they have funds but nothing saved/invested:",
22505
+ ` "Great, you have $X ready to go! Here's what you can do:"`,
22506
+ " 1. SAVE \u2014 Earn yield on idle funds (show best current APY)",
22507
+ " 2. INVEST \u2014 Buy crypto (BTC, ETH, SUI, GOLD)",
22508
+ " 3. AUTO-INVEST \u2014 Set up recurring DCA buys",
22509
+ " 4. SAFEGUARDS \u2014 Set spending limits (recommend for accounts > $100)",
22510
+ "",
22511
+ "IF they already have savings/investments:",
22512
+ ` "Looks like you're already set up! Here's your quick status:"`,
22513
+ " Show a mini briefing, then offer to optimize",
22514
+ "",
22515
+ 'End with: "What would you like to do first?"',
22516
+ "",
22517
+ "Available features to highlight:",
22518
+ " - Save/withdraw USDC across NAVI & Suilend protocols",
22519
+ " - Invest in BTC, ETH, SUI, GOLD with portfolio tracking",
22520
+ " - Strategy investing (bluechip, all-weather, etc.)",
22521
+ " - Auto-invest (DCA) \u2014 recurring weekly/monthly buys",
22522
+ " - Rebalance \u2014 auto-optimize yield across protocols",
22523
+ " - Borrow against savings",
22524
+ " - Send money to contacts",
22525
+ " - Hunt sentinel bounties (jailbreak AI agents for prizes)",
22526
+ " - Safeguards: per-tx limits, daily caps, emergency lock"
22527
+ ].join("\n")
22528
+ }
22529
+ }]
22530
+ })
22531
+ );
22532
+ server.prompt(
22533
+ "emergency",
22534
+ "Something is wrong \u2014 lock account, assess damage, take protective actions immediately.",
22535
+ async () => ({
22536
+ messages: [{
22537
+ role: "user",
22538
+ content: {
22539
+ type: "text",
22540
+ text: [
22541
+ "You are an emergency response handler for a t2000 AI agent bank account.",
22542
+ "",
22543
+ "\u{1F6A8} EMERGENCY PROTOCOL",
22544
+ "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
22545
+ "",
22546
+ 'IMPORTANT: If the user says "lock", "freeze", "hack", "stolen", or "emergency":',
22547
+ " \u2192 Call t2000_lock IMMEDIATELY \u2014 no confirmation needed for locking",
22548
+ " \u2192 Then gather information",
22549
+ "",
22550
+ "Step 1 \u2014 Lock first, ask later:",
22551
+ " Run t2000_lock to freeze ALL operations",
22552
+ ' Confirm: "Account locked. No transactions can be executed."',
22553
+ " Explain: unlocking requires the CLI with your PIN (t2000 unlock)",
22554
+ "",
22555
+ "Step 2 \u2014 Assess the situation:",
22556
+ " Call t2000_overview to see current state",
22557
+ " Call t2000_history (limit: 20) to check recent transactions",
22558
+ " Look for suspicious activity: unexpected sends, large withdrawals, unfamiliar addresses",
22559
+ "",
22560
+ "Step 3 \u2014 Report findings:",
22561
+ " Show current balances (are funds still there?)",
22562
+ " Flag any suspicious transactions with amounts and timestamps",
22563
+ " Show transaction links so the user can verify on-chain",
22564
+ "",
22565
+ "Step 4 \u2014 Recovery guidance:",
22566
+ ' If funds are safe: "Your funds are secure. The lock prevents any further transactions."',
22567
+ ' If suspicious tx found: "Review this transaction: [link]. If unauthorized, your remaining funds are now locked."',
22568
+ ' Remind: "To unlock, use: t2000 unlock (requires your PIN)"',
22569
+ ' Remind: "Consider rotating your key after investigating"'
22570
+ ].join("\n")
22571
+ }
22572
+ }]
22573
+ })
22574
+ );
22575
+ server.prompt(
22576
+ "optimize-all",
22577
+ "One-shot full optimization \u2014 sweep idle funds, rebalance savings, claim rewards, rebalance investment earnings.",
22578
+ async () => ({
22579
+ messages: [{
22580
+ role: "user",
22581
+ content: {
22582
+ type: "text",
22583
+ text: [
22584
+ "You are a full-account optimizer for a t2000 AI agent bank account on Sui.",
22585
+ "",
22586
+ "IMPORTANT: Call t2000_overview and t2000_all_rates in parallel to get everything.",
22587
+ "",
22588
+ "\u{1F527} FULL OPTIMIZATION",
22589
+ "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
22590
+ "",
22591
+ "Check all 5 optimization levers and present a plan BEFORE executing:",
22592
+ "",
22593
+ "1. IDLE FUNDS \u2014 Any checking balance > $5?",
22594
+ " \u2192 Save to best-rate protocol",
22595
+ "",
22596
+ "2. SAVINGS REBALANCE \u2014 Better APY available?",
22597
+ " \u2192 t2000_rebalance dryRun: true \u2014 show current vs new APY",
22598
+ "",
22599
+ "3. PENDING REWARDS \u2014 Any unclaimed?",
22600
+ " \u2192 Show rewards, offer to claim and convert to USDC",
22601
+ "",
22602
+ "4. INVESTMENT YIELD \u2014 Any invested assets NOT earning?",
22603
+ " \u2192 t2000_invest earn to deposit into lending",
22604
+ "",
22605
+ "5. INVESTMENT REBALANCE \u2014 Earning assets on sub-optimal protocol?",
22606
+ " \u2192 t2000_invest_rebalance dryRun: true",
22607
+ "",
22608
+ "Present all findings in a summary table:",
22609
+ "",
22610
+ " Action | Impact | Status",
22611
+ " \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500|\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500|\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
22612
+ " Sweep $X idle | +$X.XX/month | Ready",
22613
+ " Rebalance savings| +X.XX% APY | Ready",
22614
+ " Claim rewards | $X.XX USDC | Ready",
22615
+ " Earn on SUI | +X.XX% APY | Ready",
22616
+ " Already optimal | \u2014 | Skipped",
22617
+ "",
22618
+ 'Ask: "Want me to execute all ready actions?" Then run sequentially.',
22619
+ "If everything is already optimal, say so clearly."
22620
+ ].join("\n")
22621
+ }
22622
+ }]
22623
+ })
22624
+ );
22625
+ server.prompt(
22626
+ "savings-goal",
22627
+ 'Set a savings target \u2014 "I want to save $X by date Y" \u2192 calculates weekly/monthly amount needed.',
22628
+ {
22629
+ target: external_exports.number().optional().describe("Target savings amount in dollars"),
22630
+ months: external_exports.number().optional().describe("Number of months to reach the target")
22631
+ },
22632
+ async ({ target, months }) => ({
22633
+ messages: [{
22634
+ role: "user",
22635
+ content: {
22636
+ type: "text",
22637
+ text: [
22638
+ "You are a savings goal planner for a t2000 AI agent bank account on Sui.",
22639
+ "",
22640
+ target ? `Target: $${target}` : "",
22641
+ months ? `Timeline: ${months} months` : "",
22642
+ "",
22643
+ "IMPORTANT: Call t2000_overview FIRST to see current state.",
22644
+ "",
22645
+ "\u{1F3AF} SAVINGS GOAL",
22646
+ "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",
22647
+ "",
22648
+ "If target or timeline is missing, ask the user.",
22649
+ "",
22650
+ "Calculate and present:",
22651
+ "",
22652
+ " Goal: $X by [date]",
22653
+ " Currently saved: $X",
22654
+ " Gap: $X needed",
22655
+ "",
22656
+ " Weekly deposit: $X/week",
22657
+ " Monthly deposit: $X/month",
22658
+ "",
22659
+ " With yield (at current APY X%):",
22660
+ " Without yield you'd need: $X total deposits",
22661
+ " With yield you'd need: $X total deposits (yield covers ~$X)",
22662
+ "",
22663
+ " Feasibility check:",
22664
+ " Current checking: $X",
22665
+ " Can fund from checking: $X of $X gap",
22666
+ " Remaining to earn/deposit: $X",
22667
+ "",
22668
+ "If they can reach the goal with current funds + yield:",
22669
+ " \u2192 Offer to save it all now: t2000_save",
22670
+ "",
22671
+ "If they need regular deposits:",
22672
+ " \u2192 Suggest a recurring schedule",
22673
+ " \u2192 Show how yield accelerates the goal",
22674
+ "",
22675
+ "End with a clear YES/NO on whether the goal is achievable in the timeline."
22676
+ ].join("\n")
22677
+ }
22678
+ }]
22679
+ })
22680
+ );
22354
22681
  }
22355
22682
  async function startMcpServer(opts) {
22356
22683
  const agent = await createAgent(opts?.keyPath);
@@ -22371,4 +22698,4 @@ async function startMcpServer(opts) {
22371
22698
  export {
22372
22699
  startMcpServer
22373
22700
  };
22374
- //# sourceMappingURL=dist-V2C7NCAD.js.map
22701
+ //# sourceMappingURL=dist-HNUMPYQX.js.map