@t2000/mcp 0.17.27 → 0.17.28

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.
Files changed (73) hide show
  1. package/dist/bin.d.ts +2 -0
  2. package/dist/bin.d.ts.map +1 -0
  3. package/dist/bin.js +1 -1395
  4. package/dist/bin.js.map +1 -1
  5. package/dist/errors.d.ts +16 -0
  6. package/dist/errors.d.ts.map +1 -0
  7. package/dist/errors.js +31 -0
  8. package/dist/errors.js.map +1 -0
  9. package/dist/errors.test.d.ts +2 -0
  10. package/dist/errors.test.d.ts.map +1 -0
  11. package/dist/errors.test.js +50 -0
  12. package/dist/errors.test.js.map +1 -0
  13. package/dist/gate.test.d.ts +2 -0
  14. package/dist/gate.test.d.ts.map +1 -0
  15. package/dist/gate.test.js +60 -0
  16. package/dist/gate.test.js.map +1 -0
  17. package/dist/index.d.ts +2 -3
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +20 -1393
  20. package/dist/index.js.map +1 -1
  21. package/dist/integration.test.d.ts +2 -0
  22. package/dist/integration.test.d.ts.map +1 -0
  23. package/dist/integration.test.js +216 -0
  24. package/dist/integration.test.js.map +1 -0
  25. package/dist/mutex.d.ts +5 -0
  26. package/dist/mutex.d.ts.map +1 -0
  27. package/dist/mutex.js +17 -0
  28. package/dist/mutex.js.map +1 -0
  29. package/dist/mutex.test.d.ts +2 -0
  30. package/dist/mutex.test.d.ts.map +1 -0
  31. package/dist/mutex.test.js +35 -0
  32. package/dist/mutex.test.js.map +1 -0
  33. package/dist/prompts.d.ts +3 -0
  34. package/dist/prompts.d.ts.map +1 -0
  35. package/dist/prompts.js +635 -0
  36. package/dist/prompts.js.map +1 -0
  37. package/dist/prompts.test.d.ts +2 -0
  38. package/dist/prompts.test.d.ts.map +1 -0
  39. package/dist/prompts.test.js +126 -0
  40. package/dist/prompts.test.js.map +1 -0
  41. package/dist/tools/read.d.ts +4 -0
  42. package/dist/tools/read.d.ts.map +1 -0
  43. package/dist/tools/read.js +93 -0
  44. package/dist/tools/read.js.map +1 -0
  45. package/dist/tools/read.test.d.ts +2 -0
  46. package/dist/tools/read.test.d.ts.map +1 -0
  47. package/dist/tools/read.test.js +198 -0
  48. package/dist/tools/read.test.js.map +1 -0
  49. package/dist/tools/safety.d.ts +4 -0
  50. package/dist/tools/safety.d.ts.map +1 -0
  51. package/dist/tools/safety.js +66 -0
  52. package/dist/tools/safety.js.map +1 -0
  53. package/dist/tools/safety.test.d.ts +2 -0
  54. package/dist/tools/safety.test.d.ts.map +1 -0
  55. package/dist/tools/safety.test.js +100 -0
  56. package/dist/tools/safety.test.js.map +1 -0
  57. package/dist/tools/write.d.ts +4 -0
  58. package/dist/tools/write.d.ts.map +1 -0
  59. package/dist/tools/write.js +394 -0
  60. package/dist/tools/write.js.map +1 -0
  61. package/dist/tools/write.test.d.ts +2 -0
  62. package/dist/tools/write.test.d.ts.map +1 -0
  63. package/dist/tools/write.test.js +332 -0
  64. package/dist/tools/write.test.js.map +1 -0
  65. package/dist/unlock.d.ts +3 -0
  66. package/dist/unlock.d.ts.map +1 -0
  67. package/dist/unlock.js +24 -0
  68. package/dist/unlock.js.map +1 -0
  69. package/dist/unlock.test.d.ts +2 -0
  70. package/dist/unlock.test.d.ts.map +1 -0
  71. package/dist/unlock.test.js +57 -0
  72. package/dist/unlock.test.js.map +1 -0
  73. package/package.json +2 -2
