@xmtp/agent-sdk 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -38,8 +38,8 @@ const agent = await Agent.create(signer, {
38
38
  dbPath: null, // in-memory store; provide a path to persist
39
39
  });
40
40
 
41
- // 3. Respond to any incoming message
42
- agent.on("message", async (ctx) => {
41
+ // 3. Respond to text messages
42
+ agent.on("text", async (ctx) => {
43
43
  await ctx.conversation.send("Hello from my XMTP Agent! 👋");
44
44
  });
45
45
 
@@ -53,17 +53,15 @@ await agent.start();
53
53
 
54
54
  ## Environment Variables
55
55
 
56
- The XMTP Agent SDK supports environment variables (`process.env`) to simplify configuration without code changes.
56
+ The XMTP Agent SDK allows you to use environment variables (`process.env`) for easier configuration without modifying code. Simply set the following variables and call `Agent.createFromEnv()`:
57
57
 
58
58
  **Available Variables:**
59
59
 
60
- | Variable | Purpose | Example |
61
- | --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- |
62
- | `XMTP_WALLET_KEY` | [Private key for wallet](https://docs.xmtp.org/inboxes/core-messaging/create-a-signer) | `XMTP_WALLET_KEY=0x1234...abcd` |
63
- | `XMTP_ENV` | [Network environment](https://docs.xmtp.org/agents/core-messaging/create-a-client#xmtp-network-environments) | `XMTP_ENV=dev` or `XMTP_ENV=production` |
64
- | `XMTP_DB_ENCRYPTION_KEY` | [Database encryption key](https://docs.xmtp.org/agents/core-messaging/create-a-client#keep-the-database-encryption-key-safe) | `XMTP_DB_ENCRYPTION_KEY=0xabcd...1234` |
65
- | `XMTP_FORCE_DEBUG` | [Activate debugging logs](https://docs.xmtp.org/agents/debug-agents) | `XMTP_FORCE_DEBUG=true` |
66
- | `XMTP_FORCE_REVOKE_INSTALLATIONS` | [Remove other installations](https://docs.xmtp.org/agents/core-messaging/agent-installations#revoke-agent-installations) | `XMTP_FORCE_REVOKE_INSTALLATIONS=true` |
60
+ | Variable | Purpose | Example |
61
+ | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- |
62
+ | `XMTP_WALLET_KEY` | [Private key for wallet](https://docs.xmtp.org/inboxes/core-messaging/create-a-signer) | `XMTP_WALLET_KEY=0x1234...abcd` |
63
+ | `XMTP_ENV` | [Network environment](https://docs.xmtp.org/agents/core-messaging/create-a-client#xmtp-network-environments) | `XMTP_ENV=dev` or `XMTP_ENV=production` |
64
+ | `XMTP_DB_ENCRYPTION_KEY` | [Database encryption key](https://docs.xmtp.org/agents/core-messaging/create-a-client#keep-the-database-encryption-key-safe) | `XMTP_DB_ENCRYPTION_KEY=0xabcd...1234` |
67
65
 
68
66
  Using the environment variables, you can setup your agent in just a few lines of code:
69
67
 
@@ -72,25 +70,66 @@ Using the environment variables, you can setup your agent in just a few lines of
72
70
  process.loadEnvFile(".env");
73
71
 
74
72
  // Create agent using environment variables
75
- const agent = await Agent.create();
73
+ const agent = await Agent.createFromEnv();
76
74
  ```
77
75
 
76
+ Agents can also recognize the following environment variables:
77
+
78
+ | Variable | Purpose | Example |
79
+ | ------------------ | -------------------------------------------------------------------- | ----------------------- |
80
+ | `XMTP_FORCE_DEBUG` | [Activate debugging logs](https://docs.xmtp.org/agents/debug-agents) | `XMTP_FORCE_DEBUG=true` |
81
+
78
82
  ## Core Concepts
79
83
 
80
84
  ### 1. Event‑Driven Architecture
81
85
 
82
- Subscribe only to what you need using Node’s `EventEmitter` interface.
86
+ Subscribe only to what you need using Node’s `EventEmitter` interface. Events you can listen for:
87
+
88
+ **Message Events**
89
+
90
+ - `text` – a new incoming text message
91
+ - `reaction` – a new incoming reaction message
92
+ - `reply` – a new incoming reply message
93
+ - `attachment` – a new incoming remote attachment message
94
+ - `unhandledMessage` – a message that doesn't match any specific type
95
+
96
+ **Conversation Events**
83
97
 
84
- Events you can listen for:
98
+ - `dm` a new DM conversation
99
+ - `group` – a new group conversation
85
100
 
86
- - `message` – a new incoming (non‑self) message
87
- - `start` / `stop` – lifecycle events
88
- - `error` – surfaced errors
101
+ **Lifecycle Events**
89
102
 
90
- **Example:**
103
+ - `start` / `stop` – agent lifecycle events
104
+ - `unhandledError` – unhandled errors
105
+
106
+ **Example**
91
107
 
92
108
  ```ts
93
- agent.on("error", (error) => {
109
+ // Handle different message types
110
+ agent.on("text", async (ctx) => {
111
+ console.log(`Text message: ${ctx.text}`);
112
+ });
113
+
114
+ agent.on("reaction", async (ctx) => {
115
+ console.log(`Reaction: ${ctx.message.content}`);
116
+ });
117
+
118
+ agent.on("reply", async (ctx) => {
119
+ console.log(`Reply to: ${ctx.message.content.reference}`);
120
+ });
121
+
122
+ // Handle new conversations
123
+ agent.on("dm", async (ctx) => {
124
+ await ctx.conversation.send("Welcome to our DM!");
125
+ });
126
+
127
+ agent.on("group", async (ctx) => {
128
+ await ctx.conversation.send("Hello group!");
129
+ });
130
+
131
+ // Handle uncaught errors
132
+ agent.on("unhandledError", (error) => {
94
133
  console.error("Agent error", error);
95
134
  });
96
135
  ```
@@ -99,7 +138,7 @@ agent.on("error", (error) => {
99
138
 
100
139
  Extend your agent with custom business logic using middlewares. Compose cross-cutting behavior like routing, telemetry, rate limiting, analytics, and feature flags, or plug in your own.
101
140
 
102
- **Example:**
141
+ **Example**
103
142
 
104
143
  ```ts
105
144
  import { CommandRouter } from "@xmtp/agent-sdk";
@@ -117,24 +156,24 @@ agent.use(router.middleware());
117
156
 
118
157
  Instead of manually checking every incoming message, you can compose simple, reusable filters that make intent clear.
119
158
 
120
- **Example:**
159
+ **Example**
121
160
 
122
161
  ```ts
123
162
  import { withFilter, filter } from "@xmtp/agent-sdk";
124
163
 
125
164
  // Using filter in message handler
126
165
  agent.on(
127
- "message",
166
+ "text",
128
167
  withFilter(filter.startsWith("@agent"), async (ctx) => {
129
168
  await ctx.conversation.send("How can I help you?");
130
169
  }),
131
170
  );
132
171
 
133
172
  // Combination of filters
134
- const combined = filter.and(filter.notFromSelf, filter.textOnly);
173
+ const combined = filter.and(filter.notFromSelf, filter.isText);
135
174
 
136
175
  agent.on(
137
- "message",
176
+ "text",
138
177
  withFilter(combined, async (ctx) => {
139
178
  await ctx.conversation.send("You sent a text message ✅");
140
179
  }),
@@ -148,40 +187,38 @@ For convenience, the `filter` object can also be imported as `f`:
148
187
  import { filter, f } from "@xmtp/agent-sdk";
149
188
 
150
189
  // Both work the same way:
151
- const longVersion = filter.and(filter.notFromSelf, filter.textOnly);
152
- const shortVersion = f.and(f.notFromSelf, f.textOnly);
190
+ const longVersion = filter.and(filter.notFromSelf, filter.isText);
191
+ const shortVersion = f.and(f.notFromSelf, f.isText);
153
192
  ```
154
193
 
155
194
  You can find all available prebuilt filters [here](https://github.com/xmtp/xmtp-js/blob/main/sdks/agent-sdk/src/utils/filter.ts).
156
195
 
157
196
  ### 4. Rich Context
158
197
 
159
- Every `message` handler receives an `AgentContext` with:
198
+ Every message event handler receives a `MessageContext` with:
160
199
 
161
- - `message` – decoded message
200
+ - `message` – the decoded message object
162
201
  - `conversation` – the active conversation object
163
202
  - `client` – underlying XMTP client
164
- - Helpers like `sendText()` / `sendTextReply()`
203
+ - Helpers like `sendTextReply()`, `sendReaction()`, `getSenderAddress`, and more
165
204
 
166
- **Example:**
205
+ **Example**
167
206
 
168
207
  ```ts
169
- agent.on("message", async (ctx) => {
208
+ agent.on("text", async (ctx) => {
170
209
  await ctx.sendTextReply("Reply using helper ✨");
171
210
  });
172
211
  ```
173
212
 
174
213
  ## Adding Custom Content Types
175
214
 
176
- Pass codecs when creating your agent to extend supported content:
215
+ Pass `codecs` when creating your agent to extend supported content:
177
216
 
178
217
  ```ts
179
- import { ReplyCodec } from "@xmtp/content-type-reply";
180
-
181
218
  const agent = await Agent.create(signer, {
182
219
  env: "dev",
183
220
  dbPath: null,
184
- codecs: [new ReplyCodec()],
221
+ codecs: [new MyContentType()],
185
222
  });
186
223
  ```
187
224
 
@@ -190,15 +227,6 @@ const agent = await Agent.create(signer, {
190
227
  - [Debug an agent](https://docs.xmtp.org/agents/debug-agents)
191
228
  - [Further debugging info](https://docs.xmtp.org/inboxes/debug-your-app#debug-your-inbox-app)
192
229
 
193
- ## FAQ (Quick Hits)
194
-
195
- | Question | Answer |
196
- | -------------------------------------------------------------------------------------------- | ----------------------------------------------- |
197
- | Does middleware run for every message? | Yes, in the order added. |
198
- | How do I reject a message early? | Don’t call `next()` in middleware. |
199
- | How do I filter messages? | Use `withFilter(...)` around an event listener. |
200
- | Can I send custom [content types](https://docs.xmtp.org/agents/content-types/content-types)? | Yes, register codecs during agent creation. |
201
-
202
230
  ## Contributing / Feedback
203
231
 
204
232
  We’d love your feedback: [open an issue](https://github.com/xmtp/xmtp-js/issues) or discussion. PRs welcome for docs, examples, and core improvements.
@@ -3,28 +3,45 @@ import type { ContentCodec } from "@xmtp/content-type-primitives";
3
3
  import { ReactionCodec } from "@xmtp/content-type-reaction";
4
4
  import { RemoteAttachmentCodec } from "@xmtp/content-type-remote-attachment";
5
5
  import { ReplyCodec } from "@xmtp/content-type-reply";
6
- import { Client, type ClientOptions } from "@xmtp/node-sdk";
7
- import { AgentContext } from "./AgentContext.js";
6
+ import type { TextCodec } from "@xmtp/content-type-text";
7
+ import { Client, Dm, Group, type ClientOptions } from "@xmtp/node-sdk";
8
+ import { ConversationContext } from "./ConversationContext.js";
9
+ import { AgentContext } from "./MessageContext.js";
8
10
  interface EventHandlerMap<ContentTypes> {
9
- error: [error: Error];
10
- message: [ctx: AgentContext<ContentTypes>];
11
+ attachment: [ctx: AgentContext<ReturnType<RemoteAttachmentCodec["decode"]>>];
12
+ dm: [ctx: ConversationContext<ContentTypes, Dm<ContentTypes>>];
13
+ group: [ctx: ConversationContext<ContentTypes, Group<ContentTypes>>];
14
+ reaction: [ctx: AgentContext<ReturnType<ReactionCodec["decode"]>>];
15
+ reply: [ctx: AgentContext<ReturnType<ReplyCodec["decode"]>>];
11
16
  start: [];
12
17
  stop: [];
18
+ text: [ctx: AgentContext<ReturnType<TextCodec["decode"]>>];
19
+ unhandledError: [error: Error];
20
+ unhandledMessage: [ctx: AgentContext<ContentTypes>];
13
21
  }
14
22
  export interface AgentOptions<ContentTypes> {
15
23
  client: Client<ContentTypes>;
16
24
  }
17
- export type AgentEventHandler<ContentTypes = unknown> = (ctx: AgentContext<ContentTypes>) => Promise<void> | void;
18
- export type AgentMiddleware<ContentTypes> = (ctx: AgentContext<ContentTypes>, next: () => Promise<void>) => Promise<void>;
25
+ export type AgentMessageHandler<ContentTypes = unknown> = (ctx: AgentContext<ContentTypes>) => Promise<void> | void;
26
+ export type AgentMiddleware<ContentTypes = unknown> = (ctx: AgentContext<ContentTypes>, next: () => Promise<void> | void) => Promise<void>;
27
+ export type AgentErrorMiddleware<ContentTypes = unknown> = (error: unknown, ctx: AgentContext<ContentTypes> | null, next: (err?: unknown) => Promise<void> | void) => Promise<void> | void;
28
+ export type StreamAllMessagesOptions<ContentTypes> = Parameters<Client<ContentTypes>["conversations"]["streamAllMessages"]>[0];
29
+ export interface AgentErrorRegistrar<ContentTypes> {
30
+ use(...errorMiddleware: Array<AgentErrorMiddleware<ContentTypes> | AgentErrorMiddleware<ContentTypes>[]>): AgentErrorRegistrar<ContentTypes>;
31
+ }
19
32
  export declare class Agent<ContentTypes> extends EventEmitter<EventHandlerMap<ContentTypes>> {
20
33
  #private;
21
34
  constructor({ client }: AgentOptions<ContentTypes>);
22
- static create<ContentCodecs extends ContentCodec[] = []>(signer?: Parameters<typeof Client.create>[0], options?: Omit<ClientOptions, "codecs"> & {
35
+ static create<ContentCodecs extends ContentCodec[] = []>(signer: Parameters<typeof Client.create>[0], options?: Omit<ClientOptions, "codecs"> & {
36
+ codecs?: ContentCodecs;
37
+ }): Promise<Agent<import("@xmtp/node-sdk").ExtractCodecContentTypes<(RemoteAttachmentCodec | ReactionCodec | ReplyCodec | (never[] | ContentCodecs)[number])[]>>>;
38
+ static createFromEnv<ContentCodecs extends ContentCodec[] = []>(options?: Omit<ClientOptions, "codecs"> & {
23
39
  codecs?: ContentCodecs;
24
- }): Promise<Agent<import("@xmtp/node-sdk").ExtractCodecContentTypes<(ReactionCodec | ReplyCodec | RemoteAttachmentCodec | (never[] | ContentCodecs)[number])[]>>>;
25
- use(middleware: AgentMiddleware<ContentTypes>): this;
26
- start(): Promise<void>;
40
+ }): Promise<Agent<import("@xmtp/node-sdk").ExtractCodecContentTypes<(RemoteAttachmentCodec | ReactionCodec | ReplyCodec | (never[] | ContentCodecs)[number])[]>>>;
41
+ use(...middleware: Array<AgentMiddleware<ContentTypes> | AgentMiddleware<ContentTypes>[]>): this;
42
+ start(options?: StreamAllMessagesOptions<ContentTypes>): Promise<void>;
27
43
  get client(): Client<ContentTypes>;
28
- stop(): void;
44
+ get errors(): AgentErrorRegistrar<ContentTypes>;
45
+ stop(): Promise<void>;
29
46
  }
30
47
  export {};
@@ -2,17 +2,41 @@ import EventEmitter from "node:events";
2
2
  import { ReactionCodec } from "@xmtp/content-type-reaction";
3
3
  import { RemoteAttachmentCodec } from "@xmtp/content-type-remote-attachment";
4
4
  import { ReplyCodec } from "@xmtp/content-type-reply";
5
- import { ApiUrls, Client, } from "@xmtp/node-sdk";
5
+ import { ApiUrls, Client, Dm, Group, } from "@xmtp/node-sdk";
6
6
  import { isHex } from "viem/utils";
7
7
  import { getEncryptionKeyFromHex } from "../utils/crypto.js";
8
- import { logDetails } from "../utils/debug.js";
9
8
  import { filter } from "../utils/filter.js";
9
+ import { hasDefinedContent, isReaction, isRemoteAttachment, isReply, isText, } from "../utils/message.js";
10
10
  import { createSigner, createUser } from "../utils/user.js";
11
- import { AgentContext } from "./AgentContext.js";
11
+ import { ConversationContext } from "./ConversationContext.js";
12
+ import { AgentContext } from "./MessageContext.js";
12
13
  export class Agent extends EventEmitter {
13
14
  #client;
15
+ #conversationsStream;
14
16
  #middleware = [];
17
+ #errorMiddleware = [];
15
18
  #isListening = false;
19
+ #errors = Object.freeze({
20
+ use: (...errorMiddleware) => {
21
+ for (const emw of errorMiddleware) {
22
+ if (Array.isArray(emw)) {
23
+ this.#errorMiddleware.push(...emw);
24
+ }
25
+ else if (typeof emw === "function") {
26
+ this.#errorMiddleware.push(emw);
27
+ }
28
+ }
29
+ return this.#errors;
30
+ },
31
+ });
32
+ #defaultErrorHandler = (currentError) => {
33
+ const emittedError = currentError instanceof Error
34
+ ? currentError
35
+ : new Error(`Unhandled error caught by default error middleware.`, {
36
+ cause: currentError,
37
+ });
38
+ this.emit("unhandledError", emittedError);
39
+ };
16
40
  constructor({ client }) {
17
41
  super();
18
42
  this.#client = client;
@@ -20,107 +44,224 @@ export class Agent extends EventEmitter {
20
44
  static async create(signer,
21
45
  // Note: we need to omit this so that "Client.create" can correctly infer the codecs.
22
46
  options) {
23
- if (!signer) {
24
- if (isHex(process.env.XMTP_WALLET_KEY)) {
25
- signer = createSigner(createUser(process.env.XMTP_WALLET_KEY));
26
- }
27
- else {
28
- throw new Error(`No signer detected. Provide a "signer" to "Agent.create()" or set the "XMTP_WALLET_KEY" environment variable to a private key in hexadecimal format. Read more: https://docs.xmtp.org/inboxes/core-messaging/create-a-signer`);
29
- }
30
- }
31
- const initializedOptions = { ...options };
47
+ const initializedOptions = { ...(options ?? {}) };
32
48
  initializedOptions.appVersion ??= "agent-sdk/alpha";
33
- if (process.env.XMTP_DB_ENCRYPTION_KEY) {
34
- initializedOptions.dbEncryptionKey = getEncryptionKeyFromHex(process.env.XMTP_DB_ENCRYPTION_KEY);
35
- }
36
- if (process.env.XMTP_ENV &&
37
- Object.keys(ApiUrls).includes(process.env.XMTP_ENV)) {
38
- initializedOptions.env = process.env.XMTP_ENV;
39
- }
40
- if (process.env.XMTP_FORCE_DEBUG) {
41
- initializedOptions.debugEventsEnabled = true;
42
- initializedOptions.loggingLevel = "warn" /* LogLevel.warn */;
43
- initializedOptions.structuredLogging = true;
44
- }
45
49
  const upgradedCodecs = [
46
50
  ...(initializedOptions.codecs ?? []),
47
51
  new ReactionCodec(),
48
52
  new ReplyCodec(),
49
53
  new RemoteAttachmentCodec(),
50
54
  ];
55
+ if (process.env.XMTP_FORCE_DEBUG) {
56
+ initializedOptions.debugEventsEnabled = true;
57
+ initializedOptions.loggingLevel = "warn" /* LogLevel.warn */;
58
+ initializedOptions.structuredLogging = true;
59
+ }
51
60
  const client = await Client.create(signer, {
52
61
  ...initializedOptions,
53
62
  codecs: upgradedCodecs,
54
63
  });
55
- if (process.env.XMTP_FORCE_REVOKE_INSTALLATIONS) {
56
- await client.revokeAllOtherInstallations();
64
+ return new Agent({ client });
65
+ }
66
+ static async createFromEnv(
67
+ // Note: we need to omit this so that "Client.create" can correctly infer the codecs.
68
+ options) {
69
+ if (!isHex(process.env.XMTP_WALLET_KEY)) {
70
+ throw new Error(`XMTP_WALLET_KEY env is not in hex (0x) format.`);
57
71
  }
58
- if (process.env.XMTP_FORCE_DEBUG) {
59
- await logDetails(client);
72
+ const signer = createSigner(createUser(process.env.XMTP_WALLET_KEY));
73
+ const initializedOptions = { ...(options ?? {}) };
74
+ if (process.env.XMTP_DB_ENCRYPTION_KEY) {
75
+ initializedOptions.dbEncryptionKey = getEncryptionKeyFromHex(process.env.XMTP_DB_ENCRYPTION_KEY);
60
76
  }
61
- return new Agent({ client });
77
+ if (process.env.XMTP_ENV &&
78
+ Object.keys(ApiUrls).includes(process.env.XMTP_ENV)) {
79
+ initializedOptions.env = process.env.XMTP_ENV;
80
+ }
81
+ return this.create(signer, initializedOptions);
62
82
  }
63
- use(middleware) {
64
- this.#middleware.push(middleware);
83
+ use(...middleware) {
84
+ for (const mw of middleware) {
85
+ if (Array.isArray(mw)) {
86
+ this.#middleware.push(...mw);
87
+ }
88
+ else if (typeof mw === "function") {
89
+ this.#middleware.push(mw);
90
+ }
91
+ }
65
92
  return this;
66
93
  }
67
- async start() {
94
+ async start(options) {
68
95
  if (this.#isListening) {
69
96
  return;
70
97
  }
71
98
  try {
72
99
  this.#isListening = true;
73
100
  void this.emit("start");
74
- const stream = await this.#client.conversations.streamAllMessages();
75
- for await (const message of stream) {
101
+ this.#conversationsStream = await this.#client.conversations.stream({
102
+ onValue: async (conversation) => {
103
+ try {
104
+ if (conversation instanceof Group) {
105
+ this.emit("group", new ConversationContext({
106
+ conversation,
107
+ client: this.#client,
108
+ }));
109
+ }
110
+ else if (conversation instanceof Dm) {
111
+ this.emit("dm", new ConversationContext({
112
+ conversation,
113
+ client: this.#client,
114
+ }));
115
+ }
116
+ }
117
+ catch (error) {
118
+ const recovered = await this.#runErrorChain(error, null);
119
+ if (!recovered)
120
+ await this.stop();
121
+ }
122
+ },
123
+ onError: async (error) => {
124
+ const recovered = await this.#runErrorChain(error, null);
125
+ if (!recovered)
126
+ await this.stop();
127
+ },
128
+ });
129
+ const messages = await this.#client.conversations.streamAllMessages(options);
130
+ for await (const message of messages) {
76
131
  // The "stop()" method sets "isListening"
77
132
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
78
133
  if (!this.#isListening)
79
134
  break;
80
135
  try {
81
- await this.#processMessage(message);
136
+ switch (true) {
137
+ case isRemoteAttachment(message):
138
+ await this.#processMessage(message, "attachment");
139
+ break;
140
+ case isReaction(message):
141
+ await this.#processMessage(message, "reaction");
142
+ break;
143
+ case isReply(message):
144
+ await this.#processMessage(message, "reply");
145
+ break;
146
+ case isText(message):
147
+ await this.#processMessage(message, "text");
148
+ break;
149
+ default:
150
+ await this.#processMessage(message);
151
+ break;
152
+ }
82
153
  }
83
154
  catch (error) {
84
- this.#throwError(error);
155
+ const recovered = await this.#runErrorChain(error, null);
156
+ if (!recovered) {
157
+ await this.stop();
158
+ break;
159
+ }
85
160
  }
86
161
  }
87
162
  }
88
163
  catch (error) {
89
164
  this.#isListening = false;
90
- this.#throwError(error);
165
+ const recovered = await this.#runErrorChain(error, null);
166
+ if (recovered) {
167
+ await this.stop();
168
+ queueMicrotask(() => this.start(options));
169
+ }
91
170
  }
92
171
  }
93
- async #processMessage(message) {
172
+ async #processMessage(message, topic = "unhandledMessage") {
173
+ // Skip messages with undefined content (failed to decode)
174
+ if (!hasDefinedContent(message)) {
175
+ return;
176
+ }
177
+ let context = null;
94
178
  const conversation = await this.#client.conversations.getConversationById(message.conversationId);
95
179
  if (!conversation) {
96
- this.#throwError(new Error(`Failed to process message ID "${message.id}" for conversation ID "${message.conversationId}" because the conversation could not be found.`));
97
- return;
180
+ throw new Error(`Failed to process message ID "${message.id}" for conversation ID "${message.conversationId}" because the conversation could not be found.`);
98
181
  }
99
- const context = new AgentContext(message, conversation, this.#client);
100
- let middlewareIndex = 0;
101
- const next = async () => {
102
- if (middlewareIndex < this.#middleware.length) {
103
- const currentMiddleware = this.#middleware[middlewareIndex++];
104
- await currentMiddleware(context, next);
182
+ context = new AgentContext({ message, conversation, client: this.#client });
183
+ await this.#runMiddlewareChain(context, topic);
184
+ }
185
+ async #runMiddlewareChain(context, topic = "unhandledMessage") {
186
+ const finalEmit = async () => {
187
+ try {
188
+ if (filter.notFromSelf(context.message, this.#client)) {
189
+ this.emit(topic, context);
190
+ }
105
191
  }
106
- else if (filter.notFromSelf(message, this.#client)) {
107
- // Note: we are filtering the agent's own message to avoid
108
- // infinite message loops when a "message" listener replies
109
- void this.emit("message", context);
192
+ catch (error) {
193
+ await this.#runErrorChain(error, context);
110
194
  }
111
195
  };
112
- await next();
196
+ const chain = this.#middleware.reduceRight((next, mw) => {
197
+ return async () => {
198
+ try {
199
+ await mw(context, next);
200
+ }
201
+ catch (error) {
202
+ const resume = await this.#runErrorChain(error, context);
203
+ if (resume) {
204
+ await next();
205
+ }
206
+ // Chain is not resuming, error is being swallowed
207
+ }
208
+ };
209
+ }, finalEmit);
210
+ await chain();
211
+ }
212
+ async #runErrorHandler(handler, context, error) {
213
+ let settled = false;
214
+ let flow = { kind: "stopped" };
215
+ const next = (nextErr) => {
216
+ if (settled)
217
+ return;
218
+ settled = true;
219
+ flow =
220
+ nextErr === undefined
221
+ ? { kind: "handled" }
222
+ : { kind: "continue", error: nextErr };
223
+ };
224
+ try {
225
+ await handler(error, context, next);
226
+ return flow;
227
+ }
228
+ catch (thrown) {
229
+ if (settled) {
230
+ return flow;
231
+ }
232
+ return { kind: "continue", error: thrown };
233
+ }
234
+ }
235
+ async #runErrorChain(error, context) {
236
+ const chain = [...this.#errorMiddleware, this.#defaultErrorHandler];
237
+ let currentError = error;
238
+ for (let i = 0; i < chain.length; i++) {
239
+ const outcome = await this.#runErrorHandler(chain[i], context, currentError);
240
+ switch (outcome.kind) {
241
+ case "handled":
242
+ // Error was handled. Main middleware can continue.
243
+ return true;
244
+ case "stopped":
245
+ // Error cannot be handled. Main middleware won't continue.
246
+ return false;
247
+ case "continue":
248
+ // Error is passed to the next handler
249
+ currentError = outcome.error;
250
+ }
251
+ }
252
+ // Reached end of chain without recovery
253
+ return false;
113
254
  }
114
255
  get client() {
115
256
  return this.#client;
116
257
  }
117
- stop() {
118
- this.#isListening = false;
119
- void this.emit("stop");
258
+ get errors() {
259
+ return this.#errors;
120
260
  }
121
- #throwError(error) {
122
- const newError = error instanceof Error ? error : new Error(String(error));
123
- void this.emit("error", newError);
261
+ async stop() {
262
+ await this.#conversationsStream?.end();
263
+ this.#isListening = false;
264
+ this.emit("stop");
124
265
  }
125
266
  }
126
267
  //# sourceMappingURL=Agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Agent.js","sourceRoot":"","sources":["../../src/core/Agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Agent.js","sourceRoot":"","sources":["../../src/core/Agent.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EACL,OAAO,EACP,MAAM,EACN,EAAE,EACF,KAAK,GAKN,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,OAAO,EACP,MAAM,GACP,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAyDnD,MAAM,OAAO,KAAoB,SAAQ,YAExC;IACC,OAAO,CAAuB;IAC9B,oBAAoB,CAAoC;IACxD,WAAW,GAAoC,EAAE,CAAC;IAClD,gBAAgB,GAAyC,EAAE,CAAC;IAC5D,YAAY,GAAG,KAAK,CAAC;IACrB,OAAO,GAAsC,MAAM,CAAC,MAAM,CAAC;QACzD,GAAG,EAAE,CAAC,GAAG,eAAqD,EAAE,EAAE;YAChE,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;gBAClC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;gBACrC,CAAC;qBAAM,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;oBACrC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;KACF,CAAC,CAAC;IACH,oBAAoB,GAAuC,CAAC,YAAY,EAAE,EAAE;QAC1E,MAAM,YAAY,GAChB,YAAY,YAAY,KAAK;YAC3B,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,IAAI,KAAK,CAAC,qDAAqD,EAAE;gBAC/D,KAAK,EAAE,YAAY;aACpB,CAAC,CAAC;QACT,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,YAAY,EAAE,MAAM,EAA8B;QAChD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,MAA2C;IAC3C,qFAAqF;IACrF,OAAoE;QAEpE,MAAM,kBAAkB,GAAG,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAClD,kBAAkB,CAAC,UAAU,KAAK,iBAAiB,CAAC;QAEpD,MAAM,cAAc,GAAG;YACrB,GAAG,CAAC,kBAAkB,CAAC,MAAM,IAAI,EAAE,CAAC;YACpC,IAAI,aAAa,EAAE;YACnB,IAAI,UAAU,EAAE;YAChB,IAAI,qBAAqB,EAAE;SAC5B,CAAC;QAEF,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACjC,kBAAkB,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC7C,kBAAkB,CAAC,YAAY,6BAAgB,CAAC;YAChD,kBAAkB,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;YACzC,GAAG,kBAAkB;YACrB,MAAM,EAAE,cAAc;SACvB,CAAC,CAAC;QAEH,OAAO,IAAI,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa;IACxB,qFAAqF;IACrF,OAAoE;QAEpE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;QAErE,MAAM,kBAAkB,GAAG,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QAElD,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC;YACvC,kBAAkB,CAAC,eAAe,GAAG,uBAAuB,CAC1D,OAAO,CAAC,GAAG,CAAC,sBAAsB,CACnC,CAAC;QACJ,CAAC;QAED,IACE,OAAO,CAAC,GAAG,CAAC,QAAQ;YACpB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EACnD,CAAC;YACD,kBAAkB,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAmB,CAAC;QAC3D,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACjD,CAAC;IAED,GAAG,CACD,GAAG,UAEF;QAED,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC/B,CAAC;iBAAM,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,CAAC;gBACpC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAgD;QAC1D,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAExB,IAAI,CAAC,oBAAoB,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;gBAClE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;oBAC9B,IAAI,CAAC;wBACH,IAAI,YAAY,YAAY,KAAK,EAAE,CAAC;4BAClC,IAAI,CAAC,IAAI,CACP,OAAO,EACP,IAAI,mBAAmB,CAAoC;gCACzD,YAAY;gCACZ,MAAM,EAAE,IAAI,CAAC,OAAO;6BACrB,CAAC,CACH,CAAC;wBACJ,CAAC;6BAAM,IAAI,YAAY,YAAY,EAAE,EAAE,CAAC;4BACtC,IAAI,CAAC,IAAI,CACP,IAAI,EACJ,IAAI,mBAAmB,CAAiC;gCACtD,YAAY;gCACZ,MAAM,EAAE,IAAI,CAAC,OAAO;6BACrB,CAAC,CACH,CAAC;wBACJ,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;wBACzD,IAAI,CAAC,SAAS;4BAAE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;oBACpC,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACvB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBACzD,IAAI,CAAC,SAAS;wBAAE,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBACpC,CAAC;aACF,CAAC,CAAC;YAEH,MAAM,QAAQ,GACZ,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBACrC,yCAAyC;gBACzC,uEAAuE;gBACvE,IAAI,CAAC,IAAI,CAAC,YAAY;oBAAE,MAAM;gBAC9B,IAAI,CAAC;oBACH,QAAQ,IAAI,EAAE,CAAC;wBACb,KAAK,kBAAkB,CAAC,OAAO,CAAC;4BAC9B,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;4BAClD,MAAM;wBACR,KAAK,UAAU,CAAC,OAAO,CAAC;4BACtB,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;4BAChD,MAAM;wBACR,KAAK,OAAO,CAAC,OAAO,CAAC;4BACnB,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;4BAC7C,MAAM;wBACR,KAAK,MAAM,CAAC,OAAO,CAAC;4BAClB,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;4BAC5C,MAAM;wBACR;4BACE,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;4BACpC,MAAM;oBACV,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;oBACzD,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;wBAClB,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACzD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClB,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,OAAqC,EACrC,QAAiC,kBAAkB;QAEnD,0DAA0D;QAC1D,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,OAAO,GAAsC,IAAI,CAAC;QACtD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,mBAAmB,CACvE,OAAO,CAAC,cAAc,CACvB,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,iCAAiC,OAAO,CAAC,EAAE,0BAA0B,OAAO,CAAC,cAAc,gDAAgD,CAC5I,CAAC;QACJ,CAAC;QAED,OAAO,GAAG,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,OAAmC,EACnC,QAAiC,kBAAkB;QAEnD,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;YAC3B,IAAI,CAAC;gBACH,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CACxC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;YACX,OAAO,KAAK,IAAI,EAAE;gBAChB,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC1B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBACzD,IAAI,MAAM,EAAE,CAAC;wBACX,MAAM,IAAI,EAAE,CAAC;oBACf,CAAC;oBACD,kDAAkD;gBACpD,CAAC;YACH,CAAC,CAAC;QACJ,CAAC,EACD,SAAS,CACV,CAAC;QAEF,MAAM,KAAK,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,OAA2C,EAC3C,OAA0C,EAC1C,KAAc;QAEd,IAAI,OAAO,GAAG,KAAgB,CAAC;QAC/B,IAAI,IAAI,GAAc,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAE1C,MAAM,IAAI,GAAG,CAAC,OAAiB,EAAE,EAAE;YACjC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI;gBACF,OAAO,KAAK,SAAS;oBACnB,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;oBACrB,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC7C,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,KAAc,EACd,OAA0C;QAE1C,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAEpE,IAAI,YAAY,GAAY,KAAK,CAAC;QAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,OAAO,EACP,YAAY,CACb,CAAC;YAEF,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,SAAS;oBACZ,mDAAmD;oBACnD,OAAO,IAAI,CAAC;gBACd,KAAK,SAAS;oBACZ,2DAA2D;oBAC3D,OAAO,KAAK,CAAC;gBACf,KAAK,UAAU;oBACb,sCAAsC;oBACtC,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;YACjC,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { Client, Conversation } from "@xmtp/node-sdk";
2
+ export declare class ConversationContext<ContentTypes = unknown, ConversationType extends Conversation = Conversation> {
3
+ #private;
4
+ constructor({ conversation, client, }: {
5
+ conversation: ConversationType;
6
+ client: Client<ContentTypes>;
7
+ });
8
+ sendText(text: string): Promise<void>;
9
+ getOwnAddress(): string | undefined;
10
+ get conversation(): ConversationType;
11
+ get client(): Client<ContentTypes>;
12
+ }
@@ -0,0 +1,22 @@
1
+ import { ContentTypeText } from "@xmtp/content-type-text";
2
+ export class ConversationContext {
3
+ #client;
4
+ #conversation;
5
+ constructor({ conversation, client, }) {
6
+ this.#conversation = conversation;
7
+ this.#client = client;
8
+ }
9
+ async sendText(text) {
10
+ await this.#conversation.send(text, ContentTypeText);
11
+ }
12
+ getOwnAddress() {
13
+ return this.#client.accountIdentifier?.identifier;
14
+ }
15
+ get conversation() {
16
+ return this.#conversation;
17
+ }
18
+ get client() {
19
+ return this.#client;
20
+ }
21
+ }
22
+ //# sourceMappingURL=ConversationContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationContext.js","sourceRoot":"","sources":["../../src/core/ConversationContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,MAAM,OAAO,mBAAmB;IAI9B,OAAO,CAAuB;IAC9B,aAAa,CAAmB;IAEhC,YAAY,EACV,YAAY,EACZ,MAAM,GAIP;QACC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACvD,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC;IACpD,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import { type Reaction } from "@xmtp/content-type-reaction";
2
+ import type { Client, Conversation, DecodedMessage } from "@xmtp/node-sdk";
3
+ import { ConversationContext } from "./ConversationContext.js";
4
+ export type MessageContext<ContentTypes = unknown> = DecodedMessage<ContentTypes> & {
5
+ content: ContentTypes;
6
+ };
7
+ export declare class AgentContext<ContentTypes = unknown> extends ConversationContext<ContentTypes> {
8
+ #private;
9
+ constructor({ message, conversation, client, }: {
10
+ message: MessageContext<ContentTypes>;
11
+ conversation: Conversation;
12
+ client: Client<ContentTypes>;
13
+ });
14
+ sendReaction(content: string, schema?: Reaction["schema"]): Promise<void>;
15
+ sendTextReply(text: string): Promise<void>;
16
+ getSenderAddress(): Promise<string>;
17
+ get message(): MessageContext<ContentTypes>;
18
+ }
@@ -1,14 +1,12 @@
1
1
  import { ContentTypeReaction, } from "@xmtp/content-type-reaction";
2
2
  import { ContentTypeReply } from "@xmtp/content-type-reply";
3
3
  import { ContentTypeText } from "@xmtp/content-type-text";
4
- export class AgentContext {
5
- #client;
4
+ import { ConversationContext } from "./ConversationContext.js";
5
+ export class AgentContext extends ConversationContext {
6
6
  #message;
7
- #conversation;
8
- constructor(message, conversation, client) {
7
+ constructor({ message, conversation, client, }) {
8
+ super({ conversation, client });
9
9
  this.#message = message;
10
- this.#conversation = conversation;
11
- this.#client = client;
12
10
  }
13
11
  async sendReaction(content, schema = "unicode") {
14
12
  const reaction = {
@@ -18,10 +16,7 @@ export class AgentContext {
18
16
  schema,
19
17
  content,
20
18
  };
21
- await this.#conversation.send(reaction, ContentTypeReaction);
22
- }
23
- async sendText(text) {
24
- await this.#conversation.send(text, ContentTypeText);
19
+ await this.conversation.send(reaction, ContentTypeReaction);
25
20
  }
26
21
  async sendTextReply(text) {
27
22
  const reply = {
@@ -30,13 +25,10 @@ export class AgentContext {
30
25
  contentType: ContentTypeText,
31
26
  content: text,
32
27
  };
33
- await this.#conversation.send(reply, ContentTypeReply);
34
- }
35
- getOwnAddress() {
36
- return this.#client.accountIdentifier?.identifier;
28
+ await this.conversation.send(reply, ContentTypeReply);
37
29
  }
38
30
  async getSenderAddress() {
39
- const inboxState = await this.#client.preferences.inboxStateFromInboxIds([
31
+ const inboxState = await this.client.preferences.inboxStateFromInboxIds([
40
32
  this.#message.senderInboxId,
41
33
  ]);
42
34
  return inboxState[0].identifiers[0].identifier;
@@ -44,11 +36,5 @@ export class AgentContext {
44
36
  get message() {
45
37
  return this.#message;
46
38
  }
47
- get conversation() {
48
- return this.#conversation;
49
- }
50
- get client() {
51
- return this.#client;
52
- }
53
39
  }
54
- //# sourceMappingURL=AgentContext.js.map
40
+ //# sourceMappingURL=MessageContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageContext.js","sourceRoot":"","sources":["../../src/core/MessageContext.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAEpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAc,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAQ/D,MAAM,OAAO,YAEX,SAAQ,mBAAiC;IACzC,QAAQ,CAA+B;IAEvC,YAAY,EACV,OAAO,EACP,YAAY,EACZ,MAAM,GAKP;QACC,KAAK,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,SAA6B,SAAS;QACxE,MAAM,QAAQ,GAAa;YACzB,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAC3B,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa;YAC7C,MAAM;YACN,OAAO;SACR,CAAC;QACF,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,MAAM,KAAK,GAAU;YACnB,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAC3B,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa;YAC7C,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,IAAI;SACd,CAAC;QACF,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,sBAAsB,CAAC;YACtE,IAAI,CAAC,QAAQ,CAAC,aAAa;SAC5B,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACjD,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF"}
@@ -1,2 +1,3 @@
1
1
  export * from "./Agent.js";
2
- export * from "./AgentContext.js";
2
+ export * from "./ConversationContext.js";
3
+ export * from "./MessageContext.js";
@@ -1,3 +1,4 @@
1
1
  export * from "./Agent.js";
2
- export * from "./AgentContext.js";
2
+ export * from "./ConversationContext.js";
3
+ export * from "./MessageContext.js";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC"}
package/dist/demo.js CHANGED
@@ -9,7 +9,7 @@ try {
9
9
  }
10
10
  catch { }
11
11
  const agent = process.env.XMTP_WALLET_KEY
12
- ? await Agent.create()
12
+ ? await Agent.createFromEnv()
13
13
  : await Agent.create(createSigner(createUser()), {
14
14
  dbPath: null,
15
15
  });
@@ -18,17 +18,31 @@ router.command("/version", async (ctx) => {
18
18
  await ctx.conversation.send(`v${process.env.npm_package_version}`);
19
19
  });
20
20
  agent.use(router.middleware());
21
- agent.on("message", (ctx) => {
22
- console.log("Got message:", ctx.message.content);
21
+ agent.on("dm", (ctx) => {
22
+ console.log("Got new direct message in:", ctx.conversation.id);
23
23
  });
24
- agent.on("message", withFilter(f.startsWith("@agent"), async (ctx) => {
24
+ agent.on("group", (ctx) => {
25
+ console.log("Got new group message in:", ctx.conversation.id);
26
+ });
27
+ agent.on("attachment", (ctx) => {
28
+ console.log("Got attachment:", ctx.message.content);
29
+ });
30
+ agent.on("text", (ctx) => {
31
+ console.log("Got text:", ctx.message.content);
32
+ });
33
+ agent.on("reaction", (ctx) => {
34
+ console.log("Got reaction:", ctx.message.content);
35
+ });
36
+ agent.on("reply", (ctx) => {
37
+ console.log("Got reply:", ctx.message.content);
38
+ });
39
+ agent.on("text", withFilter(f.startsWith("@agent"), async (ctx) => {
25
40
  await ctx.conversation.send("How can I help you?");
26
41
  }));
27
42
  const errorHandler = (error) => {
28
43
  console.log("Caught error", error);
29
44
  };
30
- agent.on("error", errorHandler);
31
- agent.off("error", errorHandler);
45
+ agent.on("unhandledError", errorHandler);
32
46
  agent.on("start", () => {
33
47
  console.log(`We are online: ${getTestUrl(agent)}`);
34
48
  });
package/dist/demo.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"demo.js","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE3E,IAAI,CAAC;IACH,WAAW,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;AAChD,CAAC;AAAC,MAAM,CAAC,CAAA,CAAC;AAEV,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe;IACvC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE;IACtB,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC,EAAE;QAC7C,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;AAEP,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;AAEnC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IACvC,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC;AACrE,CAAC,CAAC,CAAC;AAEH,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;AAE/B,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;IAC1B,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,KAAK,CAAC,EAAE,CACN,SAAS,EACT,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IAC/C,MAAM,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AACrD,CAAC,CAAC,CACH,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAc,EAAE,EAAE;IACtC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAEhC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAEjC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from "./core/index.js";
2
2
  export * from "./middleware/index.js";
3
3
  export * from "./utils/index.js";
4
+ export type * from "@xmtp/node-sdk";
@@ -1,10 +1,10 @@
1
- import { type AgentEventHandler, type AgentMiddleware } from "../core/Agent.js";
2
- import type { AgentContext } from "../core/AgentContext.js";
1
+ import { type AgentMessageHandler, type AgentMiddleware } from "../core/Agent.js";
2
+ import type { AgentContext } from "../core/MessageContext.js";
3
3
  export declare class CommandRouter<ContentTypes> {
4
4
  private commandMap;
5
5
  private defaultHandler;
6
- command(command: string, handler: AgentEventHandler): this;
7
- default(handler: AgentEventHandler): this;
6
+ command(command: string, handler: AgentMessageHandler): this;
7
+ default(handler: AgentMessageHandler): this;
8
8
  handle(ctx: AgentContext): Promise<boolean>;
9
9
  middleware: () => AgentMiddleware<ContentTypes>;
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CommandRouter.js","sourceRoot":"","sources":["../../src/middleware/CommandRouter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,aAAa;IAChB,UAAU,GAAG,IAAI,GAAG,EAA6B,CAAC;IAClD,cAAc,GAA6B,IAAI,CAAC;IAExD,OAAO,CAAC,OAAe,EAAE,OAA0B;QACjD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,OAA0B;QAChC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAiB;QAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;QACxC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAEvC,qCAAqC;QACrC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,UAAU,GAAwC,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC1E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC;CACH"}
1
+ {"version":3,"file":"CommandRouter.js","sourceRoot":"","sources":["../../src/middleware/CommandRouter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,aAAa;IAChB,UAAU,GAAG,IAAI,GAAG,EAA+B,CAAC;IACpD,cAAc,GAA+B,IAAI,CAAC;IAE1D,OAAO,CAAC,OAAe,EAAE,OAA4B;QACnD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,OAA4B;QAClC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAiB;QAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;QACxC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAEvC,qCAAqC;QACrC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,UAAU,GAAwC,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC1E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC;CACH"}
@@ -1,7 +1,6 @@
1
1
  import { getRandomValues } from "node:crypto";
2
- import { secp256k1 } from "@noble/curves/secp256k1.js";
3
2
  import { fromString, toString } from "uint8arrays";
4
- import { toHex } from "viem";
3
+ import { generatePrivateKey } from "viem/accounts";
5
4
  /**
6
5
  * Convert a hex string to a Uint8Array encryption key.
7
6
  * @param hex - The hex string
@@ -10,17 +9,6 @@ import { toHex } from "viem";
10
9
  export const getEncryptionKeyFromHex = (hex) => {
11
10
  return fromString(hex, "hex");
12
11
  };
13
- /**
14
- * Generates a cryptographically secure random private key for wallet operations.
15
- *
16
- * Uses the secp256k1 elliptic curve to generate a private key suitable for
17
- * Ethereum-compatible wallets and XMTP client authentication.
18
- *
19
- * @returns A hex-encoded private key string (64 characters, prefixed with '0x')
20
- */
21
- function generatePrivateKey() {
22
- return toHex(secp256k1.utils.randomSecretKey());
23
- }
24
12
  /**
25
13
  * Generates a cryptographically secure random encryption key for database encryption.
26
14
  *
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE7B;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAW,EAAc,EAAE;IACjE,OAAO,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,SAAS,kBAAkB;IACzB,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,wBAAwB,GAAG,GAAG,EAAE;IACpC,sCAAsC;IACtC,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,gDAAgD;IAChD,OAAO,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE;IACrC,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,eAAe,GAAG,wBAAwB,EAAE,CAAC;IACnD,OAAO;QACL,sBAAsB,EAAE,eAAe;QACvC,eAAe,EAAE,SAAS;KAC3B,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAW,EAAc,EAAE;IACjE,OAAO,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,wBAAwB,GAAG,GAAG,EAAE;IACpC,sCAAsC;IACtC,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IACvD,gDAAgD;IAChD,OAAO,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE;IACrC,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,eAAe,GAAG,wBAAwB,EAAE,CAAC;IACnD,OAAO;QACL,sBAAsB,EAAE,eAAe;QACvC,eAAe,EAAE,SAAS;KAC3B,CAAC;AACJ,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { Client, DecodedMessage } from "@xmtp/node-sdk";
2
- import type { AgentContext } from "../core/AgentContext.js";
2
+ import type { AgentContext } from "../core/MessageContext.js";
3
3
  /**
4
4
  * Function type for filtering messages based on content and client state.
5
5
  */
@@ -45,7 +45,7 @@ declare function not<ContentTypes>(filter: MessageFilter<ContentTypes>): Message
45
45
  export declare const filter: {
46
46
  notFromSelf: MessageFilter<unknown>;
47
47
  fromSelf: MessageFilter<unknown>;
48
- textOnly: MessageFilter<unknown>;
48
+ isText: MessageFilter<unknown>;
49
49
  fromSender: typeof fromSender;
50
50
  startsWith: typeof startsWith;
51
51
  and: typeof and;
@@ -55,7 +55,7 @@ export declare const filter: {
55
55
  export declare const f: {
56
56
  notFromSelf: MessageFilter<unknown>;
57
57
  fromSelf: MessageFilter<unknown>;
58
- textOnly: MessageFilter<unknown>;
58
+ isText: MessageFilter<unknown>;
59
59
  fromSender: typeof fromSender;
60
60
  startsWith: typeof startsWith;
61
61
  and: typeof and;
@@ -25,7 +25,7 @@ function fromSelf() {
25
25
  *
26
26
  * @returns Filter function
27
27
  */
28
- function textOnly() {
28
+ function isText() {
29
29
  return (message) => {
30
30
  return !!message.contentType?.sameAs(ContentTypeText);
31
31
  };
@@ -106,7 +106,7 @@ export const filter = {
106
106
  // basic filters
107
107
  notFromSelf: notFromSelf(),
108
108
  fromSelf: fromSelf(),
109
- textOnly: textOnly(),
109
+ isText: isText(),
110
110
  // factory functions
111
111
  fromSender,
112
112
  startsWith,
@@ -1 +1 @@
1
- {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/utils/filter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/utils/filter.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,9 @@ import { type RemoteAttachment } from "@xmtp/content-type-remote-attachment";
3
3
  import { type Reply } from "@xmtp/content-type-reply";
4
4
  import type { DecodedMessage } from "@xmtp/node-sdk";
5
5
  type ContentMessage = Pick<DecodedMessage, "content" | "contentType" | "fallback">;
6
+ export declare const hasDefinedContent: <ContentTypes = unknown>(message: DecodedMessage<ContentTypes>) => message is DecodedMessage<ContentTypes> & {
7
+ content: ContentTypes;
8
+ };
6
9
  export declare const isReaction: <M extends ContentMessage>(m: M) => m is M & {
7
10
  content: Reaction;
8
11
  };
@@ -2,6 +2,7 @@ import { ContentTypeReaction, } from "@xmtp/content-type-reaction";
2
2
  import { ContentTypeRemoteAttachment, } from "@xmtp/content-type-remote-attachment";
3
3
  import { ContentTypeReply } from "@xmtp/content-type-reply";
4
4
  import { ContentTypeText } from "@xmtp/content-type-text";
5
+ export const hasDefinedContent = (message) => message.content !== undefined;
5
6
  export const isReaction = (m) => !!m.contentType?.sameAs(ContentTypeReaction);
6
7
  export const isReply = (m) => !!m.contentType?.sameAs(ContentTypeReply);
7
8
  export const isTextReply = (m) => isReply(m) && typeof m.content.content === "string";
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/utils/message.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAEpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,2BAA2B,GAE5B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAc,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAQ1D,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,CAAI,EAC4B,EAAE,CAClC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,CAAI,EACyB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,CAAI,EAC+C,EAAE,CACrD,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC;AAEtD,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,CAAI,EAC0B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,CAAI,EACoC,EAAE,CAC1C,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,2BAA2B,CAAC,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAuB,EAAE,EAAE;IACxD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC;QACzB,KAAK,WAAW,CAAC,OAAO,CAAC;YACvB,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QACjC,KAAK,MAAM,CAAC,OAAO,CAAC;YAClB,OAAO,OAAO,CAAC,OAAO,CAAC;IAC3B,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/utils/message.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAEpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,2BAA2B,GAE5B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAc,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAQ1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAqC,EAGrC,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC;AAEnC,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,CAAI,EAC4B,EAAE,CAClC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,CAAI,EACyB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,CAAI,EAC+C,EAAE,CACrD,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC;AAEtD,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,CAAI,EAC0B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,CAAI,EACoC,EAAE,CAC1C,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,2BAA2B,CAAC,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAuB,EAAE,EAAE;IACxD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC;QACzB,KAAK,WAAW,CAAC,OAAO,CAAC;YACvB,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;QACjC,KAAK,MAAM,CAAC,OAAO,CAAC;YAClB,OAAO,OAAO,CAAC,OAAO,CAAC;IAC3B,CAAC;AACH,CAAC,CAAC"}
package/package.json CHANGED
@@ -4,7 +4,6 @@
4
4
  "url": "https://github.com/xmtp/xmtp-js/issues"
5
5
  },
6
6
  "dependencies": {
7
- "@noble/curves": "^2.0.0",
8
7
  "@xmtp/content-type-reaction": "^2.0.2",
9
8
  "@xmtp/content-type-remote-attachment": "^2.0.2",
10
9
  "@xmtp/content-type-reply": "^2.0.2",
@@ -71,5 +70,5 @@
71
70
  "typecheck": "tsc --noEmit"
72
71
  },
73
72
  "type": "module",
74
- "version": "0.0.7"
73
+ "version": "0.0.9"
75
74
  }
@@ -1,14 +0,0 @@
1
- import { type Reaction } from "@xmtp/content-type-reaction";
2
- import type { Client, Conversation, DecodedMessage } from "@xmtp/node-sdk";
3
- export declare class AgentContext<ContentTypes = unknown> {
4
- #private;
5
- constructor(message: DecodedMessage<ContentTypes>, conversation: Conversation, client: Client<ContentTypes>);
6
- sendReaction(content: string, schema?: Reaction["schema"]): Promise<void>;
7
- sendText(text: string): Promise<void>;
8
- sendTextReply(text: string): Promise<void>;
9
- getOwnAddress(): string | undefined;
10
- getSenderAddress(): Promise<string>;
11
- get message(): DecodedMessage<ContentTypes>;
12
- get conversation(): Conversation<unknown>;
13
- get client(): Client<ContentTypes>;
14
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgentContext.js","sourceRoot":"","sources":["../../src/core/AgentContext.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAEpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAc,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,MAAM,OAAO,YAAY;IACvB,OAAO,CAAuB;IAC9B,QAAQ,CAA+B;IACvC,aAAa,CAAe;IAE5B,YACE,OAAqC,EACrC,YAA0B,EAC1B,MAA4B;QAE5B,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,SAA6B,SAAS;QACxE,MAAM,QAAQ,GAAa;YACzB,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAC3B,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa;YAC7C,MAAM;YACN,OAAO;SACR,CAAC;QACF,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,MAAM,KAAK,GAAU;YACnB,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAC3B,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa;YAC7C,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,IAAI;SACd,CAAC;QACF,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACzD,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC;YACvE,IAAI,CAAC,QAAQ,CAAC,aAAa;SAC5B,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACjD,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF"}