@framers/agentos-ext-channel-bluesky 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +98 -0
  2. package/dist/BlueskyChannelAdapter.d.ts +53 -0
  3. package/dist/BlueskyChannelAdapter.d.ts.map +1 -0
  4. package/dist/BlueskyChannelAdapter.js +92 -0
  5. package/dist/BlueskyChannelAdapter.js.map +1 -0
  6. package/dist/BlueskyService.d.ts +140 -0
  7. package/dist/BlueskyService.d.ts.map +1 -0
  8. package/dist/BlueskyService.js +291 -0
  9. package/dist/BlueskyService.js.map +1 -0
  10. package/dist/index.d.ts +43 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +122 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/tools/analytics.d.ts +35 -0
  15. package/dist/tools/analytics.d.ts.map +1 -0
  16. package/dist/tools/analytics.js +55 -0
  17. package/dist/tools/analytics.js.map +1 -0
  18. package/dist/tools/feed.d.ts +47 -0
  19. package/dist/tools/feed.d.ts.map +1 -0
  20. package/dist/tools/feed.js +53 -0
  21. package/dist/tools/feed.js.map +1 -0
  22. package/dist/tools/follow.d.ts +42 -0
  23. package/dist/tools/follow.d.ts.map +1 -0
  24. package/dist/tools/follow.js +51 -0
  25. package/dist/tools/follow.js.map +1 -0
  26. package/dist/tools/like.d.ts +47 -0
  27. package/dist/tools/like.d.ts.map +1 -0
  28. package/dist/tools/like.js +49 -0
  29. package/dist/tools/like.js.map +1 -0
  30. package/dist/tools/post.d.ts +51 -0
  31. package/dist/tools/post.d.ts.map +1 -0
  32. package/dist/tools/post.js +67 -0
  33. package/dist/tools/post.js.map +1 -0
  34. package/dist/tools/reply.d.ts +56 -0
  35. package/dist/tools/reply.d.ts.map +1 -0
  36. package/dist/tools/reply.js +47 -0
  37. package/dist/tools/reply.js.map +1 -0
  38. package/dist/tools/repost.d.ts +47 -0
  39. package/dist/tools/repost.d.ts.map +1 -0
  40. package/dist/tools/repost.js +49 -0
  41. package/dist/tools/repost.js.map +1 -0
  42. package/dist/tools/search.d.ts +48 -0
  43. package/dist/tools/search.d.ts.map +1 -0
  44. package/dist/tools/search.js +51 -0
  45. package/dist/tools/search.js.map +1 -0
  46. package/manifest.json +35 -0
  47. package/package.json +35 -0
