@elizaos/plugin-bluesky 2.0.0-alpha.7 → 2.0.0-beta.1

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 ADDED
@@ -0,0 +1,203 @@
1
+ # @elizaos/plugin-bluesky
2
+
3
+ BlueSky plugin for elizaOS - A comprehensive AT Protocol client for social interactions on BlueSky.
4
+
5
+ ## Overview
6
+
7
+ This plugin provides BlueSky integration for elizaOS agents, enabling:
8
+
9
+ - **Posting**: Create, delete, like, and repost posts
10
+ - **Direct Messaging**: Send and receive direct messages
11
+ - **Notifications**: Monitor and respond to mentions, follows, likes, and reposts
12
+ - **Profile Management**: Access user profiles and timelines
13
+ - **Automated Posting**: Schedule and automate post creation
14
+
15
+ ## Installation
16
+
17
+ ### TypeScript/JavaScript
18
+
19
+ ```bash
20
+ npm install @elizaos/plugin-bluesky
21
+ # or
22
+ bun add @elizaos/plugin-bluesky
23
+ ```
24
+ ## Configuration
25
+
26
+ ### Environment Variables
27
+
28
+ Required:
29
+
30
+ - `BLUESKY_HANDLE`: Your BlueSky handle (e.g., `user.bsky.social`)
31
+ - `BLUESKY_PASSWORD`: Your app password (generate at https://bsky.app/settings/app-passwords)
32
+
33
+ Optional:
34
+ | Variable | Description | Default |
35
+ |----------|-------------|---------|
36
+ | `BLUESKY_SERVICE` | BlueSky service URL | `https://bsky.social` |
37
+ | `BLUESKY_DRY_RUN` | Simulate operations without executing | `false` |
38
+ | `BLUESKY_POLL_INTERVAL` | Notification polling interval (seconds) | `60` |
39
+ | `BLUESKY_ENABLE_POSTING` | Enable automated posting | `true` |
40
+ | `BLUESKY_ENABLE_DMS` | Enable direct messaging | `true` |
41
+ | `BLUESKY_POST_INTERVAL_MIN` | Minimum post interval (seconds) | `1800` |
42
+ | `BLUESKY_POST_INTERVAL_MAX` | Maximum post interval (seconds) | `3600` |
43
+ | `BLUESKY_ENABLE_ACTION_PROCESSING` | Enable action processing | `true` |
44
+ | `BLUESKY_ACTION_INTERVAL` | Action processing interval (seconds) | `120` |
45
+ | `BLUESKY_POST_IMMEDIATELY` | Post immediately on startup | `false` |
46
+ | `BLUESKY_MAX_ACTIONS_PROCESSING` | Max actions per batch | `5` |
47
+
48
+ ## Quick Start
49
+
50
+ ### TypeScript
51
+
52
+ ```typescript
53
+ import { blueSkyPlugin } from "@elizaos/plugin-bluesky";
54
+
55
+ // Add to your elizaOS agent
56
+ const agent = createAgent({
57
+ plugins: [blueSkyPlugin],
58
+ });
59
+
60
+ // Or use the client directly
61
+ import { BlueSkyClient, validateBlueSkyConfig } from "@elizaos/plugin-bluesky";
62
+
63
+ const client = new BlueSkyClient({
64
+ service: "https://bsky.social",
65
+ handle: "your-handle.bsky.social",
66
+ password: "your-app-password",
67
+ });
68
+
69
+ await client.authenticate();
70
+ const post = await client.sendPost({ content: { text: "Hello BlueSky!" } });
71
+ ```
72
+ ## Features
73
+
74
+ ### Posting
75
+
76
+ ```typescript
77
+ // Create a post
78
+ const post = await client.sendPost({
79
+ content: { text: "Hello BlueSky!" },
80
+ });
81
+
82
+ // Reply to a post
83
+ const reply = await client.sendPost({
84
+ content: { text: "This is a reply!" },
85
+ replyTo: { uri: post.uri, cid: post.cid },
86
+ });
87
+
88
+ // Like a post
89
+ await client.likePost(post.uri, post.cid);
90
+
91
+ // Repost
92
+ await client.repost(post.uri, post.cid);
93
+
94
+ // Delete a post
95
+ await client.deletePost(post.uri);
96
+ ```
97
+
98
+ ### Direct Messages
99
+
100
+ ```typescript
101
+ // Get conversations
102
+ const { conversations } = await client.getConversations();
103
+
104
+ // Get messages from a conversation
105
+ const { messages } = await client.getMessages(convoId);
106
+
107
+ // Send a message
108
+ const message = await client.sendMessage({
109
+ convoId: "conversation-id",
110
+ message: { text: "Hello!" },
111
+ });
112
+ ```
113
+
114
+ ### Notifications
115
+
116
+ ```typescript
117
+ // Get notifications
118
+ const { notifications } = await client.getNotifications(50);
119
+
120
+ // Mark as read
121
+ await client.updateSeenNotifications();
122
+ ```
123
+
124
+ ### Timeline
125
+
126
+ ```typescript
127
+ // Get timeline
128
+ const timeline = await client.getTimeline({ limit: 50 });
129
+
130
+ for (const item of timeline.feed) {
131
+ console.log(`@${item.post.author.handle}: ${item.post.record.text}`);
132
+ }
133
+ ```
134
+
135
+ ### Profiles
136
+
137
+ ```typescript
138
+ // Get a profile
139
+ const profile = await client.getProfile("user.bsky.social");
140
+ console.log(`${profile.displayName} - ${profile.followersCount} followers`);
141
+ ```
142
+
143
+ ## Events
144
+
145
+ The plugin emits the following events for elizaOS integration:
146
+
147
+ | Event | Description |
148
+ | -------------------------- | ------------------------------- |
149
+ | `bluesky.mention_received` | Agent was mentioned in a post |
150
+ | `bluesky.follow_received` | Agent received a new follower |
151
+ | `bluesky.like_received` | Agent's post was liked |
152
+ | `bluesky.repost_received` | Agent's post was reposted |
153
+ | `bluesky.quote_received` | Agent's post was quoted |
154
+ | `bluesky.should_respond` | Trigger for response generation |
155
+ | `bluesky.create_post` | Trigger for automated posting |
156
+
157
+ ## Development
158
+
159
+ ### TypeScript
160
+
161
+ ```bash
162
+ cd typescript
163
+ bun install
164
+ bun run build
165
+ npx vitest
166
+ ```
167
+ ## Architecture
168
+
169
+ ```
170
+ plugin-bluesky/
171
+ ├── typescript/ # TypeScript implementation
172
+ │ ├── index.ts # Main plugin export
173
+ │ ├── client.ts # BlueSky API client
174
+ │ ├── types/ # Type definitions
175
+ │ ├── services/ # Service implementations
176
+ │ ├── managers/ # Agent manager
177
+ │ └── utils/ # Configuration utilities
178
+ ├── python/ # Python implementation
179
+ │ ├── elizaos_plugin_bluesky/
180
+ │ │ ├── __init__.py # Package exports
181
+ │ │ ├── client.py # BlueSky API client
182
+ │ │ ├── config.py # Configuration
183
+ │ │ ├── types.py # Type definitions
184
+ │ │ └── errors.py # Error types
185
+ │ └── tests/ # Test suite
186
+ ├── rust/ # Rust implementation
187
+ │ ├── src/
188
+ │ │ ├── lib.rs # Library root
189
+ │ │ ├── client.rs # BlueSky API client
190
+ │ │ ├── config.rs # Configuration
191
+ │ │ ├── types.rs # Type definitions
192
+ │ │ └── error.rs # Error types
193
+ │ └── tests/ # Integration tests
194
+ └── package.json # Root package configuration
195
+ ```
196
+
197
+ ## License
198
+
199
+ MIT License - see [LICENSE](./LICENSE) for details.
200
+
201
+ ## Contributing
202
+
203
+ Contributions are welcome! Please ensure your changes maintain feature parity across all three language implementations.
@@ -1,5 +1,6 @@
1
1
  // types/index.ts
2
- import { z } from "zod";
2
+ import * as zod from "zod";
3
+ var z2 = zod.z ?? zod;
3
4
  var BLUESKY_SERVICE_URL = "https://bsky.social";
4
5
  var BLUESKY_MAX_POST_LENGTH = 300;
5
6
  var BLUESKY_POLL_INTERVAL = 60;
@@ -24,20 +25,20 @@ var CACHE_SIZE = {
24
25
  NOTIFICATIONS: 1000,
25
26
  CONVERSATIONS: 100
26
27
  };
27
- var BlueSkyConfigSchema = z.object({
28
- handle: z.string().regex(AT_PROTOCOL_HANDLE_REGEX, "Invalid handle format"),
29
- password: z.string().min(1),
30
- service: z.string().url().default(BLUESKY_SERVICE_URL),
31
- dryRun: z.boolean().default(false),
32
- pollInterval: z.number().positive().default(BLUESKY_POLL_INTERVAL),
33
- enablePost: z.boolean().default(true),
34
- postIntervalMin: z.number().positive().default(BLUESKY_POST_INTERVAL_MIN),
35
- postIntervalMax: z.number().positive().default(BLUESKY_POST_INTERVAL_MAX),
36
- enableActionProcessing: z.boolean().default(true),
37
- actionInterval: z.number().positive().default(BLUESKY_ACTION_INTERVAL),
38
- postImmediately: z.boolean().default(false),
39
- maxActionsProcessing: z.number().positive().default(BLUESKY_MAX_ACTIONS),
40
- enableDMs: z.boolean().default(true)
28
+ var BlueSkyConfigSchema = z2.object({
29
+ handle: z2.string().regex(AT_PROTOCOL_HANDLE_REGEX, "Invalid handle format"),
30
+ password: z2.string().min(1),
31
+ service: z2.string().url().default(BLUESKY_SERVICE_URL),
32
+ dryRun: z2.boolean().default(false),
33
+ pollInterval: z2.number().positive().default(BLUESKY_POLL_INTERVAL),
34
+ enablePost: z2.boolean().default(true),
35
+ postIntervalMin: z2.number().positive().default(BLUESKY_POST_INTERVAL_MIN),
36
+ postIntervalMax: z2.number().positive().default(BLUESKY_POST_INTERVAL_MAX),
37
+ enableActionProcessing: z2.boolean().default(true),
38
+ actionInterval: z2.number().positive().default(BLUESKY_ACTION_INTERVAL),
39
+ postImmediately: z2.boolean().default(false),
40
+ maxActionsProcessing: z2.number().positive().default(BLUESKY_MAX_ACTIONS),
41
+ enableDMs: z2.boolean().default(true)
41
42
  });
42
43
 
43
44
  class BlueSkyError extends Error {
@@ -55,6 +56,7 @@ export {
55
56
  CACHE_SIZE,
56
57
  BlueSkyError,
57
58
  BlueSkyConfigSchema,
59
+ BlueSkyConfig,
58
60
  BLUESKY_SERVICE_URL,
59
61
  BLUESKY_SERVICE_NAME,
60
62
  BLUESKY_POST_INTERVAL_MIN,
@@ -67,4 +69,4 @@ export {
67
69
  AT_PROTOCOL_HANDLE_REGEX
68
70
  };
69
71
 
70
- //# debugId=AB54F736CEC6763B64756E2164756E21
72
+ //# debugId=028253F8E0BBFEA764756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../types/index.ts"],
4
4
  "sourcesContent": [
5
- "import type { IAgentRuntime } from \"@elizaos/core\";\nimport { z } from \"zod\";\n\nexport const BLUESKY_SERVICE_URL = \"https://bsky.social\";\nexport const BLUESKY_MAX_POST_LENGTH = 300;\nexport const BLUESKY_POLL_INTERVAL = 60;\nexport const BLUESKY_POST_INTERVAL_MIN = 1800;\nexport const BLUESKY_POST_INTERVAL_MAX = 3600;\nexport const BLUESKY_ACTION_INTERVAL = 120;\nexport const BLUESKY_MAX_ACTIONS = 5;\nexport const BLUESKY_CHAT_SERVICE_DID = \"did:web:api.bsky.chat\";\nexport const BLUESKY_SERVICE_NAME = \"bluesky\";\n\nexport const AT_PROTOCOL_HANDLE_REGEX =\n\t/^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/;\n\nexport const CACHE_TTL = {\n\tPROFILE: 3600000,\n\tTIMELINE: 300000,\n\tPOST: 1800000,\n\tNOTIFICATIONS: 300000,\n\tCONVERSATIONS: 300000,\n} as const;\n\nexport const CACHE_SIZE = {\n\tPROFILE: 1000,\n\tTIMELINE: 500,\n\tPOST: 10000,\n\tNOTIFICATIONS: 1000,\n\tCONVERSATIONS: 100,\n} as const;\n\nexport const BlueSkyConfigSchema = z.object({\n\thandle: z.string().regex(AT_PROTOCOL_HANDLE_REGEX, \"Invalid handle format\"),\n\tpassword: z.string().min(1),\n\tservice: z.string().url().default(BLUESKY_SERVICE_URL),\n\tdryRun: z.boolean().default(false),\n\tpollInterval: z.number().positive().default(BLUESKY_POLL_INTERVAL),\n\tenablePost: z.boolean().default(true),\n\tpostIntervalMin: z.number().positive().default(BLUESKY_POST_INTERVAL_MIN),\n\tpostIntervalMax: z.number().positive().default(BLUESKY_POST_INTERVAL_MAX),\n\tenableActionProcessing: z.boolean().default(true),\n\tactionInterval: z.number().positive().default(BLUESKY_ACTION_INTERVAL),\n\tpostImmediately: z.boolean().default(false),\n\tmaxActionsProcessing: z.number().positive().default(BLUESKY_MAX_ACTIONS),\n\tenableDMs: z.boolean().default(true),\n});\n\nexport type BlueSkyConfig = z.infer<typeof BlueSkyConfigSchema>;\n\nexport interface BlueSkyProfile {\n\tdid: string;\n\thandle: string;\n\tdisplayName?: string;\n\tdescription?: string;\n\tavatar?: string;\n\tbanner?: string;\n\tfollowersCount?: number;\n\tfollowsCount?: number;\n\tpostsCount?: number;\n\tindexedAt?: string;\n\tcreatedAt?: string;\n}\n\nexport interface PostFacet {\n\tindex: { byteStart: number; byteEnd: number };\n\tfeatures: Array<{\n\t\t$type?: string;\n\t\t[key: string]: string | number | boolean | object | null | undefined;\n\t}>;\n}\n\nexport interface PostEmbed {\n\t$type: string;\n\t[key: string]: string | number | boolean | object | null | undefined;\n}\n\nexport interface PostRecord {\n\t$type: string;\n\ttext: string;\n\tfacets?: PostFacet[];\n\tembed?: PostEmbed;\n\tcreatedAt: string;\n}\n\nexport interface BlueSkyPost {\n\turi: string;\n\tcid: string;\n\tauthor: BlueSkyProfile;\n\trecord: PostRecord;\n\tembed?: PostEmbed;\n\treplyCount?: number;\n\trepostCount?: number;\n\tlikeCount?: number;\n\tquoteCount?: number;\n\tindexedAt: string;\n}\n\nexport interface TimelineRequest {\n\talgorithm?: string;\n\tlimit?: number;\n\tcursor?: string;\n}\n\nexport interface TimelineFeedItem {\n\tpost: BlueSkyPost;\n\treply?: {\n\t\troot: BlueSkyPost;\n\t\tparent: BlueSkyPost;\n\t};\n\treason?: Record<\n\t\tstring,\n\t\tstring | number | boolean | object | null | undefined\n\t>;\n}\n\nexport interface TimelineResponse {\n\tcursor?: string;\n\tfeed: TimelineFeedItem[];\n}\n\nexport interface CreatePostRequest {\n\tcontent: {\n\t\ttext: string;\n\t\tfacets?: PostFacet[];\n\t\tembed?: PostEmbed;\n\t};\n\treplyTo?: { uri: string; cid: string };\n}\n\nexport type NotificationReason =\n\t| \"mention\"\n\t| \"reply\"\n\t| \"follow\"\n\t| \"like\"\n\t| \"repost\"\n\t| \"quote\";\n\nexport interface BlueSkyNotification {\n\turi: string;\n\tcid: string;\n\tauthor: BlueSkyProfile;\n\treason: NotificationReason;\n\treasonSubject?: string;\n\trecord: Record<string, string | number | boolean | object | null | undefined>;\n\tisRead: boolean;\n\tindexedAt: string;\n}\n\nexport interface BlueSkyMessage {\n\tid: string;\n\trev: string;\n\ttext?: string;\n\tembed?: PostEmbed;\n\tsender: { did: string };\n\tsentAt: string;\n}\n\nexport interface BlueSkyConversation {\n\tid: string;\n\trev: string;\n\tmembers: Array<{\n\t\tdid: string;\n\t\thandle?: string;\n\t\tdisplayName?: string;\n\t\tavatar?: string;\n\t}>;\n\tlastMessage?: BlueSkyMessage;\n\tunreadCount: number;\n\tmuted: boolean;\n}\n\nexport interface SendMessageRequest {\n\tconvoId: string;\n\tmessage: { text?: string; embed?: PostEmbed };\n}\n\nexport interface BlueSkySession {\n\tdid: string;\n\thandle: string;\n\temail?: string;\n\taccessJwt: string;\n\trefreshJwt: string;\n}\n\nexport class BlueSkyError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly code: string,\n\t\tpublic readonly status?: number,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"BlueSkyError\";\n\t}\n}\n\nexport interface ATProtocolPostRecord {\n\t$type: string;\n\ttext: string;\n\tfacets?: PostFacet[];\n\tembed?: PostEmbed;\n\tcreatedAt: string;\n\t[k: string]:\n\t\t| string\n\t\t| PostFacet[]\n\t\t| PostEmbed\n\t\t| number\n\t\t| boolean\n\t\t| null\n\t\t| undefined;\n}\n\nexport interface ATProtocolProfileViewExtended {\n\tdid: string;\n\thandle: string;\n\tdisplayName?: string;\n\tdescription?: string;\n\tavatar?: string;\n\tbanner?: string;\n\tfollowersCount?: number;\n\tfollowsCount?: number;\n\tpostsCount?: number;\n\tindexedAt?: string;\n\tcreatedAt?: string;\n\t[k: string]: string | number | undefined;\n}\n\nexport interface BlueSkyEventPayload {\n\truntime: IAgentRuntime;\n\tsource: \"bluesky\";\n}\n\nexport interface BlueSkyNotificationEventPayload extends BlueSkyEventPayload {\n\tnotification: BlueSkyNotification;\n}\n\nexport interface BlueSkyCreatePostEventPayload extends BlueSkyEventPayload {\n\tautomated: boolean;\n}\n"
5
+ "import type { IAgentRuntime } from \"@elizaos/core\";\nimport * as zod from \"zod\";\n\nconst z = zod.z ?? zod;\n\nexport const BLUESKY_SERVICE_URL = \"https://bsky.social\";\nexport const BLUESKY_MAX_POST_LENGTH = 300;\nexport const BLUESKY_POLL_INTERVAL = 60;\nexport const BLUESKY_POST_INTERVAL_MIN = 1800;\nexport const BLUESKY_POST_INTERVAL_MAX = 3600;\nexport const BLUESKY_ACTION_INTERVAL = 120;\nexport const BLUESKY_MAX_ACTIONS = 5;\nexport const BLUESKY_CHAT_SERVICE_DID = \"did:web:api.bsky.chat\";\nexport const BLUESKY_SERVICE_NAME = \"bluesky\";\n\nexport const AT_PROTOCOL_HANDLE_REGEX =\n\t/^([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/;\n\nexport const CACHE_TTL = {\n\tPROFILE: 3600000,\n\tTIMELINE: 300000,\n\tPOST: 1800000,\n\tNOTIFICATIONS: 300000,\n\tCONVERSATIONS: 300000,\n} as const;\n\nexport const CACHE_SIZE = {\n\tPROFILE: 1000,\n\tTIMELINE: 500,\n\tPOST: 10000,\n\tNOTIFICATIONS: 1000,\n\tCONVERSATIONS: 100,\n} as const;\n\nexport const BlueSkyConfigSchema = z.object({\n\thandle: z.string().regex(AT_PROTOCOL_HANDLE_REGEX, \"Invalid handle format\"),\n\tpassword: z.string().min(1),\n\tservice: z.string().url().default(BLUESKY_SERVICE_URL),\n\tdryRun: z.boolean().default(false),\n\tpollInterval: z.number().positive().default(BLUESKY_POLL_INTERVAL),\n\tenablePost: z.boolean().default(true),\n\tpostIntervalMin: z.number().positive().default(BLUESKY_POST_INTERVAL_MIN),\n\tpostIntervalMax: z.number().positive().default(BLUESKY_POST_INTERVAL_MAX),\n\tenableActionProcessing: z.boolean().default(true),\n\tactionInterval: z.number().positive().default(BLUESKY_ACTION_INTERVAL),\n\tpostImmediately: z.boolean().default(false),\n\tmaxActionsProcessing: z.number().positive().default(BLUESKY_MAX_ACTIONS),\n\tenableDMs: z.boolean().default(true),\n});\n\nexport type BlueSkyConfig = zod.infer<typeof BlueSkyConfigSchema>;\n\nexport interface BlueSkyProfile {\n\tdid: string;\n\thandle: string;\n\tdisplayName?: string;\n\tdescription?: string;\n\tavatar?: string;\n\tbanner?: string;\n\tfollowersCount?: number;\n\tfollowsCount?: number;\n\tpostsCount?: number;\n\tindexedAt?: string;\n\tcreatedAt?: string;\n}\n\nexport interface PostFacet {\n\tindex: { byteStart: number; byteEnd: number };\n\tfeatures: Array<{\n\t\t$type?: string;\n\t\t[key: string]: string | number | boolean | object | null | undefined;\n\t}>;\n}\n\nexport interface PostEmbed {\n\t$type: string;\n\t[key: string]: string | number | boolean | object | null | undefined;\n}\n\nexport interface PostRecord {\n\t$type: string;\n\ttext: string;\n\tfacets?: PostFacet[];\n\tembed?: PostEmbed;\n\tcreatedAt: string;\n}\n\nexport interface BlueSkyPost {\n\turi: string;\n\tcid: string;\n\tauthor: BlueSkyProfile;\n\trecord: PostRecord;\n\tembed?: PostEmbed;\n\treplyCount?: number;\n\trepostCount?: number;\n\tlikeCount?: number;\n\tquoteCount?: number;\n\tindexedAt: string;\n}\n\nexport interface TimelineRequest {\n\talgorithm?: string;\n\tlimit?: number;\n\tcursor?: string;\n}\n\nexport interface TimelineFeedItem {\n\tpost: BlueSkyPost;\n\treply?: {\n\t\troot: BlueSkyPost;\n\t\tparent: BlueSkyPost;\n\t};\n\treason?: Record<\n\t\tstring,\n\t\tstring | number | boolean | object | null | undefined\n\t>;\n}\n\nexport interface TimelineResponse {\n\tcursor?: string;\n\tfeed: TimelineFeedItem[];\n}\n\nexport interface CreatePostRequest {\n\tcontent: {\n\t\ttext: string;\n\t\tfacets?: PostFacet[];\n\t\tembed?: PostEmbed;\n\t};\n\treplyTo?: { uri: string; cid: string };\n}\n\nexport type NotificationReason =\n\t| \"mention\"\n\t| \"reply\"\n\t| \"follow\"\n\t| \"like\"\n\t| \"repost\"\n\t| \"quote\";\n\nexport interface BlueSkyNotification {\n\turi: string;\n\tcid: string;\n\tauthor: BlueSkyProfile;\n\treason: NotificationReason;\n\treasonSubject?: string;\n\trecord: Record<string, string | number | boolean | object | null | undefined>;\n\tisRead: boolean;\n\tindexedAt: string;\n}\n\nexport interface BlueSkyMessage {\n\tid: string;\n\trev: string;\n\ttext?: string;\n\tembed?: PostEmbed;\n\tsender: { did: string };\n\tsentAt: string;\n}\n\nexport interface BlueSkyConversation {\n\tid: string;\n\trev: string;\n\tmembers: Array<{\n\t\tdid: string;\n\t\thandle?: string;\n\t\tdisplayName?: string;\n\t\tavatar?: string;\n\t}>;\n\tlastMessage?: BlueSkyMessage;\n\tunreadCount: number;\n\tmuted: boolean;\n}\n\nexport interface SendMessageRequest {\n\tconvoId: string;\n\tmessage: { text?: string; embed?: PostEmbed };\n}\n\nexport interface BlueSkySession {\n\tdid: string;\n\thandle: string;\n\temail?: string;\n\taccessJwt: string;\n\trefreshJwt: string;\n}\n\nexport class BlueSkyError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly code: string,\n\t\tpublic readonly status?: number,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"BlueSkyError\";\n\t}\n}\n\nexport interface ATProtocolPostRecord {\n\t$type: string;\n\ttext: string;\n\tfacets?: PostFacet[];\n\tembed?: PostEmbed;\n\tcreatedAt: string;\n\t[k: string]:\n\t\t| string\n\t\t| PostFacet[]\n\t\t| PostEmbed\n\t\t| number\n\t\t| boolean\n\t\t| null\n\t\t| undefined;\n}\n\nexport interface ATProtocolProfileViewExtended {\n\tdid: string;\n\thandle: string;\n\tdisplayName?: string;\n\tdescription?: string;\n\tavatar?: string;\n\tbanner?: string;\n\tfollowersCount?: number;\n\tfollowsCount?: number;\n\tpostsCount?: number;\n\tindexedAt?: string;\n\tcreatedAt?: string;\n\t[k: string]: string | number | undefined;\n}\n\nexport interface BlueSkyEventPayload {\n\truntime: IAgentRuntime;\n\tsource: \"bluesky\";\n\taccountId?: string;\n}\n\nexport interface BlueSkyNotificationEventPayload extends BlueSkyEventPayload {\n\tnotification: BlueSkyNotification;\n}\n\nexport interface BlueSkyCreatePostEventPayload extends BlueSkyEventPayload {\n\tautomated: boolean;\n}\n"
6
6
  ],
7
- "mappings": ";AACA;AAEO,IAAM,sBAAsB;AAC5B,IAAM,0BAA0B;AAChC,IAAM,wBAAwB;AAC9B,IAAM,4BAA4B;AAClC,IAAM,4BAA4B;AAClC,IAAM,0BAA0B;AAChC,IAAM,sBAAsB;AAC5B,IAAM,2BAA2B;AACjC,IAAM,uBAAuB;AAE7B,IAAM,2BACZ;AAEM,IAAM,YAAY;AAAA,EACxB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,eAAe;AAAA,EACf,eAAe;AAChB;AAEO,IAAM,aAAa;AAAA,EACzB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,eAAe;AAAA,EACf,eAAe;AAChB;AAEO,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC3C,QAAQ,EAAE,OAAO,EAAE,MAAM,0BAA0B,uBAAuB;AAAA,EAC1E,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,mBAAmB;AAAA,EACrD,QAAQ,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACjC,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,qBAAqB;AAAA,EACjE,YAAY,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACpC,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,yBAAyB;AAAA,EACxE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,yBAAyB;AAAA,EACxE,wBAAwB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAChD,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,uBAAuB;AAAA,EACrE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAC1C,sBAAsB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,mBAAmB;AAAA,EACvE,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACpC,CAAC;AAAA;AA2IM,MAAM,qBAAqB,MAAM;AAAA,EAGtB;AAAA,EACA;AAAA,EAHjB,WAAW,CACV,SACgB,MACA,QACf;AAAA,IACD,MAAM,OAAO;AAAA,IAHG;AAAA,IACA;AAAA,IAGhB,KAAK,OAAO;AAAA;AAEd;",
8
- "debugId": "AB54F736CEC6763B64756E2164756E21",
7
+ "mappings": ";AACA;AAEA,IAAM,KAAQ,SAAK;AAEZ,IAAM,sBAAsB;AAC5B,IAAM,0BAA0B;AAChC,IAAM,wBAAwB;AAC9B,IAAM,4BAA4B;AAClC,IAAM,4BAA4B;AAClC,IAAM,0BAA0B;AAChC,IAAM,sBAAsB;AAC5B,IAAM,2BAA2B;AACjC,IAAM,uBAAuB;AAE7B,IAAM,2BACZ;AAEM,IAAM,YAAY;AAAA,EACxB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,eAAe;AAAA,EACf,eAAe;AAChB;AAEO,IAAM,aAAa;AAAA,EACzB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,eAAe;AAAA,EACf,eAAe;AAChB;AAEO,IAAM,sBAAsB,GAAE,OAAO;AAAA,EAC3C,QAAQ,GAAE,OAAO,EAAE,MAAM,0BAA0B,uBAAuB;AAAA,EAC1E,UAAU,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,SAAS,GAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,mBAAmB;AAAA,EACrD,QAAQ,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACjC,cAAc,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,qBAAqB;AAAA,EACjE,YAAY,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACpC,iBAAiB,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,yBAAyB;AAAA,EACxE,iBAAiB,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,yBAAyB;AAAA,EACxE,wBAAwB,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAChD,gBAAgB,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,uBAAuB;AAAA,EACrE,iBAAiB,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAC1C,sBAAsB,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,mBAAmB;AAAA,EACvE,WAAW,GAAE,QAAQ,EAAE,QAAQ,IAAI;AACpC,CAAC;AAAA;AA2IM,MAAM,qBAAqB,MAAM;AAAA,EAGtB;AAAA,EACA;AAAA,EAHjB,WAAW,CACV,SACgB,MACA,QACf;AAAA,IACD,MAAM,OAAO;AAAA,IAHG;AAAA,IACA;AAAA,IAGhB,KAAK,OAAO;AAAA;AAEd;",
8
+ "debugId": "028253F8E0BBFEA764756E2164756E21",
9
9
  "names": []
10
10
  }