@clawnch/clawtomaton 0.2.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/README.md +82 -10
  2. package/dist/agent/index.d.ts +5 -1
  3. package/dist/agent/index.d.ts.map +1 -1
  4. package/dist/agent/index.js +120 -10
  5. package/dist/agent/index.js.map +1 -1
  6. package/dist/agent/prompt.d.ts +2 -0
  7. package/dist/agent/prompt.d.ts.map +1 -1
  8. package/dist/agent/prompt.js +199 -2
  9. package/dist/agent/prompt.js.map +1 -1
  10. package/dist/bunker/client.d.ts +113 -0
  11. package/dist/bunker/client.d.ts.map +1 -0
  12. package/dist/bunker/client.js +404 -0
  13. package/dist/bunker/client.js.map +1 -0
  14. package/dist/bunker/self-deploy.d.ts +54 -0
  15. package/dist/bunker/self-deploy.d.ts.map +1 -0
  16. package/dist/bunker/self-deploy.js +353 -0
  17. package/dist/bunker/self-deploy.js.map +1 -0
  18. package/dist/bunker/threat-monitor.d.ts +47 -0
  19. package/dist/bunker/threat-monitor.d.ts.map +1 -0
  20. package/dist/bunker/threat-monitor.js +173 -0
  21. package/dist/bunker/threat-monitor.js.map +1 -0
  22. package/dist/bunker/types.d.ts +320 -0
  23. package/dist/bunker/types.d.ts.map +1 -0
  24. package/dist/bunker/types.js +9 -0
  25. package/dist/bunker/types.js.map +1 -0
  26. package/dist/cli.js +207 -9
  27. package/dist/cli.js.map +1 -1
  28. package/dist/constants.d.ts +11 -0
  29. package/dist/constants.d.ts.map +1 -1
  30. package/dist/constants.js +10 -0
  31. package/dist/constants.js.map +1 -1
  32. package/dist/heartbeat/index.d.ts +28 -0
  33. package/dist/heartbeat/index.d.ts.map +1 -1
  34. package/dist/heartbeat/index.js +240 -11
  35. package/dist/heartbeat/index.js.map +1 -1
  36. package/dist/index.d.ts +10 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +9 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/market/index.d.ts +20 -1
  41. package/dist/market/index.d.ts.map +1 -1
  42. package/dist/market/index.js +76 -4
  43. package/dist/market/index.js.map +1 -1
  44. package/dist/skills/analyze-market.d.ts +17 -0
  45. package/dist/skills/analyze-market.d.ts.map +1 -0
  46. package/dist/skills/analyze-market.js +156 -0
  47. package/dist/skills/analyze-market.js.map +1 -0
  48. package/dist/skills/bunker.d.ts +29 -0
  49. package/dist/skills/bunker.d.ts.map +1 -0
  50. package/dist/skills/bunker.js +502 -0
  51. package/dist/skills/bunker.js.map +1 -0
  52. package/dist/skills/check-balance.d.ts +2 -2
  53. package/dist/skills/check-balance.d.ts.map +1 -1
  54. package/dist/skills/check-balance.js +43 -8
  55. package/dist/skills/check-balance.js.map +1 -1
  56. package/dist/skills/check-price.d.ts +11 -0
  57. package/dist/skills/check-price.d.ts.map +1 -0
  58. package/dist/skills/check-price.js +83 -0
  59. package/dist/skills/check-price.js.map +1 -0
  60. package/dist/skills/claim-vault.d.ts +15 -0
  61. package/dist/skills/claim-vault.d.ts.map +1 -0
  62. package/dist/skills/claim-vault.js +96 -0
  63. package/dist/skills/claim-vault.js.map +1 -0
  64. package/dist/skills/deploy.d.ts.map +1 -1
  65. package/dist/skills/deploy.js +10 -1
  66. package/dist/skills/deploy.js.map +1 -1
  67. package/dist/skills/index.d.ts +9 -1
  68. package/dist/skills/index.d.ts.map +1 -1
  69. package/dist/skills/index.js +34 -1
  70. package/dist/skills/index.js.map +1 -1
  71. package/dist/skills/manage-orders.d.ts +26 -0
  72. package/dist/skills/manage-orders.d.ts.map +1 -0
  73. package/dist/skills/manage-orders.js +470 -0
  74. package/dist/skills/manage-orders.js.map +1 -0
  75. package/dist/skills/portfolio.d.ts +19 -0
  76. package/dist/skills/portfolio.d.ts.map +1 -0
  77. package/dist/skills/portfolio.js +189 -0
  78. package/dist/skills/portfolio.js.map +1 -0
  79. package/dist/skills/watch-activity.d.ts +12 -0
  80. package/dist/skills/watch-activity.d.ts.map +1 -0
  81. package/dist/skills/watch-activity.js +130 -0
  82. package/dist/skills/watch-activity.js.map +1 -0
  83. package/dist/skills/xmtp.d.ts +18 -0
  84. package/dist/skills/xmtp.d.ts.map +1 -0
  85. package/dist/skills/xmtp.js +180 -0
  86. package/dist/skills/xmtp.js.map +1 -0
  87. package/dist/state/index.d.ts +25 -0
  88. package/dist/state/index.d.ts.map +1 -1
  89. package/dist/state/index.js +156 -0
  90. package/dist/state/index.js.map +1 -1
  91. package/dist/survival/index.d.ts.map +1 -1
  92. package/dist/survival/index.js +3 -0
  93. package/dist/survival/index.js.map +1 -1
  94. package/dist/types.d.ts +19 -0
  95. package/dist/types.d.ts.map +1 -1
  96. package/dist/types.js.map +1 -1
  97. package/dist/xmtp/client.d.ts +79 -0
  98. package/dist/xmtp/client.d.ts.map +1 -0
  99. package/dist/xmtp/client.js +282 -0
  100. package/dist/xmtp/client.js.map +1 -0
  101. package/dist/xmtp/index.d.ts +9 -0
  102. package/dist/xmtp/index.d.ts.map +1 -0
  103. package/dist/xmtp/index.js +8 -0
  104. package/dist/xmtp/index.js.map +1 -0
  105. package/dist/xmtp/types.d.ts +59 -0
  106. package/dist/xmtp/types.d.ts.map +1 -0
  107. package/dist/xmtp/types.js +5 -0
  108. package/dist/xmtp/types.js.map +1 -0
  109. package/package.json +3 -2