@@ -0,0 +1,291 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * @fileoverview Bluesky AT Protocol service layer.
5
+ *
6
+ * Wraps @atproto/api for post creation, engagement, search,
7
+ * feed reading, following, and analytics on the Bluesky network.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.BlueskyService = void 0;
11
+ const api_1 = require("@atproto/api");
12
+ // ---------------------------------------------------------------------------
13
+ // Service
14
+ // ---------------------------------------------------------------------------
15
+ class BlueskyService {
16
+ agent = null;
17
+ config;
18
+ running = false;
19
+ sessionData = null;
20
+ constructor(config) {
21
+ this.config = {
22
+ ...config,
23
+ service: config.service ?? 'https://bsky.social',
24
+ };
25
+ }
26
+ /**
27
+ * Initialize the Bluesky agent and authenticate.
28
+ * Creates a BskyAgent, logs in with the configured handle and app password.
29
+ */
30
+ async initialize() {
31
+ this.agent = new api_1.BskyAgent({
32
+ service: this.config.service,
33
+ persistSession: (_evt, sess) => {
34
+ if (sess) {
35
+ this.sessionData = sess;
36
+ }
37
+ },
38
+ });
39
+ await this.agent.login({
40
+ identifier: this.config.handle,
41
+ password: this.config.appPassword,
42
+ });
43
+ this.running = true;
44
+ }
45
+ async shutdown() {
46
+ this.agent = null;
47
+ this.sessionData = null;
48
+ this.running = false;
49
+ }
50
+ get isRunning() {
51
+ return this.running;
52
+ }
53
+ get handle() {
54
+ return this.config.handle;
55
+ }
56
+ // ── Posting ──────────────────────────────────────────────────────────────
57
+ /**
58
+ * Create a post with rich-text facet detection (mentions, links, hashtags).
59
+ * Optionally attach images and/or reply to or quote another post.
60
+ */
61
+ async createPost(text, options) {
62
+ const agent = this.requireAgent();
63
+ // Build RichText and detect facets (mentions, links, hashtags)
64
+ const rt = new api_1.RichText({ text });
65
+ await rt.detectFacets(agent);
66
+ // Build the record
67
+ const record = {
68
+ $type: 'app.bsky.feed.post',
69
+ text: rt.text,
70
+ facets: rt.facets,
71
+ createdAt: new Date().toISOString(),
72
+ };
73
+ // Attach images via blob upload
74
+ if (options?.images?.length) {
75
+ const imageEmbeds = [];
76
+ for (const img of options.images) {
77
+ const uploadResult = await agent.uploadBlob(img.data, { encoding: img.mimeType });
78
+ imageEmbeds.push({
79
+ alt: img.alt ?? '',
80
+ image: uploadResult.data.blob,
81
+ });
82
+ }
83
+ record.embed = {
84
+ $type: 'app.bsky.embed.images',
85
+ images: imageEmbeds,
86
+ };
87
+ }
88
+ // Quote post embed
89
+ if (options?.quote) {
90
+ record.embed = {
91
+ $type: 'app.bsky.embed.record',
92
+ record: {
93
+ uri: options.quote.uri,
94
+ cid: options.quote.cid,
95
+ },
96
+ };
97
+ }
98
+ // Reply reference
99
+ if (options?.replyTo) {
100
+ record.reply = {
101
+ root: {
102
+ uri: options.replyTo.uri,
103
+ cid: options.replyTo.cid,
104
+ },
105
+ parent: {
106
+ uri: options.replyTo.uri,
107
+ cid: options.replyTo.cid,
108
+ },
109
+ };
110
+ }
111
+ // Language tags
112
+ if (options?.langs?.length) {
113
+ record.langs = options.langs;
114
+ }
115
+ const result = await agent.post(record);
116
+ const rkey = result.uri.split('/').pop() ?? '';
117
+ const url = this.buildPostUrl(this.config.handle, rkey);
118
+ return { uri: result.uri, cid: result.cid, url };
119
+ }
120
+ // ── Reply ────────────────────────────────────────────────────────────────
121
+ /**
122
+ * Reply to a post. Uses the parent/root threading model required by AT Protocol.
123
+ */
124
+ async reply(parentUri, parentCid, rootUri, rootCid, text) {
125
+ const agent = this.requireAgent();
126
+ const rt = new api_1.RichText({ text });
127
+ await rt.detectFacets(agent);
128
+ const record = {
129
+ $type: 'app.bsky.feed.post',
130
+ text: rt.text,
131
+ facets: rt.facets,
132
+ createdAt: new Date().toISOString(),
133
+ reply: {
134
+ root: { uri: rootUri, cid: rootCid },
135
+ parent: { uri: parentUri, cid: parentCid },
136
+ },
137
+ };
138
+ const result = await agent.post(record);
139
+ const rkey = result.uri.split('/').pop() ?? '';
140
+ const url = this.buildPostUrl(this.config.handle, rkey);
141
+ return { uri: result.uri, cid: result.cid, url };
142
+ }
143
+ // ── Engagement ───────────────────────────────────────────────────────────
144
+ /** Like a post. Returns the like record URI (needed for unlike). */
145
+ async like(uri, cid) {
146
+ const agent = this.requireAgent();
147
+ const result = await agent.like(uri, cid);
148
+ return { uri: result.uri };
149
+ }
150
+ /** Remove a like by its record URI. */
151
+ async unlike(likeUri) {
152
+ const agent = this.requireAgent();
153
+ await agent.deleteLike(likeUri);
154
+ }
155
+ /** Repost a post. Returns the repost record URI (needed for unrepost). */
156
+ async repost(uri, cid) {
157
+ const agent = this.requireAgent();
158
+ const result = await agent.repost(uri, cid);
159
+ return { uri: result.uri };
160
+ }
161
+ /** Remove a repost by its record URI. */
162
+ async unrepost(repostUri) {
163
+ const agent = this.requireAgent();
164
+ await agent.deleteRepost(repostUri);
165
+ }
166
+ // ── Search ───────────────────────────────────────────────────────────────
167
+ /** Search posts by query string. */
168
+ async searchPosts(query, limit = 25) {
169
+ const agent = this.requireAgent();
170
+ const result = await agent.app.bsky.feed.searchPosts({
171
+ q: query,
172
+ limit: Math.min(limit, 100),
173
+ });
174
+ return (result.data.posts ?? []).map((p) => this.mapPostView(p));
175
+ }
176
+ /** Search for actors (users) by query string. */
177
+ async searchActors(query, limit = 25) {
178
+ const agent = this.requireAgent();
179
+ const result = await agent.searchActors({
180
+ term: query,
181
+ limit: Math.min(limit, 100),
182
+ });
183
+ return (result.data.actors ?? []).map((a) => ({
184
+ did: a.did,
185
+ handle: a.handle,
186
+ displayName: a.displayName,
187
+ description: a.description,
188
+ }));
189
+ }
190
+ // ── Feeds ────────────────────────────────────────────────────────────────
191
+ /** Get the authenticated user's timeline. */
192
+ async getTimeline(limit = 50, cursor) {
193
+ const agent = this.requireAgent();
194
+ const result = await agent.getTimeline({
195
+ limit: Math.min(limit, 100),
196
+ cursor,
197
+ });
198
+ const posts = (result.data.feed ?? []).map((item) => this.mapPostView(item.post));
199
+ return { posts, cursor: result.data.cursor };
200
+ }
201
+ /** Get a specific author's feed. */
202
+ async getAuthorFeed(handle, limit = 50) {
203
+ const agent = this.requireAgent();
204
+ const result = await agent.getAuthorFeed({
205
+ actor: handle,
206
+ limit: Math.min(limit, 100),
207
+ });
208
+ return (result.data.feed ?? []).map((item) => this.mapPostView(item.post));
209
+ }
210
+ // ── Following ────────────────────────────────────────────────────────────
211
+ /** Follow a user by DID. Returns the follow record URI (needed for unfollow). */
212
+ async follow(did) {
213
+ const agent = this.requireAgent();
214
+ const result = await agent.follow(did);
215
+ return { uri: result.uri };
216
+ }
217
+ /** Unfollow a user by removing the follow record URI. */
218
+ async unfollow(followUri) {
219
+ const agent = this.requireAgent();
220
+ await agent.deleteFollow(followUri);
221
+ }
222
+ // ── Profile ──────────────────────────────────────────────────────────────
223
+ /** Get a user's profile. Defaults to the authenticated user. */
224
+ async getProfile(handle) {
225
+ const agent = this.requireAgent();
226
+ const result = await agent.getProfile({ actor: handle ?? this.config.handle });
227
+ const p = result.data;
228
+ return {
229
+ did: p.did,
230
+ handle: p.handle,
231
+ displayName: p.displayName,
232
+ description: p.description,
233
+ followersCount: p.followersCount ?? 0,
234
+ followsCount: p.followsCount ?? 0,
235
+ postsCount: p.postsCount ?? 0,
236
+ avatar: p.avatar,
237
+ };
238
+ }
239
+ // ── Thread ───────────────────────────────────────────────────────────────
240
+ /** Get a full post thread (ancestors + replies). */
241
+ async getPostThread(uri) {
242
+ const agent = this.requireAgent();
243
+ const result = await agent.getPostThread({ uri });
244
+ return result.data.thread;
245
+ }
246
+ // ── Delete ───────────────────────────────────────────────────────────────
247
+ /** Delete a post by its AT URI. */
248
+ async deletePost(uri) {
249
+ const agent = this.requireAgent();
250
+ await agent.deletePost(uri);
251
+ }
252
+ // ── Resolve Handle ───────────────────────────────────────────────────────
253
+ /** Resolve a handle to a DID. */
254
+ async resolveHandle(handle) {
255
+ const agent = this.requireAgent();
256
+ const result = await agent.resolveHandle({ handle });
257
+ return result.data.did;
258
+ }
259
+ // ── Helpers ──────────────────────────────────────────────────────────────
260
+ /**
261
+ * Build a human-readable Bluesky post URL.
262
+ * @param handle - The author's handle (e.g. "alice.bsky.social")
263
+ * @param rkey - The record key (last segment of the AT URI)
264
+ */
265
+ buildPostUrl(handle, rkey) {
266
+ return `https://bsky.app/profile/${handle}/post/${rkey}`;
267
+ }
268
+ // ── Internal ─────────────────────────────────────────────────────────────
269
+ requireAgent() {
270
+ if (!this.agent) {
271
+ throw new Error('Bluesky service not initialized. Call initialize() first.');
272
+ }
273
+ return this.agent;
274
+ }
275
+ /** Map a raw post object to a PostView. */
276
+ mapPostView(post) {
277
+ return {
278
+ uri: post.uri,
279
+ cid: post.cid,
280
+ text: post.record?.text ?? '',
281
+ authorHandle: post.author?.handle ?? '',
282
+ authorDisplayName: post.author?.displayName,
283
+ createdAt: post.record?.createdAt ?? post.indexedAt,
284
+ likeCount: post.likeCount ?? 0,
285
+ repostCount: post.repostCount ?? 0,
286
+ replyCount: post.replyCount ?? 0,
287
+ };
288
+ }
289
+ }
290
+ exports.BlueskyService = BlueskyService;
291
+ //# sourceMappingURL=BlueskyService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlueskyService.js","sourceRoot":"","sources":["../src/BlueskyService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @fileoverview Bluesky Channel Extension for AgentOS.
3
+ *
4
+ * Provides a full IChannelAdapter + 8 tools for autonomous Bluesky interaction
5
+ * via the AT Protocol (@atproto/api).
6
+ *
7
+ * @module @framers/agentos-ext-channel-bluesky
8
+ */
9
+ export interface BlueskyChannelOptions {
10
+ handle?: string;
11
+ appPassword?: string;
12
+ service?: string;
13
+ secrets?: Record<string, string>;
14
+ }
15
+ export interface ExtensionContext {
16
+ options?: Record<string, unknown>;
17
+ secrets?: Record<string, string>;
18
+ }
19
+ export interface ExtensionPack {
20
+ name: string;
21
+ version: string;
22
+ descriptors: Array<{
23
+ id: string;
24
+ kind: string;
25
+ priority?: number;
26
+ payload: unknown;
27
+ }>;
28
+ onActivate?: () => Promise<void>;
29
+ onDeactivate?: () => Promise<void>;
30
+ }
31
+ export declare function createExtensionPack(context: ExtensionContext): ExtensionPack;
32
+ export { BlueskyService } from './BlueskyService.js';
33
+ export type { BlueskyConfig, PostOptions, PostResult, PostView } from './BlueskyService.js';
34
+ export { BlueskyChannelAdapter } from './BlueskyChannelAdapter.js';
35
+ export { BlueskyPostTool } from './tools/post.js';
36
+ export { BlueskyReplyTool } from './tools/reply.js';
37
+ export { BlueskyLikeTool } from './tools/like.js';
38
+ export { BlueskyRepostTool } from './tools/repost.js';
39
+ export { BlueskySearchTool } from './tools/search.js';
40
+ export { BlueskyFeedTool } from './tools/feed.js';
41
+ export { BlueskyFollowTool } from './tools/follow.js';
42
+ export { BlueskyAnalyticsTool } from './tools/analytics.js';
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAkBH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAyBD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACtF,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAMD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,CA+D5E;AAMD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * @fileoverview Bluesky Channel Extension for AgentOS.
5
+ *
6
+ * Provides a full IChannelAdapter + 8 tools for autonomous Bluesky interaction
7
+ * via the AT Protocol (@atproto/api).
8
+ *
9
+ * @module @framers/agentos-ext-channel-bluesky
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.BlueskyAnalyticsTool = exports.BlueskyFollowTool = exports.BlueskyFeedTool = exports.BlueskySearchTool = exports.BlueskyRepostTool = exports.BlueskyLikeTool = exports.BlueskyReplyTool = exports.BlueskyPostTool = exports.BlueskyChannelAdapter = exports.BlueskyService = void 0;
13
+ exports.createExtensionPack = createExtensionPack;
14
+ const BlueskyService_js_1 = require("./BlueskyService.js");
15
+ const BlueskyChannelAdapter_js_1 = require("./BlueskyChannelAdapter.js");
16
+ const post_js_1 = require("./tools/post.js");
17
+ const reply_js_1 = require("./tools/reply.js");
18
+ const like_js_1 = require("./tools/like.js");
19
+ const repost_js_1 = require("./tools/repost.js");
20
+ const search_js_1 = require("./tools/search.js");
21
+ const feed_js_1 = require("./tools/feed.js");
22
+ const follow_js_1 = require("./tools/follow.js");
23
+ const analytics_js_1 = require("./tools/analytics.js");
24
+ // ---------------------------------------------------------------------------
25
+ // Secret Resolution
26
+ // ---------------------------------------------------------------------------
27
+ function resolveConfig(opts, secrets) {
28
+ return {
29
+ handle: opts.handle ?? secrets['bluesky.handle']
30
+ ?? process.env.BLUESKY_HANDLE ?? process.env.BSKY_HANDLE ?? '',
31
+ appPassword: opts.appPassword ?? secrets['bluesky.appPassword']
32
+ ?? process.env.BLUESKY_APP_PASSWORD ?? process.env.BSKY_APP_PASSWORD ?? '',
33
+ service: opts.service ?? secrets['bluesky.service']
34
+ ?? process.env.BLUESKY_SERVICE ?? process.env.BSKY_SERVICE
35
+ ?? 'https://bsky.social',
36
+ };
37
+ }
38
+ // ---------------------------------------------------------------------------
39
+ // Factory
40
+ // ---------------------------------------------------------------------------
41
+ function createExtensionPack(context) {
42
+ const opts = (context.options ?? {});
43
+ const secrets = opts.secrets ?? context.secrets ?? {};
44
+ const config = resolveConfig(opts, secrets);
45
+ const service = new BlueskyService_js_1.BlueskyService(config);
46
+ const adapter = new BlueskyChannelAdapter_js_1.BlueskyChannelAdapter(service);
47
+ const postTool = new post_js_1.BlueskyPostTool(service);
48
+ const replyTool = new reply_js_1.BlueskyReplyTool(service);
49
+ const likeTool = new like_js_1.BlueskyLikeTool(service);
50
+ const repostTool = new repost_js_1.BlueskyRepostTool(service);
51
+ const searchTool = new search_js_1.BlueskySearchTool(service);
52
+ const feedTool = new feed_js_1.BlueskyFeedTool(service);
53
+ const followTool = new follow_js_1.BlueskyFollowTool(service);
54
+ const analyticsTool = new analytics_js_1.BlueskyAnalyticsTool(service);
55
+ return {
56
+ name: '@framers/agentos-ext-channel-bluesky',
57
+ version: '0.1.0',
58
+ descriptors: [
59
+ { id: 'blueskyPost', kind: 'tool', priority: 50, payload: postTool },
60
+ { id: 'blueskyReply', kind: 'tool', priority: 50, payload: replyTool },
61
+ { id: 'blueskyLike', kind: 'tool', priority: 50, payload: likeTool },
62
+ { id: 'blueskyRepost', kind: 'tool', priority: 50, payload: repostTool },
63
+ { id: 'blueskySearch', kind: 'tool', priority: 50, payload: searchTool },
64
+ { id: 'blueskyFeed', kind: 'tool', priority: 50, payload: feedTool },
65
+ { id: 'blueskyFollow', kind: 'tool', priority: 50, payload: followTool },
66
+ { id: 'blueskyAnalytics', kind: 'tool', priority: 50, payload: analyticsTool },
67
+ { id: 'blueskyChannel', kind: 'messaging-channel', priority: 50, payload: adapter },
68
+ ],
69
+ onActivate: async () => {
70
+ if (!config.handle || !config.appPassword) {
71
+ try {
72
+ const { FileTokenStore } = await import('@framers/agentos/auth');
73
+ const tokens = await new FileTokenStore().load('bluesky');
74
+ if (tokens?.accessToken) {
75
+ const metadata = tokens.metadata ?? {};
76
+ config.appPassword = config.appPassword || tokens.accessToken;
77
+ config.handle = config.handle || metadata.handle || '';
78
+ config.service = config.service || metadata.service || config.service;
79
+ }
80
+ }
81
+ catch { /* FileTokenStore not available — ignore */ }
82
+ }
83
+ if (!config.handle || !config.appPassword) {
84
+ throw new Error('Bluesky: no credentials provided. Set BLUESKY_HANDLE (or BSKY_HANDLE) and '
85
+ + 'BLUESKY_APP_PASSWORD (or BSKY_APP_PASSWORD) environment variables, '
86
+ + 'or provide them via secrets["bluesky.handle"] and secrets["bluesky.appPassword"].');
87
+ }
88
+ await service.initialize();
89
+ await adapter.initialize({
90
+ platform: 'bluesky',
91
+ credential: config.handle,
92
+ });
93
+ },
94
+ onDeactivate: async () => {
95
+ await adapter.shutdown();
96
+ },
97
+ };
98
+ }
99
+ // ---------------------------------------------------------------------------
100
+ // Public exports
101
+ // ---------------------------------------------------------------------------
102
+ var BlueskyService_js_2 = require("./BlueskyService.js");
103
+ Object.defineProperty(exports, "BlueskyService", { enumerable: true, get: function () { return BlueskyService_js_2.BlueskyService; } });
104
+ var BlueskyChannelAdapter_js_2 = require("./BlueskyChannelAdapter.js");
105
+ Object.defineProperty(exports, "BlueskyChannelAdapter", { enumerable: true, get: function () { return BlueskyChannelAdapter_js_2.BlueskyChannelAdapter; } });
106
+ var post_js_2 = require("./tools/post.js");
107
+ Object.defineProperty(exports, "BlueskyPostTool", { enumerable: true, get: function () { return post_js_2.BlueskyPostTool; } });
108
+ var reply_js_2 = require("./tools/reply.js");
109
+ Object.defineProperty(exports, "BlueskyReplyTool", { enumerable: true, get: function () { return reply_js_2.BlueskyReplyTool; } });
110
+ var like_js_2 = require("./tools/like.js");
111
+ Object.defineProperty(exports, "BlueskyLikeTool", { enumerable: true, get: function () { return like_js_2.BlueskyLikeTool; } });
112
+ var repost_js_2 = require("./tools/repost.js");
113
+ Object.defineProperty(exports, "BlueskyRepostTool", { enumerable: true, get: function () { return repost_js_2.BlueskyRepostTool; } });
114
+ var search_js_2 = require("./tools/search.js");
115
+ Object.defineProperty(exports, "BlueskySearchTool", { enumerable: true, get: function () { return search_js_2.BlueskySearchTool; } });
116
+ var feed_js_2 = require("./tools/feed.js");
117
+ Object.defineProperty(exports, "BlueskyFeedTool", { enumerable: true, get: function () { return feed_js_2.BlueskyFeedTool; } });
118
+ var follow_js_2 = require("./tools/follow.js");
119
+ Object.defineProperty(exports, "BlueskyFollowTool", { enumerable: true, get: function () { return follow_js_2.BlueskyFollowTool; } });
120
+ var analytics_js_2 = require("./tools/analytics.js");
121
+ Object.defineProperty(exports, "BlueskyAnalyticsTool", { enumerable: true, get: function () { return analytics_js_2.BlueskyAnalyticsTool; } });
122
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @fileoverview BlueskyAnalyticsTool — get engagement metrics for a Bluesky post.
3
+ *
4
+ * Fetches the post thread and extracts like, repost, and reply counts.
5
+ */
6
+ import type { BlueskyService } from '../BlueskyService.js';
7
+ export declare class BlueskyAnalyticsTool {
8
+ private service;
9
+ readonly id = "blueskyAnalytics";
10
+ readonly name = "blueskyAnalytics";
11
+ readonly displayName = "Post Analytics";
12
+ readonly description = "Get engagement metrics (likes, reposts, replies) for a specific Bluesky post.";
13
+ readonly category = "social";
14
+ readonly version = "0.1.0";
15
+ readonly hasSideEffects = false;
16
+ readonly inputSchema: {
17
+ type: "object";
18
+ properties: {
19
+ uri: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ };
24
+ required: string[];
25
+ };
26
+ constructor(service: BlueskyService);
27
+ execute(args: {
28
+ uri: string;
29
+ }): Promise<{
30
+ success: boolean;
31
+ data?: any;
32
+ error?: string;
33
+ }>;
34
+ }
35
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qBAAa,oBAAoB;IAiBnB,OAAO,CAAC,OAAO;IAhB3B,QAAQ,CAAC,EAAE,sBAAsB;IACjC,QAAQ,CAAC,IAAI,sBAAsB;IACnC,QAAQ,CAAC,WAAW,oBAAoB;IACxC,QAAQ,CAAC,WAAW,mFAAmF;IACvG,QAAQ,CAAC,QAAQ,YAAY;IAC7B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,cAAc,SAAS;IAEhC,QAAQ,CAAC,WAAW;;;;;;;;;MAMlB;gBAEkB,OAAO,EAAE,cAAc;IAErC,OAAO,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CA0BhG"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * @fileoverview BlueskyAnalyticsTool — get engagement metrics for a Bluesky post.
5
+ *
6
+ * Fetches the post thread and extracts like, repost, and reply counts.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.BlueskyAnalyticsTool = void 0;
10
+ class BlueskyAnalyticsTool {
11
+ service;
12
+ id = 'blueskyAnalytics';
13
+ name = 'blueskyAnalytics';
14
+ displayName = 'Post Analytics';
15
+ description = 'Get engagement metrics (likes, reposts, replies) for a specific Bluesky post.';
16
+ category = 'social';
17
+ version = '0.1.0';
18
+ hasSideEffects = false;
19
+ inputSchema = {
20
+ type: 'object',
21
+ properties: {
22
+ uri: { type: 'string', description: 'AT URI of the post to analyze' },
23
+ },
24
+ required: ['uri'],
25
+ };
26
+ constructor(service) {
27
+ this.service = service;
28
+ }
29
+ async execute(args) {
30
+ try {
31
+ const thread = await this.service.getPostThread(args.uri);
32
+ const post = thread?.post;
33
+ if (!post) {
34
+ return { success: false, error: 'Post not found' };
35
+ }
36
+ const metrics = {
37
+ uri: post.uri,
38
+ cid: post.cid,
39
+ text: post.record?.text ?? '',
40
+ authorHandle: post.author?.handle ?? '',
41
+ authorDisplayName: post.author?.displayName,
42
+ createdAt: post.record?.createdAt ?? post.indexedAt,
43
+ likeCount: post.likeCount ?? 0,
44
+ repostCount: post.repostCount ?? 0,
45
+ replyCount: post.replyCount ?? 0,
46
+ };
47
+ return { success: true, data: metrics };
48
+ }
49
+ catch (err) {
50
+ return { success: false, error: err.message };
51
+ }
52
+ }
53
+ }
54
+ exports.BlueskyAnalyticsTool = BlueskyAnalyticsTool;
55
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":";AAAA,cAAc;AACd;;;;GAIG;;;AAIH,MAAa,oBAAoB;IAiBX;IAhBX,EAAE,GAAG,kBAAkB,CAAC;IACxB,IAAI,GAAG,kBAAkB,CAAC;IAC1B,WAAW,GAAG,gBAAgB,CAAC;IAC/B,WAAW,GAAG,+EAA+E,CAAC;IAC9F,QAAQ,GAAG,QAAQ,CAAC;IACpB,OAAO,GAAG,OAAO,CAAC;IAClB,cAAc,GAAG,KAAK,CAAC;IAEvB,WAAW,GAAG;QACrB,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;SACtE;QACD,QAAQ,EAAE,CAAC,KAAK,CAAC;KAClB,CAAC;IAEF,YAAoB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAE/C,KAAK,CAAC,OAAO,CAAC,IAAqB;QACjC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,CAAC;YAE1B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;YACrD,CAAC;YAED,MAAM,OAAO,GAAG;gBACd,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE;gBAC7B,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE;gBACvC,iBAAiB,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW;gBAC3C,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC,SAAS;gBACnD,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,CAAC;gBAC9B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC;gBAClC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;aACjC,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;CACF;AA7CD,oDA6CC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @fileoverview BlueskyFeedTool — retrieve timeline or a specific author's feed.
3
+ *
4
+ * Supports two modes:
5
+ * - "timeline" (default): The authenticated user's home timeline.
6
+ * - "author": A specific user's post feed (requires handle).
7
+ */
8
+ import type { BlueskyService } from '../BlueskyService.js';
9
+ export declare class BlueskyFeedTool {
10
+ private service;
11
+ readonly id = "blueskyFeed";
12
+ readonly name = "blueskyFeed";
13
+ readonly displayName = "Get Feed";
14
+ readonly description = "Get the authenticated user's timeline or a specific author's feed on Bluesky.";
15
+ readonly category = "social";
16
+ readonly version = "0.1.0";
17
+ readonly hasSideEffects = false;
18
+ readonly inputSchema: {
19
+ type: "object";
20
+ properties: {
21
+ type: {
22
+ type: string;
23
+ enum: string[];
24
+ description: string;
25
+ };
26
+ handle: {
27
+ type: string;
28
+ description: string;
29
+ };
30
+ limit: {
31
+ type: string;
32
+ description: string;
33
+ };
34
+ };
35
+ };
36
+ constructor(service: BlueskyService);
37
+ execute(args: {
38
+ type?: 'timeline' | 'author';
39
+ handle?: string;
40
+ limit?: number;
41
+ }): Promise<{
42
+ success: boolean;
43
+ data?: any;
44
+ error?: string;
45
+ }>;
46
+ }
47
+ //# sourceMappingURL=feed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../src/tools/feed.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qBAAa,eAAe;IAkBd,OAAO,CAAC,OAAO;IAjB3B,QAAQ,CAAC,EAAE,iBAAiB;IAC5B,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,cAAc;IAClC,QAAQ,CAAC,WAAW,mFAAqF;IACzG,QAAQ,CAAC,QAAQ,YAAY;IAC7B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,cAAc,SAAS;IAEhC,QAAQ,CAAC,WAAW;;;;;;;;;;;;;;;;;MAOlB;gBAEkB,OAAO,EAAE,cAAc;IAErC,OAAO,CAAC,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAkBlJ"}