@towns-protocol/bot 0.0.406 → 0.0.408

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
@@ -59,6 +59,88 @@ app.post("/webhook", jwtMiddleware, handler);
59
59
  export default app;
60
60
  ```
61
61
 
62
+ ## Identity Metadata (ERC-8004)
63
+
64
+ Bots can optionally define ERC-8004 compliant identity metadata for agent discovery and trust.
65
+
66
+ ### Minimal Example
67
+
68
+ Create `identity.ts`:
69
+
70
+ ```ts
71
+ import type { BotIdentityConfig } from "@towns-protocol/bot";
72
+
73
+ const identity = {
74
+ name: "My Bot",
75
+ description: "A helpful bot for Towns",
76
+ image: "https://example.com/bot-logo.png",
77
+ domain: "mybot.example.com",
78
+ } as const satisfies BotIdentityConfig;
79
+
80
+ export default identity;
81
+ ```
82
+
83
+ Use in bot setup:
84
+
85
+ ```ts
86
+ import identity from "./identity";
87
+
88
+ const bot = await makeTownsBot(
89
+ process.env.APP_PRIVATE_DATA!,
90
+ process.env.JWT_SECRET!,
91
+ {
92
+ commands,
93
+ identity,
94
+ },
95
+ );
96
+
97
+ // Get metadata for hosting at /.well-known/agent-metadata.json
98
+ const metadata = bot.getIdentityMetadata();
99
+ app.get("/.well-known/agent-metadata.json", metadata);
100
+ ```
101
+
102
+ ### Advanced Example
103
+
104
+ For full ERC-8004 compliance with endpoints and trust models:
105
+
106
+ ```ts
107
+ import type { BotIdentityConfig } from "@towns-protocol/bot";
108
+
109
+ const identity = {
110
+ name: "Advanced Bot",
111
+ description: "AI-powered agent with multi-protocol support",
112
+ image: "https://example.com/bot-logo.png",
113
+ motto: "Building the future of agent economies",
114
+ domain: "bot.example.com",
115
+
116
+ endpoints: [
117
+ {
118
+ name: "A2A",
119
+ endpoint: "https://bot.example.com/.well-known/agent-card.json",
120
+ version: "0.3.0",
121
+ },
122
+ {
123
+ name: "MCP",
124
+ endpoint: "https://mcp.bot.example.com/",
125
+ version: "2025-06-18",
126
+ },
127
+ ],
128
+
129
+ registrations: [],
130
+
131
+ supportedTrust: ["reputation", "crypto-economic"],
132
+
133
+ attributes: [
134
+ { trait_type: "Category", value: "Gateway" },
135
+ { trait_type: "Model", value: "GPT-4" },
136
+ ],
137
+ } as const satisfies BotIdentityConfig;
138
+
139
+ export default identity;
140
+ ```
141
+
142
+ The bot automatically adds `agentWallet` endpoint using the bot's app address and `A2A` endpoint if domain is configured.
143
+
62
144
  ## Debug Logging
63
145
 
64
146
  Bot framework uses `debug` package for logging.
package/dist/bot.d.ts CHANGED
@@ -2,9 +2,10 @@ import { SpaceDapp, Permission, type SendTipMemberParams } from '@towns-protocol
2
2
  import type { StandardSchemaV1 } from '@standard-schema/spec';
3
3
  import { type ClientV2, type ParsedEvent, type CreateTownsClientParams } from '@towns-protocol/sdk';
4
4
  import { type Context, type Env } from 'hono';
5
- import { type ChannelMessage_Post_Mention, ChannelMessage, type PlainMessage, Tags, type SlashCommand, type BlockchainTransaction, InteractionRequest, InteractionResponsePayload } from '@towns-protocol/proto';
5
+ import { type ChannelMessage_Post_Mention, ChannelMessage, type PlainMessage, Tags, type SlashCommand, type BlockchainTransaction, InteractionRequestPayload, InteractionResponsePayload, StreamEvent } from '@towns-protocol/proto';
6
6
  import { type Chain, type Transport, type Address, type Account, type WalletClient, type TransactionReceipt } from 'viem';
7
7
  import type { BlankEnv } from 'hono/types';
8
+ import type { BotIdentityConfig, BotIdentityMetadata } from './identity-types';
8
9
  type BotActions = ReturnType<typeof buildBotActions>;
9
10
  export type BotHandler = ReturnType<typeof buildBotActions>;
10
11
  export type InferInput<Schema extends StandardSchemaV1> = NonNullable<Schema['~standard']['types']>['input'];
@@ -174,7 +175,8 @@ export declare class Bot<Commands extends PlainMessage<SlashCommand>[] = [], Hon
174
175
  private readonly slashCommandHandlers;
175
176
  private readonly gmTypedHandlers;
176
177
  private readonly commands;
177
- constructor(clientV2: ClientV2<BotActions>, viem: WalletClient<Transport, Chain, Account>, jwtSecretBase64: string, appAddress: Address, commands?: Commands);
178
+ private readonly identityConfig?;
179
+ constructor(clientV2: ClientV2<BotActions>, viem: WalletClient<Transport, Chain, Account>, jwtSecretBase64: string, appAddress: Address, commands?: Commands, identityConfig?: BotIdentityConfig);
178
180
  start(): {
179
181
  jwtMiddleware: import("hono").MiddlewareHandler<HonoEnv, string, {}>;
180
182
  handler: (c: Context<HonoEnv>) => Promise<Response & import("hono").TypedResponse<unknown, 200, "body">>;
@@ -197,6 +199,7 @@ export declare class Bot<Commands extends PlainMessage<SlashCommand>[] = [], Hon
197
199
  sendMessage(streamId: string, message: string, opts?: PostMessageOpts): Promise<{
198
200
  eventId: string;
199
201
  prevMiniblockHash: Uint8Array;
202
+ envelope: import("@towns-protocol/proto").Envelope;
200
203
  }>;
201
204
  /**
202
205
  * Send a reaction to a stream
@@ -207,6 +210,7 @@ export declare class Bot<Commands extends PlainMessage<SlashCommand>[] = [], Hon
207
210
  sendReaction(streamId: string, refEventId: string, reaction: string): Promise<{
208
211
  eventId: string;
209
212
  prevMiniblockHash: Uint8Array;
213
+ envelope: import("@towns-protocol/proto").Envelope;
210
214
  }>;
211
215
  /**
212
216
  * Remove an specific event from a stream
@@ -216,6 +220,7 @@ export declare class Bot<Commands extends PlainMessage<SlashCommand>[] = [], Hon
216
220
  removeEvent(streamId: string, refEventId: string): Promise<{
217
221
  eventId: string;
218
222
  prevMiniblockHash: Uint8Array;
223
+ envelope: import("@towns-protocol/proto").Envelope;
219
224
  }>;
220
225
  /**
221
226
  * Remove an specific event from a stream as an admin. This is only available if you have Permission.Redact
@@ -225,6 +230,7 @@ export declare class Bot<Commands extends PlainMessage<SlashCommand>[] = [], Hon
225
230
  adminRemoveEvent(streamId: string, refEventId: string): Promise<{
226
231
  eventId: string;
227
232
  prevMiniblockHash: Uint8Array;
233
+ envelope: import("@towns-protocol/proto").Envelope;
228
234
  }>;
229
235
  /**
230
236
  * Edit an specific message from a stream
@@ -235,6 +241,7 @@ export declare class Bot<Commands extends PlainMessage<SlashCommand>[] = [], Hon
235
241
  editMessage(streamId: string, messageId: string, message: string, opts?: PostMessageOpts): Promise<{
236
242
  eventId: string;
237
243
  prevMiniblockHash: Uint8Array;
244
+ envelope: import("@towns-protocol/proto").Envelope;
238
245
  }>;
239
246
  /**
240
247
  * Send a GM (generic message) to a stream with schema validation
@@ -246,6 +253,7 @@ export declare class Bot<Commands extends PlainMessage<SlashCommand>[] = [], Hon
246
253
  sendGM<Schema extends StandardSchemaV1>(streamId: string, typeUrl: string, schema: Schema, data: InferInput<Schema>, opts?: MessageOpts): Promise<{
247
254
  eventId: string;
248
255
  prevMiniblockHash: Uint8Array;
256
+ envelope: import("@towns-protocol/proto").Envelope;
249
257
  }>;
250
258
  /**
251
259
  * Send a raw GM (generic message) to a stream without schema validation
@@ -257,6 +265,7 @@ export declare class Bot<Commands extends PlainMessage<SlashCommand>[] = [], Hon
257
265
  sendRawGM(streamId: string, typeUrl: string, message: Uint8Array, opts?: MessageOpts): Promise<{
258
266
  eventId: string;
259
267
  prevMiniblockHash: Uint8Array;
268
+ envelope: import("@towns-protocol/proto").Envelope;
260
269
  }>;
261
270
  /**
262
271
  * Send an interaction request to a stream
@@ -265,9 +274,10 @@ export declare class Bot<Commands extends PlainMessage<SlashCommand>[] = [], Hon
265
274
  * @param opts - The options for the interaction request
266
275
  * @returns The eventId of the interaction request
267
276
  */
268
- sendInteractionRequest(streamId: string, content: PlainMessage<InteractionRequest['content']>, recipient?: Uint8Array, opts?: MessageOpts): Promise<{
277
+ sendInteractionRequest(streamId: string, content: PlainMessage<InteractionRequestPayload['content']>, recipient?: Uint8Array, opts?: MessageOpts): Promise<{
269
278
  eventId: string;
270
279
  prevMiniblockHash: Uint8Array;
280
+ envelope: import("@towns-protocol/proto").Envelope;
271
281
  }>;
272
282
  hasAdminPermission(userId: string, spaceId: string): Promise<boolean>;
273
283
  checkPermission(streamId: string, userId: string, permission: Permission): Promise<boolean>;
@@ -301,6 +311,16 @@ export declare class Bot<Commands extends PlainMessage<SlashCommand>[] = [], Hon
301
311
  txHash: string;
302
312
  eventId: string;
303
313
  }>;
314
+ pinMessage(streamId: string, eventId: string, streamEvent: StreamEvent): Promise<{
315
+ eventId: string;
316
+ prevMiniblockHash: Uint8Array;
317
+ envelope: import("@towns-protocol/proto").Envelope;
318
+ }>;
319
+ unpinMessage(streamId: string, eventId: string): Promise<{
320
+ eventId: string;
321
+ prevMiniblockHash: Uint8Array;
322
+ envelope: import("@towns-protocol/proto").Envelope;
323
+ }>;
304
324
  /**
305
325
  * Triggered when someone sends a message.
306
326
  * This is triggered for all messages, including direct messages and group messages.
@@ -358,27 +378,45 @@ export declare class Bot<Commands extends PlainMessage<SlashCommand>[] = [], Hon
358
378
  * @returns The stream view
359
379
  */
360
380
  getStreamView(streamId: string): Promise<import("@towns-protocol/sdk").StreamStateView>;
381
+ /**
382
+ * Get the ERC-8004 compliant metadata JSON
383
+ * This should be hosted at /.well-known/agent-metadata.json
384
+ * Fetches metadata from the App Registry and merges with local config
385
+ * @returns The ERC-8004 compliant metadata object or null
386
+ */
387
+ getIdentityMetadata(): Promise<BotIdentityMetadata | null>;
388
+ /**
389
+ * Get the tokenURI that would be used for ERC-8004 registration
390
+ * Returns null if no domain is configured
391
+ * @returns The .well-known URL or null
392
+ */
393
+ getTokenURI(): string | null;
361
394
  }
362
395
  export declare const makeTownsBot: <Commands extends PlainMessage<SlashCommand>[] = [], HonoEnv extends Env = BlankEnv>(appPrivateData: string, jwtSecretBase64: string, opts?: {
363
396
  baseRpcUrl?: string;
364
397
  commands?: Commands;
398
+ identity?: BotIdentityConfig;
365
399
  } & Partial<Omit<CreateTownsClientParams, "env" | "encryptionDevice">>) => Promise<Bot<Commands, HonoEnv>>;
366
400
  declare const buildBotActions: (client: ClientV2, viem: WalletClient<Transport, Chain, Account>, spaceDapp: SpaceDapp, appAddress: Address) => {
367
401
  sendMessage: (streamId: string, message: string, opts?: PostMessageOpts, tags?: PlainMessage<Tags>) => Promise<{
368
402
  eventId: string;
369
403
  prevMiniblockHash: Uint8Array;
404
+ envelope: import("@towns-protocol/proto").Envelope;
370
405
  }>;
371
406
  editMessage: (streamId: string, messageId: string, message: string, opts?: PostMessageOpts, tags?: PlainMessage<Tags>) => Promise<{
372
407
  eventId: string;
373
408
  prevMiniblockHash: Uint8Array;
409
+ envelope: import("@towns-protocol/proto").Envelope;
374
410
  }>;
375
411
  sendReaction: (streamId: string, messageId: string, reaction: string, tags?: PlainMessage<Tags>) => Promise<{
376
412
  eventId: string;
377
413
  prevMiniblockHash: Uint8Array;
414
+ envelope: import("@towns-protocol/proto").Envelope;
378
415
  }>;
379
- sendInteractionRequest: (streamId: string, request: PlainMessage<InteractionRequest>, opts?: MessageOpts, tags?: PlainMessage<Tags>) => Promise<{
416
+ sendInteractionRequest: (streamId: string, content: PlainMessage<InteractionRequestPayload["content"]>, recipient?: Uint8Array, opts?: MessageOpts, tags?: PlainMessage<Tags>) => Promise<{
380
417
  eventId: string;
381
418
  prevMiniblockHash: Uint8Array;
419
+ envelope: import("@towns-protocol/proto").Envelope;
382
420
  }>;
383
421
  sendGM: <Schema extends StandardSchemaV1>(streamId: string, typeUrl: string, schema: Schema, data: InferInput<Schema>, opts?: MessageOpts, tags?: PlainMessage<Tags>) => ReturnType<({ streamId, payload, tags, ephemeral, }: {
384
422
  streamId: string;
@@ -388,26 +426,32 @@ declare const buildBotActions: (client: ClientV2, viem: WalletClient<Transport,
388
426
  }) => Promise<{
389
427
  eventId: string;
390
428
  prevMiniblockHash: Uint8Array;
429
+ envelope: import("@towns-protocol/proto").Envelope;
391
430
  }>>;
392
431
  sendRawGM: (streamId: string, typeUrl: string, message: Uint8Array, opts?: MessageOpts, tags?: PlainMessage<Tags>) => Promise<{
393
432
  eventId: string;
394
433
  prevMiniblockHash: Uint8Array;
434
+ envelope: import("@towns-protocol/proto").Envelope;
395
435
  }>;
396
436
  removeEvent: (streamId: string, messageId: string, tags?: PlainMessage<Tags>) => Promise<{
397
437
  eventId: string;
398
438
  prevMiniblockHash: Uint8Array;
439
+ envelope: import("@towns-protocol/proto").Envelope;
399
440
  }>;
400
441
  adminRemoveEvent: (streamId: string, messageId: string) => Promise<{
401
442
  eventId: string;
402
443
  prevMiniblockHash: Uint8Array;
444
+ envelope: import("@towns-protocol/proto").Envelope;
403
445
  }>;
404
446
  sendKeySolicitation: (streamId: string, sessionIds: string[]) => Promise<{
405
447
  eventId: string;
406
448
  prevMiniblockHash: Uint8Array;
449
+ envelope: import("@towns-protocol/proto").Envelope;
407
450
  }>;
408
451
  uploadDeviceKeys: () => Promise<{
409
452
  eventId: string;
410
453
  prevMiniblockHash: Uint8Array;
454
+ envelope: import("@towns-protocol/proto").Envelope;
411
455
  }>;
412
456
  hasAdminPermission: (userId: string, spaceId: string) => Promise<boolean>;
413
457
  checkPermission: (streamId: string, userId: string, permission: Permission) => Promise<boolean>;
@@ -417,6 +461,16 @@ declare const buildBotActions: (client: ClientV2, viem: WalletClient<Transport,
417
461
  unban: (userId: string, spaceId: string) => Promise<{
418
462
  txHash: string;
419
463
  }>;
464
+ pinMessage: (streamId: string, eventId: string, streamEvent: StreamEvent) => Promise<{
465
+ eventId: string;
466
+ prevMiniblockHash: Uint8Array;
467
+ envelope: import("@towns-protocol/proto").Envelope;
468
+ }>;
469
+ unpinMessage: (streamId: string, eventId: string) => Promise<{
470
+ eventId: string;
471
+ prevMiniblockHash: Uint8Array;
472
+ envelope: import("@towns-protocol/proto").Envelope;
473
+ }>;
420
474
  getChannelSettings: (channelId: string) => Promise<import("@towns-protocol/sdk").ParsedChannelProperties>;
421
475
  sendTip: (params: Omit<SendTipMemberParams, "spaceId" | "tokenId" | "currency" | "receiver"> & {
422
476
  currency?: Address;
package/dist/bot.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,SAAS,EACT,UAAU,EAEV,KAAK,mBAAmB,EAG3B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAI7D,OAAO,EAKH,KAAK,QAAQ,EAOb,KAAK,WAAW,EAIhB,KAAK,uBAAuB,EAgB/B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,GAAG,EAAa,MAAM,MAAM,CAAA;AAKxD,OAAO,EAEH,KAAK,2BAA2B,EAChC,cAAc,EAOd,KAAK,YAAY,EACjB,IAAI,EAEJ,KAAK,YAAY,EAKjB,KAAK,qBAAqB,EAG1B,yBAAyB,EAEzB,0BAA0B,EAI1B,WAAW,EACd,MAAM,uBAAuB,CAAA;AAY9B,OAAO,EAEH,KAAK,KAAK,EACV,KAAK,SAAS,EAEd,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,YAAY,EAEjB,KAAK,kBAAkB,EAI1B,MAAM,MAAM,CAAA;AAGb,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAM1C,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAmB,MAAM,kBAAkB,CAAA;AAE/F,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;AAEpD,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;AAG3D,MAAM,MAAM,UAAU,CAAC,MAAM,SAAS,gBAAgB,IAAI,WAAW,CACjE,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAC/B,CAAC,OAAO,CAAC,CAAA;AAEV,MAAM,MAAM,WAAW,CAAC,MAAM,SAAS,gBAAgB,IAAI,WAAW,CAClE,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAC/B,CAAC,QAAQ,CAAC,CAAA;AAIX,MAAM,MAAM,UAAU,CAClB,CAAC,SAAS,MAAM,SAAS,CAAC,QAAQ,CAAC,EACnC,QAAQ,SAAS,YAAY,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,IAClD,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAEzC,KAAK,eAAe,GAAG;IACnB,IAAI,EAAE,OAAO,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACd,CAAA;AAED,KAAK,sBAAsB,GACrB;IACI,IAAI,EAAE,SAAS,CAAA;IACf,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACnB,GACD;IACI,IAAI,EAAE,SAAS,CAAA;IACf,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACnB,CAAA;AAEP,KAAK,cAAc,GAAG;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,MAAM,CAAA;QACd,GAAG,EAAE,MAAM,CAAA;KACd,CAAA;CACJ,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG;IACxC,QAAQ,CAAC,EAAE,YAAY,CAAC,2BAA2B,CAAC,EAAE,CAAA;IACtD,WAAW,CAAC,EAAE,KAAK,CAAC,eAAe,GAAG,sBAAsB,GAAG,cAAc,CAAC,CAAA;CACjF,CAAA;AAED,MAAM,MAAM,4BAA4B,GAAG;IACvC,SAAS,EAAE,UAAU,CAAA;IACrB,OAAO,EAAE,YAAY,CAAC,0BAA0B,CAAC,CAAA;CACpD,CAAA;AAED,MAAM,MAAM,SAAS,CAAC,QAAQ,SAAS,YAAY,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,IAAI;IACxE,OAAO,EAAE,CACL,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,GAAG;QACjB,oCAAoC;QACpC,OAAO,EAAE,MAAM,CAAA;QACf,8EAA8E;QAC9E,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B,6EAA6E;QAC7E,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B,qCAAqC;QACrC,QAAQ,EAAE,IAAI,CAAC,2BAA2B,EAAE,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAA;QACvE,yDAAyD;QACzD,WAAW,EAAE,OAAO,CAAA;KACvB,KACA,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,SAAS,EAAE,CACP,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,GAAG;QACjB,qCAAqC;QACrC,UAAU,EAAE,MAAM,CAAA;KACrB,KACA,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,WAAW,EAAE,CACT,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,GAAG;QACjB,kDAAkD;QAClD,UAAU,EAAE,MAAM,CAAA;QAClB,kBAAkB;QAClB,OAAO,EAAE,MAAM,CAAA;QACf,8EAA8E;QAC9E,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B,6EAA6E;QAC7E,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B,qCAAqC;QACrC,QAAQ,EAAE,IAAI,CAAC,2BAA2B,EAAE,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAA;QACvE,yDAAyD;QACzD,WAAW,EAAE,OAAO,CAAA;KACvB,KACA,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,QAAQ,EAAE,CACN,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,GAAG;QACjB,kCAAkC;QAClC,QAAQ,EAAE,MAAM,CAAA;QAChB,sDAAsD;QACtD,SAAS,EAAE,MAAM,CAAA;QACjB,sDAAsD;QACtD,MAAM,EAAE,MAAM,CAAA;KACjB,KACA,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACzB,WAAW,EAAE,CACT,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,GAAG;QACjB,mDAAmD;QACnD,UAAU,EAAE,MAAM,CAAA;KACrB,KACA,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACzB,GAAG,EAAE,CACD,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,GAAG;QACjB,8CAA8C;QAC9C,SAAS,EAAE,MAAM,CAAA;QACjB,oCAAoC;QACpC,aAAa,EAAE,OAAO,CAAA;QACtB,wCAAwC;QACxC,eAAe,EAAE,OAAO,CAAA;QACxB,wCAAwC;QACxC,cAAc,EAAE,MAAM,CAAA;QACtB,4BAA4B;QAC5B,MAAM,EAAE,MAAM,CAAA;QACd,8BAA8B;QAC9B,QAAQ,EAAE,OAAO,CAAA;KACpB,KACA,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACzB,WAAW,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC9E,YAAY,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC/E,WAAW,EAAE,CACT,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,GAAG;QAAE,KAAK,EAAE,WAAW,CAAA;KAAE,KAC1C,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACzB,YAAY,EAAE,CACV,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,GAAG;QACjB,yDAAyD;QACzD,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;QACjC;;;;;;;;;;WAUG;QACH,IAAI,EAAE,MAAM,EAAE,CAAA;QACd,qCAAqC;QACrC,QAAQ,EAAE,IAAI,CAAC,2BAA2B,EAAE,QAAQ,GAAG,aAAa,CAAC,EAAE,CAAA;QACvE,kDAAkD;QAClD,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B,iDAAiD;QACjD,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;KAC/B,KACA,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACzB,YAAY,EAAE,CACV,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,UAAU,CAAA;KAAE,KAC5D,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,EAAE,EAAE,CAAC,MAAM,SAAS,gBAAgB,EAChC,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;KAAE,KAClF,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,mBAAmB,EAAE,CACjB,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,GAAG;QACjB,iDAAiD;QACjD,QAAQ,EAAE,4BAA4B,CAAA;KACzC,KACA,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACtB,uDAAuD;IACvD,MAAM,EAAE,OAAO,CAAA;IACf,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAA;IACf,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAA;IACjB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,SAAS,EAAE,IAAI,CAAA;CAClB,CAAA;AAED,qBAAa,GAAG,CACZ,QAAQ,SAAS,YAAY,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,EAClD,OAAO,SAAS,GAAG,GAAG,QAAQ;IAE9B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;IACrC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;IAC7C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmD;IAC3E,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CACxB;IACb,OAAO,CAAC,QAAQ,CAAC,eAAe,CASnB;IACb,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAmB;gBAG/C,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC9B,IAAI,EAAE,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,EAC7C,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,OAAO,EACnB,QAAQ,CAAC,EAAE,QAAQ,EACnB,cAAc,CAAC,EAAE,iBAAiB;IAYtC,KAAK;;qBAuC2B,OAAO,CAAC,OAAO,CAAC;;YA5BlC,aAAa;YA4Bb,cAAc;YA6Cd,WAAW;YAuQX,oBAAoB;IAsKlC;;;OAGG;IACH,aAAa;IAIb;;;;;OAKG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe;;;;;IAW3E;;;;;OAKG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;IAWzE;;;;OAIG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;;;;;IAMtD;;;;OAIG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;;;;;IAK3D;;;;;OAKG;IACG,WAAW,CACb,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,eAAe;;;;;IAa1B;;;;;;OAMG;IACG,MAAM,CAAC,MAAM,SAAS,gBAAgB,EACxC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EACxB,IAAI,CAAC,EAAE,WAAW;;;;;IActB;;;;;;OAMG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,WAAW;;;;;IAY1F;;;;;;OAMG;IACG,sBAAsB,CACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,YAAY,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC,EAC3D,SAAS,CAAC,EAAE,UAAU,EACtB,IAAI,CAAC,EAAE,WAAW;;;;;IAahB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAIlD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;IAI9E;;;;;OAKG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;IAIzC;;;;;OAKG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;IAI3C;;;;OAIG;IACG,OAAO,CACT,MAAM,EAAE,IAAI,CAAC,mBAAmB,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC,GAAG;QACjF,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,MAAM,EAAE,OAAO,CAAA;KAClB;gBAulCgB,MAAM;iBAAW,MAAM;;IAhlCtC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;;;;;IAItE,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;;;;IAIpD;;;OAGG;IACH,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,SAAS,CAAC;IAIlC,WAAW,CAAC,EAAE,EAAE,SAAS,CAAC,WAAW,CAAC;IAItC;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,aAAa,CAAC;IAI1C;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,UAAU,CAAC;IAIpC;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,aAAa,CAAC;IAI1C;;OAEG;IACH,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC;IAI1B;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,aAAa,CAAC;IAI1C;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,SAAS,CAAC,cAAc,CAAC;IAI5C,aAAa,CAAC,EAAE,EAAE,SAAS,CAAC,aAAa,CAAC;IAI1C,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC;IAIzF;;;;;OAKG;IACH,WAAW,CAAC,MAAM,SAAS,gBAAgB,EACvC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CACL,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;KAAE,KAClE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7B,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,cAAc,CAAC;IAIjD;;;OAGG;IACH,qBAAqB,CAAC,EAAE,EAAE,SAAS,CAAC,qBAAqB,CAAC;IAI1D;;;;;;;OAOG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM;IAIpC;;;;;OAKG;IACG,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAkEhE;;;;OAIG;IACH,WAAW,IAAI,MAAM,GAAG,IAAI;CAS/B;AAED,eAAO,MAAM,YAAY,GACrB,QAAQ,SAAS,YAAY,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,EAClD,OAAO,SAAS,GAAG,GAAG,QAAQ,EAE9B,gBAAgB,MAAM,EACtB,iBAAiB,MAAM,EACvB,OAAM;IACF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,QAAQ,CAAC,EAAE,iBAAiB,CAAA;CAC/B,GAAG,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,KAAK,GAAG,kBAAkB,CAAC,CAAM,oCAyF9E,CAAA;AAED,QAAA,MAAM,eAAe,GACjB,QAAQ,QAAQ,EAChB,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,EAC7C,WAAW,SAAS,EACpB,YAAY,OAAO;4BAgTL,MAAM,WACP,MAAM,SACR,eAAe,SACf,YAAY,CAAC,IAAI,CAAC;;;;;4BAkDf,MAAM,aACL,MAAM,WACR,MAAM,SACR,eAAe,SACf,YAAY,CAAC,IAAI,CAAC;;;;;6BAoDf,MAAM,aACL,MAAM,YACP,MAAM,SACT,YAAY,CAAC,IAAI,CAAC;;;;;uCAkLf,MAAM,WACP,YAAY,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC,cAC/C,UAAU,SACf,WAAW,SACX,YAAY,CAAC,IAAI,CAAC;;;;;aApKP,MAAM,SAAS,gBAAgB,YACvC,MAAM,WACP,MAAM,UACP,MAAM,QACR,UAAU,CAAC,MAAM,CAAC,SACjB,WAAW,SACX,YAAY,CAAC,IAAI,CAAC,KAC1B,UAAU,2CAjNV;QACC,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,EAAE,cAAc,CAAA;QACvB,IAAI,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAA;QACzB,SAAS,CAAC,EAAE,OAAO,CAAA;KACtB;;;;OA4MqC;0BAmCxB,MAAM,WACP,MAAM,WACN,UAAU,SACZ,WAAW,SACX,YAAY,CAAC,IAAI,CAAC;;;;;4BAiBQ,MAAM,aAAa,MAAM,SAAS,YAAY,CAAC,IAAI,CAAC;;;;;iCAO/C,MAAM,aAAa,MAAM;;;;;oCApOtB,MAAM,cAAc,MAAM,EAAE;;;;;;;;;;iCAkP/B,MAAM,WAAW,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;gCAStE,MAAM,UACR,MAAM,cACF,UAAU,KACvB,OAAO,CAAC,OAAO,CAAC;kBAgBQ,MAAM,WAAW,MAAM;;;oBAUrB,MAAM,WAAW,MAAM;;;2BAahB,MAAM,WAAW,MAAM,eAAe,WAAW;;;;;6BAa/C,MAAM,WAAW,MAAM;;;;;oCAIhB,MAAM;sBAiNvC,IAAI,CAAC,mBAAmB,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC,GAAG;QACjF,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,MAAM,EAAE,OAAO,CAAA;KAClB,SACM,YAAY,CAAC,IAAI,CAAC,KAC1B,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;yCA1JlC,MAAM,WACN,kBAAkB,YACjB,YAAY,CAAC,qBAAqB,CAAC,CAAC,SAAS,CAAC,SACjD,YAAY,CAAC,IAAI,CAAC,KAC1B,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CA4LlD,CAAA"}
package/dist/bot.js CHANGED
@@ -3,12 +3,12 @@ import { utils, ethers } from 'ethers';
3
3
  import { SpaceDapp, Permission, SpaceAddressFromSpaceId, TipRecipientType, ETH_ADDRESS, } from '@towns-protocol/web3';
4
4
  import { stringify as superjsonStringify, parse as superjsonParse } from 'superjson';
5
5
  import tippingFacetAbi from '@towns-protocol/generated/dev/abis/ITipping.abi';
6
- import { getRefEventIdFromChannelMessage, isChannelStreamId, make_ChannelPayload_Message, createTownsClient, streamIdAsString, make_MemberPayload_KeySolicitation, make_UserMetadataPayload_EncryptionDevice, logNever, userIdFromAddress, makeUserMetadataStreamId, unsafe_makeTags, townsEnv, spaceIdFromChannelId, make_ChannelPayload_Redaction, parseAppPrivateData, makeEvent, make_MediaPayload_Inception, make_MediaPayload_Chunk, makeUniqueMediaStreamId, streamIdAsBytes, addressFromUserId, make_ChannelPayload_InteractionRequest, userIdToAddress, unpackEnvelope, make_UserPayload_BlockchainTransaction, makeUserStreamId, } from '@towns-protocol/sdk';
6
+ import { getRefEventIdFromChannelMessage, isChannelStreamId, make_ChannelPayload_Message, createTownsClient, streamIdAsString, make_MemberPayload_KeySolicitation, make_UserMetadataPayload_EncryptionDevice, logNever, userIdFromAddress, makeUserMetadataStreamId, unsafe_makeTags, townsEnv, spaceIdFromChannelId, make_ChannelPayload_Redaction, parseAppPrivateData, makeEvent, make_MediaPayload_Inception, make_MediaPayload_Chunk, makeUniqueMediaStreamId, streamIdAsBytes, addressFromUserId, make_ChannelPayload_InteractionRequest, userIdToAddress, unpackEnvelope, make_UserPayload_BlockchainTransaction, makeUserStreamId, make_MemberPayload_Pin, make_MemberPayload_Unpin, } from '@towns-protocol/sdk';
7
7
  import { createMiddleware } from 'hono/factory';
8
8
  import { default as jwt } from 'jsonwebtoken';
9
9
  import { createNanoEvents } from 'nanoevents';
10
10
  import imageSize from 'image-size';
11
- import { ChannelMessageSchema, AppServiceRequestSchema, AppServiceResponseSchema, MembershipOp, MessageInteractionType, ChannelMessage_Post_Content_ImageSchema, ChannelMessage_Post_Content_Image_InfoSchema, ChunkedMediaSchema, CreationCookieSchema, BlockchainTransactionSchema, InteractionResponsePayloadSchema, ChannelMessage_Post_AttachmentSchema, } from '@towns-protocol/proto';
11
+ import { ChannelMessageSchema, AppServiceRequestSchema, AppServiceResponseSchema, MembershipOp, MessageInteractionType, ChannelMessage_Post_Content_ImageSchema, ChannelMessage_Post_Content_Image_InfoSchema, ChunkedMediaSchema, CreationCookieSchema, BlockchainTransactionSchema, InteractionRequestPayloadSchema, InteractionResponsePayloadSchema, ChannelMessage_Post_AttachmentSchema, } from '@towns-protocol/proto';
12
12
  import { bin_equal, bin_fromBase64, bin_fromHexString, bin_toHexString, check, dlog, } from '@towns-protocol/utils';
13
13
  import { encryptChunkedAESGCM } from '@towns-protocol/sdk-crypto';
14
14
  import { http, createWalletClient, encodeAbiParameters, zeroAddress, parseEventLogs, } from 'viem';
@@ -31,7 +31,8 @@ export class Bot {
31
31
  slashCommandHandlers = new Map();
32
32
  gmTypedHandlers = new Map();
33
33
  commands;
34
- constructor(clientV2, viem, jwtSecretBase64, appAddress, commands) {
34
+ identityConfig;
35
+ constructor(clientV2, viem, jwtSecretBase64, appAddress, commands, identityConfig) {
35
36
  this.client = clientV2;
36
37
  this.botId = clientV2.userId;
37
38
  this.viem = viem;
@@ -39,6 +40,7 @@ export class Bot {
39
40
  this.currentMessageTags = undefined;
40
41
  this.commands = commands;
41
42
  this.appAddress = appAddress;
43
+ this.identityConfig = identityConfig;
42
44
  }
43
45
  start() {
44
46
  const jwtMiddleware = createMiddleware(this.jwtMiddleware.bind(this));
@@ -599,12 +601,7 @@ export class Bot {
599
601
  * @returns The eventId of the interaction request
600
602
  */
601
603
  async sendInteractionRequest(streamId, content, recipient, opts) {
602
- const request = {
603
- recipient,
604
- content,
605
- encryptionDevice: this.getUserDevice(),
606
- };
607
- const result = await this.client.sendInteractionRequest(streamId, request, opts, this.currentMessageTags);
604
+ const result = await this.client.sendInteractionRequest(streamId, content, recipient, opts, this.currentMessageTags);
608
605
  this.currentMessageTags = undefined;
609
606
  return result;
610
607
  }
@@ -642,6 +639,12 @@ export class Bot {
642
639
  this.currentMessageTags = undefined;
643
640
  return result;
644
641
  }
642
+ async pinMessage(streamId, eventId, streamEvent) {
643
+ return this.client.pinMessage(streamId, eventId, streamEvent);
644
+ }
645
+ async unpinMessage(streamId, eventId) {
646
+ return this.client.unpinMessage(streamId, eventId);
647
+ }
645
648
  /**
646
649
  * Triggered when someone sends a message.
647
650
  * This is triggered for all messages, including direct messages and group messages.
@@ -724,6 +727,83 @@ export class Bot {
724
727
  async getStreamView(streamId) {
725
728
  return this.client.getStream(streamId);
726
729
  }
730
+ /**
731
+ * Get the ERC-8004 compliant metadata JSON
732
+ * This should be hosted at /.well-known/agent-metadata.json
733
+ * Fetches metadata from the App Registry and merges with local config
734
+ * @returns The ERC-8004 compliant metadata object or null
735
+ */
736
+ async getIdentityMetadata() {
737
+ // Fetch metadata from App Registry
738
+ let appMetadata;
739
+ try {
740
+ const appRegistry = await this.client.appServiceClient();
741
+ const response = await appRegistry.getAppMetadata({
742
+ appId: bin_fromHexString(this.botId),
743
+ });
744
+ appMetadata = response.metadata;
745
+ }
746
+ catch (err) {
747
+ // eslint-disable-next-line no-console
748
+ console.warn('[@towns-protocol/bot] Failed to fetch app metadata', err);
749
+ }
750
+ // If no config and no fetched metadata, return null
751
+ if (!this.identityConfig && !appMetadata)
752
+ return null;
753
+ const endpoints = [];
754
+ if (this.identityConfig?.endpoints) {
755
+ endpoints.push(...this.identityConfig.endpoints);
756
+ }
757
+ const hasAgentWallet = endpoints.some((e) => e.name === 'agentWallet');
758
+ if (!hasAgentWallet) {
759
+ const chainId = this.viem.chain.id;
760
+ endpoints.push({
761
+ name: 'agentWallet',
762
+ endpoint: `eip155:${chainId}:${this.appAddress}`,
763
+ });
764
+ }
765
+ const domain = this.identityConfig?.domain;
766
+ if (domain && !endpoints.some((e) => e.name === 'A2A')) {
767
+ const origin = domain.startsWith('http') ? domain : `https://${domain}`;
768
+ endpoints.push({
769
+ name: 'A2A',
770
+ endpoint: `${origin}/.well-known/agent-card.json`,
771
+ version: '0.3.0',
772
+ });
773
+ }
774
+ // Merge app metadata with identity config, preferring identity config
775
+ const name = this.identityConfig?.name || appMetadata?.displayName || 'Unknown Bot';
776
+ const description = this.identityConfig?.description || appMetadata?.description || '';
777
+ const image = this.identityConfig?.image || appMetadata?.avatarUrl || appMetadata?.imageUrl || '';
778
+ const motto = this.identityConfig?.motto || appMetadata?.motto;
779
+ return {
780
+ type: 'https://eips.ethereum.org/EIPS/eip-8004#registration-v1',
781
+ name,
782
+ description,
783
+ image,
784
+ endpoints,
785
+ registrations: this.identityConfig?.registrations || [],
786
+ supportedTrust: this.identityConfig?.supportedTrust,
787
+ motto,
788
+ capabilities: this.commands?.map((c) => c.name) || [],
789
+ version: packageJson.version,
790
+ framework: `javascript:${packageJson.name}:${packageJson.version}`,
791
+ attributes: this.identityConfig?.attributes,
792
+ };
793
+ }
794
+ /**
795
+ * Get the tokenURI that would be used for ERC-8004 registration
796
+ * Returns null if no domain is configured
797
+ * @returns The .well-known URL or null
798
+ */
799
+ getTokenURI() {
800
+ if (!this.identityConfig?.domain)
801
+ return null;
802
+ const origin = this.identityConfig.domain.startsWith('http')
803
+ ? this.identityConfig.domain
804
+ : `https://${this.identityConfig.domain}`;
805
+ return `${origin}/.well-known/agent-metadata.json`;
806
+ }
727
807
  }
