@xmtp/agent-sdk 2.0.0-rc1 → 2.0.0-rc2

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 (74) hide show
  1. package/README.md +8 -15
  2. package/dist/index.d.ts +234 -4
  3. package/dist/index.js +871 -5
  4. package/dist/index.js.map +1 -1
  5. package/package.json +19 -26
  6. package/dist/bin/generateKeys.d.ts +0 -2
  7. package/dist/bin/generateKeys.js +0 -44
  8. package/dist/bin/generateKeys.js.map +0 -1
  9. package/dist/core/Agent.d.ts +0 -84
  10. package/dist/core/Agent.js +0 -394
  11. package/dist/core/Agent.js.map +0 -1
  12. package/dist/core/AgentError.d.ts +0 -7
  13. package/dist/core/AgentError.js +0 -13
  14. package/dist/core/AgentError.js.map +0 -1
  15. package/dist/core/ClientContext.d.ts +0 -9
  16. package/dist/core/ClientContext.js +0 -13
  17. package/dist/core/ClientContext.js.map +0 -1
  18. package/dist/core/ConversationContext.d.ts +0 -19
  19. package/dist/core/ConversationContext.js +0 -43
  20. package/dist/core/ConversationContext.js.map +0 -1
  21. package/dist/core/MessageContext.d.ts +0 -33
  22. package/dist/core/MessageContext.js +0 -75
  23. package/dist/core/MessageContext.js.map +0 -1
  24. package/dist/core/filter.d.ts +0 -84
  25. package/dist/core/filter.js +0 -88
  26. package/dist/core/filter.js.map +0 -1
  27. package/dist/core/index.d.ts +0 -6
  28. package/dist/core/index.js +0 -7
  29. package/dist/core/index.js.map +0 -1
  30. package/dist/debug/index.d.ts +0 -1
  31. package/dist/debug/index.js +0 -2
  32. package/dist/debug/index.js.map +0 -1
  33. package/dist/debug/log.d.ts +0 -18
  34. package/dist/debug/log.js +0 -80
  35. package/dist/debug/log.js.map +0 -1
  36. package/dist/debug.d.ts +0 -1
  37. package/dist/debug.js +0 -2
  38. package/dist/debug.js.map +0 -1
  39. package/dist/middleware/CommandRouter.d.ts +0 -14
  40. package/dist/middleware/CommandRouter.js +0 -57
  41. package/dist/middleware/CommandRouter.js.map +0 -1
  42. package/dist/middleware/index.d.ts +0 -1
  43. package/dist/middleware/index.js +0 -2
  44. package/dist/middleware/index.js.map +0 -1
  45. package/dist/middleware.d.ts +0 -1
  46. package/dist/middleware.js +0 -2
  47. package/dist/middleware.js.map +0 -1
  48. package/dist/user/NameResolver.d.ts +0 -1
  49. package/dist/user/NameResolver.js +0 -45
  50. package/dist/user/NameResolver.js.map +0 -1
  51. package/dist/user/User.d.ts +0 -10
  52. package/dist/user/User.js +0 -35
  53. package/dist/user/User.js.map +0 -1
  54. package/dist/user/index.d.ts +0 -2
  55. package/dist/user/index.js +0 -3
  56. package/dist/user/index.js.map +0 -1
  57. package/dist/user.d.ts +0 -1
  58. package/dist/user.js +0 -2
  59. package/dist/user.js.map +0 -1
  60. package/dist/util/AttachmentUtil.d.ts +0 -41
  61. package/dist/util/AttachmentUtil.js +0 -67
  62. package/dist/util/AttachmentUtil.js.map +0 -1
  63. package/dist/util/LimitedMap.d.ts +0 -6
  64. package/dist/util/LimitedMap.js +0 -20
  65. package/dist/util/LimitedMap.js.map +0 -1
  66. package/dist/util/TestUtil.d.ts +0 -35
  67. package/dist/util/TestUtil.js +0 -83
  68. package/dist/util/TestUtil.js.map +0 -1
  69. package/dist/util/index.d.ts +0 -1
  70. package/dist/util/index.js +0 -2
  71. package/dist/util/index.js.map +0 -1
  72. package/dist/util.d.ts +0 -1
  73. package/dist/util.js +0 -2
  74. package/dist/util.js.map +0 -1
