@framers/agentos-ext-channel-reddit 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.
- package/LICENSE +98 -0
- package/dist/RedditChannelAdapter.d.ts +30 -0
- package/dist/RedditChannelAdapter.d.ts.map +1 -0
- package/dist/RedditChannelAdapter.js +195 -0
- package/dist/RedditChannelAdapter.js.map +1 -0
- package/dist/RedditService.d.ts +135 -0
- package/dist/RedditService.d.ts.map +1 -0
- package/dist/RedditService.js +420 -0
- package/dist/RedditService.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +110 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/analytics.d.ts +96 -0
- package/dist/tools/analytics.d.ts.map +1 -0
- package/dist/tools/analytics.js +81 -0
- package/dist/tools/analytics.js.map +1 -0
- package/dist/tools/comment.d.ts +56 -0
- package/dist/tools/comment.d.ts.map +1 -0
- package/dist/tools/comment.js +72 -0
- package/dist/tools/comment.js.map +1 -0
- package/dist/tools/inbox.d.ts +103 -0
- package/dist/tools/inbox.d.ts.map +1 -0
- package/dist/tools/inbox.js +137 -0
- package/dist/tools/inbox.js.map +1 -0
- package/dist/tools/search.d.ts +106 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +113 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/submitPost.d.ts +99 -0
- package/dist/tools/submitPost.d.ts.map +1 -0
- package/dist/tools/submitPost.js +109 -0
- package/dist/tools/submitPost.js.map +1 -0
- package/dist/tools/subscribe.d.ts +57 -0
- package/dist/tools/subscribe.d.ts.map +1 -0
- package/dist/tools/subscribe.js +73 -0
- package/dist/tools/subscribe.js.map +1 -0
- package/dist/tools/trending.d.ts +98 -0
- package/dist/tools/trending.d.ts.map +1 -0
- package/dist/tools/trending.js +107 -0
- package/dist/tools/trending.js.map +1 -0
- package/dist/tools/vote.d.ts +57 -0
- package/dist/tools/vote.d.ts.map +1 -0
- package/dist/tools/vote.js +73 -0
- package/dist/tools/vote.js.map +1 -0
- package/manifest.json +73 -0
- package/package.json +51 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview ITool for fetching Reddit user karma and activity analytics via the Reddit channel adapter.
|
|
3
|
+
*/
|
|
4
|
+
import type { ITool, ToolExecutionContext, ToolExecutionResult } from '@framers/agentos';
|
|
5
|
+
import type { RedditService } from '../RedditService';
|
|
6
|
+
export declare class RedditAnalyticsTool implements ITool {
|
|
7
|
+
private readonly service;
|
|
8
|
+
readonly id = "redditAnalytics";
|
|
9
|
+
readonly name = "reddit.analytics";
|
|
10
|
+
readonly displayName = "Reddit Analytics";
|
|
11
|
+
readonly description = "Get karma analytics and activity summary for a Reddit user. Includes link/comment karma breakdown, top subreddits, and recent activity counts. Omit username to get analytics for the authenticated account.";
|
|
12
|
+
readonly category = "social";
|
|
13
|
+
readonly version = "0.1.0";
|
|
14
|
+
readonly hasSideEffects = false;
|
|
15
|
+
readonly inputSchema: {
|
|
16
|
+
type: "object";
|
|
17
|
+
required: readonly [];
|
|
18
|
+
properties: {
|
|
19
|
+
username: {
|
|
20
|
+
type: string;
|
|
21
|
+
description: string;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
readonly outputSchema: {
|
|
26
|
+
type: "object";
|
|
27
|
+
properties: {
|
|
28
|
+
username: {
|
|
29
|
+
type: string;
|
|
30
|
+
description: string;
|
|
31
|
+
};
|
|
32
|
+
linkKarma: {
|
|
33
|
+
type: string;
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
36
|
+
commentKarma: {
|
|
37
|
+
type: string;
|
|
38
|
+
description: string;
|
|
39
|
+
};
|
|
40
|
+
totalKarma: {
|
|
41
|
+
type: string;
|
|
42
|
+
description: string;
|
|
43
|
+
};
|
|
44
|
+
accountCreatedUtc: {
|
|
45
|
+
type: string;
|
|
46
|
+
description: string;
|
|
47
|
+
};
|
|
48
|
+
isGold: {
|
|
49
|
+
type: string;
|
|
50
|
+
description: string;
|
|
51
|
+
};
|
|
52
|
+
isMod: {
|
|
53
|
+
type: string;
|
|
54
|
+
description: string;
|
|
55
|
+
};
|
|
56
|
+
topSubreddits: {
|
|
57
|
+
type: string;
|
|
58
|
+
description: string;
|
|
59
|
+
items: {
|
|
60
|
+
type: string;
|
|
61
|
+
properties: {
|
|
62
|
+
subreddit: {
|
|
63
|
+
type: string;
|
|
64
|
+
};
|
|
65
|
+
count: {
|
|
66
|
+
type: string;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
recentActivity: {
|
|
72
|
+
type: string;
|
|
73
|
+
description: string;
|
|
74
|
+
properties: {
|
|
75
|
+
posts: {
|
|
76
|
+
type: string;
|
|
77
|
+
description: string;
|
|
78
|
+
};
|
|
79
|
+
comments: {
|
|
80
|
+
type: string;
|
|
81
|
+
description: string;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
constructor(service: RedditService);
|
|
88
|
+
execute(args: {
|
|
89
|
+
username?: string;
|
|
90
|
+
}, _context: ToolExecutionContext): Promise<ToolExecutionResult>;
|
|
91
|
+
validateArgs(args: Record<string, any>): {
|
|
92
|
+
isValid: boolean;
|
|
93
|
+
errors?: string[];
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=analytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,qBAAa,mBAAoB,YAAW,KAAK;IAqDnC,OAAO,CAAC,QAAQ,CAAC,OAAO;IApDpC,SAAgB,EAAE,qBAAqB;IACvC,SAAgB,IAAI,sBAAsB;IAC1C,SAAgB,WAAW,sBAAsB;IACjD,SAAgB,WAAW,kNACsL;IACjN,SAAgB,QAAQ,YAAY;IACpC,SAAgB,OAAO,WAAW;IAClC,SAAgB,cAAc,SAAS;IAEvC,SAAgB,WAAW;;;;;;;;;MASzB;IAEF,SAAgB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8B1B;gBAE2B,OAAO,EAAE,aAAa;IAE7C,OAAO,CACX,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAC3B,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC;IAa/B,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;CAOjF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview ITool for fetching Reddit user karma and activity analytics via the Reddit channel adapter.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RedditAnalyticsTool = void 0;
|
|
8
|
+
class RedditAnalyticsTool {
|
|
9
|
+
constructor(service) {
|
|
10
|
+
this.service = service;
|
|
11
|
+
this.id = 'redditAnalytics';
|
|
12
|
+
this.name = 'reddit.analytics';
|
|
13
|
+
this.displayName = 'Reddit Analytics';
|
|
14
|
+
this.description = 'Get karma analytics and activity summary for a Reddit user. Includes link/comment karma breakdown, top subreddits, and recent activity counts. Omit username to get analytics for the authenticated account.';
|
|
15
|
+
this.category = 'social';
|
|
16
|
+
this.version = '0.1.0';
|
|
17
|
+
this.hasSideEffects = false;
|
|
18
|
+
this.inputSchema = {
|
|
19
|
+
type: 'object',
|
|
20
|
+
required: [],
|
|
21
|
+
properties: {
|
|
22
|
+
username: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
description: 'Reddit username to analyze (without u/ prefix). Omit for self.',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
this.outputSchema = {
|
|
29
|
+
type: 'object',
|
|
30
|
+
properties: {
|
|
31
|
+
username: { type: 'string', description: 'Reddit username' },
|
|
32
|
+
linkKarma: { type: 'number', description: 'Karma from posts' },
|
|
33
|
+
commentKarma: { type: 'number', description: 'Karma from comments' },
|
|
34
|
+
totalKarma: { type: 'number', description: 'Combined karma total' },
|
|
35
|
+
accountCreatedUtc: { type: 'number', description: 'Account creation timestamp (UTC)' },
|
|
36
|
+
isGold: { type: 'boolean', description: 'Whether user has Reddit Gold/Premium' },
|
|
37
|
+
isMod: { type: 'boolean', description: 'Whether user is a moderator' },
|
|
38
|
+
topSubreddits: {
|
|
39
|
+
type: 'array',
|
|
40
|
+
description: 'Most active subreddits',
|
|
41
|
+
items: {
|
|
42
|
+
type: 'object',
|
|
43
|
+
properties: {
|
|
44
|
+
subreddit: { type: 'string' },
|
|
45
|
+
count: { type: 'number' },
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
recentActivity: {
|
|
50
|
+
type: 'object',
|
|
51
|
+
description: 'Recent activity counts',
|
|
52
|
+
properties: {
|
|
53
|
+
posts: { type: 'number', description: 'Number of recent posts' },
|
|
54
|
+
comments: { type: 'number', description: 'Number of recent comments' },
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async execute(args, _context) {
|
|
61
|
+
try {
|
|
62
|
+
const analytics = await this.service.getAnalytics(args.username);
|
|
63
|
+
return {
|
|
64
|
+
success: true,
|
|
65
|
+
output: analytics,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
return { success: false, error: error.message };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
validateArgs(args) {
|
|
73
|
+
const errors = [];
|
|
74
|
+
if (args.username !== undefined && typeof args.username !== 'string') {
|
|
75
|
+
errors.push('username must be a string');
|
|
76
|
+
}
|
|
77
|
+
return { isValid: errors.length === 0, errors };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.RedditAnalyticsTool = RedditAnalyticsTool;
|
|
81
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview ITool for commenting on posts or replying to comments via the Reddit channel adapter.
|
|
3
|
+
*/
|
|
4
|
+
import type { ITool, ToolExecutionContext, ToolExecutionResult } from '@framers/agentos';
|
|
5
|
+
import type { RedditService } from '../RedditService';
|
|
6
|
+
export declare class RedditCommentTool implements ITool {
|
|
7
|
+
private readonly service;
|
|
8
|
+
readonly id = "redditComment";
|
|
9
|
+
readonly name = "reddit.comment";
|
|
10
|
+
readonly displayName = "Reddit Comment";
|
|
11
|
+
readonly description = "Comment on a Reddit post or reply to an existing comment. Provide the post or comment fullname (e.g. t3_abc123 or t1_xyz789) and the comment text.";
|
|
12
|
+
readonly category = "social";
|
|
13
|
+
readonly version = "0.1.0";
|
|
14
|
+
readonly hasSideEffects = true;
|
|
15
|
+
readonly inputSchema: {
|
|
16
|
+
type: "object";
|
|
17
|
+
required: readonly ["thingId", "text"];
|
|
18
|
+
properties: {
|
|
19
|
+
thingId: {
|
|
20
|
+
type: string;
|
|
21
|
+
description: string;
|
|
22
|
+
};
|
|
23
|
+
text: {
|
|
24
|
+
type: string;
|
|
25
|
+
description: string;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
readonly outputSchema: {
|
|
30
|
+
type: "object";
|
|
31
|
+
properties: {
|
|
32
|
+
id: {
|
|
33
|
+
type: string;
|
|
34
|
+
description: string;
|
|
35
|
+
};
|
|
36
|
+
name: {
|
|
37
|
+
type: string;
|
|
38
|
+
description: string;
|
|
39
|
+
};
|
|
40
|
+
permalink: {
|
|
41
|
+
type: string;
|
|
42
|
+
description: string;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
constructor(service: RedditService);
|
|
47
|
+
execute(args: {
|
|
48
|
+
thingId: string;
|
|
49
|
+
text: string;
|
|
50
|
+
}, _context: ToolExecutionContext): Promise<ToolExecutionResult>;
|
|
51
|
+
validateArgs(args: Record<string, any>): {
|
|
52
|
+
isValid: boolean;
|
|
53
|
+
errors?: string[];
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=comment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../../src/tools/comment.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,qBAAa,iBAAkB,YAAW,KAAK;IAkCjC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAjCpC,SAAgB,EAAE,mBAAmB;IACrC,SAAgB,IAAI,oBAAoB;IACxC,SAAgB,WAAW,oBAAoB;IAC/C,SAAgB,WAAW,wJAC4H;IACvJ,SAAgB,QAAQ,YAAY;IACpC,SAAgB,OAAO,WAAW;IAClC,SAAgB,cAAc,QAAQ;IAEtC,SAAgB,WAAW;;;;;;;;;;;;;MAazB;IAEF,SAAgB,YAAY;;;;;;;;;;;;;;;;MAO1B;gBAE2B,OAAO,EAAE,aAAa;IAE7C,OAAO,CACX,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EACvC,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC;IAiB/B,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;CASjF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview ITool for commenting on posts or replying to comments via the Reddit channel adapter.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RedditCommentTool = void 0;
|
|
8
|
+
class RedditCommentTool {
|
|
9
|
+
constructor(service) {
|
|
10
|
+
this.service = service;
|
|
11
|
+
this.id = 'redditComment';
|
|
12
|
+
this.name = 'reddit.comment';
|
|
13
|
+
this.displayName = 'Reddit Comment';
|
|
14
|
+
this.description = 'Comment on a Reddit post or reply to an existing comment. Provide the post or comment fullname (e.g. t3_abc123 or t1_xyz789) and the comment text.';
|
|
15
|
+
this.category = 'social';
|
|
16
|
+
this.version = '0.1.0';
|
|
17
|
+
this.hasSideEffects = true;
|
|
18
|
+
this.inputSchema = {
|
|
19
|
+
type: 'object',
|
|
20
|
+
required: ['thingId', 'text'],
|
|
21
|
+
properties: {
|
|
22
|
+
thingId: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
description: 'Reddit fullname of the post (t3_xxx) or comment (t1_xxx) to reply to',
|
|
25
|
+
},
|
|
26
|
+
text: {
|
|
27
|
+
type: 'string',
|
|
28
|
+
description: 'Comment text (supports Reddit Markdown, max 10000 characters)',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
this.outputSchema = {
|
|
33
|
+
type: 'object',
|
|
34
|
+
properties: {
|
|
35
|
+
id: { type: 'string', description: 'Comment ID' },
|
|
36
|
+
name: { type: 'string', description: 'Reddit fullname (e.g. t1_abc123)' },
|
|
37
|
+
permalink: { type: 'string', description: 'Permalink to the comment' },
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async execute(args, _context) {
|
|
42
|
+
try {
|
|
43
|
+
if (args.text.length > 10000) {
|
|
44
|
+
throw new Error('Comment text exceeds 10000 character limit');
|
|
45
|
+
}
|
|
46
|
+
const result = await this.service.comment(args.thingId, args.text);
|
|
47
|
+
return {
|
|
48
|
+
success: true,
|
|
49
|
+
output: result,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
return { success: false, error: error.message };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
validateArgs(args) {
|
|
57
|
+
const errors = [];
|
|
58
|
+
if (!args.thingId)
|
|
59
|
+
errors.push('thingId is required');
|
|
60
|
+
else if (typeof args.thingId !== 'string')
|
|
61
|
+
errors.push('thingId must be a string');
|
|
62
|
+
if (!args.text)
|
|
63
|
+
errors.push('text is required');
|
|
64
|
+
else if (typeof args.text !== 'string')
|
|
65
|
+
errors.push('text must be a string');
|
|
66
|
+
else if (args.text.length > 10000)
|
|
67
|
+
errors.push('text exceeds 10000 character limit');
|
|
68
|
+
return { isValid: errors.length === 0, errors };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.RedditCommentTool = RedditCommentTool;
|
|
72
|
+
//# sourceMappingURL=comment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment.js","sourceRoot":"","sources":["../../src/tools/comment.ts"],"names":[],"mappings":";AAAA,cAAc;AACd;;GAEG;;;AAKH,MAAa,iBAAiB;IAkC5B,YAA6B,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;QAjCnC,OAAE,GAAG,eAAe,CAAC;QACrB,SAAI,GAAG,gBAAgB,CAAC;QACxB,gBAAW,GAAG,gBAAgB,CAAC;QAC/B,gBAAW,GACzB,oJAAoJ,CAAC;QACvI,aAAQ,GAAG,QAAQ,CAAC;QACpB,YAAO,GAAG,OAAO,CAAC;QAClB,mBAAc,GAAG,IAAI,CAAC;QAEtB,gBAAW,GAAG;YAC5B,IAAI,EAAE,QAAiB;YACvB,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAU;YACtC,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sEAAsE;iBACpF;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+DAA+D;iBAC7E;aACF;SACF,CAAC;QAEc,iBAAY,GAAG;YAC7B,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;gBACjD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE;gBACzE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE;aACvE;SACF,CAAC;IAEoD,CAAC;IAEvD,KAAK,CAAC,OAAO,CACX,IAAuC,EACvC,QAA8B;QAE9B,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEnE,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,MAAM;aACf,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED,YAAY,CAAC,IAAyB;QACpC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;aACjD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;aAC3C,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;aACxE,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAM;YAAE,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACtF,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAClD,CAAC;CACF;AAjED,8CAiEC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview ITool for reading and sending Reddit private messages via the Reddit channel adapter.
|
|
3
|
+
*/
|
|
4
|
+
import type { ITool, ToolExecutionContext, ToolExecutionResult } from '@framers/agentos';
|
|
5
|
+
import type { RedditService } from '../RedditService';
|
|
6
|
+
export declare class RedditInboxTool implements ITool {
|
|
7
|
+
private readonly service;
|
|
8
|
+
readonly id = "redditInbox";
|
|
9
|
+
readonly name = "reddit.inbox";
|
|
10
|
+
readonly displayName = "Reddit Inbox";
|
|
11
|
+
readonly description = "Read inbox messages or send a private message to a Reddit user. Use action \"read\" to fetch messages or \"send\" to compose a new message.";
|
|
12
|
+
readonly category = "social";
|
|
13
|
+
readonly version = "0.1.0";
|
|
14
|
+
readonly hasSideEffects = true;
|
|
15
|
+
readonly inputSchema: {
|
|
16
|
+
type: "object";
|
|
17
|
+
required: readonly ["action"];
|
|
18
|
+
properties: {
|
|
19
|
+
action: {
|
|
20
|
+
type: string;
|
|
21
|
+
enum: string[];
|
|
22
|
+
description: string;
|
|
23
|
+
};
|
|
24
|
+
filter: {
|
|
25
|
+
type: string;
|
|
26
|
+
enum: string[];
|
|
27
|
+
description: string;
|
|
28
|
+
};
|
|
29
|
+
limit: {
|
|
30
|
+
type: string;
|
|
31
|
+
description: string;
|
|
32
|
+
minimum: number;
|
|
33
|
+
maximum: number;
|
|
34
|
+
};
|
|
35
|
+
to: {
|
|
36
|
+
type: string;
|
|
37
|
+
description: string;
|
|
38
|
+
};
|
|
39
|
+
subject: {
|
|
40
|
+
type: string;
|
|
41
|
+
description: string;
|
|
42
|
+
};
|
|
43
|
+
body: {
|
|
44
|
+
type: string;
|
|
45
|
+
description: string;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
readonly outputSchema: {
|
|
50
|
+
type: "object";
|
|
51
|
+
properties: {
|
|
52
|
+
messages: {
|
|
53
|
+
type: string;
|
|
54
|
+
description: string;
|
|
55
|
+
items: {
|
|
56
|
+
type: string;
|
|
57
|
+
properties: {
|
|
58
|
+
id: {
|
|
59
|
+
type: string;
|
|
60
|
+
};
|
|
61
|
+
author: {
|
|
62
|
+
type: string;
|
|
63
|
+
};
|
|
64
|
+
subject: {
|
|
65
|
+
type: string;
|
|
66
|
+
};
|
|
67
|
+
body: {
|
|
68
|
+
type: string;
|
|
69
|
+
};
|
|
70
|
+
createdUtc: {
|
|
71
|
+
type: string;
|
|
72
|
+
};
|
|
73
|
+
isUnread: {
|
|
74
|
+
type: string;
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
sent: {
|
|
80
|
+
type: string;
|
|
81
|
+
description: string;
|
|
82
|
+
};
|
|
83
|
+
count: {
|
|
84
|
+
type: string;
|
|
85
|
+
description: string;
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
constructor(service: RedditService);
|
|
90
|
+
execute(args: {
|
|
91
|
+
action: 'read' | 'send';
|
|
92
|
+
filter?: 'unread' | 'all';
|
|
93
|
+
limit?: number;
|
|
94
|
+
to?: string;
|
|
95
|
+
subject?: string;
|
|
96
|
+
body?: string;
|
|
97
|
+
}, _context: ToolExecutionContext): Promise<ToolExecutionResult>;
|
|
98
|
+
validateArgs(args: Record<string, any>): {
|
|
99
|
+
isValid: boolean;
|
|
100
|
+
errors?: string[];
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=inbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/tools/inbox.ts"],"names":[],"mappings":"AACA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,qBAAa,eAAgB,YAAW,KAAK;IAoE/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAnEpC,SAAgB,EAAE,iBAAiB;IACnC,SAAgB,IAAI,kBAAkB;IACtC,SAAgB,WAAW,kBAAkB;IAC7C,SAAgB,WAAW,iJACiH;IAC5I,SAAgB,QAAQ,YAAY;IACpC,SAAgB,OAAO,WAAW;IAClC,SAAgB,cAAc,QAAQ;IAEtC,SAAgB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiCzB;IAEF,SAAgB,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAqB1B;gBAE2B,OAAO,EAAE,aAAa;IAE7C,OAAO,CACX,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,MAAM,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,EACD,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC;IAoC/B,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;CAsBjF"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview ITool for reading and sending Reddit private messages via the Reddit channel adapter.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RedditInboxTool = void 0;
|
|
8
|
+
class RedditInboxTool {
|
|
9
|
+
constructor(service) {
|
|
10
|
+
this.service = service;
|
|
11
|
+
this.id = 'redditInbox';
|
|
12
|
+
this.name = 'reddit.inbox';
|
|
13
|
+
this.displayName = 'Reddit Inbox';
|
|
14
|
+
this.description = 'Read inbox messages or send a private message to a Reddit user. Use action "read" to fetch messages or "send" to compose a new message.';
|
|
15
|
+
this.category = 'social';
|
|
16
|
+
this.version = '0.1.0';
|
|
17
|
+
this.hasSideEffects = true;
|
|
18
|
+
this.inputSchema = {
|
|
19
|
+
type: 'object',
|
|
20
|
+
required: ['action'],
|
|
21
|
+
properties: {
|
|
22
|
+
action: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
enum: ['read', 'send'],
|
|
25
|
+
description: 'Action: read (fetch inbox) or send (compose message)',
|
|
26
|
+
},
|
|
27
|
+
filter: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
enum: ['unread', 'all'],
|
|
30
|
+
description: 'Filter for read action: unread or all (default: all)',
|
|
31
|
+
},
|
|
32
|
+
limit: {
|
|
33
|
+
type: 'number',
|
|
34
|
+
description: 'Max messages to fetch for read action (1-100, default: 25)',
|
|
35
|
+
minimum: 1,
|
|
36
|
+
maximum: 100,
|
|
37
|
+
},
|
|
38
|
+
to: {
|
|
39
|
+
type: 'string',
|
|
40
|
+
description: 'Recipient username for send action (without u/ prefix)',
|
|
41
|
+
},
|
|
42
|
+
subject: {
|
|
43
|
+
type: 'string',
|
|
44
|
+
description: 'Message subject for send action',
|
|
45
|
+
},
|
|
46
|
+
body: {
|
|
47
|
+
type: 'string',
|
|
48
|
+
description: 'Message body for send action (supports Reddit Markdown)',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
this.outputSchema = {
|
|
53
|
+
type: 'object',
|
|
54
|
+
properties: {
|
|
55
|
+
messages: {
|
|
56
|
+
type: 'array',
|
|
57
|
+
description: 'Inbox messages (for read action)',
|
|
58
|
+
items: {
|
|
59
|
+
type: 'object',
|
|
60
|
+
properties: {
|
|
61
|
+
id: { type: 'string' },
|
|
62
|
+
author: { type: 'string' },
|
|
63
|
+
subject: { type: 'string' },
|
|
64
|
+
body: { type: 'string' },
|
|
65
|
+
createdUtc: { type: 'number' },
|
|
66
|
+
isUnread: { type: 'boolean' },
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
sent: { type: 'boolean', description: 'Whether message was sent (for send action)' },
|
|
71
|
+
count: { type: 'number', description: 'Number of messages returned' },
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async execute(args, _context) {
|
|
76
|
+
try {
|
|
77
|
+
if (args.action === 'read') {
|
|
78
|
+
const messages = await this.service.getInbox({
|
|
79
|
+
filter: args.filter,
|
|
80
|
+
limit: args.limit,
|
|
81
|
+
});
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
output: {
|
|
85
|
+
messages,
|
|
86
|
+
count: messages.length,
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
if (args.action === 'send') {
|
|
91
|
+
if (!args.to)
|
|
92
|
+
throw new Error('Recipient (to) is required for send action');
|
|
93
|
+
if (!args.subject)
|
|
94
|
+
throw new Error('Subject is required for send action');
|
|
95
|
+
if (!args.body)
|
|
96
|
+
throw new Error('Body is required for send action');
|
|
97
|
+
await this.service.sendMessage(args.to, args.subject, args.body);
|
|
98
|
+
return {
|
|
99
|
+
success: true,
|
|
100
|
+
output: { sent: true },
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
throw new Error(`Unknown action: ${args.action}`);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return { success: false, error: error.message };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
validateArgs(args) {
|
|
110
|
+
const errors = [];
|
|
111
|
+
if (!args.action)
|
|
112
|
+
errors.push('action is required');
|
|
113
|
+
else if (!['read', 'send'].includes(args.action)) {
|
|
114
|
+
errors.push('action must be one of: read, send');
|
|
115
|
+
}
|
|
116
|
+
if (args.action === 'send') {
|
|
117
|
+
if (!args.to)
|
|
118
|
+
errors.push('to is required for send action');
|
|
119
|
+
if (!args.subject)
|
|
120
|
+
errors.push('subject is required for send action');
|
|
121
|
+
if (!args.body)
|
|
122
|
+
errors.push('body is required for send action');
|
|
123
|
+
}
|
|
124
|
+
if (args.filter && !['unread', 'all'].includes(args.filter)) {
|
|
125
|
+
errors.push('filter must be one of: unread, all');
|
|
126
|
+
}
|
|
127
|
+
if (args.limit !== undefined) {
|
|
128
|
+
if (typeof args.limit !== 'number')
|
|
129
|
+
errors.push('limit must be a number');
|
|
130
|
+
else if (args.limit < 1 || args.limit > 100)
|
|
131
|
+
errors.push('limit must be between 1 and 100');
|
|
132
|
+
}
|
|
133
|
+
return { isValid: errors.length === 0, errors };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.RedditInboxTool = RedditInboxTool;
|
|
137
|
+
//# sourceMappingURL=inbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/tools/inbox.ts"],"names":[],"mappings":";AAAA,cAAc;AACd;;GAEG;;;AAKH,MAAa,eAAe;IAoE1B,YAA6B,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;QAnEnC,OAAE,GAAG,aAAa,CAAC;QACnB,SAAI,GAAG,cAAc,CAAC;QACtB,gBAAW,GAAG,cAAc,CAAC;QAC7B,gBAAW,GACzB,yIAAyI,CAAC;QAC5H,aAAQ,GAAG,QAAQ,CAAC;QACpB,YAAO,GAAG,OAAO,CAAC;QAClB,mBAAc,GAAG,IAAI,CAAC;QAEtB,gBAAW,GAAG;YAC5B,IAAI,EAAE,QAAiB;YACvB,QAAQ,EAAE,CAAC,QAAQ,CAAU;YAC7B,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;oBACtB,WAAW,EAAE,sDAAsD;iBACpE;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;oBACvB,WAAW,EAAE,sDAAsD;iBACpE;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4DAA4D;oBACzE,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,GAAG;iBACb;gBACD,EAAE,EAAE;oBACF,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,wDAAwD;iBACtE;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iCAAiC;iBAC/C;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yDAAyD;iBACvE;aACF;SACF,CAAC;QAEc,iBAAY,GAAG;YAC7B,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,kCAAkC;oBAC/C,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACtB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC1B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC3B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACxB,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC9B,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;yBAC9B;qBACF;iBACF;gBACD,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,4CAA4C,EAAE;gBACpF,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;aACtE;SACF,CAAC;IAEoD,CAAC;IAEvD,KAAK,CAAC,OAAO,CACX,IAOC,EACD,QAA8B;QAE9B,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;oBAC3C,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB,CAAC,CAAC;gBAEH,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE;wBACN,QAAQ;wBACR,KAAK,EAAE,QAAQ,CAAC,MAAM;qBACvB;iBACF,CAAC;YACJ,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,CAAC,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAC5E,IAAI,CAAC,IAAI,CAAC,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBAC1E,IAAI,CAAC,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBAEpE,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEjE,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;iBACvB,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED,YAAY,CAAC,IAAyB;QACpC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;aAC/C,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC5D,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAAE,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;iBACrE,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG;gBAAE,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC9F,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAClD,CAAC;CACF;AA1ID,0CA0IC"}
|