@@ -0,0 +1,100 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { registerSafetyTools } from './safety.js';
4
+ function createMockAgent() {
5
+ return {
6
+ enforcer: {
7
+ getConfig: vi.fn().mockReturnValue({
8
+ locked: false,
9
+ maxPerTx: 100,
10
+ maxDailySend: 1000,
11
+ dailyUsed: 350,
12
+ dailyResetDate: '2026-02-19',
13
+ }),
14
+ set: vi.fn(),
15
+ lock: vi.fn(),
16
+ unlock: vi.fn(),
17
+ },
18
+ };
19
+ }
20
+ describe('safety tools', () => {
21
+ let server;
22
+ let agent;
23
+ let tools;
24
+ beforeEach(() => {
25
+ server = new McpServer({ name: 'test', version: '0.0.1' });
26
+ agent = createMockAgent();
27
+ tools = new Map();
28
+ const origTool = server.tool.bind(server);
29
+ server.tool = ((...args) => {
30
+ const name = args[0];
31
+ const handler = args[args.length - 1];
32
+ tools.set(name, handler);
33
+ return origTool(...args);
34
+ });
35
+ registerSafetyTools(server, agent);
36
+ });
37
+ it('should register 2 safety tools', () => {
38
+ expect(tools.size).toBe(2);
39
+ expect(tools.has('t2000_config')).toBe(true);
40
+ expect(tools.has('t2000_lock')).toBe(true);
41
+ });
42
+ describe('t2000_config', () => {
43
+ it('should show current config', async () => {
44
+ const handler = tools.get('t2000_config');
45
+ const result = await handler({ action: 'show' });
46
+ const data = JSON.parse(result.content[0].text);
47
+ expect(data.locked).toBe(false);
48
+ expect(data.maxPerTx).toBe(100);
49
+ expect(data.maxDailySend).toBe(1000);
50
+ expect(data.dailyUsed).toBe(350);
51
+ });
52
+ it('should set maxPerTx', async () => {
53
+ const handler = tools.get('t2000_config');
54
+ const result = await handler({ action: 'set', key: 'maxPerTx', value: 500 });
55
+ const data = JSON.parse(result.content[0].text);
56
+ expect(data.updated).toBe(true);
57
+ expect(data.key).toBe('maxPerTx');
58
+ expect(data.value).toBe(500);
59
+ expect(agent.enforcer.set).toHaveBeenCalledWith('maxPerTx', 500);
60
+ });
61
+ it('should set maxDailySend', async () => {
62
+ const handler = tools.get('t2000_config');
63
+ await handler({ action: 'set', key: 'maxDailySend', value: 2000 });
64
+ expect(agent.enforcer.set).toHaveBeenCalledWith('maxDailySend', 2000);
65
+ });
66
+ it('should reject setting locked via config', async () => {
67
+ const handler = tools.get('t2000_config');
68
+ const result = await handler({ action: 'set', key: 'locked', value: true });
69
+ expect(result.isError).toBe(true);
70
+ const data = JSON.parse(result.content[0].text);
71
+ expect(data.message).toContain('Cannot set "locked"');
72
+ });
73
+ it('should reject unknown keys', async () => {
74
+ const handler = tools.get('t2000_config');
75
+ const result = await handler({ action: 'set', key: 'unknown', value: 100 });
76
+ expect(result.isError).toBe(true);
77
+ });
78
+ it('should reject negative values', async () => {
79
+ const handler = tools.get('t2000_config');
80
+ const result = await handler({ action: 'set', key: 'maxPerTx', value: -10 });
81
+ expect(result.isError).toBe(true);
82
+ });
83
+ it('should require key and value for set action', async () => {
84
+ const handler = tools.get('t2000_config');
85
+ const result = await handler({ action: 'set' });
86
+ expect(result.isError).toBe(true);
87
+ });
88
+ });
89
+ describe('t2000_lock', () => {
90
+ it('should lock the agent', async () => {
91
+ const handler = tools.get('t2000_lock');
92
+ const result = await handler({});
93
+ const data = JSON.parse(result.content[0].text);
94
+ expect(data.locked).toBe(true);
95
+ expect(data.message).toContain('t2000 unlock');
96
+ expect(agent.enforcer.lock).toHaveBeenCalled();
97
+ });
98
+ });
99
+ });
100
+ //# sourceMappingURL=safety.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.test.js","sourceRoot":"","sources":["../../src/tools/safety.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { T2000 } from '@t2000/sdk';
3
+ export declare function registerWriteTools(server: McpServer, agent: T2000): void;
4
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAMxC,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAkdxE"}
@@ -0,0 +1,394 @@
1
+ import { z } from 'zod';
2
+ import { INVESTMENT_ASSETS } from '@t2000/sdk';
3
+ import { TxMutex } from '../mutex.js';
4
+ import { errorResult } from '../errors.js';
5
+ export function registerWriteTools(server, agent) {
6
+ const mutex = new TxMutex();
7
+ server.tool('t2000_send', 'Send USDC or stablecoins to a Sui address or contact name. Amount is in dollars. Subject to per-transaction and daily send limits. Set dryRun: true to preview without signing.', {
8
+ to: z.string().describe("Recipient Sui address (0x...) or contact name (e.g. 'Tom')"),
9
+ amount: z.number().describe('Amount in dollars to send'),
10
+ asset: z.string().optional().describe('Asset to send (default: USDC)'),
11
+ dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),
12
+ }, async ({ to, amount, asset, dryRun }) => {
13
+ try {
14
+ const resolved = agent.contacts.resolve(to);
15
+ if (dryRun) {
16
+ agent.enforcer.check({ operation: 'send', amount });
17
+ const balance = await agent.balance();
18
+ const config = agent.enforcer.getConfig();
19
+ return {
20
+ content: [{
21
+ type: 'text',
22
+ text: JSON.stringify({
23
+ preview: true,
24
+ canSend: balance.available >= amount,
25
+ amount,
26
+ to: resolved.address,
27
+ contactName: resolved.contactName,
28
+ asset: asset ?? 'USDC',
29
+ currentBalance: balance.available,
30
+ balanceAfter: balance.available - amount,
31
+ safeguards: {
32
+ dailyUsedAfter: config.dailyUsed + amount,
33
+ dailyLimit: config.maxDailySend,
34
+ },
35
+ }),
36
+ }],
37
+ };
38
+ }
39
+ const result = await mutex.run(() => agent.send({ to, amount, asset }));
40
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
41
+ }
42
+ catch (err) {
43
+ return errorResult(err);
44
+ }
45
+ });
46
+ server.tool('t2000_save', 'Deposit USDC to savings (earns yield). Amount is in dollars. Use "all" to save entire available balance. Set dryRun: true to preview.', {
47
+ amount: z.union([z.number(), z.literal('all')]).describe('Dollar amount to save, or "all"'),
48
+ dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),
49
+ }, async ({ amount, dryRun }) => {
50
+ try {
51
+ if (dryRun) {
52
+ agent.enforcer.assertNotLocked();
53
+ const balance = await agent.balance();
54
+ const rates = await agent.rates();
55
+ const saveAmount = amount === 'all' ? balance.available - 1.0 : amount;
56
+ return {
57
+ content: [{
58
+ type: 'text',
59
+ text: JSON.stringify({
60
+ preview: true,
61
+ amount: saveAmount,
62
+ currentApy: rates.USDC?.saveApy ?? 0,
63
+ savingsBalanceAfter: balance.savings + saveAmount,
64
+ }),
65
+ }],
66
+ };
67
+ }
68
+ const result = await mutex.run(() => agent.save({ amount }));
69
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
70
+ }
71
+ catch (err) {
72
+ return errorResult(err);
73
+ }
74
+ });
75
+ server.tool('t2000_withdraw', 'Withdraw from savings back to checking. Amount is in dollars. Use "all" to withdraw everything. Set dryRun: true to preview.', {
76
+ amount: z.union([z.number(), z.literal('all')]).describe('Dollar amount to withdraw, or "all"'),
77
+ dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),
78
+ }, async ({ amount, dryRun }) => {
79
+ try {
80
+ if (dryRun) {
81
+ agent.enforcer.assertNotLocked();
82
+ const positions = await agent.positions();
83
+ const health = await agent.healthFactor();
84
+ const savings = positions.positions
85
+ .filter(p => p.type === 'save')
86
+ .reduce((sum, p) => sum + p.amount, 0);
87
+ return {
88
+ content: [{
89
+ type: 'text',
90
+ text: JSON.stringify({
91
+ preview: true,
92
+ amount: amount === 'all' ? savings : amount,
93
+ currentSavings: savings,
94
+ currentHealthFactor: health.healthFactor,
95
+ }),
96
+ }],
97
+ };
98
+ }
99
+ const result = await mutex.run(() => agent.withdraw({ amount }));
100
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
101
+ }
102
+ catch (err) {
103
+ return errorResult(err);
104
+ }
105
+ });
106
+ server.tool('t2000_borrow', 'Borrow USDC against savings collateral. Check health factor first — below 1.0 risks liquidation. Amount is in dollars. Set dryRun: true to preview.', {
107
+ amount: z.number().describe('Dollar amount to borrow'),
108
+ dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),
109
+ }, async ({ amount, dryRun }) => {
110
+ try {
111
+ if (dryRun) {
112
+ agent.enforcer.assertNotLocked();
113
+ const health = await agent.healthFactor();
114
+ const maxBorrow = await agent.maxBorrow();
115
+ return {
116
+ content: [{
117
+ type: 'text',
118
+ text: JSON.stringify({
119
+ preview: true,
120
+ amount,
121
+ maxBorrow: maxBorrow.maxAmount,
122
+ currentHealthFactor: health.healthFactor,
123
+ estimatedHealthFactorAfter: maxBorrow.healthFactorAfter,
124
+ }),
125
+ }],
126
+ };
127
+ }
128
+ const result = await mutex.run(() => agent.borrow({ amount }));
129
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
130
+ }
131
+ catch (err) {
132
+ return errorResult(err);
133
+ }
134
+ });
135
+ server.tool('t2000_repay', 'Repay borrowed USDC. Amount is in dollars. Use "all" to repay entire debt. Set dryRun: true to preview.', {
136
+ amount: z.union([z.number(), z.literal('all')]).describe('Dollar amount to repay, or "all"'),
137
+ dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),
138
+ }, async ({ amount, dryRun }) => {
139
+ try {
140
+ if (dryRun) {
141
+ agent.enforcer.assertNotLocked();
142
+ const health = await agent.healthFactor();
143
+ const positions = await agent.positions();
144
+ const totalDebt = positions.positions
145
+ .filter(p => p.type === 'borrow')
146
+ .reduce((sum, p) => sum + p.amount, 0);
147
+ return {
148
+ content: [{
149
+ type: 'text',
150
+ text: JSON.stringify({
151
+ preview: true,
152
+ amount: amount === 'all' ? totalDebt : amount,
153
+ currentDebt: totalDebt,
154
+ currentHealthFactor: health.healthFactor,
155
+ }),
156
+ }],
157
+ };
158
+ }
159
+ const result = await mutex.run(() => agent.repay({ amount }));
160
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
161
+ }
162
+ catch (err) {
163
+ return errorResult(err);
164
+ }
165
+ });
166
+ server.tool('t2000_exchange', 'Swap assets via Cetus DEX (e.g. USDC to SUI, SUI to USDC). Amount is in source asset units. Set dryRun: true to get a quote without executing.', {
167
+ amount: z.number().describe('Amount to swap (in source asset units)'),
168
+ from: z.string().describe('Source asset (e.g. USDC, SUI)'),
169
+ to: z.string().describe('Target asset (e.g. SUI, USDC)'),
170
+ maxSlippage: z.number().optional().describe('Max slippage percentage (default: 3%)'),
171
+ dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),
172
+ }, async ({ amount, from, to, maxSlippage, dryRun }) => {
173
+ try {
174
+ if (dryRun) {
175
+ agent.enforcer.assertNotLocked();
176
+ const quote = await agent.exchangeQuote({ from, to, amount });
177
+ return {
178
+ content: [{
179
+ type: 'text',
180
+ text: JSON.stringify({
181
+ preview: true,
182
+ from,
183
+ to,
184
+ amount,
185
+ expectedOutput: quote.expectedOutput,
186
+ priceImpact: quote.priceImpact,
187
+ fee: quote.fee.amount,
188
+ }),
189
+ }],
190
+ };
191
+ }
192
+ const result = await mutex.run(() => agent.exchange({ from, to, amount, maxSlippage }));
193
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
194
+ }
195
+ catch (err) {
196
+ return errorResult(err);
197
+ }
198
+ });
199
+ const investAssets = Object.keys(INVESTMENT_ASSETS);
200
+ server.tool('t2000_invest', 'Buy, sell, earn yield, or stop earning on investment assets. Actions: buy (invest USD), sell (convert to USDC), earn (deposit into best-rate lending for yield), unearn (withdraw from lending, keep in portfolio). Amount required for buy/sell only.', {
201
+ action: z.enum(['buy', 'sell', 'earn', 'unearn']).describe("'buy' to invest, 'sell' to liquidate, 'earn' to deposit into lending for yield, 'unearn' to withdraw from lending"),
202
+ asset: z.enum(investAssets).describe('Asset to invest in'),
203
+ amount: z.union([z.number(), z.literal('all')]).optional().describe('USD amount (required for buy/sell, ignored for earn/unearn)'),
204
+ slippage: z.number().optional().describe('Max slippage percent (default: 3, for buy/sell only)'),
205
+ dryRun: z.boolean().optional().describe('Preview without signing (default: false)'),
206
+ }, async ({ action, asset, amount, slippage, dryRun }) => {
207
+ try {
208
+ if (dryRun) {
209
+ agent.enforcer.assertNotLocked();
210
+ const balance = await agent.balance();
211
+ const portfolio = await agent.getPortfolio();
212
+ const position = portfolio.positions.find(p => p.asset === asset);
213
+ if (action === 'sell' && amount === 'all' && !position) {
214
+ return {
215
+ content: [{ type: 'text', text: JSON.stringify({ preview: true, error: `No ${asset} position to sell` }) }],
216
+ };
217
+ }
218
+ return {
219
+ content: [{
220
+ type: 'text',
221
+ text: JSON.stringify({
222
+ preview: true,
223
+ action,
224
+ asset,
225
+ amount: amount === 'all' ? position?.currentValue ?? 0 : amount ?? position?.totalAmount ?? 0,
226
+ currentBalance: balance.available,
227
+ currentPosition: position ?? null,
228
+ earning: position?.earning ?? false,
229
+ earningProtocol: position?.earningProtocol ?? null,
230
+ earningApy: position?.earningApy ?? null,
231
+ }),
232
+ }],
233
+ };
234
+ }
235
+ const maxSlippage = slippage ? slippage / 100 : undefined;
236
+ if (action === 'buy') {
237
+ if (typeof amount !== 'number')
238
+ throw new Error('Buy amount must be a number');
239
+ const result = await mutex.run(() => agent.investBuy({ asset: asset, usdAmount: amount, maxSlippage }));
240
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
241
+ }
242
+ else if (action === 'sell') {
243
+ const usdAmount = amount === 'all' ? 'all' : amount;
244
+ const result = await mutex.run(() => agent.investSell({ asset: asset, usdAmount, maxSlippage }));
245
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
246
+ }
247
+ else if (action === 'earn') {
248
+ const result = await mutex.run(() => agent.investEarn({ asset: asset }));
249
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
250
+ }
251
+ else {
252
+ const result = await mutex.run(() => agent.investUnearn({ asset: asset }));
253
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
254
+ }
255
+ }
256
+ catch (err) {
257
+ return errorResult(err);
258
+ }
259
+ });
260
+ server.tool('t2000_invest_rebalance', 'Move earning investment positions to better-rate protocols. Checks all earning assets and moves any where another protocol offers a higher APY.', {
261
+ dryRun: z.boolean().optional().describe('Preview moves without executing (default: false)'),
262
+ minYieldDiff: z.number().optional().describe('Minimum APY difference to trigger a move (default: 0.1)'),
263
+ }, async ({ dryRun, minYieldDiff }) => {
264
+ try {
265
+ const result = await mutex.run(() => agent.investRebalance({ dryRun, minYieldDiff }));
266
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
267
+ }
268
+ catch (err) {
269
+ return errorResult(err);
270
+ }
271
+ });
272
+ server.tool('t2000_strategy', 'Manage investment strategies — buy into predefined or custom allocations, sell entire strategies, check status, rebalance, or create/delete custom strategies.', {
273
+ action: z.enum(['list', 'buy', 'sell', 'status', 'rebalance', 'create', 'delete']).describe("Strategy action to perform"),
274
+ name: z.string().optional().describe("Strategy name (required for all actions except 'list')"),
275
+ amount: z.number().optional().describe("USD amount (required for 'buy')"),
276
+ allocations: z.record(z.number()).optional().describe("Allocation map e.g. {SUI: 40, BTC: 20, ETH: 20, GOLD: 20} (for 'create')"),
277
+ description: z.string().optional().describe("Strategy description (for 'create')"),
278
+ dryRun: z.boolean().optional().describe("Preview without signing (for 'buy')"),
279
+ }, async ({ action, name, amount, allocations, description, dryRun }) => {
280
+ try {
281
+ if (action === 'list') {
282
+ const all = agent.strategies.getAll();
283
+ return { content: [{ type: 'text', text: JSON.stringify(all) }] };
284
+ }
285
+ if (!name) {
286
+ return { content: [{ type: 'text', text: JSON.stringify({ error: 'Strategy name is required' }) }] };
287
+ }
288
+ switch (action) {
289
+ case 'buy': {
290
+ if (typeof amount !== 'number') {
291
+ return { content: [{ type: 'text', text: JSON.stringify({ error: 'Amount is required for buy' }) }] };
292
+ }
293
+ const result = await mutex.run(() => agent.investStrategy({ strategy: name, usdAmount: amount, dryRun }));
294
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
295
+ }
296
+ case 'sell': {
297
+ const result = await mutex.run(() => agent.sellStrategy({ strategy: name }));
298
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
299
+ }
300
+ case 'status': {
301
+ const result = await agent.getStrategyStatus(name);
302
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
303
+ }
304
+ case 'rebalance': {
305
+ const result = await mutex.run(() => agent.rebalanceStrategy({ strategy: name }));
306
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
307
+ }
308
+ case 'create': {
309
+ if (!allocations) {
310
+ return { content: [{ type: 'text', text: JSON.stringify({ error: 'Allocations required for create' }) }] };
311
+ }
312
+ const def = agent.strategies.create({ name, allocations, description });
313
+ return { content: [{ type: 'text', text: JSON.stringify(def) }] };
314
+ }
315
+ case 'delete': {
316
+ agent.strategies.delete(name);
317
+ return { content: [{ type: 'text', text: JSON.stringify({ deleted: name }) }] };
318
+ }
319
+ default:
320
+ return { content: [{ type: 'text', text: JSON.stringify({ error: `Unknown action: ${action}` }) }] };
321
+ }
322
+ }
323
+ catch (err) {
324
+ return errorResult(err);
325
+ }
326
+ });
327
+ server.tool('t2000_auto_invest', 'Dollar-cost averaging (DCA) — set up recurring purchases into strategies or individual assets. Actions: setup, status, run, stop.', {
328
+ action: z.enum(['setup', 'status', 'run', 'stop']).describe("Auto-invest action"),
329
+ amount: z.number().optional().describe("USD amount per purchase (for 'setup')"),
330
+ frequency: z.enum(['daily', 'weekly', 'monthly']).optional().describe("Purchase frequency (for 'setup')"),
331
+ strategy: z.string().optional().describe("Strategy name (for 'setup')"),
332
+ asset: z.string().optional().describe("Single asset (for 'setup', alternative to strategy)"),
333
+ scheduleId: z.string().optional().describe("Schedule ID (for 'stop')"),
334
+ }, async ({ action, amount, frequency, strategy, asset, scheduleId }) => {
335
+ try {
336
+ switch (action) {
337
+ case 'setup': {
338
+ if (!amount || !frequency) {
339
+ return { content: [{ type: 'text', text: JSON.stringify({ error: 'Amount and frequency required for setup' }) }] };
340
+ }
341
+ const schedule = agent.setupAutoInvest({ amount, frequency, strategy, asset });
342
+ return { content: [{ type: 'text', text: JSON.stringify(schedule) }] };
343
+ }
344
+ case 'status': {
345
+ const status = agent.getAutoInvestStatus();
346
+ return { content: [{ type: 'text', text: JSON.stringify(status) }] };
347
+ }
348
+ case 'run': {
349
+ const result = await mutex.run(() => agent.runAutoInvest());
350
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
351
+ }
352
+ case 'stop': {
353
+ if (!scheduleId) {
354
+ return { content: [{ type: 'text', text: JSON.stringify({ error: 'Schedule ID required for stop' }) }] };
355
+ }
356
+ agent.stopAutoInvest(scheduleId);
357
+ return { content: [{ type: 'text', text: JSON.stringify({ stopped: scheduleId }) }] };
358
+ }
359
+ default:
360
+ return { content: [{ type: 'text', text: JSON.stringify({ error: `Unknown action: ${action}` }) }] };
361
+ }
362
+ }
363
+ catch (err) {
364
+ return errorResult(err);
365
+ }
366
+ });
367
+ server.tool('t2000_rebalance', 'Optimize yield by moving funds to the highest-rate protocol. Always previews first — set dryRun: false to execute. Shows plan with expected APY gain and break-even period.', {
368
+ dryRun: z.boolean().optional().describe('Preview without executing (default: true)'),
369
+ minYieldDiff: z.number().optional().describe('Min APY difference to rebalance (default: 0.5%)'),
370
+ maxBreakEven: z.number().optional().describe('Max break-even days (default: 30)'),
371
+ }, async ({ dryRun, minYieldDiff, maxBreakEven }) => {
372
+ try {
373
+ const result = await mutex.run(() => agent.rebalance({
374
+ dryRun: dryRun ?? true,
375
+ minYieldDiff,
376
+ maxBreakEven,
377
+ }));
378
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
379
+ }
380
+ catch (err) {
381
+ return errorResult(err);
382
+ }
383
+ });
384
+ server.tool('t2000_claim_rewards', 'Claim pending protocol rewards from lending positions and auto-convert to USDC.', {}, async () => {
385
+ try {
386
+ const result = await mutex.run(() => agent.claimRewards());
387
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
388
+ }
389
+ catch (err) {
390
+ return errorResult(err);
391
+ }
392
+ });
393
+ }
394
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=write.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.test.d.ts","sourceRoot":"","sources":["../../src/tools/write.test.ts"],"names":[],"mappings":""}