package/README.md CHANGED
@@ -23,9 +23,7 @@ yarn add @xmtp/agent-sdk
23
23
  ## Quick Start
24
24
 
25
25
  ```ts
26
- import { Agent } from "@xmtp/agent-sdk";
27
- import { getTestUrl } from "@xmtp/agent-sdk/debug";
28
- import { createUser, createSigner } from "@xmtp/agent-sdk/user";
26
+ import { Agent, createUser, createSigner, getTestUrl } from "@xmtp/agent-sdk";
29
27
 
30
28
  // 1. Create a local user + signer (you can plug in your own wallet signer)
31
29
  const user = createUser();
@@ -237,15 +235,14 @@ agent.on("unhandledError", (error) => {
237
235
 
238
236
  #### Provided Middleware
239
237
 
240
- Built‑in, officially supported middleware is provided via `@xmtp/agent-sdk/middleware`.
238
+ Built‑in, officially supported middleware is provided by the Agent SDK.
241
239
 
242
240
  **Example: CommandRouter**
243
241
 
244
242
  The `CommandRouter` makes it easy to handle slash commands out of the box.
245
243
 
246
244
  ```ts
247
- import { Agent } from "@xmtp/agent-sdk";
248
- import { CommandRouter } from "@xmtp/agent-sdk/middleware";
245
+ import { Agent, CommandRouter } from "@xmtp/agent-sdk";
249
246
 
250
247
  const agent = await Agent.createFromEnv();
251
248
  const router = new CommandRouter()
@@ -346,10 +343,10 @@ await group.send("Hello group!");
346
343
 
347
344
  ### 6. Utilities
348
345
 
349
- The Agent SDK comes with subpackages that include utilities. You can for example get a testing URL or details of your Agent from the debug utilities:
346
+ The Agent SDK includes various utilities. You can for example get a testing URL or details of your Agent:
350
347
 
351
348
  ```ts
352
- import { getTestUrl, logDetails } from "@xmtp/agent-sdk/debug";
349
+ import { getTestUrl, logDetails } from "@xmtp/agent-sdk";
353
350
 
354
351
  // Get a test URL for your agent
355
352
  const testUrl = getTestUrl(agent.client);
@@ -362,11 +359,7 @@ await logDetails(agent.client);
362
359
  There are also utilities to simplify user management, such as signer creation or name resolutions:
363
360
 
364
361
  ```ts
365
- import {
366
- createUser,
367
- createSigner,
368
- createNameResolver,
369
- } from "@xmtp/agent-sdk/user";
362
+ import { createUser, createSigner, createNameResolver } from "@xmtp/agent-sdk";
370
363
 
371
364
  // Create a new user with a random private key
372
365
  const user = createUser();
@@ -387,7 +380,7 @@ The Agent SDK supports sending encrypted remote attachments. Files are encrypted
387
380
  **Example**
388
381
 
389
382
  ```ts
390
- import { type AttachmentUploadCallback } from "@xmtp/agent-sdk/util";
383
+ import { type AttachmentUploadCallback } from "@xmtp/agent-sdk";
391
384
 
392
385
  agent.on("text", async (ctx) => {
393
386
  if (ctx.message.content === "/send-file") {
@@ -429,7 +422,7 @@ agent.on("text", async (ctx) => {
429
422
  Other agents can then download and decrypt the attachment using the `"attachment"` topic:
430
423
 
431
424
  ```ts
432
- import { downloadRemoteAttachment } from "@xmtp/agent-sdk/util";
425
+ import { downloadRemoteAttachment } from "@xmtp/agent-sdk";
433
426
 
