@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,53 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * @fileoverview BlueskyFeedTool — retrieve timeline or a specific author's feed.
5
+ *
6
+ * Supports two modes:
7
+ * - "timeline" (default): The authenticated user's home timeline.
8
+ * - "author": A specific user's post feed (requires handle).
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.BlueskyFeedTool = void 0;
12
+ class BlueskyFeedTool {
13
+ service;
14
+ id = 'blueskyFeed';
15
+ name = 'blueskyFeed';
16
+ displayName = 'Get Feed';
17
+ description = 'Get the authenticated user\'s timeline or a specific author\'s feed on Bluesky.';
18
+ category = 'social';
19
+ version = '0.1.0';
20
+ hasSideEffects = false;
21
+ inputSchema = {
22
+ type: 'object',
23
+ properties: {
24
+ type: { type: 'string', enum: ['timeline', 'author'], description: 'Feed type (default: "timeline")' },
25
+ handle: { type: 'string', description: 'Author handle (required when type is "author")' },
26
+ limit: { type: 'number', description: 'Max posts to return (default 50, max 100)' },
27
+ },
28
+ };
29
+ constructor(service) {
30
+ this.service = service;
31
+ }
32
+ async execute(args) {
33
+ try {
34
+ const feedType = args.type ?? 'timeline';
35
+ if (feedType === 'author') {
36
+ if (!args.handle) {
37
+ return { success: false, error: 'handle is required when type is "author"' };
38
+ }
39
+ const posts = await this.service.getAuthorFeed(args.handle, args.limit);
40
+ return { success: true, data: posts };
41
+ }
42
+ else {
43
+ const result = await this.service.getTimeline(args.limit);
44
+ return { success: true, data: result };
45
+ }
46
+ }
47
+ catch (err) {
48
+ return { success: false, error: err.message };
49
+ }
50
+ }
51
+ }
52
+ exports.BlueskyFeedTool = BlueskyFeedTool;
53
+ //# sourceMappingURL=feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.js","sourceRoot":"","sources":["../../src/tools/feed.ts"],"names":[],"mappings":";AAAA,cAAc;AACd;;;;;;GAMG;;;AAIH,MAAa,eAAe;IAkBN;IAjBX,EAAE,GAAG,aAAa,CAAC;IACnB,IAAI,GAAG,aAAa,CAAC;IACrB,WAAW,GAAG,UAAU,CAAC;IACzB,WAAW,GAAG,iFAAiF,CAAC;IAChG,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,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,iCAAiC,EAAE;YACtG,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gDAAgD,EAAE;YACzF,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE;SACpF;KACF,CAAC;IAEF,YAAoB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAE/C,KAAK,CAAC,OAAO,CAAC,IAAuE;QACnF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC;YAEzC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAC;gBAC/E,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACzC,CAAC;QACH,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;AAtCD,0CAsCC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @fileoverview BlueskyFollowTool — follow or unfollow a user on Bluesky.
3
+ *
4
+ * Resolves a handle to a DID before following.
5
+ * Unfollowing requires the follow record URI from a prior follow operation.
6
+ */
7
+ import type { BlueskyService } from '../BlueskyService.js';
8
+ export declare class BlueskyFollowTool {
9
+ private service;
10
+ readonly id = "blueskyFollow";
11
+ readonly name = "blueskyFollow";
12
+ readonly displayName = "Follow User";
13
+ readonly description = "Follow or unfollow a user on Bluesky by handle.";
14
+ readonly category = "social";
15
+ readonly version = "0.1.0";
16
+ readonly hasSideEffects = true;
17
+ readonly inputSchema: {
18
+ type: "object";
19
+ properties: {
20
+ handle: {
21
+ type: string;
22
+ description: string;
23
+ };
24
+ unfollow: {
25
+ type: string;
26
+ description: string;
27
+ default: boolean;
28
+ };
29
+ };
30
+ required: string[];
31
+ };
32
+ constructor(service: BlueskyService);
33
+ execute(args: {
34
+ handle: string;
35
+ unfollow?: boolean;
36
+ }): Promise<{
37
+ success: boolean;
38
+ data?: any;
39
+ error?: string;
40
+ }>;
41
+ }
42
+ //# sourceMappingURL=follow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow.d.ts","sourceRoot":"","sources":["../../src/tools/follow.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qBAAa,iBAAiB;IAkBhB,OAAO,CAAC,OAAO;IAjB3B,QAAQ,CAAC,EAAE,mBAAmB;IAC9B,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,WAAW,iBAAiB;IACrC,QAAQ,CAAC,WAAW,qDAAqD;IACzE,QAAQ,CAAC,QAAQ,YAAY;IAC7B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,cAAc,QAAQ;IAE/B,QAAQ,CAAC,WAAW;;;;;;;;;;;;;;MAOlB;gBAEkB,OAAO,EAAE,cAAc;IAErC,OAAO,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAgBvH"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * @fileoverview BlueskyFollowTool — follow or unfollow a user on Bluesky.
5
+ *
6
+ * Resolves a handle to a DID before following.
7
+ * Unfollowing requires the follow record URI from a prior follow operation.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.BlueskyFollowTool = void 0;
11
+ class BlueskyFollowTool {
12
+ service;
13
+ id = 'blueskyFollow';
14
+ name = 'blueskyFollow';
15
+ displayName = 'Follow User';
16
+ description = 'Follow or unfollow a user on Bluesky by handle.';
17
+ category = 'social';
18
+ version = '0.1.0';
19
+ hasSideEffects = true;
20
+ inputSchema = {
21
+ type: 'object',
22
+ properties: {
23
+ handle: { type: 'string', description: 'Bluesky handle to follow (e.g. "alice.bsky.social")' },
24
+ unfollow: { type: 'boolean', description: 'Set to true to unfollow (handle should then be the follow record URI)', default: false },
25
+ },
26
+ required: ['handle'],
27
+ };
28
+ constructor(service) {
29
+ this.service = service;
30
+ }
31
+ async execute(args) {
32
+ try {
33
+ if (args.unfollow) {
34
+ // When unfollowing, the "handle" field is used as the follow record URI
35
+ await this.service.unfollow(args.handle);
36
+ return { success: true };
37
+ }
38
+ else {
39
+ // Resolve handle to DID, then follow
40
+ const did = await this.service.resolveHandle(args.handle);
41
+ const result = await this.service.follow(did);
42
+ return { success: true, data: { did, followUri: result.uri } };
43
+ }
44
+ }
45
+ catch (err) {
46
+ return { success: false, error: err.message };
47
+ }
48
+ }
49
+ }
50
+ exports.BlueskyFollowTool = BlueskyFollowTool;
51
+ //# sourceMappingURL=follow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow.js","sourceRoot":"","sources":["../../src/tools/follow.ts"],"names":[],"mappings":";AAAA,cAAc;AACd;;;;;GAKG;;;AAIH,MAAa,iBAAiB;IAkBR;IAjBX,EAAE,GAAG,eAAe,CAAC;IACrB,IAAI,GAAG,eAAe,CAAC;IACvB,WAAW,GAAG,aAAa,CAAC;IAC5B,WAAW,GAAG,iDAAiD,CAAC;IAChE,QAAQ,GAAG,QAAQ,CAAC;IACpB,OAAO,GAAG,OAAO,CAAC;IAClB,cAAc,GAAG,IAAI,CAAC;IAEtB,WAAW,GAAG;QACrB,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qDAAqD,EAAE;YAC9F,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,uEAAuE,EAAE,OAAO,EAAE,KAAK,EAAE;SACpI;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB,CAAC;IAEF,YAAoB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAE/C,KAAK,CAAC,OAAO,CAAC,IAA4C;QACxD,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,wEAAwE;gBACxE,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,qCAAqC;gBACrC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC1D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;YACjE,CAAC;QACH,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;AApCD,8CAoCC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @fileoverview BlueskyLikeTool — like or unlike a post on Bluesky.
3
+ *
4
+ * Liking requires the post URI and CID.
5
+ * Unliking requires the like record URI returned from a prior like operation.
6
+ */
7
+ import type { BlueskyService } from '../BlueskyService.js';
8
+ export declare class BlueskyLikeTool {
9
+ private service;
10
+ readonly id = "blueskyLike";
11
+ readonly name = "blueskyLike";
12
+ readonly displayName = "Like Post";
13
+ readonly description = "Like or unlike a Bluesky post.";
14
+ readonly category = "social";
15
+ readonly version = "0.1.0";
16
+ readonly hasSideEffects = true;
17
+ readonly inputSchema: {
18
+ type: "object";
19
+ properties: {
20
+ uri: {
21
+ type: string;
22
+ description: string;
23
+ };
24
+ cid: {
25
+ type: string;
26
+ description: string;
27
+ };
28
+ unlike: {
29
+ type: string;
30
+ description: string;
31
+ default: boolean;
32
+ };
33
+ };
34
+ required: string[];
35
+ };
36
+ constructor(service: BlueskyService);
37
+ execute(args: {
38
+ uri: string;
39
+ cid: string;
40
+ unlike?: boolean;
41
+ }): Promise<{
42
+ success: boolean;
43
+ data?: any;
44
+ error?: string;
45
+ }>;
46
+ }
47
+ //# sourceMappingURL=like.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"like.d.ts","sourceRoot":"","sources":["../../src/tools/like.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qBAAa,eAAe;IAmBd,OAAO,CAAC,OAAO;IAlB3B,QAAQ,CAAC,EAAE,iBAAiB;IAC5B,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,eAAe;IACnC,QAAQ,CAAC,WAAW,oCAAoC;IACxD,QAAQ,CAAC,QAAQ,YAAY;IAC7B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,cAAc,QAAQ;IAE/B,QAAQ,CAAC,WAAW;;;;;;;;;;;;;;;;;;MAQlB;gBAEkB,OAAO,EAAE,cAAc;IAErC,OAAO,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAa/H"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * @fileoverview BlueskyLikeTool — like or unlike a post on Bluesky.
5
+ *
6
+ * Liking requires the post URI and CID.
7
+ * Unliking requires the like record URI returned from a prior like operation.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.BlueskyLikeTool = void 0;
11
+ class BlueskyLikeTool {
12
+ service;
13
+ id = 'blueskyLike';
14
+ name = 'blueskyLike';
15
+ displayName = 'Like Post';
16
+ description = 'Like or unlike a Bluesky post.';
17
+ category = 'social';
18
+ version = '0.1.0';
19
+ hasSideEffects = true;
20
+ inputSchema = {
21
+ type: 'object',
22
+ properties: {
23
+ uri: { type: 'string', description: 'AT URI of the post to like' },
24
+ cid: { type: 'string', description: 'CID of the post to like' },
25
+ unlike: { type: 'boolean', description: 'Set to true to unlike (uri should then be the like record URI)', default: false },
26
+ },
27
+ required: ['uri', 'cid'],
28
+ };
29
+ constructor(service) {
30
+ this.service = service;
31
+ }
32
+ async execute(args) {
33
+ try {
34
+ if (args.unlike) {
35
+ await this.service.unlike(args.uri);
36
+ return { success: true };
37
+ }
38
+ else {
39
+ const result = await this.service.like(args.uri, args.cid);
40
+ return { success: true, data: result };
41
+ }
42
+ }
43
+ catch (err) {
44
+ return { success: false, error: err.message };
45
+ }
46
+ }
47
+ }
48
+ exports.BlueskyLikeTool = BlueskyLikeTool;
49
+ //# sourceMappingURL=like.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"like.js","sourceRoot":"","sources":["../../src/tools/like.ts"],"names":[],"mappings":";AAAA,cAAc;AACd;;;;;GAKG;;;AAIH,MAAa,eAAe;IAmBN;IAlBX,EAAE,GAAG,aAAa,CAAC;IACnB,IAAI,GAAG,aAAa,CAAC;IACrB,WAAW,GAAG,WAAW,CAAC;IAC1B,WAAW,GAAG,gCAAgC,CAAC;IAC/C,QAAQ,GAAG,QAAQ,CAAC;IACpB,OAAO,GAAG,OAAO,CAAC;IAClB,cAAc,GAAG,IAAI,CAAC;IAEtB,WAAW,GAAG;QACrB,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;YAClE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;YAC/D,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gEAAgE,EAAE,OAAO,EAAE,KAAK,EAAE;SAC3H;QACD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;KACzB,CAAC;IAEF,YAAoB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAE/C,KAAK,CAAC,OAAO,CAAC,IAAoD;QAChE,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACzC,CAAC;QACH,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;AAlCD,0CAkCC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @fileoverview BlueskyPostTool — create a post on Bluesky with text, optional images, and language tags.
3
+ *
4
+ * Rich-text facets (mentions, links, hashtags) are detected automatically via the AT Protocol RichText API.
5
+ */
6
+ import type { BlueskyService } from '../BlueskyService.js';
7
+ export declare class BlueskyPostTool {
8
+ private service;
9
+ readonly id = "blueskyPost";
10
+ readonly name = "blueskyPost";
11
+ readonly displayName = "Create Post";
12
+ readonly description = "Create a Bluesky post with text, optional images (up to 4), and language tags. Mentions, links, and hashtags are detected automatically.";
13
+ readonly category = "social";
14
+ readonly version = "0.1.0";
15
+ readonly hasSideEffects = true;
16
+ readonly inputSchema: {
17
+ type: "object";
18
+ properties: {
19
+ text: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ imagePaths: {
24
+ type: string;
25
+ items: {
26
+ type: string;
27
+ };
28
+ description: string;
29
+ };
30
+ langs: {
31
+ type: string;
32
+ items: {
33
+ type: string;
34
+ };
35
+ description: string;
36
+ };
37
+ };
38
+ required: string[];
39
+ };
40
+ constructor(service: BlueskyService);
41
+ execute(args: {
42
+ text: string;
43
+ imagePaths?: string[];
44
+ langs?: string[];
45
+ }): Promise<{
46
+ success: boolean;
47
+ data?: any;
48
+ error?: string;
49
+ }>;
50
+ }
51
+ //# sourceMappingURL=post.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/tools/post.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAa3D,qBAAa,eAAe;IAmBd,OAAO,CAAC,OAAO;IAlB3B,QAAQ,CAAC,EAAE,iBAAiB;IAC5B,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,iBAAiB;IACrC,QAAQ,CAAC,WAAW,8IAA8I;IAClK,QAAQ,CAAC,QAAQ,YAAY;IAC7B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,cAAc,QAAQ;IAE/B,QAAQ,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;MAQlB;gBAEkB,OAAO,EAAE,cAAc;IAErC,OAAO,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAuB1I"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * @fileoverview BlueskyPostTool — create a post on Bluesky with text, optional images, and language tags.
5
+ *
6
+ * Rich-text facets (mentions, links, hashtags) are detected automatically via the AT Protocol RichText API.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.BlueskyPostTool = void 0;
10
+ const promises_1 = require("node:fs/promises");
11
+ const node_path_1 = require("node:path");
12
+ /** Infer MIME type from file extension. */
13
+ function inferMimeType(filePath) {
14
+ const ext = (0, node_path_1.basename)(filePath).split('.').pop()?.toLowerCase();
15
+ switch (ext) {
16
+ case 'png': return 'image/png';
17
+ case 'gif': return 'image/gif';
18
+ case 'webp': return 'image/webp';
19
+ default: return 'image/jpeg';
20
+ }
21
+ }
22
+ class BlueskyPostTool {
23
+ service;
24
+ id = 'blueskyPost';
25
+ name = 'blueskyPost';
26
+ displayName = 'Create Post';
27
+ description = 'Create a Bluesky post with text, optional images (up to 4), and language tags. Mentions, links, and hashtags are detected automatically.';
28
+ category = 'social';
29
+ version = '0.1.0';
30
+ hasSideEffects = true;
31
+ inputSchema = {
32
+ type: 'object',
33
+ properties: {
34
+ text: { type: 'string', description: 'Post text (max 300 graphemes). Mentions (@handle), links, and #hashtags are auto-detected.' },
35
+ imagePaths: { type: 'array', items: { type: 'string' }, description: 'File paths to images to attach (max 4)' },
36
+ langs: { type: 'array', items: { type: 'string' }, description: 'Language tags (e.g. ["en", "ja"])' },
37
+ },
38
+ required: ['text'],
39
+ };
40
+ constructor(service) {
41
+ this.service = service;
42
+ }
43
+ async execute(args) {
44
+ try {
45
+ const images = [];
46
+ if (args.imagePaths?.length) {
47
+ for (const filePath of args.imagePaths.slice(0, 4)) {
48
+ const buffer = await (0, promises_1.readFile)(filePath);
49
+ images.push({
50
+ data: new Uint8Array(buffer),
51
+ mimeType: inferMimeType(filePath),
52
+ });
53
+ }
54
+ }
55
+ const result = await this.service.createPost(args.text, {
56
+ images: images.length ? images : undefined,
57
+ langs: args.langs,
58
+ });
59
+ return { success: true, data: result };
60
+ }
61
+ catch (err) {
62
+ return { success: false, error: err.message };
63
+ }
64
+ }
65
+ }
66
+ exports.BlueskyPostTool = BlueskyPostTool;
67
+ //# sourceMappingURL=post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.js","sourceRoot":"","sources":["../../src/tools/post.ts"],"names":[],"mappings":";AAAA,cAAc;AACd;;;;GAIG;;;AAEH,+CAA4C;AAC5C,yCAAqC;AAGrC,2CAA2C;AAC3C,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,GAAG,GAAG,IAAA,oBAAQ,EAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;IAC/D,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,KAAK,CAAC,CAAC,OAAO,WAAW,CAAC;QAC/B,KAAK,KAAK,CAAC,CAAC,OAAO,WAAW,CAAC;QAC/B,KAAK,MAAM,CAAC,CAAC,OAAO,YAAY,CAAC;QACjC,OAAO,CAAC,CAAC,OAAO,YAAY,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAa,eAAe;IAmBN;IAlBX,EAAE,GAAG,aAAa,CAAC;IACnB,IAAI,GAAG,aAAa,CAAC;IACrB,WAAW,GAAG,aAAa,CAAC;IAC5B,WAAW,GAAG,0IAA0I,CAAC;IACzJ,QAAQ,GAAG,QAAQ,CAAC;IACpB,OAAO,GAAG,OAAO,CAAC;IAClB,cAAc,GAAG,IAAI,CAAC;IAEtB,WAAW,GAAG;QACrB,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4FAA4F,EAAE;YACnI,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,wCAAwC,EAAE;YAC/G,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,mCAAmC,EAAE;SACtG;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB,CAAC;IAEF,YAAoB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAE/C,KAAK,CAAC,OAAO,CAAC,IAA+D;QAC3E,IAAI,CAAC;YACH,MAAM,MAAM,GAAkD,EAAE,CAAC;YACjE,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;gBAC5B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACnD,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAQ,EAAC,QAAQ,CAAC,CAAC;oBACxC,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC;wBAC5B,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC;qBAClC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE;gBACtD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;gBAC1C,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;YAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACzC,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;AA5CD,0CA4CC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @fileoverview BlueskyReplyTool — reply to an existing Bluesky post.
3
+ *
4
+ * AT Protocol requires both a parent and root reference for thread replies.
5
+ * If root is not provided, the parent is assumed to be the thread root.
6
+ */
7
+ import type { BlueskyService } from '../BlueskyService.js';
8
+ export declare class BlueskyReplyTool {
9
+ private service;
10
+ readonly id = "blueskyReply";
11
+ readonly name = "blueskyReply";
12
+ readonly displayName = "Reply to Post";
13
+ readonly description = "Reply to an existing Bluesky post. Requires the parent post URI and CID; root URI/CID defaults to the parent if not provided.";
14
+ readonly category = "social";
15
+ readonly version = "0.1.0";
16
+ readonly hasSideEffects = true;
17
+ readonly inputSchema: {
18
+ type: "object";
19
+ properties: {
20
+ parentUri: {
21
+ type: string;
22
+ description: string;
23
+ };
24
+ parentCid: {
25
+ type: string;
26
+ description: string;
27
+ };
28
+ rootUri: {
29
+ type: string;
30
+ description: string;
31
+ };
32
+ rootCid: {
33
+ type: string;
34
+ description: string;
35
+ };
36
+ text: {
37
+ type: string;
38
+ description: string;
39
+ };
40
+ };
41
+ required: string[];
42
+ };
43
+ constructor(service: BlueskyService);
44
+ execute(args: {
45
+ parentUri: string;
46
+ parentCid: string;
47
+ rootUri?: string;
48
+ rootCid?: string;
49
+ text: string;
50
+ }): Promise<{
51
+ success: boolean;
52
+ data?: any;
53
+ error?: string;
54
+ }>;
55
+ }
56
+ //# sourceMappingURL=reply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply.d.ts","sourceRoot":"","sources":["../../src/tools/reply.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qBAAa,gBAAgB;IAqBf,OAAO,CAAC,OAAO;IApB3B,QAAQ,CAAC,EAAE,kBAAkB;IAC7B,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,WAAW,mBAAmB;IACvC,QAAQ,CAAC,WAAW,mIAAmI;IACvJ,QAAQ,CAAC,QAAQ,YAAY;IAC7B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,cAAc,QAAQ;IAE/B,QAAQ,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;MAUlB;gBAEkB,OAAO,EAAE,cAAc;IAErC,OAAO,CAAC,IAAI,EAAE;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAkB9D"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * @fileoverview BlueskyReplyTool — reply to an existing Bluesky post.
5
+ *
6
+ * AT Protocol requires both a parent and root reference for thread replies.
7
+ * If root is not provided, the parent is assumed to be the thread root.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.BlueskyReplyTool = void 0;
11
+ class BlueskyReplyTool {
12
+ service;
13
+ id = 'blueskyReply';
14
+ name = 'blueskyReply';
15
+ displayName = 'Reply to Post';
16
+ description = 'Reply to an existing Bluesky post. Requires the parent post URI and CID; root URI/CID defaults to the parent if not provided.';
17
+ category = 'social';
18
+ version = '0.1.0';
19
+ hasSideEffects = true;
20
+ inputSchema = {
21
+ type: 'object',
22
+ properties: {
23
+ parentUri: { type: 'string', description: 'AT URI of the post to reply to' },
24
+ parentCid: { type: 'string', description: 'CID of the post to reply to' },
25
+ rootUri: { type: 'string', description: 'AT URI of the thread root (defaults to parent)' },
26
+ rootCid: { type: 'string', description: 'CID of the thread root (defaults to parent)' },
27
+ text: { type: 'string', description: 'Reply text' },
28
+ },
29
+ required: ['parentUri', 'parentCid', 'text'],
30
+ };
31
+ constructor(service) {
32
+ this.service = service;
33
+ }
34
+ async execute(args) {
35
+ try {
36
+ const rootUri = args.rootUri ?? args.parentUri;
37
+ const rootCid = args.rootCid ?? args.parentCid;
38
+ const result = await this.service.reply(args.parentUri, args.parentCid, rootUri, rootCid, args.text);
39
+ return { success: true, data: result };
40
+ }
41
+ catch (err) {
42
+ return { success: false, error: err.message };
43
+ }
44
+ }
45
+ }
46
+ exports.BlueskyReplyTool = BlueskyReplyTool;
47
+ //# sourceMappingURL=reply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply.js","sourceRoot":"","sources":["../../src/tools/reply.ts"],"names":[],"mappings":";AAAA,cAAc;AACd;;;;;GAKG;;;AAIH,MAAa,gBAAgB;IAqBP;IApBX,EAAE,GAAG,cAAc,CAAC;IACpB,IAAI,GAAG,cAAc,CAAC;IACtB,WAAW,GAAG,eAAe,CAAC;IAC9B,WAAW,GAAG,+HAA+H,CAAC;IAC9I,QAAQ,GAAG,QAAQ,CAAC;IACpB,OAAO,GAAG,OAAO,CAAC;IAClB,cAAc,GAAG,IAAI,CAAC;IAEtB,WAAW,GAAG;QACrB,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;YAC5E,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;YACzE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gDAAgD,EAAE;YAC1F,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6CAA6C,EAAE;YACvF,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;SACpD;QACD,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC;KAC7C,CAAC;IAEF,YAAoB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAE/C,KAAK,CAAC,OAAO,CAAC,IAMb;QACC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC;YAE/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CACrC,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,SAAS,EACd,OAAO,EACP,OAAO,EACP,IAAI,CAAC,IAAI,CACV,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACzC,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;AA/CD,4CA+CC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @fileoverview BlueskyRepostTool — repost or undo a repost on Bluesky.
3
+ *
4
+ * Reposting requires the post URI and CID.
5
+ * Undoing a repost requires the repost record URI returned from a prior repost operation.
6
+ */
7
+ import type { BlueskyService } from '../BlueskyService.js';
8
+ export declare class BlueskyRepostTool {
9
+ private service;
10
+ readonly id = "blueskyRepost";
11
+ readonly name = "blueskyRepost";
12
+ readonly displayName = "Repost";
13
+ readonly description = "Repost or undo a repost on Bluesky.";
14
+ readonly category = "social";
15
+ readonly version = "0.1.0";
16
+ readonly hasSideEffects = true;
17
+ readonly inputSchema: {
18
+ type: "object";
19
+ properties: {
20
+ uri: {
21
+ type: string;
22
+ description: string;
23
+ };
24
+ cid: {
25
+ type: string;
26
+ description: string;
27
+ };
28
+ undo: {
29
+ type: string;
30
+ description: string;
31
+ default: boolean;
32
+ };
33
+ };
34
+ required: string[];
35
+ };
36
+ constructor(service: BlueskyService);
37
+ execute(args: {
38
+ uri: string;
39
+ cid: string;
40
+ undo?: boolean;
41
+ }): Promise<{
42
+ success: boolean;
43
+ data?: any;
44
+ error?: string;
45
+ }>;
46
+ }
47
+ //# sourceMappingURL=repost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repost.d.ts","sourceRoot":"","sources":["../../src/tools/repost.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,qBAAa,iBAAiB;IAmBhB,OAAO,CAAC,OAAO;IAlB3B,QAAQ,CAAC,EAAE,mBAAmB;IAC9B,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,WAAW,YAAY;IAChC,QAAQ,CAAC,WAAW,yCAAyC;IAC7D,QAAQ,CAAC,QAAQ,YAAY;IAC7B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,cAAc,QAAQ;IAE/B,QAAQ,CAAC,WAAW;;;;;;;;;;;;;;;;;;MAQlB;gBAEkB,OAAO,EAAE,cAAc;IAErC,OAAO,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAa7H"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ /**
4
+ * @fileoverview BlueskyRepostTool — repost or undo a repost on Bluesky.
5
+ *
6
+ * Reposting requires the post URI and CID.
7
+ * Undoing a repost requires the repost record URI returned from a prior repost operation.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.BlueskyRepostTool = void 0;
11
+ class BlueskyRepostTool {
12
+ service;
13
+ id = 'blueskyRepost';
14
+ name = 'blueskyRepost';
15
+ displayName = 'Repost';
16
+ description = 'Repost or undo a repost on Bluesky.';
17
+ category = 'social';
18
+ version = '0.1.0';
19
+ hasSideEffects = true;
20
+ inputSchema = {
21
+ type: 'object',
22
+ properties: {
23
+ uri: { type: 'string', description: 'AT URI of the post to repost' },
24
+ cid: { type: 'string', description: 'CID of the post to repost' },
25
+ undo: { type: 'boolean', description: 'Set to true to undo repost (uri should then be the repost record URI)', default: false },
26
+ },
27
+ required: ['uri', 'cid'],
28
+ };
29
+ constructor(service) {
30
+ this.service = service;
31
+ }
32
+ async execute(args) {
33
+ try {
34
+ if (args.undo) {
35
+ await this.service.unrepost(args.uri);
36
+ return { success: true };
37
+ }
38
+ else {
39
+ const result = await this.service.repost(args.uri, args.cid);
40
+ return { success: true, data: result };
41
+ }
42
+ }
43
+ catch (err) {
44
+ return { success: false, error: err.message };
45
+ }
46
+ }
47
+ }
48
+ exports.BlueskyRepostTool = BlueskyRepostTool;
49
+ //# sourceMappingURL=repost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repost.js","sourceRoot":"","sources":["../../src/tools/repost.ts"],"names":[],"mappings":";AAAA,cAAc;AACd;;;;;GAKG;;;AAIH,MAAa,iBAAiB;IAmBR;IAlBX,EAAE,GAAG,eAAe,CAAC;IACrB,IAAI,GAAG,eAAe,CAAC;IACvB,WAAW,GAAG,QAAQ,CAAC;IACvB,WAAW,GAAG,qCAAqC,CAAC;IACpD,QAAQ,GAAG,QAAQ,CAAC;IACpB,OAAO,GAAG,OAAO,CAAC;IAClB,cAAc,GAAG,IAAI,CAAC;IAEtB,WAAW,GAAG;QACrB,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;YACpE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;YACjE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,uEAAuE,EAAE,OAAO,EAAE,KAAK,EAAE;SAChI;QACD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;KACzB,CAAC;IAEF,YAAoB,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAE/C,KAAK,CAAC,OAAO,CAAC,IAAkD;QAC9D,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YACzC,CAAC;QACH,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;AAlCD,8CAkCC"}