@@ -0,0 +1,282 @@
1
+ /**
2
+ * XMTP client wrapper for Clawtomaton.
3
+ *
4
+ * Manages the XMTP Agent SDK lifecycle: creation, message streaming,
5
+ * conversation management, and graceful shutdown.
6
+ *
7
+ * The agent's existing Ethereum wallet key is used as the XMTP identity —
8
+ * no new keypair needed.
9
+ *
10
+ * IMPORTANT: XMTP creates local SQLite database files that MUST persist
11
+ * across restarts. Each restart without the DB creates a new installation,
12
+ * and you're limited to 10 installations per inbox.
13
+ */
14
+ // Lazy-loaded to keep XMTP optional
15
+ let _Agent = null;
16
+ let _createSigner = null;
17
+ let _createUser = null;
18
+ let _filter = null;
19
+ async function loadXmtpSdk() {
20
+ if (_Agent)
21
+ return;
22
+ const sdk = await import('@xmtp/agent-sdk');
23
+ _Agent = sdk.Agent;
24
+ _createSigner = sdk.createSigner;
25
+ _createUser = sdk.createUser;
26
+ _filter = sdk.filter;
27
+ }
28
+ // ============================================================================
29
+ // XMTP Client
30
+ // ============================================================================
31
+ export class XmtpClient {
32
+ agent = null; // XMTP Agent instance
33
+ config;
34
+ state;
35
+ walletKey;
36
+ started = false;
37
+ messageQueue = [];
38
+ maxQueueSize = 100;
39
+ lastProcessedTime = 0;
40
+ constructor(config, walletKey, state) {
41
+ this.config = config;
42
+ this.walletKey = walletKey;
43
+ this.state = state;
44
+ }
45
+ /**
46
+ * Initialize and start the XMTP agent.
47
+ * Begins streaming messages into the internal queue.
48
+ */
49
+ async start() {
50
+ if (this.started)
51
+ return;
52
+ await loadXmtpSdk();
53
+ const user = _createUser(this.walletKey);
54
+ const signer = _createSigner(user);
55
+ // Derive encryption key from wallet key (deterministic — same wallet = same key)
56
+ const encryptionKey = this.config.dbEncryptionKey
57
+ ? hexToBytes(this.config.dbEncryptionKey)
58
+ : deriveEncryptionKey(this.walletKey);
59
+ this.agent = await _Agent.create(signer, {
60
+ env: this.config.env ?? 'production',
61
+ dbEncryptionKey: encryptionKey,
62
+ dbPath: this.config.dbPath ?? undefined,
63
+ appVersion: 'clawtomaton/0.3.0',
64
+ });
65
+ // Stream text messages into our queue
66
+ this.agent.on('text', async (ctx) => {
67
+ const senderAddress = await ctx.getSenderAddress();
68
+ const agentAddress = ctx.getClientAddress();
69
+ // Don't queue our own messages
70
+ if (senderAddress?.toLowerCase() === agentAddress?.toLowerCase())
71
+ return;
72
+ const msg = {
73
+ id: ctx.message.id,
74
+ conversationId: ctx.conversation.id,
75
+ senderAddress: senderAddress ?? 'unknown',
76
+ content: ctx.message.content,
77
+ sentAt: ctx.message.sentAt?.getTime?.() ?? Date.now(),
78
+ isDm: ctx.isDm?.() ?? true,
79
+ isGroup: ctx.isGroup?.() ?? false,
80
+ };
81
+ this.messageQueue.push(msg);
82
+ // Cap queue size
83
+ if (this.messageQueue.length > this.maxQueueSize) {
84
+ this.messageQueue = this.messageQueue.slice(-this.maxQueueSize);
85
+ }
86
+ });
87
+ // Track new conversations
88
+ this.agent.on('dm', async (ctx) => {
89
+ this.state.audit('xmtp_dm', `New DM conversation: ${ctx.conversation.id}`);
90
+ });
91
+ this.agent.on('group', async (ctx) => {
92
+ this.state.audit('xmtp_group', `Added to group: ${ctx.conversation.id}`);
93
+ });
94
+ this.agent.on('unhandledError', (error) => {
95
+ console.error(`[xmtp] Unhandled error: ${error}`);
96
+ this.state.audit('xmtp_error', String(error));
97
+ });
98
+ await this.agent.start();
99
+ this.started = true;
100
+ this.lastProcessedTime = Date.now();
101
+ console.log(`[xmtp] Started — address: ${this.agent.address}`);
102
+ this.state.audit('xmtp_started', `XMTP agent started. Address: ${this.agent.address}`);
103
+ }
104
+ /**
105
+ * Stop the XMTP agent gracefully.
106
+ */
107
+ async stop() {
108
+ if (!this.started || !this.agent)
109
+ return;
110
+ try {
111
+ await this.agent.stop();
112
+ }
113
+ catch (err) {
114
+ console.error(`[xmtp] Error stopping: ${err}`);
115
+ }
116
+ this.started = false;
117
+ console.log('[xmtp] Stopped.');
118
+ }
119
+ /**
120
+ * Check if there are unprocessed messages in the queue.
121
+ * Used by the heartbeat to decide whether to wake the agent.
122
+ */
123
+ hasUnreadMessages() {
124
+ return this.messageQueue.length > 0;
125
+ }
126
+ /**
127
+ * Drain all queued messages (marks them as processed).
128
+ * Returns messages ordered by sentAt.
129
+ */
130
+ drainMessages() {
131
+ const messages = [...this.messageQueue].sort((a, b) => a.sentAt - b.sentAt);
132
+ this.messageQueue = [];
133
+ this.lastProcessedTime = Date.now();
134
+ return messages;
135
+ }
136
+ /**
137
+ * Peek at queued messages without draining.
138
+ */
139
+ peekMessages() {
140
+ return [...this.messageQueue].sort((a, b) => a.sentAt - b.sentAt);
141
+ }
142
+ /**
143
+ * Send a text message to a conversation by ID.
144
+ */
145
+ async sendMessage(conversationId, text) {
146
+ if (!this.started || !this.agent) {
147
+ throw new Error('XMTP client not started');
148
+ }
149
+ const conversation = await this.agent.client.conversations.getConversationById(conversationId);
150
+ if (!conversation) {
151
+ throw new Error(`Conversation not found: ${conversationId}`);
152
+ }
153
+ await conversation.sendText(text);
154
+ this.state.audit('xmtp_sent', `Sent message to ${conversationId}: ${text.slice(0, 100)}`);
155
+ }
156
+ /**
157
+ * Send a text message to an address (creates DM if needed).
158
+ * Uses agent.createDmWithAddress() which handles identity resolution.
159
+ */
160
+ async sendToAddress(address, text) {
161
+ if (!this.started || !this.agent) {
162
+ throw new Error('XMTP client not started');
163
+ }
164
+ const conversation = await this.agent.createDmWithAddress(address);
165
+ await conversation.sendText(text);
166
+ const conversationId = conversation.id;
167
+ this.state.audit('xmtp_sent', `Sent DM to ${address}: ${text.slice(0, 100)}`);
168
+ return conversationId;
169
+ }
170
+ /**
171
+ * List recent conversations with metadata.
172
+ */
173
+ async listConversations(limit = 20) {
174
+ if (!this.started || !this.agent) {
175
+ throw new Error('XMTP client not started');
176
+ }
177
+ await this.agent.client.conversations.sync();
178
+ const convos = await this.agent.client.conversations.list();
179
+ const results = [];
180
+ for (const convo of convos.slice(0, limit)) {
181
+ try {
182
+ const messages = await convo.messages();
183
+ // Find the last text message (skip system/group_updated messages)
184
+ const textMessages = messages.filter((m) => typeof m.content === 'string' && m.contentType?.typeId === 'text');
185
+ const lastMessage = textMessages[textMessages.length - 1];
186
+ const members = await convo.members();
187
+ // Check if DM by constructor name (Dm vs Group)
188
+ const isDm = convo.constructor?.name === 'Dm';
189
+ results.push({
190
+ id: convo.id,
191
+ isDm,
192
+ memberCount: members.length,
193
+ lastMessageAt: lastMessage?.sentAt?.getTime?.() ?? 0,
194
+ lastMessagePreview: lastMessage?.content
195
+ ? String(lastMessage.content).slice(0, 80)
196
+ : undefined,
197
+ });
198
+ }
199
+ catch {
200
+ results.push({
201
+ id: convo.id,
202
+ isDm: false,
203
+ memberCount: 0,
204
+ lastMessageAt: 0,
205
+ });
206
+ }
207
+ }
208
+ return results.sort((a, b) => b.lastMessageAt - a.lastMessageAt);
209
+ }
210
+ /**
211
+ * Get recent messages from a specific conversation.
212
+ */
213
+ async getConversationHistory(conversationId, limit = 20) {
214
+ if (!this.started || !this.agent) {
215
+ throw new Error('XMTP client not started');
216
+ }
217
+ const conversation = await this.agent.client.conversations.getConversationById(conversationId);
218
+ if (!conversation) {
219
+ throw new Error(`Conversation not found: ${conversationId}`);
220
+ }
221
+ await conversation.sync();
222
+ const allMessages = await conversation.messages();
223
+ // Filter to text messages only (skip group_updated, reactions, etc.)
224
+ const textMessages = allMessages.filter((m) => typeof m.content === 'string' && m.contentType?.typeId === 'text');
225
+ // Take the most recent `limit` messages
226
+ const recent = textMessages.slice(-limit);
227
+ const isDm = conversation.constructor?.name === 'Dm';
228
+ const results = [];
229
+ for (const msg of recent) {
230
+ results.push({
231
+ id: msg.id,
232
+ conversationId,
233
+ senderAddress: msg.senderInboxId ?? 'unknown',
234
+ content: msg.content,
235
+ sentAt: msg.sentAt?.getTime?.() ?? 0,
236
+ isDm,
237
+ isGroup: !isDm,
238
+ });
239
+ }
240
+ return results;
241
+ }
242
+ /**
243
+ * Get the XMTP address (same as wallet address).
244
+ */
245
+ getAddress() {
246
+ return this.agent?.address ?? null;
247
+ }
248
+ /**
249
+ * Check if the client is running.
250
+ */
251
+ isStarted() {
252
+ return this.started;
253
+ }
254
+ /**
255
+ * Get the number of queued messages.
256
+ */
257
+ getQueueSize() {
258
+ return this.messageQueue.length;
259
+ }
260
+ }
261
+ // ============================================================================
262
+ // Helpers
263
+ // ============================================================================
264
+ /**
265
+ * Derive a deterministic 32-byte encryption key from the wallet private key.
266
+ * Uses a simple hash approach — the key is always the same for the same wallet.
267
+ */
268
+ function deriveEncryptionKey(walletKey) {
269
+ // Simple derivation: take the raw bytes of the private key
270
+ // The wallet key is already 32 bytes (64 hex chars after 0x prefix)
271
+ const hex = walletKey.slice(2);
272
+ return hexToBytes(`0x${hex}`);
273
+ }
274
+ function hexToBytes(hex) {
275
+ const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;
276
+ const bytes = new Uint8Array(cleanHex.length / 2);
277
+ for (let i = 0; i < bytes.length; i++) {
278
+ bytes[i] = parseInt(cleanHex.slice(i * 2, i * 2 + 2), 16);
279
+ }
280
+ return bytes;
281
+ }
282
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/xmtp/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * XMTP module — bidirectional encrypted messaging for Clawtomaton agents.
3
+ *
4
+ * Agents can receive commands and send updates via XMTP.
5
+ * Discoverable on Base App, World App, and xmtp.chat.
6
+ */
7
+ export { XmtpClient } from './client.js';
8
+ export type { XmtpConfig, XmtpMessage, XmtpConversationInfo } from './types.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/xmtp/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * XMTP module — bidirectional encrypted messaging for Clawtomaton agents.
3
+ *
4
+ * Agents can receive commands and send updates via XMTP.
5
+ * Discoverable on Base App, World App, and xmtp.chat.
6
+ */
7
+ export { XmtpClient } from './client.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/xmtp/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Types for the XMTP integration.
3
+ */
4
+ export interface XmtpConfig {
5
+ /** XMTP network environment */
6
+ env?: 'local' | 'dev' | 'production';
7
+ /**
8
+ * Path to the XMTP local database directory.
9
+ * CRITICAL: Must persist across restarts and deploys.
10
+ * Limited to 10 installations per inbox — each lost DB = new installation.
11
+ * If not set, defaults to the clawtomaton state directory.
12
+ */
13
+ dbPath?: string;
14
+ /**
15
+ * Encryption key for the XMTP local database (64 hex chars / 32 bytes).
16
+ * If not set, derived deterministically from the wallet private key.
17
+ */
18
+ dbEncryptionKey?: string;
19
+ /**
20
+ * Allowlist of Ethereum addresses that can message the agent.
21
+ * If empty/undefined, all addresses are allowed.
22
+ * Case-insensitive comparison.
23
+ */
24
+ allowlist?: string[];
25
+ /**
26
+ * Maximum number of messages to queue before oldest are dropped.
27
+ * Default: 100
28
+ */
29
+ maxQueueSize?: number;
30
+ }
31
+ export interface XmtpMessage {
32
+ /** Message ID from XMTP */
33
+ id: string;
34
+ /** Conversation ID */
35
+ conversationId: string;
36
+ /** Sender's Ethereum address or inbox ID */
37
+ senderAddress: string;
38
+ /** Text content */
39
+ content: string;
40
+ /** Timestamp in ms */
41
+ sentAt: number;
42
+ /** Whether this is a DM */
43
+ isDm: boolean;
44
+ /** Whether this is a group chat */
45
+ isGroup: boolean;
46
+ }
47
+ export interface XmtpConversationInfo {
48
+ /** Conversation ID */
49
+ id: string;
50
+ /** Whether this is a DM (vs group) */
51
+ isDm: boolean;
52
+ /** Number of members */
53
+ memberCount: number;
54
+ /** Timestamp of last message in ms */
55
+ lastMessageAt: number;
56
+ /** Preview of last message (truncated) */
57
+ lastMessagePreview?: string;
58
+ }
59
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/xmtp/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,UAAU;IACzB,+BAA+B;IAC/B,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,YAAY,CAAC;IAErC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;CAClB;AAMD,MAAM,WAAW,oBAAoB;IACnC,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Types for the XMTP integration.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/xmtp/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clawnch/clawtomaton",
3
- "version": "0.2.2",
3
+ "version": "0.4.0",
4
4
  "description": "Clawtomaton — Autonomous AI agents that launch and manage crypto projects on Base",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -44,7 +44,8 @@
44
44
  "node": ">=18"
45
45
  },
46
46
  "dependencies": {
47
- "@clawnch/clawncher-sdk": "^0.1.0",
47
+ "@clawnch/clawncher-sdk": "^0.2.0",
48
+ "@xmtp/agent-sdk": "^2.2.0",
48
49
  "better-sqlite3": "^11.0.0",
49
50
  "viem": "^2.0.0"
50
51
  },