434
427
  agent.on("attachment", async (ctx) => {
435
428
  const receivedAttachment = await downloadRemoteAttachment(
package/dist/index.d.ts CHANGED
@@ -1,4 +1,234 @@
1
- export { ConsentEntityType, ConsentState, ConversationType, DeliveryStatus, GroupMember, GroupMembershipState, GroupMessageKind, GroupMetadata, GroupPermissions, GroupPermissionsOptions, IdentifierKind, LogLevel, MetadataField, PermissionLevel, PermissionPolicy, PermissionUpdateType, SignatureRequestHandle, SortDirection, } from "@xmtp/node-sdk";
2
- export type * from "@xmtp/node-sdk";
3
- export { isHexString, validHex } from "@xmtp/node-sdk";
4
- export * from "./core/index.js";
1
+ import * as _xmtp_node_sdk from '@xmtp/node-sdk';
2
+ import { Client, EncryptedAttachment, RemoteAttachment, Attachment, Conversation, Dm, Group, DecodedMessage, GroupUpdated, Reaction, ReadReceipt, EnrichedReply, TransactionReference, WalletSendCalls, Reply, StreamOptions, ClientOptions, HexString, CreateDmOptions, CreateGroupOptions, BuiltInContentTypes, Identifier, Signer } from '@xmtp/node-sdk';
3
+ export * from '@xmtp/node-sdk';
4
+ import EventEmitter from 'node:events';
5
+ import { ContentCodec } from '@xmtp/content-type-primitives';
6
+ import { Hex, PrivateKeyAccount, WalletClient, Chain } from 'viem';
7
+
8
+ declare class ClientContext<ContentTypes = unknown> {
9
+ #private;
10
+ constructor({ client }: {
11
+ client: Client<ContentTypes>;
12
+ });
13
+ getClientAddress(): string | undefined;
14
+ get client(): Client<ContentTypes>;
15
+ }
16
+
17
+ type AttachmentUploadCallback = (attachment: EncryptedAttachment) => Promise<string>;
18
+ /**
19
+ * Downloads and decrypts a remote attachment.
20
+ *
21
+ * @param remoteAttachment - The remote attachment metadata containing the downloadd URL and encryption keys
22
+ * @param agent - The agent instance used to lookup the necessary decoding codec
23
+ * @returns A promise that resolves with the decrypted attachment
24
+ */
25
+ declare function downloadRemoteAttachment(remoteAttachment: RemoteAttachment): Promise<Attachment>;
26
+ /**
27
+ * Creates a remote attachment object from an encrypted attachment and file URL.
28
+ *
29
+ * @param encryptedAttachment - The encrypted attachment containing encryption keys and metadata
30
+ * @param fileUrl - The URL where the encrypted attachment can be downloaded
31
+ * @returns A remote attachment object with all necessary metadata for retrieval and decryption
32
+ */
33
+ declare function createRemoteAttachment(encryptedAttachment: EncryptedAttachment, fileUrl: string): RemoteAttachment;
34
+ /**
35
+ * Creates a remote attachment from a file by encrypting it and uploading it to a remote storage.
36
+ * This is a convenience function that combines file processing, encryption, uploading, and
37
+ * remote attachment creation into a single operation.
38
+ *
39
+ * @param unencryptedFile - The unencrypted file to process and upload
40
+ * @param uploadCallback - A callback function that receives the encrypted attachment and returns the URL where it was uploaded
41
+ * @returns A promise that resolves with a remote attachment containing all necessary metadata for retrieval and decryption
42
+ */
43
+ declare function createRemoteAttachmentFromFile(unencryptedFile: File, uploadCallback: AttachmentUploadCallback): Promise<RemoteAttachment>;
44
+
45
+ declare class ConversationContext<ContentTypes = unknown, ConversationType extends Conversation = Conversation> extends ClientContext<ContentTypes> {
46
+ #private;
47
+ constructor({ conversation, client, }: {
48
+ conversation: ConversationType;
49
+ client: Client<ContentTypes>;
50
+ });
51
+ isDm(): this is ConversationContext<ContentTypes, Dm<ContentTypes>>;
52
+ isGroup(): this is ConversationContext<ContentTypes, Group<ContentTypes>>;
53
+ sendRemoteAttachment(unencryptedFile: File, uploadCallback: AttachmentUploadCallback): Promise<void>;
54
+ get conversation(): ConversationType;
55
+ get isAllowed(): boolean;
56
+ get isDenied(): boolean;
57
+ get isUnknown(): boolean;
58
+ }
59
+
60
+ type DecodedMessageWithContent<ContentTypes = unknown> = DecodedMessage<ContentTypes> & {
61
+ content: ContentTypes;
62
+ };
63
+ declare const filter: {
64
+ fromSelf: <ContentTypes>(message: DecodedMessage<ContentTypes>, client: Client<ContentTypes>) => boolean;
65
+ hasContent: <ContentTypes>(message: DecodedMessage<ContentTypes>) => message is DecodedMessageWithContent<ContentTypes>;
66
+ isDM: (conversation: Conversation) => conversation is Dm;
67
+ isGroup: (conversation: Conversation) => conversation is Group;
68
+ isGroupAdmin: (conversation: Conversation, message: DecodedMessage) => boolean;
69
+ isGroupSuperAdmin: (conversation: Conversation, message: DecodedMessage) => boolean;
70
+ isGroupUpdate: (message: DecodedMessage) => message is DecodedMessageWithContent<GroupUpdated>;
71
+ isMarkdown: (message: DecodedMessage) => message is DecodedMessageWithContent<string>;
72
+ isReaction: (message: DecodedMessage) => message is DecodedMessageWithContent<Reaction>;
73
+ isReadReceipt: (message: DecodedMessage) => message is DecodedMessageWithContent<ReadReceipt>;
74
+ isRemoteAttachment: (message: DecodedMessage) => message is DecodedMessageWithContent<RemoteAttachment>;
75
+ isReply: (message: DecodedMessage) => message is DecodedMessageWithContent<EnrichedReply>;
76
+ isText: (message: DecodedMessage) => message is DecodedMessageWithContent<string>;
77
+ isTextReply: (message: DecodedMessage) => message is DecodedMessageWithContent<EnrichedReply<string>>;
78
+ isTransactionReference: (message: DecodedMessage) => message is DecodedMessageWithContent<TransactionReference>;
79
+ isWalletSendCalls: (message: DecodedMessage) => message is DecodedMessageWithContent<WalletSendCalls>;
80
+ usesCodec: <T extends ContentCodec>(message: DecodedMessage, codecClass: new () => T) => message is DecodedMessageWithContent<ReturnType<T["decode"]>>;
81
+ };
82
+ declare const f: {
83
+ fromSelf: <ContentTypes>(message: DecodedMessage<ContentTypes>, client: Client<ContentTypes>) => boolean;
84
+ hasContent: <ContentTypes>(message: DecodedMessage<ContentTypes>) => message is DecodedMessageWithContent<ContentTypes>;
85
+ isDM: (conversation: Conversation) => conversation is Dm;
86
+ isGroup: (conversation: Conversation) => conversation is Group;
87
+ isGroupAdmin: (conversation: Conversation, message: DecodedMessage) => boolean;
88
+ isGroupSuperAdmin: (conversation: Conversation, message: DecodedMessage) => boolean;
89
+ isGroupUpdate: (message: DecodedMessage) => message is DecodedMessageWithContent<GroupUpdated>;
90
+ isMarkdown: (message: DecodedMessage) => message is DecodedMessageWithContent<string>;
91
+ isReaction: (message: DecodedMessage) => message is DecodedMessageWithContent<Reaction>;
92
+ isReadReceipt: (message: DecodedMessage) => message is DecodedMessageWithContent<ReadReceipt>;
93
+ isRemoteAttachment: (message: DecodedMessage) => message is DecodedMessageWithContent<RemoteAttachment>;
94
+ isReply: (message: DecodedMessage) => message is DecodedMessageWithContent<EnrichedReply>;
95
+ isText: (message: DecodedMessage) => message is DecodedMessageWithContent<string>;
96
+ isTextReply: (message: DecodedMessage) => message is DecodedMessageWithContent<EnrichedReply<string>>;
97
+ isTransactionReference: (message: DecodedMessage) => message is DecodedMessageWithContent<TransactionReference>;
98
+ isWalletSendCalls: (message: DecodedMessage) => message is DecodedMessageWithContent<WalletSendCalls>;
99
+ usesCodec: <T extends ContentCodec>(message: DecodedMessage, codecClass: new () => T) => message is DecodedMessageWithContent<ReturnType<T["decode"]>>;
100
+ };
101
+
102
+ type MessageContextParams<MessageContentType = unknown, ContentTypes = unknown> = Omit<AgentBaseContext<ContentTypes>, "message"> & {
103
+ message: DecodedMessageWithContent<MessageContentType>;
104
+ };
105
+ declare class MessageContext<MessageContentType = unknown, ContentTypes = unknown> extends ConversationContext<ContentTypes> {
106
+ #private;
107
+ constructor({ message, conversation, client, }: MessageContextParams<MessageContentType, ContentTypes>);
108
+ usesCodec<T extends ContentCodec>(codecClass: new () => T): this is MessageContext<ReturnType<T["decode"]>>;
109
+ isMarkdown(): this is MessageContext<string>;
110
+ isText(): this is MessageContext<string>;
111
+ isReply(): this is MessageContext<Reply>;
112
+ isReaction(): this is MessageContext<Reaction>;
113
+ isReadReceipt(): this is MessageContext<ReadReceipt>;
114
+ isRemoteAttachment(): this is MessageContext<RemoteAttachment>;
115
+ isTransactionReference(): this is MessageContext<TransactionReference>;
116
+ isWalletSendCalls(): this is MessageContext<WalletSendCalls>;
117
+ sendReaction(content: string, schema?: Reaction["schema"]): Promise<void>;
118
+ sendMarkdownReply(markdown: string): Promise<void>;
119
+ sendTextReply(text: string): Promise<void>;
120
+ getSenderAddress(): Promise<string | undefined>;
121
+ get message(): DecodedMessageWithContent<MessageContentType>;
122
+ }
123
+
124
+ type EventHandlerMap<ContentTypes> = {
125
+ attachment: [ctx: MessageContext<RemoteAttachment, ContentTypes>];
126
+ conversation: [ctx: ConversationContext<ContentTypes>];
127
+ "group-update": [ctx: MessageContext<GroupUpdated, ContentTypes>];
128
+ dm: [ctx: ConversationContext<ContentTypes, Dm<ContentTypes>>];
129
+ group: [ctx: ConversationContext<ContentTypes, Group<ContentTypes>>];
130
+ markdown: [ctx: MessageContext<string, ContentTypes>];
131
+ message: [ctx: MessageContext<unknown, ContentTypes>];
132
+ reaction: [ctx: MessageContext<Reaction, ContentTypes>];
133
+ "read-receipt": [ctx: MessageContext<ReadReceipt, ContentTypes>];
134
+ reply: [ctx: MessageContext<Reply, ContentTypes>];
135
+ start: [ctx: ClientContext<ContentTypes>];
136
+ stop: [ctx: ClientContext<ContentTypes>];
137
+ text: [ctx: MessageContext<string, ContentTypes>];
138
+ "transaction-reference": [
139
+ ctx: MessageContext<TransactionReference, ContentTypes>
140
+ ];
141
+ unhandledError: [error: Error];
142
+ unknownMessage: [ctx: MessageContext<unknown, ContentTypes>];
143
+ "wallet-send-calls": [ctx: MessageContext<WalletSendCalls, ContentTypes>];
144
+ };
145
+ type EthAddress = HexString;
146
+ type AgentBaseContext<ContentTypes = unknown> = {
147
+ client: Client<ContentTypes>;
148
+ conversation: Conversation;
149
+ message: DecodedMessage;
150
+ };
151
+ type AgentErrorContext<ContentTypes = unknown> = Partial<AgentBaseContext<ContentTypes>> & {
152
+ client: Client<ContentTypes>;
153
+ };
154
+ type AgentOptions<ContentTypes> = {
155
+ client: Client<ContentTypes>;
156
+ };
157
+ type AgentMessageHandler<ContentTypes = unknown> = (ctx: MessageContext<ContentTypes>) => Promise<void> | void;
158
+ type AgentMiddleware<ContentTypes = unknown> = (ctx: MessageContext<unknown, ContentTypes>, next: () => Promise<void> | void) => Promise<void>;
159
+ type AgentErrorMiddleware<ContentTypes = unknown> = (error: unknown, ctx: AgentErrorContext<ContentTypes>, next: (err?: unknown) => Promise<void> | void) => Promise<void> | void;
160
+ type AgentStreamingOptions = Omit<StreamOptions, "onValue" | "onError">;
161
+ type StreamAllMessagesOptions<ContentTypes> = Parameters<Client<ContentTypes>["conversations"]["streamAllMessages"]>[0];
162
+ type AgentErrorRegistrar<ContentTypes> = {
163
+ use(...errorMiddleware: Array<AgentErrorMiddleware<ContentTypes> | AgentErrorMiddleware<ContentTypes>[]>): AgentErrorRegistrar<ContentTypes>;
164
+ };
165
+ declare class Agent<ContentTypes = unknown> extends EventEmitter<EventHandlerMap<ContentTypes>> {
166
+ #private;
167
+ constructor({ client }: AgentOptions<ContentTypes>);
168
+ static create<ContentCodecs extends ContentCodec[] = []>(signer: Parameters<typeof Client.create>[0], options?: Omit<ClientOptions, "codecs"> & {
169
+ codecs?: ContentCodecs;
170
+ }): Promise<Agent<_xmtp_node_sdk.ExtractCodecContentTypes<ContentCodecs>>>;
171
+ static createFromEnv<ContentCodecs extends ContentCodec[] = []>(options?: Omit<ClientOptions, "codecs"> & {
172
+ codecs?: ContentCodecs;
173
+ }): Promise<Agent<_xmtp_node_sdk.ExtractCodecContentTypes<ContentCodecs>>>;
174
+ get libxmtpVersion(): string | undefined;
175
+ use(...middleware: Array<AgentMiddleware<ContentTypes> | AgentMiddleware<ContentTypes>[]>): this;
176
+ start(options?: AgentStreamingOptions): Promise<void>;
177
+ get client(): Client<ContentTypes>;
178
+ get errors(): AgentErrorRegistrar<ContentTypes>;
179
+ stop(): Promise<void>;
180
+ createDmWithAddress(address: EthAddress, options?: CreateDmOptions): Promise<Dm<ContentTypes>>;
181
+ createGroupWithAddresses(addresses: EthAddress[], options?: CreateGroupOptions): Promise<Group<ContentTypes>>;
182
+ addMembersWithAddresses<ContentTypes>(group: Group<ContentTypes>, addresses: EthAddress[]): Promise<void>;
183
+ getConversationContext(conversationId: string): Promise<ConversationContext<ContentTypes, Dm<ContentTypes> | Group<ContentTypes>> | undefined>;
184
+ get address(): string | undefined;
185
+ }
186
+
187
+ declare class AgentError extends Error {
188
+ #private;
189
+ constructor(code: number, message: string, cause?: unknown);
190
+ get code(): number;
191
+ }
192
+ declare class AgentStreamingError extends AgentError {
193
+ }
194
+
195
+ declare const logDetails: <ContentTypes>(agent: Agent<ContentTypes>) => Promise<void>;
196
+ /**
197
+ * Returns a URL to test your agent on https://xmtp.chat/ (for development purposes only).
198
+ *
199
+ * @param client - Your XMTP client
200
+ * @returns The URL to test your agent with
201
+ */
202
+ declare const getTestUrl: <ContentTypes>(client: Client<ContentTypes>) => string;
203
+ type InstallationInfo = {
204
+ totalInstallations: number;
205
+ installationId: string;
206
+ mostRecentInstallationId: null | string;
207
+ isMostRecent: boolean;
208
+ };
209
+ declare const getInstallationInfo: <ContentTypes>(client: Client<ContentTypes>) => Promise<InstallationInfo>;
210
+
211
+ /** Content type supported by the "CommandRouter" */
212
+ type SupportedType = string;
213
+ declare class CommandRouter<ContentTypes = BuiltInContentTypes> {
214
+ #private;
215
+ get commandList(): string[];
216
+ command(command: string, handler: AgentMessageHandler<SupportedType>): this;
217
+ default(handler: AgentMessageHandler<SupportedType>): this;
218
+ handle(ctx: MessageContext<SupportedType>): Promise<boolean>;
219
+ middleware(): AgentMiddleware<ContentTypes>;
220
+ }
221
+
222
+ type User = {
223
+ key: Hex;
224
+ account: PrivateKeyAccount;
225
+ wallet: WalletClient;
226
+ };
227
+ declare const createUser: (key?: HexString, chain?: Chain) => User;
228
+ declare const createIdentifier: (user: User) => Identifier;
229
+ declare const createSigner: (user: User) => Signer;
230
+
231
+ declare const createNameResolver: (apiKey?: string) => (name: string) => Promise<string | null>;
232
+
233
+ export { Agent, AgentError, AgentStreamingError, ClientContext, CommandRouter, ConversationContext, MessageContext, createIdentifier, createNameResolver, createRemoteAttachment, createRemoteAttachmentFromFile, createSigner, createUser, downloadRemoteAttachment, f, filter, getInstallationInfo, getTestUrl, logDetails };
234
+ export type { AgentBaseContext, AgentErrorContext, AgentErrorMiddleware, AgentErrorRegistrar, AgentMessageHandler, AgentMiddleware, AgentOptions, AgentStreamingOptions, AttachmentUploadCallback, DecodedMessageWithContent, MessageContextParams, StreamAllMessagesOptions, User };