deso-ag 1.0.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +272 -0
  3. package/dist/fetchers/bluesky.d.ts +3 -0
  4. package/dist/fetchers/bluesky.d.ts.map +1 -0
  5. package/dist/fetchers/bluesky.js +154 -0
  6. package/dist/fetchers/bluesky.js.map +1 -0
  7. package/dist/fetchers/farcaster.d.ts +3 -0
  8. package/dist/fetchers/farcaster.d.ts.map +1 -0
  9. package/dist/fetchers/farcaster.js +149 -0
  10. package/dist/fetchers/farcaster.js.map +1 -0
  11. package/dist/fetchers/lens.d.ts +3 -0
  12. package/dist/fetchers/lens.d.ts.map +1 -0
  13. package/dist/fetchers/lens.js +125 -0
  14. package/dist/fetchers/lens.js.map +1 -0
  15. package/dist/fetchers/nostr.d.ts +3 -0
  16. package/dist/fetchers/nostr.d.ts.map +1 -0
  17. package/dist/fetchers/nostr.js +307 -0
  18. package/dist/fetchers/nostr.js.map +1 -0
  19. package/dist/formatters/output.d.ts +5 -0
  20. package/dist/formatters/output.d.ts.map +1 -0
  21. package/dist/formatters/output.js +225 -0
  22. package/dist/formatters/output.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +193 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/lib.d.ts +20 -0
  28. package/dist/lib.d.ts.map +1 -0
  29. package/dist/lib.js +71 -0
  30. package/dist/lib.js.map +1 -0
  31. package/dist/pipeline.d.ts +12 -0
  32. package/dist/pipeline.d.ts.map +1 -0
  33. package/dist/pipeline.js +136 -0
  34. package/dist/pipeline.js.map +1 -0
  35. package/dist/terms.d.ts +20 -0
  36. package/dist/terms.d.ts.map +1 -0
  37. package/dist/terms.js +158 -0
  38. package/dist/terms.js.map +1 -0
  39. package/dist/types.d.ts +67 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +2 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/utils/search.d.ts +6 -0
  44. package/dist/utils/search.d.ts.map +1 -0
  45. package/dist/utils/search.js +13 -0
  46. package/dist/utils/search.js.map +1 -0
  47. package/dist/utils/time.d.ts +4 -0
  48. package/dist/utils/time.d.ts.map +1 -0
  49. package/dist/utils/time.js +24 -0
  50. package/dist/utils/time.js.map +1 -0
  51. package/package.json +62 -0
