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.
- package/LICENSE +21 -0
- package/README.md +272 -0
- package/dist/fetchers/bluesky.d.ts +3 -0
- package/dist/fetchers/bluesky.d.ts.map +1 -0
- package/dist/fetchers/bluesky.js +154 -0
- package/dist/fetchers/bluesky.js.map +1 -0
- package/dist/fetchers/farcaster.d.ts +3 -0
- package/dist/fetchers/farcaster.d.ts.map +1 -0
- package/dist/fetchers/farcaster.js +149 -0
- package/dist/fetchers/farcaster.js.map +1 -0
- package/dist/fetchers/lens.d.ts +3 -0
- package/dist/fetchers/lens.d.ts.map +1 -0
- package/dist/fetchers/lens.js +125 -0
- package/dist/fetchers/lens.js.map +1 -0
- package/dist/fetchers/nostr.d.ts +3 -0
- package/dist/fetchers/nostr.d.ts.map +1 -0
- package/dist/fetchers/nostr.js +307 -0
- package/dist/fetchers/nostr.js.map +1 -0
- package/dist/formatters/output.d.ts +5 -0
- package/dist/formatters/output.d.ts.map +1 -0
- package/dist/formatters/output.js +225 -0
- package/dist/formatters/output.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +193 -0
- package/dist/index.js.map +1 -0
- package/dist/lib.d.ts +20 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +71 -0
- package/dist/lib.js.map +1 -0
- package/dist/pipeline.d.ts +12 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +136 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/terms.d.ts +20 -0
- package/dist/terms.d.ts.map +1 -0
- package/dist/terms.js +158 -0
- package/dist/terms.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/search.d.ts +6 -0
- package/dist/utils/search.d.ts.map +1 -0
- package/dist/utils/search.js +13 -0
- package/dist/utils/search.js.map +1 -0
- package/dist/utils/time.d.ts +4 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +24 -0
- package/dist/utils/time.js.map +1 -0
- 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":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
package/dist/lib.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AAAA,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;AAErD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAGlD,gCAAgC;AAChC,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;AAGrD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAsB;IACpD,MAAM,IAAI,GAAc,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAErF,+CAA+C;IAC/C,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,WAAW;gBACd,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;gBACvC,MAAM;YACR,KAAK,MAAM;gBACT,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBAClC,MAAM;YACR,KAAK,OAAO;gBACV,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,SAAS;gBACZ,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;gBACrC,MAAM;QACV,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE5C,kBAAkB;IAClB,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,2BAA2B;IAC3B,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE3C,OAAO;IACP,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAExC,aAAa;IACb,MAAM,IAAI,GAA4B;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,EAAE,CAAC,CAAC,MAAM;YACd,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM;YACrB,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,UAAU,EAAE,OAAO,CAAC,MAAM;KAC3B,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,OAAsB,EACtB,OAAe,CAAC;IAEhB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -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"}
|