@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,
|
|
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
|
-
"
|
|
21675
|
-
"
|
|
21676
|
-
"
|
|
21677
|
-
"
|
|
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
|
-
"
|
|
21684
|
-
|
|
21685
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
21709
|
-
"
|
|
21710
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
21800
|
-
"- How much
|
|
21801
|
-
"- Which protocol offers the best
|
|
21802
|
-
"- Expected annual yield on the recommended amount",
|
|
21803
|
-
"- If
|
|
21804
|
-
"- Whether
|
|
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.
|
|
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
|
-
|
|
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
|
-
"
|
|
21832
|
-
"- Portfolio allocation
|
|
21833
|
-
"-
|
|
21834
|
-
"- If strategy positions are drifting from target weights, suggest rebalancing",
|
|
21835
|
-
"- If
|
|
21836
|
-
|
|
21837
|
-
"-
|
|
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
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
21878
|
-
" Checking
|
|
21879
|
-
"
|
|
21880
|
-
|
|
21881
|
-
"",
|
|
21882
|
-
"
|
|
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
|
-
"
|
|
21887
|
-
"
|
|
21888
|
-
"
|
|
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
|
-
"
|
|
21895
|
-
|
|
21896
|
-
"
|
|
21897
|
-
"
|
|
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
|
|
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
|
-
"
|
|
21922
|
-
"
|
|
21923
|
-
"
|
|
21924
|
-
"
|
|
21925
|
-
"
|
|
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
|
-
|
|
22116
|
+
'For BORROW scenarios ("borrow $X"):',
|
|
22117
|
+
" - Show new health factor and interest cost",
|
|
21928
22118
|
"",
|
|
21929
|
-
'
|
|
21930
|
-
" -
|
|
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
|
-
|
|
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
|
-
|
|
21940
|
-
"
|
|
21941
|
-
" - Compare: cost of borrowing vs withdrawing from savings",
|
|
22124
|
+
"\u{1F4CA} SCENARIO: [description]",
|
|
22125
|
+
" [strategy allocation breakdown if applicable]",
|
|
21942
22126
|
"",
|
|
21943
|
-
|
|
21944
|
-
"
|
|
21945
|
-
"
|
|
22127
|
+
" Before After",
|
|
22128
|
+
" Checking $XX.XX $XX.XX",
|
|
22129
|
+
" Savings $XX.XX $XX.XX",
|
|
22130
|
+
" Investment $XX.XX $XX.XX",
|
|
21946
22131
|
"",
|
|
21947
|
-
"
|
|
21948
|
-
"
|
|
21949
|
-
"
|
|
21950
|
-
"
|
|
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
|
-
'
|
|
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: $
|
|
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 ??
|
|
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
|
-
`
|
|
22159
|
+
`IMPORTANT: Call t2000_overview and t2000_all_rates in parallel. Keep $${buffer} in checking as buffer.`,
|
|
21975
22160
|
"",
|
|
21976
|
-
|
|
21977
|
-
"
|
|
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
|
-
|
|
21983
|
-
" If sweep amount is < $1, tell the user their funds are already optimized.",
|
|
22164
|
+
"Present a sweep plan:",
|
|
21984
22165
|
"",
|
|
21985
|
-
"
|
|
21986
|
-
"
|
|
21987
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
|
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
|
-
"
|
|
22039
|
-
"
|
|
22040
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
|
22099
|
-
"
|
|
22100
|
-
"",
|
|
22101
|
-
"\u{
|
|
22102
|
-
"
|
|
22103
|
-
"
|
|
22104
|
-
"
|
|
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
|
-
"
|
|
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
|
|
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
|
-
"
|
|
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
|
|
22169
|
-
"
|
|
22170
|
-
" -
|
|
22171
|
-
" -
|
|
22172
|
-
" -
|
|
22173
|
-
" -
|
|
22174
|
-
"
|
|
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
|
-
"
|
|
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
|
|
22190
|
-
"
|
|
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
|
-
|
|
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-
|
|
22701
|
+
//# sourceMappingURL=dist-HNUMPYQX.js.map
|