@@ -0,0 +1,225 @@
1
+ import { formatTimeAgo } from '../utils/time.js';
2
+ export function computeEngagementScore(post) {
3
+ return (post.engagement?.likes || 0) +
4
+ (post.engagement?.reposts || 0) * 2 +
5
+ (post.engagement?.replies || 0);
6
+ }
7
+ export function formatOutput(posts, format, meta, termsResult) {
8
+ // Filter out posts with empty/whitespace-only content
9
+ const filtered = posts.filter(p => p.content.trim().length > 0);
10
+ switch (format) {
11
+ case 'json':
12
+ return formatJson(filtered);
13
+ case 'markdown':
14
+ return formatMarkdown(filtered);
15
+ case 'summary':
16
+ return formatSummary(filtered);
17
+ case 'compact':
18
+ return formatCompact(filtered, meta, termsResult);
19
+ default:
20
+ return formatMarkdown(filtered);
21
+ }
22
+ }
23
+ function formatJson(posts) {
24
+ return JSON.stringify(posts, (key, value) => {
25
+ if (value instanceof Date) {
26
+ return value.toISOString();
27
+ }
28
+ return value;
29
+ }, 2);
30
+ }
31
+ function formatCompact(posts, meta, termsResult) {
32
+ const result = {
33
+ meta: meta || {
34
+ totalPosts: posts.length,
35
+ sources: [],
36
+ timeframe: 'unknown',
37
+ fetchedAt: new Date().toISOString(),
38
+ },
39
+ posts: posts.map(p => ({
40
+ id: p.id,
41
+ source: p.source,
42
+ author: p.author.username,
43
+ content: p.content,
44
+ timestamp: p.timestamp instanceof Date ? p.timestamp.toISOString() : p.timestamp,
45
+ url: p.url || null,
46
+ score: computeEngagementScore(p),
47
+ engagement: {
48
+ likes: p.engagement?.likes || 0,
49
+ reposts: p.engagement?.reposts || 0,
50
+ replies: p.engagement?.replies || 0,
51
+ },
52
+ tags: p.tags || [],
53
+ })),
54
+ };
55
+ if (termsResult) {
56
+ result.terms = termsResult;
57
+ }
58
+ return JSON.stringify(result);
59
+ }
60
+ function formatMarkdown(posts) {
61
+ if (posts.length === 0) {
62
+ return '# No posts found\n\nTry adjusting your search parameters.';
63
+ }
64
+ const lines = [
65
+ `# Social Aggregator Results`,
66
+ `*Found ${posts.length} posts*\n`,
67
+ '---\n',
68
+ ];
69
+ for (const post of posts) {
70
+ const sourceEmoji = getSourceEmoji(post.source);
71
+ const timeAgo = formatTimeAgo(post.timestamp);
72
+ lines.push(`## ${sourceEmoji} ${post.author.displayName || post.author.username}`);
73
+ lines.push(`**@${post.author.username}** · ${timeAgo}\n`);
74
+ // Content (truncate if too long)
75
+ const content = post.content.length > 2500
76
+ ? post.content.slice(0, 2500) + '...'
77
+ : post.content;
78
+ lines.push(content + '\n');
79
+ // Engagement
80
+ if (post.engagement) {
81
+ const parts = [];
82
+ if (post.engagement.likes !== undefined)
83
+ parts.push(`❤️ ${post.engagement.likes}`);
84
+ if (post.engagement.reposts !== undefined)
85
+ parts.push(`🔁 ${post.engagement.reposts}`);
86
+ if (post.engagement.replies !== undefined)
87
+ parts.push(`💬 ${post.engagement.replies}`);
88
+ if (parts.length > 0)
89
+ lines.push(parts.join(' · ') + '\n');
90
+ }
91
+ // Tags
92
+ if (post.tags && post.tags.length > 0) {
93
+ lines.push(`Tags: ${post.tags.map(t => `#${t}`).join(' ')}\n`);
94
+ }
95
+ // Link
96
+ if (post.url) {
97
+ lines.push(`[View on ${getSourceName(post.source)}](${post.url})\n`);
98
+ }
99
+ lines.push('---\n');
100
+ }
101
+ return lines.join('\n');
102
+ }
103
+ function formatSummary(posts) {
104
+ if (posts.length === 0) {
105
+ return 'No posts found matching your criteria.';
106
+ }
107
+ // Group by source
108
+ const bySource = new Map();
109
+ for (const post of posts) {
110
+ const existing = bySource.get(post.source) || [];
111
+ existing.push(post);
112
+ bySource.set(post.source, existing);
113
+ }
114
+ const lines = [
115
+ `📊 Social Aggregator Summary`,
116
+ `━━━━━━━━━━━━━━━━━━━━━━━━━━━━`,
117
+ `Total: ${posts.length} posts\n`,
118
+ ];
119
+ // Stats by source
120
+ for (const [source, sourcePosts] of bySource) {
121
+ const emoji = getSourceEmoji(source);
122
+ const name = getSourceName(source);
123
+ const totalLikes = sourcePosts.reduce((sum, p) => sum + (p.engagement?.likes || 0), 0);
124
+ const totalReposts = sourcePosts.reduce((sum, p) => sum + (p.engagement?.reposts || 0), 0);
125
+ lines.push(`${emoji} ${name}: ${sourcePosts.length} posts`);
126
+ if (totalLikes > 0 || totalReposts > 0) {
127
+ lines.push(` ❤️ ${totalLikes} likes · 🔁 ${totalReposts} reposts`);
128
+ }
129
+ lines.push('');
130
+ }
131
+ // All posts sorted by engagement (posts without engagement go last, sorted by time)
132
+ const allPosts = [...posts]
133
+ .sort((a, b) => {
134
+ const aScore = (a.engagement?.likes || 0) + (a.engagement?.reposts || 0) * 2;
135
+ const bScore = (b.engagement?.likes || 0) + (b.engagement?.reposts || 0) * 2;
136
+ if (aScore !== bScore)
137
+ return bScore - aScore;
138
+ return b.timestamp.getTime() - a.timestamp.getTime();
139
+ });
140
+ if (allPosts.length > 0) {
141
+ lines.push(`\n🔥 All Posts by Engagement:`);
142
+ lines.push(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`);
143
+ for (let i = 0; i < allPosts.length; i++) {
144
+ const post = allPosts[i];
145
+ const emoji = getSourceEmoji(post.source);
146
+ const preview = post.content.slice(0, 400).replace(/\n/g, ' ');
147
+ const engagement = [];
148
+ if (post.engagement?.likes)
149
+ engagement.push(`❤️${post.engagement.likes}`);
150
+ if (post.engagement?.reposts)
151
+ engagement.push(`🔁${post.engagement.reposts}`);
152
+ lines.push(`${i + 1}. ${emoji} @${post.author.username}`);
153
+ lines.push(` "${preview}${post.content.length > 400 ? '...' : ''}"`);
154
+ lines.push(` ${engagement.join(' ')} · ${formatTimeAgo(post.timestamp)}`);
155
+ lines.push('');
156
+ }
157
+ }
158
+ // Common topics/hashtags
159
+ const tagCounts = new Map();
160
+ for (const post of posts) {
161
+ for (const tag of post.tags || []) {
162
+ tagCounts.set(tag.toLowerCase(), (tagCounts.get(tag.toLowerCase()) || 0) + 1);
163
+ }
164
+ }
165
+ const topTags = [...tagCounts.entries()]
166
+ .sort((a, b) => b[1] - a[1])
167
+ .slice(0, 10);
168
+ if (topTags.length > 0) {
169
+ lines.push(`\n🏷️ Trending Tags:`);
170
+ lines.push(topTags.map(([tag, count]) => `#${tag} (${count})`).join(' · '));
171
+ }
172
+ return lines.join('\n');
173
+ }
174
+ function getSourceEmoji(source) {
175
+ switch (source) {
176
+ case 'farcaster': return '🟣';
177
+ case 'lens': return '🌿';
178
+ case 'nostr': return '⚡';
179
+ case 'bluesky': return '🦋';
180
+ }
181
+ }
182
+ function getSourceName(source) {
183
+ switch (source) {
184
+ case 'farcaster': return 'Farcaster';
185
+ case 'lens': return 'Lens';
186
+ case 'nostr': return 'Nostr';
187
+ case 'bluesky': return 'Bluesky';
188
+ }
189
+ }
190
+ export function formatTermsSummary(result) {
191
+ const lines = [
192
+ `📊 Top Terms (last ${result.timeframe})`,
193
+ '━━━━━━━━━━━━━━━━━━━━━━━━',
194
+ '',
195
+ ];
196
+ for (const st of result.bySource) {
197
+ const emoji = getSourceEmoji(st.source);
198
+ const name = getSourceName(st.source);
199
+ lines.push(`${emoji} ${name} (${st.postCount} posts analyzed)`);
200
+ if (st.terms.length === 0) {
201
+ lines.push(' No significant terms found');
202
+ }
203
+ else {
204
+ for (let i = 0; i < st.terms.length; i++) {
205
+ const t = st.terms[i];
206
+ const pad = t.token.length < 16 ? ' '.repeat(16 - t.token.length) : ' ';
207
+ lines.push(` ${i + 1}. ${t.token}${pad}score: ${t.score.toFixed(1)} (in ${t.postCount} posts)`);
208
+ }
209
+ }
210
+ lines.push('');
211
+ }
212
+ lines.push('🌐 Overall Top Terms');
213
+ if (result.overall.length === 0) {
214
+ lines.push(' No significant terms found');
215
+ }
216
+ else {
217
+ for (let i = 0; i < result.overall.length; i++) {
218
+ const t = result.overall[i];
219
+ const pad = t.token.length < 16 ? ' '.repeat(16 - t.token.length) : ' ';
220
+ lines.push(` ${i + 1}. ${t.token}${pad}score: ${t.score.toFixed(1)} (in ${t.postCount} posts)`);
221
+ }
222
+ }
223
+ return lines.join('\n');
224
+ }
225
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/formatters/output.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,UAAU,sBAAsB,CAAC,IAAU;IAC/C,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,CAAC;QAClC,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC;QACnC,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,MAAoB,EAAE,IAA8B,EAAE,WAAyB;IACzH,sDAAsD;IACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEhE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC9B,KAAK,UAAU;YACb,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;QAClC,KAAK,SAAS;YACZ,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjC,KAAK,SAAS;YACZ,OAAO,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QACpD;YACE,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAC1C,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,IAA8B,EAAE,WAAyB;IAC7F,MAAM,MAAM,GAA4B;QACtC,IAAI,EAAE,IAAI,IAAI;YACZ,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,OAAO,EAAE,EAAE;YACX,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC;QACD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,CAAC,CAAC,SAAS,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;YAChF,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI;YAClB,KAAK,EAAE,sBAAsB,CAAC,CAAC,CAAC;YAChC,UAAU,EAAE;gBACV,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC;gBAC/B,OAAO,EAAE,CAAC,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC;gBACnC,OAAO,EAAE,CAAC,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC;aACpC;YACD,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;SACnB,CAAC,CAAC;KACJ,CAAC;IAEF,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,2DAA2D,CAAC;IACrE,CAAC;IAED,MAAM,KAAK,GAAa;QACtB,6BAA6B;QAC7B,UAAU,KAAK,CAAC,MAAM,WAAW;QACjC,OAAO;KACR,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE9C,KAAK,CAAC,IAAI,CAAC,MAAM,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnF,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,QAAQ,OAAO,IAAI,CAAC,CAAC;QAE1D,iCAAiC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI;YACxC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,KAAK;YACrC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAE3B,aAAa;QACb,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YACnF,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YACvF,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YACvF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO;QACP,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjE,CAAC;QAED,OAAO;QACP,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,YAAY,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QACvE,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,wCAAwC,CAAC;IAClD,CAAC;IAED,kBAAkB;IAClB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,KAAK,GAAa;QACtB,8BAA8B;QAC9B,8BAA8B;QAC9B,UAAU,KAAK,CAAC,MAAM,UAAU;KACjC,CAAC;IAEF,kBAAkB;IAClB,KAAK,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAEnC,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvF,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE3F,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,WAAW,CAAC,MAAM,QAAQ,CAAC,CAAC;QAC5D,IAAI,UAAU,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,SAAS,UAAU,eAAe,YAAY,UAAU,CAAC,CAAC;QACvE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,oFAAoF;IACpF,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC;SACxB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7E,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,MAAM,GAAG,MAAM,CAAC;QAC9C,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IACL,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAE7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC/D,MAAM,UAAU,GAAG,EAAE,CAAC;YACtB,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK;gBAAE,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YAC1E,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO;gBAAE,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YAE9E,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YAClC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;SACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,MAAc;IACpC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW,CAAC,CAAC,OAAO,IAAI,CAAC;QAC9B,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC;QACzB,KAAK,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC;QACzB,KAAK,SAAS,CAAC,CAAC,OAAO,IAAI,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACnC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW,CAAC,CAAC,OAAO,WAAW,CAAC;QACrC,KAAK,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC;QAC3B,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;QAC7B,KAAK,SAAS,CAAC,CAAC,OAAO,SAAS,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAmB;IACpD,MAAM,KAAK,GAAa;QACtB,sBAAsB,MAAM,CAAC,SAAS,GAAG;QACzC,0BAA0B;QAC1B,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,KAAK,EAAE,CAAC,SAAS,kBAAkB,CAAC,CAAC;QAEhE,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBACxE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC;YACpG,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACxE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import 'websocket-polyfill';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAoBA,OAAO,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,193 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { fetchFarcaster } from './fetchers/farcaster.js';
4
+ import { fetchLens } from './fetchers/lens.js';
5
+ import { fetchNostr } from './fetchers/nostr.js';
6
+ import { fetchBluesky } from './fetchers/bluesky.js';
7
+ import { formatOutput, formatTermsSummary } from './formatters/output.js';
8
+ import { mergeResults, buildMeta, parseSources, parseTimeframe, parseFormat, parseSortOrder, } from './pipeline.js';
9
+ import { extractTermsBySource } from './terms.js';
10
+ // Polyfill WebSocket for Node.js (needed for Nostr)
11
+ import 'websocket-polyfill';
12
+ const program = new Command();
13
+ program
14
+ .name('deso-ag')
15
+ .description('CLI tool for aggregating posts from decentralized social protocols')
16
+ .version('1.0.0');
17
+ program
18
+ .command('search [query]')
19
+ .description('Search for posts across decentralized social networks')
20
+ .option('-s, --sources <sources>', 'Comma-separated list of sources (farcaster,lens,nostr,bluesky)', 'farcaster,lens,nostr,bluesky')
21
+ .option('-t, --timeframe <timeframe>', 'Time range: 24h, 48h, week', '24h')
22
+ .option('-c, --channel <channel>', 'Filter by channel (Farcaster only)')
23
+ .option('-f, --format <format>', 'Output format: json, markdown, summary, compact', 'markdown')
24
+ .option('-l, --limit <limit>', 'Maximum posts per source', '25')
25
+ .option('-o, --sort <sort>', 'Sort order: engagement, recent, relevance', 'relevance')
26
+ .action(async (query, options) => {
27
+ const sources = parseSources(options.sources);
28
+ const timeframe = parseTimeframe(options.timeframe);
29
+ const format = parseFormat(options.format);
30
+ const limit = parseInt(options.limit, 10) || 25;
31
+ const sort = parseSortOrder(options.sort);
32
+ const searchOptions = {
33
+ query,
34
+ sources,
35
+ timeframe,
36
+ channel: options.channel,
37
+ limit,
38
+ sort,
39
+ };
40
+ const queryStr = query || 'all';
41
+ console.error(`\n🔍 Searching ${sources.join(', ')} for "${queryStr}" (${timeframe})...\n`);
42
+ const results = await fetchFromSources(searchOptions);
43
+ // Merge, deduplicate, and sort all posts
44
+ const allPosts = mergeResults(results, sort, query);
45
+ // Build meta for compact format
46
+ const meta = buildMeta(results, searchOptions);
47
+ // Show any errors
48
+ for (const result of results) {
49
+ if (result.error) {
50
+ console.error(`⚠️ ${result.source}: ${result.error}`);
51
+ }
52
+ }
53
+ if (allPosts.length === 0) {
54
+ console.error('No posts found. Try different search terms or sources.\n');
55
+ }
56
+ // Extract terms for compact format
57
+ const termsResult = format === 'compact' ? extractTermsBySource(allPosts, 3, timeframe) : undefined;
58
+ // Output results
59
+ console.log(formatOutput(allPosts, format, meta, termsResult));
60
+ });
61
+ program
62
+ .command('trending')
63
+ .description('Get trending posts from decentralized social networks')
64
+ .option('-s, --sources <sources>', 'Comma-separated list of sources (farcaster,lens,nostr,bluesky)', 'farcaster,lens,nostr,bluesky')
65
+ .option('-t, --timeframe <timeframe>', 'Time range: 24h, 48h, week', '24h')
66
+ .option('-f, --format <format>', 'Output format: json, markdown, summary, compact', 'summary')
67
+ .option('-l, --limit <limit>', 'Maximum posts per source', '25')
68
+ .option('-o, --sort <sort>', 'Sort order: engagement, recent, relevance', 'engagement')
69
+ .action(async (options) => {
70
+ const sources = parseSources(options.sources);
71
+ const timeframe = parseTimeframe(options.timeframe);
72
+ const format = parseFormat(options.format);
73
+ const limit = parseInt(options.limit, 10) || 25;
74
+ const sort = parseSortOrder(options.sort);
75
+ const searchOptions = {
76
+ sources,
77
+ timeframe,
78
+ limit,
79
+ sort,
80
+ };
81
+ console.error(`\n📈 Fetching trending from ${sources.join(', ')} (${timeframe})...\n`);
82
+ const results = await fetchFromSources(searchOptions);
83
+ // Merge, deduplicate, and sort all posts
84
+ const allPosts = mergeResults(results, sort);
85
+ // Build meta for compact format
86
+ const meta = buildMeta(results, searchOptions);
87
+ // Show any errors
88
+ for (const result of results) {
89
+ if (result.error) {
90
+ console.error(`⚠️ ${result.source}: ${result.error}`);
91
+ }
92
+ }
93
+ if (allPosts.length === 0) {
94
+ console.error('No posts found.\n');
95
+ }
96
+ // Extract terms for compact format
97
+ const termsResult = format === 'compact' ? extractTermsBySource(allPosts, 3, timeframe) : undefined;
98
+ // Output results
99
+ console.log(formatOutput(allPosts, format, meta, termsResult));
100
+ });
101
+ program
102
+ .command('channels')
103
+ .description('List popular Farcaster channels')
104
+ .option('-l, --limit <limit>', 'Maximum channels to show', '20')
105
+ .action(async (options) => {
106
+ const limit = parseInt(options.limit, 10) || 20;
107
+ console.error('\n📺 Popular Farcaster channels:\n');
108
+ try {
109
+ const response = await fetch('https://api.farcaster.xyz/v2/all-channels');
110
+ if (!response.ok)
111
+ throw new Error('Failed to fetch channels');
112
+ const data = await response.json();
113
+ const channels = data.result?.channels || [];
114
+ // Sort by follower count
115
+ const sorted = channels.sort((a, b) => (b.followerCount || 0) - (a.followerCount || 0)).slice(0, limit);
116
+ for (const ch of sorted) {
117
+ const desc = ch.description ? ch.description.slice(0, 60) + (ch.description.length > 60 ? '...' : '') : '';
118
+ console.log(`/${ch.id} (${(ch.followerCount || 0).toLocaleString()} followers)`);
119
+ if (desc)
120
+ console.log(` ${desc}`);
121
+ console.log('');
122
+ }
123
+ }
124
+ catch (error) {
125
+ console.error('Failed to fetch channels:', error);
126
+ }
127
+ });
128
+ program
129
+ .command('terms')
130
+ .description('Extract top discussion terms from posts')
131
+ .option('-s, --sources <sources>', 'Comma-separated list of sources (farcaster,lens,nostr,bluesky)', 'farcaster,lens,nostr,bluesky')
132
+ .option('-t, --timeframe <timeframe>', 'Time range: 24h, 48h, week', '24h')
133
+ .option('-n, --top <count>', 'Number of top terms per source', '3')
134
+ .option('-f, --format <format>', 'Output format: json, summary, compact', 'summary')
135
+ .option('-l, --limit <limit>', 'Maximum posts per source', '25')
136
+ .action(async (options) => {
137
+ const sources = parseSources(options.sources);
138
+ const timeframe = parseTimeframe(options.timeframe);
139
+ const format = parseFormat(options.format);
140
+ const limit = parseInt(options.limit, 10) || 25;
141
+ const topN = parseInt(options.top, 10) || 3;
142
+ const searchOptions = {
143
+ sources,
144
+ timeframe,
145
+ limit,
146
+ sort: 'engagement',
147
+ };
148
+ console.error(`\n📊 Analyzing terms from ${sources.join(', ')} (${timeframe})...\n`);
149
+ const results = await fetchFromSources(searchOptions);
150
+ for (const result of results) {
151
+ if (result.error) {
152
+ console.error(`⚠️ ${result.source}: ${result.error}`);
153
+ }
154
+ }
155
+ const allPosts = mergeResults(results, 'engagement');
156
+ if (allPosts.length === 0) {
157
+ console.error('No posts found to analyze.\n');
158
+ }
159
+ const termsResult = extractTermsBySource(allPosts, topN, timeframe);
160
+ switch (format) {
161
+ case 'json':
162
+ console.log(JSON.stringify(termsResult, null, 2));
163
+ break;
164
+ case 'compact':
165
+ console.log(JSON.stringify(termsResult));
166
+ break;
167
+ default:
168
+ console.log(formatTermsSummary(termsResult));
169
+ break;
170
+ }
171
+ });
172
+ async function fetchFromSources(options) {
173
+ const fetchers = [];
174
+ for (const source of options.sources) {
175
+ switch (source) {
176
+ case 'farcaster':
177
+ fetchers.push(fetchFarcaster(options));
178
+ break;
179
+ case 'lens':
180
+ fetchers.push(fetchLens(options));
181
+ break;
182
+ case 'nostr':
183
+ fetchers.push(fetchNostr(options));
184
+ break;
185
+ case 'bluesky':
186
+ fetchers.push(fetchBluesky(options));
187
+ break;
188
+ }
189
+ }
190
+ return Promise.all(fetchers);
191
+ }
192
+ program.parse();
193
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/lib.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import type { SearchOptions, AggregateResult, TermsResult } from './types.js';
2
+ export { formatOutput, computeEngagementScore, formatTermsSummary } from './formatters/output.js';
3
+ export { matchesQuery } from './utils/search.js';
4
+ export { extractTerms, extractTermsBySource, tokenize } from './terms.js';
5
+ export { fetchFarcaster } from './fetchers/farcaster.js';
6
+ export { fetchLens } from './fetchers/lens.js';
7
+ export { fetchNostr } from './fetchers/nostr.js';
8
+ export { fetchBluesky } from './fetchers/bluesky.js';
9
+ export type { Source, Timeframe, OutputFormat, SortOrder, Post, SearchOptions, FetchResult, AggregateResult, Term, SourceTerms, TermsResult } from './types.js';
10
+ /**
11
+ * Aggregate posts from decentralized social networks.
12
+ * This is the primary entry point for programmatic/agent usage.
13
+ */
14
+ export declare function aggregate(options: SearchOptions): Promise<AggregateResult>;
15
+ /**
16
+ * Extract top discussion terms from decentralized social networks.
17
+ * Fetches posts and analyzes content for engagement-weighted term frequency.
18
+ */
19
+ export declare function terms(options: SearchOptions, topN?: number): Promise<TermsResult>;
20
+ //# sourceMappingURL=lib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAqB,eAAe,EAAa,WAAW,EAAE,MAAM,YAAY,CAAC;AAG5G,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEhK;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAkDhF;AAED;;;GAGG;AACH,wBAAsB,KAAK,CACzB,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,MAAU,GACf,OAAO,CAAC,WAAW,CAAC,CAGtB"}
package/dist/lib.js ADDED
@@ -0,0 +1,71 @@
1
+ import { fetchFarcaster } from './fetchers/farcaster.js';
2
+ import { fetchLens } from './fetchers/lens.js';
3
+ import { fetchNostr } from './fetchers/nostr.js';
4
+ import { fetchBluesky } from './fetchers/bluesky.js';
5
+ import { deduplicatePosts, sortPosts } from './pipeline.js';
6
+ import { extractTermsBySource } from './terms.js';
7
+ // Re-export types and utilities
8
+ export { formatOutput, computeEngagementScore, formatTermsSummary } from './formatters/output.js';
9
+ export { matchesQuery } from './utils/search.js';
10
+ export { extractTerms, extractTermsBySource, tokenize } from './terms.js';
11
+ export { fetchFarcaster } from './fetchers/farcaster.js';
12
+ export { fetchLens } from './fetchers/lens.js';
13
+ export { fetchNostr } from './fetchers/nostr.js';
14
+ export { fetchBluesky } from './fetchers/bluesky.js';
15
+ /**
16
+ * Aggregate posts from decentralized social networks.
17
+ * This is the primary entry point for programmatic/agent usage.
18
+ */
19
+ export async function aggregate(options) {
20
+ const sort = options.sort || (options.query ? 'relevance' : 'engagement');
21
+ // Fetch from all requested sources in parallel
22
+ const fetchers = [];
23
+ for (const source of options.sources) {
24
+ switch (source) {
25
+ case 'farcaster':
26
+ fetchers.push(fetchFarcaster(options));
27
+ break;
28
+ case 'lens':
29
+ fetchers.push(fetchLens(options));
30
+ break;
31
+ case 'nostr':
32
+ fetchers.push(fetchNostr(options));
33
+ break;
34
+ case 'bluesky':
35
+ fetchers.push(fetchBluesky(options));
36
+ break;
37
+ }
38
+ }
39
+ const results = await Promise.all(fetchers);
40
+ // Merge all posts
41
+ const allPosts = [];
42
+ for (const result of results) {
43
+ allPosts.push(...result.posts);
44
+ }
45
+ // Deduplicate cross-source
46
+ const deduped = deduplicatePosts(allPosts);
47
+ // Sort
48
+ sortPosts(deduped, sort, options.query);
49
+ // Build meta
50
+ const meta = {
51
+ query: options.query,
52
+ sources: results.map(r => ({
53
+ name: r.source,
54
+ count: r.posts.length,
55
+ error: r.error,
56
+ })),
57
+ timeframe: options.timeframe,
58
+ fetchedAt: new Date().toISOString(),
59
+ totalPosts: deduped.length,
60
+ };
61
+ return { posts: deduped, meta };
62
+ }
63
+ /**
64
+ * Extract top discussion terms from decentralized social networks.
65
+ * Fetches posts and analyzes content for engagement-weighted term frequency.
66
+ */
67
+ export async function terms(options, topN = 3) {
68
+ const { posts } = await aggregate(options);
69
+ return extractTermsBySource(posts, topN, options.timeframe);
70
+ }
71
+ //# sourceMappingURL=lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Source, Timeframe, OutputFormat, SortOrder, SearchOptions, Post, FetchResult, AggregateResult } from './types.js';
2
+ export declare function normalizeContent(content: string): string;
3
+ export declare function similarityRatio(a: string, b: string): number;
4
+ export declare function deduplicatePosts(posts: Post[]): Post[];
5
+ export declare function mergeResults(results: FetchResult[], sort: SortOrder, query?: string): Post[];
6
+ export declare function sortPosts(posts: Post[], sort: SortOrder, query?: string): void;
7
+ export declare function buildMeta(results: FetchResult[], options: SearchOptions): AggregateResult['meta'];
8
+ export declare function parseSources(input: string): Source[];
9
+ export declare function parseTimeframe(input: string): Timeframe;
10
+ export declare function parseFormat(input: string): OutputFormat;
11
+ export declare function parseSortOrder(input: string): SortOrder;
12
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEhI,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAS5D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAmCtD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAc5F;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAgC9E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,CAajG;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAKpD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAKvD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAKvD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAKvD"}