728
808
  export const makeTownsBot = async (appPrivateData, jwtSecretBase64, opts = {}) => {
729
809
  const { baseRpcUrl, ...clientOpts } = opts;
@@ -790,7 +870,7 @@ export const makeTownsBot = async (appPrivateData, jwtSecretBase64, opts = {}) =
790
870
  });
791
871
  }
792
872
  await client.uploadDeviceKeys();
793
- return new Bot(client, viem, jwtSecretBase64, appAddress, opts.commands);
873
+ return new Bot(client, viem, jwtSecretBase64, appAddress, opts.commands, opts.identity);
794
874
  };
795
875
  const buildBotActions = (client, viem, spaceDapp, appAddress) => {
796
876
  const CHUNK_SIZE = 1200000; // 1.2MB max per chunk (including auth tag)
@@ -1223,18 +1303,53 @@ const buildBotActions = (client, viem, spaceDapp, appAddress) => {
1223
1303
  const receipt = await tx.wait();
1224
1304
  return { txHash: receipt.transactionHash };
1225
1305
  };
1306
+ /**
1307
+ * Pin a message to a stream
1308
+ * @param streamId - The stream ID to pin the message to
1309
+ * @param eventId - The event ID of the message to pin
1310
+ * @param streamEvent - The stream event to pin
1311
+ * @returns The event ID of the pinned message
1312
+ */
1313
+ const pinMessage = async (streamId, eventId, streamEvent) => {
1314
+ return client.sendEvent(streamId, make_MemberPayload_Pin(bin_fromHexString(eventId), streamEvent));
1315
+ };
1316
+ /**
1317
+ * Unpin a message from a stream
1318
+ * @param streamId - The stream ID to unpin the message from
1319
+ * @param eventId - The event ID of the message to unpin
1320
+ * @returns The event ID of the unpinned message
1321
+ */
1322
+ const unpinMessage = async (streamId, eventId) => {
1323
+ return client.sendEvent(streamId, make_MemberPayload_Unpin(bin_fromHexString(eventId)));
1324
+ };
1226
1325
  const getChannelSettings = async (channelId) => {
1227
1326
  const spaceId = spaceIdFromChannelId(channelId);
1228
1327
  const streamView = await client.getStream(spaceId);
1229
1328
  const channel = streamView.spaceContent.spaceChannelsMetadata[channelId];
1230
1329
  return channel;
1231
1330
  };
1232
- const sendInteractionRequest = async (streamId, request, opts, tags) => {
1233
- const payload = make_ChannelPayload_InteractionRequest({
1234
- ...request,
1331
+ const sendInteractionRequest = async (streamId, content, recipient, opts, tags) => {
1332
+ // Get encryption settings (same as sendMessageEvent)
1333
+ const miniblockInfo = await client.getMiniblockInfo(streamId);
1334
+ const encryptionAlgorithm = miniblockInfo.encryptionAlgorithm?.algorithm
1335
+ ? miniblockInfo.encryptionAlgorithm.algorithm
1336
+ : client.defaultGroupEncryptionAlgorithm;
1337
+ await ensureOutboundSession(streamId, encryptionAlgorithm, recipient ? [userIdFromAddress(recipient)] : [], miniblockInfo);
1338
+ // Create payload with content and encryption device for response
1339
+ const payload = create(InteractionRequestPayloadSchema, {
1235
1340
  encryptionDevice: client.crypto.getUserDevice(),
1341
+ content: content,
1236
1342
  });
1237
- return client.sendEvent(streamId, payload, tags, opts?.ephemeral);
1343
+ // Encrypt using group encryption (same as messages)
1344
+ const encryptedData = await client.crypto.encryptGroupEvent(streamId, toBinary(InteractionRequestPayloadSchema, payload), encryptionAlgorithm);
1345
+ // Create the request matching InteractionResponse structure
1346
+ const request = {
1347
+ recipient: recipient,
1348
+ encryptedData: encryptedData,
1349
+ };
1350
+ // Send as InteractionRequest
1351
+ const eventPayload = make_ChannelPayload_InteractionRequest(request);
1352
+ return client.sendEvent(streamId, eventPayload, tags, opts?.ephemeral);
1238
1353
  };
1239
1354
  /**
1240
1355
  * Send a blockchain transaction to the stream
@@ -1382,6 +1497,8 @@ const buildBotActions = (client, viem, spaceDapp, appAddress) => {
1382
1497
  checkPermission,
1383
1498
  ban,
1384
1499
  unban,
1500
+ pinMessage,
1501
+ unpinMessage,
1385
1502
  getChannelSettings,
1386
1503
  sendTip,
1387
1504
  sendBlockchainTransaction,