clodds 1.5.3 → 1.6.1
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/README.md +2 -2
- package/dist/agents/index.js +5 -5
- package/dist/agents/index.js.map +1 -1
- package/dist/cli/commands/index.js +1 -1
- package/dist/credentials/index.js +16 -9
- package/dist/credentials/index.js.map +1 -1
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -1
- package/dist/skills/bundled/alerts/index.js +4 -1
- package/dist/skills/bundled/alerts/index.js.map +1 -1
- package/dist/skills/bundled/copy-trading/index.js +14 -5
- package/dist/skills/bundled/copy-trading/index.js.map +1 -1
- package/dist/skills/bundled/credentials/index.js +2 -2
- package/dist/skills/bundled/credentials/index.js.map +1 -1
- package/dist/skills/bundled/dca/index.js +2 -2
- package/dist/skills/bundled/dca/index.js.map +1 -1
- package/dist/skills/bundled/edge/index.js +3 -3
- package/dist/skills/bundled/edge/index.js.map +1 -1
- package/dist/skills/bundled/history/index.js +3 -2
- package/dist/skills/bundled/history/index.js.map +1 -1
- package/dist/skills/bundled/markets/index.js +2 -2
- package/dist/skills/bundled/markets/index.js.map +1 -1
- package/dist/skills/bundled/metaculus/index.js +3 -3
- package/dist/skills/bundled/metrics/index.js +2 -2
- package/dist/skills/bundled/metrics/index.js.map +1 -1
- package/dist/skills/bundled/mev/index.js +1 -1
- package/dist/skills/bundled/mev/index.js.map +1 -1
- package/dist/skills/bundled/monitoring/index.js +1 -1
- package/dist/skills/bundled/monitoring/index.js.map +1 -1
- package/dist/skills/bundled/pancakeswap/index.js +1 -1
- package/dist/skills/bundled/percolator/index.js +2 -2
- package/dist/skills/bundled/percolator/index.js.map +1 -1
- package/dist/skills/bundled/pumpfun/SKILL.md +2 -2
- package/dist/skills/bundled/pumpfun/index.d.ts +1 -1
- package/dist/skills/bundled/pumpfun/index.js +11 -11
- package/dist/skills/bundled/pumpfun/index.js.map +1 -1
- package/dist/skills/bundled/qmd/index.js +1 -1
- package/dist/skills/bundled/qmd/index.js.map +1 -1
- package/dist/skills/bundled/remote/index.js +4 -0
- package/dist/skills/bundled/remote/index.js.map +1 -1
- package/dist/skills/bundled/router/index.js +2 -1
- package/dist/skills/bundled/router/index.js.map +1 -1
- package/dist/skills/bundled/sizing/index.js +2 -2
- package/dist/skills/bundled/sizing/index.js.map +1 -1
- package/dist/skills/bundled/streaming/index.js +12 -4
- package/dist/skills/bundled/streaming/index.js.map +1 -1
- package/dist/skills/bundled/trading-solana/SKILL.md +2 -2
- package/dist/skills/bundled/triggers/index.js +3 -1
- package/dist/skills/bundled/triggers/index.js.map +1 -1
- package/dist/skills/bundled/tts/index.js +2 -2
- package/dist/skills/bundled/tts/index.js.map +1 -1
- package/dist/skills/bundled/x-research/SKILL.md +97 -0
- package/dist/skills/bundled/x-research/index.d.ts +24 -0
- package/dist/skills/bundled/x-research/index.js +618 -0
- package/dist/skills/bundled/x-research/index.js.map +1 -0
- package/dist/skills/executor.d.ts +1 -1
- package/dist/skills/executor.js +15 -1
- package/dist/skills/executor.js.map +1 -1
- package/dist/skills/help.d.ts +1 -1
- package/dist/skills/help.js +1 -1
- package/dist/solana/pumpapi.d.ts +7 -7
- package/dist/solana/pumpapi.js +5 -5
- package/dist/solana/pumpapi.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* X/Twitter Research Skill
|
|
4
|
+
*
|
|
5
|
+
* Search tweets, follow threads, analyze profiles, and track watchlists
|
|
6
|
+
* via Composio (zero API cost).
|
|
7
|
+
*
|
|
8
|
+
* Commands:
|
|
9
|
+
* /x search <query> [options] Search recent tweets
|
|
10
|
+
* /x thread <tweet_id> Fetch conversation thread
|
|
11
|
+
* /x profile <username> Recent tweets from a user
|
|
12
|
+
* /x tweet <tweet_id> Fetch a single tweet
|
|
13
|
+
* /x watchlist Show/manage watchlist
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
const index_js_1 = require("../../../cache/index.js");
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// CACHE
|
|
19
|
+
// =============================================================================
|
|
20
|
+
const tweetCache = (0, index_js_1.createCache)({
|
|
21
|
+
maxSize: 200,
|
|
22
|
+
defaultTtl: 15 * 60 * 1000, // 15 minutes
|
|
23
|
+
name: 'x-research',
|
|
24
|
+
});
|
|
25
|
+
// =============================================================================
|
|
26
|
+
// COMPOSIO API
|
|
27
|
+
// =============================================================================
|
|
28
|
+
const COMPOSIO_BASE = 'https://backend.composio.dev/api';
|
|
29
|
+
const RATE_DELAY_MS = 500;
|
|
30
|
+
function getComposioKey() {
|
|
31
|
+
const key = process.env.COMPOSIO_API_KEY;
|
|
32
|
+
if (!key)
|
|
33
|
+
throw new Error('COMPOSIO_API_KEY not set');
|
|
34
|
+
return key;
|
|
35
|
+
}
|
|
36
|
+
function getConnectionId() {
|
|
37
|
+
const id = process.env.COMPOSIO_CONNECTION_ID;
|
|
38
|
+
if (!id)
|
|
39
|
+
throw new Error('COMPOSIO_CONNECTION_ID not set');
|
|
40
|
+
return id;
|
|
41
|
+
}
|
|
42
|
+
function sleep(ms) {
|
|
43
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
44
|
+
}
|
|
45
|
+
function parseTweets(raw) {
|
|
46
|
+
const data = raw?.data ?? raw;
|
|
47
|
+
const tweets = Array.isArray(data) ? data : data?.data ?? [];
|
|
48
|
+
if (!Array.isArray(tweets) || tweets.length === 0)
|
|
49
|
+
return [];
|
|
50
|
+
const users = {};
|
|
51
|
+
const includes = raw?.includes ?? raw?.data?.includes ?? {};
|
|
52
|
+
for (const u of includes?.users ?? []) {
|
|
53
|
+
users[u.id] = u;
|
|
54
|
+
}
|
|
55
|
+
return tweets.map((t) => {
|
|
56
|
+
const u = users[t.author_id] ?? {};
|
|
57
|
+
const m = t.public_metrics ?? {};
|
|
58
|
+
return {
|
|
59
|
+
id: t.id,
|
|
60
|
+
text: t.text,
|
|
61
|
+
author_id: t.author_id,
|
|
62
|
+
username: u.username ?? '?',
|
|
63
|
+
name: u.name ?? '?',
|
|
64
|
+
created_at: t.created_at,
|
|
65
|
+
conversation_id: t.conversation_id ?? t.id,
|
|
66
|
+
metrics: {
|
|
67
|
+
likes: m.like_count ?? 0,
|
|
68
|
+
retweets: m.retweet_count ?? 0,
|
|
69
|
+
replies: m.reply_count ?? 0,
|
|
70
|
+
quotes: m.quote_count ?? 0,
|
|
71
|
+
impressions: m.impression_count ?? 0,
|
|
72
|
+
bookmarks: m.bookmark_count ?? 0,
|
|
73
|
+
},
|
|
74
|
+
urls: (t.entities?.urls ?? [])
|
|
75
|
+
.map((u) => u.expanded_url)
|
|
76
|
+
.filter(Boolean),
|
|
77
|
+
mentions: (t.entities?.mentions ?? [])
|
|
78
|
+
.map((m) => m.username)
|
|
79
|
+
.filter(Boolean),
|
|
80
|
+
hashtags: (t.entities?.hashtags ?? [])
|
|
81
|
+
.map((h) => h.tag)
|
|
82
|
+
.filter(Boolean),
|
|
83
|
+
tweet_url: `https://x.com/${u.username ?? '?'}/status/${t.id}`,
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
async function composioExec(action, params) {
|
|
88
|
+
const key = getComposioKey();
|
|
89
|
+
const connId = getConnectionId();
|
|
90
|
+
const res = await fetch(`${COMPOSIO_BASE}/v2/actions/${action}/execute`, {
|
|
91
|
+
method: 'POST',
|
|
92
|
+
headers: {
|
|
93
|
+
'x-api-key': key,
|
|
94
|
+
'Content-Type': 'application/json',
|
|
95
|
+
},
|
|
96
|
+
body: JSON.stringify({
|
|
97
|
+
connectedAccountId: connId,
|
|
98
|
+
input: params,
|
|
99
|
+
}),
|
|
100
|
+
});
|
|
101
|
+
if (!res.ok) {
|
|
102
|
+
const body = await res.text();
|
|
103
|
+
throw new Error(`Composio ${res.status}: ${body.slice(0, 200)}`);
|
|
104
|
+
}
|
|
105
|
+
const result = (await res.json());
|
|
106
|
+
if (result.error) {
|
|
107
|
+
throw new Error(`Composio error: ${result.error}`);
|
|
108
|
+
}
|
|
109
|
+
return result.data ?? result;
|
|
110
|
+
}
|
|
111
|
+
function parseSince(since) {
|
|
112
|
+
const match = since.match(/^(\d+)(m|h|d)$/);
|
|
113
|
+
if (match) {
|
|
114
|
+
const num = parseInt(match[1], 10);
|
|
115
|
+
if (Number.isNaN(num))
|
|
116
|
+
return null;
|
|
117
|
+
const unit = match[2];
|
|
118
|
+
const ms = unit === 'm' ? num * 60_000 :
|
|
119
|
+
unit === 'h' ? num * 3_600_000 :
|
|
120
|
+
num * 86_400_000;
|
|
121
|
+
return new Date(Date.now() - ms).toISOString();
|
|
122
|
+
}
|
|
123
|
+
if (since.includes('T') || since.includes('-')) {
|
|
124
|
+
try {
|
|
125
|
+
return new Date(since).toISOString();
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
async function searchTweets(query, opts = {}) {
|
|
134
|
+
const maxResults = Math.max(Math.min(opts.maxResults ?? 100, 100), 10);
|
|
135
|
+
const pages = opts.pages ?? 1;
|
|
136
|
+
const sort = opts.sortOrder ?? 'relevancy';
|
|
137
|
+
let allTweets = [];
|
|
138
|
+
let nextToken;
|
|
139
|
+
for (let page = 0; page < pages; page++) {
|
|
140
|
+
const params = {
|
|
141
|
+
query,
|
|
142
|
+
max_results: maxResults,
|
|
143
|
+
sort_order: sort,
|
|
144
|
+
tweet__fields: ['created_at', 'public_metrics', 'author_id', 'conversation_id', 'entities'],
|
|
145
|
+
expansions: ['author_id'],
|
|
146
|
+
user__fields: ['username', 'name', 'public_metrics', 'description'],
|
|
147
|
+
};
|
|
148
|
+
if (opts.since) {
|
|
149
|
+
const startTime = parseSince(opts.since);
|
|
150
|
+
if (startTime)
|
|
151
|
+
params.start_time = startTime;
|
|
152
|
+
}
|
|
153
|
+
if (nextToken) {
|
|
154
|
+
params.next_token = nextToken;
|
|
155
|
+
}
|
|
156
|
+
const result = await composioExec('TWITTER_RECENT_SEARCH', params);
|
|
157
|
+
const tweets = parseTweets(result);
|
|
158
|
+
allTweets.push(...tweets);
|
|
159
|
+
nextToken = result?.meta?.next_token ?? result?.data?.meta?.next_token;
|
|
160
|
+
if (!nextToken)
|
|
161
|
+
break;
|
|
162
|
+
if (page < pages - 1)
|
|
163
|
+
await sleep(RATE_DELAY_MS);
|
|
164
|
+
}
|
|
165
|
+
return allTweets;
|
|
166
|
+
}
|
|
167
|
+
async function fetchThread(conversationId, pages) {
|
|
168
|
+
const query = `conversation_id:${conversationId}`;
|
|
169
|
+
return searchTweets(query, { pages: pages ?? 2, sortOrder: 'recency' });
|
|
170
|
+
}
|
|
171
|
+
async function fetchProfile(username, opts = {}) {
|
|
172
|
+
const replyFilter = opts.includeReplies ? '' : ' -is:reply';
|
|
173
|
+
const query = `from:${username} -is:retweet${replyFilter}`;
|
|
174
|
+
const tweets = await searchTweets(query, {
|
|
175
|
+
maxResults: Math.min(opts.count ?? 20, 100),
|
|
176
|
+
sortOrder: 'recency',
|
|
177
|
+
});
|
|
178
|
+
const user = tweets.length > 0
|
|
179
|
+
? { username: tweets[0].username, name: tweets[0].name }
|
|
180
|
+
: { username, name: username };
|
|
181
|
+
return { user, tweets };
|
|
182
|
+
}
|
|
183
|
+
async function fetchTweet(tweetId) {
|
|
184
|
+
const tweets = await searchTweets(tweetId, { maxResults: 10 });
|
|
185
|
+
return tweets.find((t) => t.id === tweetId) ?? tweets[0] ?? null;
|
|
186
|
+
}
|
|
187
|
+
// =============================================================================
|
|
188
|
+
// SORTING & FILTERING
|
|
189
|
+
// =============================================================================
|
|
190
|
+
function sortBy(tweets, metric = 'likes') {
|
|
191
|
+
return [...tweets].sort((a, b) => b.metrics[metric] - a.metrics[metric]);
|
|
192
|
+
}
|
|
193
|
+
function filterEngagement(tweets, opts) {
|
|
194
|
+
return tweets.filter((t) => {
|
|
195
|
+
if (opts.minLikes && t.metrics.likes < opts.minLikes)
|
|
196
|
+
return false;
|
|
197
|
+
if (opts.minImpressions && t.metrics.impressions < opts.minImpressions)
|
|
198
|
+
return false;
|
|
199
|
+
return true;
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
function dedupe(tweets) {
|
|
203
|
+
const seen = new Set();
|
|
204
|
+
return tweets.filter((t) => {
|
|
205
|
+
if (seen.has(t.id))
|
|
206
|
+
return false;
|
|
207
|
+
seen.add(t.id);
|
|
208
|
+
return true;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
// =============================================================================
|
|
212
|
+
// FORMATTING
|
|
213
|
+
// =============================================================================
|
|
214
|
+
function compactNumber(n) {
|
|
215
|
+
if (n >= 1_000_000)
|
|
216
|
+
return `${(n / 1_000_000).toFixed(1)}M`;
|
|
217
|
+
if (n >= 1_000)
|
|
218
|
+
return `${(n / 1_000).toFixed(1)}K`;
|
|
219
|
+
return String(n);
|
|
220
|
+
}
|
|
221
|
+
function timeAgo(dateStr) {
|
|
222
|
+
const diff = Date.now() - new Date(dateStr).getTime();
|
|
223
|
+
if (Number.isNaN(diff))
|
|
224
|
+
return '?';
|
|
225
|
+
const mins = Math.floor(diff / 60_000);
|
|
226
|
+
if (mins < 60)
|
|
227
|
+
return `${mins}m`;
|
|
228
|
+
const hours = Math.floor(mins / 60);
|
|
229
|
+
if (hours < 24)
|
|
230
|
+
return `${hours}h`;
|
|
231
|
+
const days = Math.floor(hours / 24);
|
|
232
|
+
return `${days}d`;
|
|
233
|
+
}
|
|
234
|
+
function formatTweet(t, index) {
|
|
235
|
+
const prefix = index !== undefined ? `${index + 1}. ` : '';
|
|
236
|
+
const engagement = `${compactNumber(t.metrics.likes)}L ${compactNumber(t.metrics.impressions)}I`;
|
|
237
|
+
const time = timeAgo(t.created_at);
|
|
238
|
+
const text = t.text.length > 200 ? t.text.slice(0, 197) + '...' : t.text;
|
|
239
|
+
const cleanText = text.replace(/https:\/\/t\.co\/\S+/g, '').trim();
|
|
240
|
+
let out = `${prefix}@${t.username} (${engagement} | ${time})\n${cleanText}`;
|
|
241
|
+
if (t.urls.length > 0) {
|
|
242
|
+
out += `\n${t.urls[0]}`;
|
|
243
|
+
}
|
|
244
|
+
out += `\n${t.tweet_url}`;
|
|
245
|
+
return out;
|
|
246
|
+
}
|
|
247
|
+
function formatResults(tweets, opts = {}) {
|
|
248
|
+
const limit = opts.limit ?? 15;
|
|
249
|
+
const shown = tweets.slice(0, limit);
|
|
250
|
+
let out = '';
|
|
251
|
+
if (opts.query) {
|
|
252
|
+
out += `"${opts.query}" -- ${tweets.length} results\n\n`;
|
|
253
|
+
}
|
|
254
|
+
out += shown.map((t, i) => formatTweet(t, i)).join('\n\n');
|
|
255
|
+
if (tweets.length > limit) {
|
|
256
|
+
out += `\n\n... +${tweets.length - limit} more`;
|
|
257
|
+
}
|
|
258
|
+
return out;
|
|
259
|
+
}
|
|
260
|
+
function formatTweetMarkdown(t) {
|
|
261
|
+
const engagement = `${t.metrics.likes}L ${t.metrics.impressions}I`;
|
|
262
|
+
const cleanText = t.text.replace(/https:\/\/t\.co\/\S+/g, '').trim();
|
|
263
|
+
const quoted = cleanText.replace(/\n/g, '\n > ');
|
|
264
|
+
let out = `- **@${t.username}** (${engagement}) [Tweet](${t.tweet_url})\n > ${quoted}`;
|
|
265
|
+
if (t.urls.length > 0) {
|
|
266
|
+
out += `\n Links: ${t.urls.map((u) => {
|
|
267
|
+
try {
|
|
268
|
+
return `[${new URL(u).hostname}](${u})`;
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
return u;
|
|
272
|
+
}
|
|
273
|
+
}).join(', ')}`;
|
|
274
|
+
}
|
|
275
|
+
return out;
|
|
276
|
+
}
|
|
277
|
+
function formatResearchMarkdown(query, tweets, opts = {}) {
|
|
278
|
+
const date = new Date().toISOString().split('T')[0];
|
|
279
|
+
let out = `# X Research: ${query}\n\n`;
|
|
280
|
+
out += `**Date:** ${date}\n`;
|
|
281
|
+
out += `**Tweets found:** ${tweets.length}\n\n`;
|
|
282
|
+
if (opts.themes && opts.themes.length > 0) {
|
|
283
|
+
for (const theme of opts.themes) {
|
|
284
|
+
out += `## ${theme.title}\n\n`;
|
|
285
|
+
const themeTweets = theme.tweetIds
|
|
286
|
+
.map((id) => tweets.find((t) => t.id === id))
|
|
287
|
+
.filter(Boolean);
|
|
288
|
+
out += themeTweets.map(formatTweetMarkdown).join('\n\n');
|
|
289
|
+
out += '\n\n';
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
out += `## Top Results (by engagement)\n\n`;
|
|
294
|
+
out += tweets.slice(0, 30).map(formatTweetMarkdown).join('\n\n');
|
|
295
|
+
out += '\n\n';
|
|
296
|
+
}
|
|
297
|
+
out += `---\n\n## Research Metadata\n`;
|
|
298
|
+
out += `- **Query:** ${query}\n`;
|
|
299
|
+
out += `- **Date:** ${date}\n`;
|
|
300
|
+
out += `- **Tweets scanned:** ${tweets.length}\n`;
|
|
301
|
+
out += `- **Cost:** $0 (Composio)\n`;
|
|
302
|
+
if (opts.queries) {
|
|
303
|
+
out += `- **Search queries:**\n`;
|
|
304
|
+
for (const q of opts.queries) {
|
|
305
|
+
out += ` - \`${q}\`\n`;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return out;
|
|
309
|
+
}
|
|
310
|
+
function formatProfile(user, tweets) {
|
|
311
|
+
const m = user.public_metrics ?? {};
|
|
312
|
+
let out = `@${user.username} -- ${user.name}\n`;
|
|
313
|
+
if (m.followers_count) {
|
|
314
|
+
out += `${compactNumber(m.followers_count)} followers | ${compactNumber(m.tweet_count ?? 0)} tweets\n`;
|
|
315
|
+
}
|
|
316
|
+
if (user.description) {
|
|
317
|
+
out += `${user.description.slice(0, 150)}\n`;
|
|
318
|
+
}
|
|
319
|
+
out += '\nRecent:\n\n';
|
|
320
|
+
out += tweets
|
|
321
|
+
.slice(0, 10)
|
|
322
|
+
.map((t, i) => formatTweet(t, i))
|
|
323
|
+
.join('\n\n');
|
|
324
|
+
return out;
|
|
325
|
+
}
|
|
326
|
+
// =============================================================================
|
|
327
|
+
// WATCHLIST (in-memory, session-scoped)
|
|
328
|
+
// =============================================================================
|
|
329
|
+
const watchlist = new Map();
|
|
330
|
+
// =============================================================================
|
|
331
|
+
// ARG PARSING HELPERS
|
|
332
|
+
// =============================================================================
|
|
333
|
+
function parseArgs(raw) {
|
|
334
|
+
const tokens = raw.trim().split(/\s+/);
|
|
335
|
+
const positional = [];
|
|
336
|
+
const flags = new Set();
|
|
337
|
+
const opts = new Map();
|
|
338
|
+
let i = 0;
|
|
339
|
+
while (i < tokens.length) {
|
|
340
|
+
const tok = tokens[i];
|
|
341
|
+
if (tok.startsWith('--')) {
|
|
342
|
+
const name = tok.slice(2);
|
|
343
|
+
// Check if next token exists and isn't a flag
|
|
344
|
+
if (i + 1 < tokens.length && !tokens[i + 1].startsWith('--')) {
|
|
345
|
+
opts.set(name, tokens[i + 1]);
|
|
346
|
+
i += 2;
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
flags.add(name);
|
|
350
|
+
i++;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
positional.push(tok);
|
|
355
|
+
i++;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return { positional, flags, opts };
|
|
359
|
+
}
|
|
360
|
+
function safeParseInt(val, fallback) {
|
|
361
|
+
if (val === undefined)
|
|
362
|
+
return fallback;
|
|
363
|
+
const n = parseInt(val, 10);
|
|
364
|
+
return Number.isNaN(n) ? fallback : n;
|
|
365
|
+
}
|
|
366
|
+
// =============================================================================
|
|
367
|
+
// COMMAND HANDLERS
|
|
368
|
+
// =============================================================================
|
|
369
|
+
async function handleSearch(argsStr) {
|
|
370
|
+
const { positional, flags, opts } = parseArgs(argsStr);
|
|
371
|
+
const sortOpt = opts.get('sort') ?? 'likes';
|
|
372
|
+
const minLikes = safeParseInt(opts.get('min-likes'), 0);
|
|
373
|
+
const minImpressions = safeParseInt(opts.get('min-impressions'), 0);
|
|
374
|
+
const pages = Math.min(safeParseInt(opts.get('pages'), 1), 5);
|
|
375
|
+
const limit = safeParseInt(opts.get('limit'), 15);
|
|
376
|
+
const since = opts.get('since');
|
|
377
|
+
const noReplies = flags.has('no-replies');
|
|
378
|
+
const noRetweets = flags.has('no-retweets');
|
|
379
|
+
const asJson = flags.has('json');
|
|
380
|
+
const asMarkdown = flags.has('markdown');
|
|
381
|
+
let query = positional.join(' ');
|
|
382
|
+
if (!query)
|
|
383
|
+
return 'Usage: /x search <query> [--sort likes|recent] [--since 1h|1d|7d] [--limit N] [--pages N]';
|
|
384
|
+
if (!query.includes('is:retweet') && !noRetweets) {
|
|
385
|
+
query += ' -is:retweet';
|
|
386
|
+
}
|
|
387
|
+
if (noReplies && !query.includes('is:reply')) {
|
|
388
|
+
query += ' -is:reply';
|
|
389
|
+
}
|
|
390
|
+
// Check cache
|
|
391
|
+
const cacheKey = `search:${query}|sort=${sortOpt}&pages=${pages}&since=${since ?? '7d'}`;
|
|
392
|
+
const cached = tweetCache.get(cacheKey);
|
|
393
|
+
let tweets;
|
|
394
|
+
if (cached) {
|
|
395
|
+
tweets = cached;
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
tweets = await searchTweets(query, {
|
|
399
|
+
pages,
|
|
400
|
+
sortOrder: sortOpt === 'recent' ? 'recency' : 'relevancy',
|
|
401
|
+
since: since ?? undefined,
|
|
402
|
+
});
|
|
403
|
+
tweetCache.set(cacheKey, tweets);
|
|
404
|
+
}
|
|
405
|
+
// Filter
|
|
406
|
+
if (minLikes > 0 || minImpressions > 0) {
|
|
407
|
+
tweets = filterEngagement(tweets, {
|
|
408
|
+
minLikes: minLikes > 0 ? minLikes : undefined,
|
|
409
|
+
minImpressions: minImpressions > 0 ? minImpressions : undefined,
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
// Sort
|
|
413
|
+
if (sortOpt !== 'recent') {
|
|
414
|
+
const metric = sortOpt;
|
|
415
|
+
tweets = sortBy(tweets, metric);
|
|
416
|
+
}
|
|
417
|
+
tweets = dedupe(tweets);
|
|
418
|
+
if (tweets.length === 0)
|
|
419
|
+
return `No tweets found for "${positional.join(' ')}".`;
|
|
420
|
+
// Output format
|
|
421
|
+
if (asJson) {
|
|
422
|
+
return JSON.stringify(tweets.slice(0, limit), null, 2);
|
|
423
|
+
}
|
|
424
|
+
if (asMarkdown) {
|
|
425
|
+
return formatResearchMarkdown(positional.join(' '), tweets, { queries: [query] });
|
|
426
|
+
}
|
|
427
|
+
const sinceLabel = since ? ` | since ${since}` : '';
|
|
428
|
+
const footer = `\n\n${tweets.length} tweets | sorted by ${sortOpt} | ${pages} page(s)${sinceLabel}`;
|
|
429
|
+
return formatResults(tweets, { query: positional.join(' '), limit }) + footer;
|
|
430
|
+
}
|
|
431
|
+
async function handleThread(argsStr) {
|
|
432
|
+
const { positional, opts } = parseArgs(argsStr);
|
|
433
|
+
const tweetId = positional[0];
|
|
434
|
+
if (!tweetId)
|
|
435
|
+
return 'Usage: /x thread <tweet_id> [--pages N]';
|
|
436
|
+
const pages = Math.min(safeParseInt(opts.get('pages'), 2), 5);
|
|
437
|
+
const tweets = await fetchThread(tweetId, pages);
|
|
438
|
+
if (tweets.length === 0)
|
|
439
|
+
return 'No tweets found in thread.';
|
|
440
|
+
let out = `Thread (${tweets.length} tweets)\n\n`;
|
|
441
|
+
out += tweets.map((t) => formatTweet(t)).join('\n\n');
|
|
442
|
+
return out;
|
|
443
|
+
}
|
|
444
|
+
async function handleProfile(argsStr) {
|
|
445
|
+
const { positional, flags, opts } = parseArgs(argsStr);
|
|
446
|
+
const username = positional[0]?.replace(/^@/, '');
|
|
447
|
+
if (!username)
|
|
448
|
+
return 'Usage: /x profile <username> [--count N] [--replies]';
|
|
449
|
+
const count = safeParseInt(opts.get('count'), 20);
|
|
450
|
+
const includeReplies = flags.has('replies');
|
|
451
|
+
const asJson = flags.has('json');
|
|
452
|
+
const { user, tweets } = await fetchProfile(username, { count, includeReplies });
|
|
453
|
+
if (asJson) {
|
|
454
|
+
return JSON.stringify({ user, tweets }, null, 2);
|
|
455
|
+
}
|
|
456
|
+
return formatProfile(user, tweets);
|
|
457
|
+
}
|
|
458
|
+
async function handleTweet(argsStr) {
|
|
459
|
+
const { positional, flags } = parseArgs(argsStr);
|
|
460
|
+
const tweetId = positional[0];
|
|
461
|
+
if (!tweetId)
|
|
462
|
+
return 'Usage: /x tweet <tweet_id>';
|
|
463
|
+
const tweet = await fetchTweet(tweetId);
|
|
464
|
+
if (!tweet)
|
|
465
|
+
return 'Tweet not found.';
|
|
466
|
+
if (flags.has('json')) {
|
|
467
|
+
return JSON.stringify(tweet, null, 2);
|
|
468
|
+
}
|
|
469
|
+
return formatTweet(tweet);
|
|
470
|
+
}
|
|
471
|
+
async function handleWatchlist(argsStr) {
|
|
472
|
+
const parts = argsStr.trim().split(/\s+/);
|
|
473
|
+
const sub = parts[0]?.toLowerCase();
|
|
474
|
+
if (sub === 'add') {
|
|
475
|
+
const username = parts[1]?.replace(/^@/, '');
|
|
476
|
+
if (!username)
|
|
477
|
+
return 'Usage: /x watchlist add <username> [note]';
|
|
478
|
+
const key = username.toLowerCase();
|
|
479
|
+
if (watchlist.has(key))
|
|
480
|
+
return `@${username} already on watchlist.`;
|
|
481
|
+
const note = parts.slice(2).join(' ') || undefined;
|
|
482
|
+
watchlist.set(key, { note, addedAt: new Date().toISOString() });
|
|
483
|
+
return `Added @${username} to watchlist.${note ? ` (${note})` : ''}`;
|
|
484
|
+
}
|
|
485
|
+
if (sub === 'remove' || sub === 'rm') {
|
|
486
|
+
const username = parts[1]?.replace(/^@/, '');
|
|
487
|
+
if (!username)
|
|
488
|
+
return 'Usage: /x watchlist remove <username>';
|
|
489
|
+
const key = username.toLowerCase();
|
|
490
|
+
if (watchlist.delete(key)) {
|
|
491
|
+
return `Removed @${username} from watchlist.`;
|
|
492
|
+
}
|
|
493
|
+
return `@${username} not found on watchlist.`;
|
|
494
|
+
}
|
|
495
|
+
if (sub === 'check') {
|
|
496
|
+
if (watchlist.size === 0)
|
|
497
|
+
return 'Watchlist is empty. Add accounts with: /x watchlist add <username>';
|
|
498
|
+
const lines = [`Checking ${watchlist.size} watchlist accounts...\n`];
|
|
499
|
+
for (const [key, entry] of watchlist) {
|
|
500
|
+
try {
|
|
501
|
+
const { user, tweets } = await fetchProfile(key, { count: 5 });
|
|
502
|
+
const label = entry.note ? ` (${entry.note})` : '';
|
|
503
|
+
lines.push(`\n--- @${key}${label} ---`);
|
|
504
|
+
if (tweets.length === 0) {
|
|
505
|
+
lines.push(' No recent tweets.');
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
for (const t of tweets.slice(0, 3)) {
|
|
509
|
+
lines.push(formatTweet(t));
|
|
510
|
+
lines.push('');
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
catch (e) {
|
|
515
|
+
lines.push(`Error checking @${key}: ${e.message}`);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
return lines.join('\n');
|
|
519
|
+
}
|
|
520
|
+
// Default: show watchlist
|
|
521
|
+
if (watchlist.size === 0)
|
|
522
|
+
return 'Watchlist is empty. Add accounts with: /x watchlist add <username>';
|
|
523
|
+
const lines = [`Watchlist (${watchlist.size} accounts)\n`];
|
|
524
|
+
for (const [key, entry] of watchlist) {
|
|
525
|
+
const note = entry.note ? ` -- ${entry.note}` : '';
|
|
526
|
+
const added = entry.addedAt.split('T')[0];
|
|
527
|
+
lines.push(` @${key}${note} (added ${added})`);
|
|
528
|
+
}
|
|
529
|
+
return lines.join('\n');
|
|
530
|
+
}
|
|
531
|
+
function handleCache(argsStr) {
|
|
532
|
+
const sub = argsStr.trim().toLowerCase();
|
|
533
|
+
if (sub === 'clear') {
|
|
534
|
+
tweetCache.clear();
|
|
535
|
+
return 'Cache cleared.';
|
|
536
|
+
}
|
|
537
|
+
const stats = tweetCache.stats();
|
|
538
|
+
return `Cache: ${stats.size}/${stats.maxSize} entries | hit rate: ${(stats.hitRate * 100).toFixed(0)}% | hits: ${stats.hits}, misses: ${stats.misses}`;
|
|
539
|
+
}
|
|
540
|
+
// =============================================================================
|
|
541
|
+
// MAIN EXECUTE
|
|
542
|
+
// =============================================================================
|
|
543
|
+
async function execute(args) {
|
|
544
|
+
const parts = args.trim().split(/\s+/);
|
|
545
|
+
const cmd = parts[0]?.toLowerCase() ?? 'help';
|
|
546
|
+
const rest = parts.slice(1).join(' ');
|
|
547
|
+
try {
|
|
548
|
+
switch (cmd) {
|
|
549
|
+
case 'search':
|
|
550
|
+
case 's':
|
|
551
|
+
return await handleSearch(rest);
|
|
552
|
+
case 'thread':
|
|
553
|
+
case 't':
|
|
554
|
+
return await handleThread(rest);
|
|
555
|
+
case 'profile':
|
|
556
|
+
case 'p':
|
|
557
|
+
return await handleProfile(rest);
|
|
558
|
+
case 'tweet':
|
|
559
|
+
return await handleTweet(rest);
|
|
560
|
+
case 'watchlist':
|
|
561
|
+
case 'wl':
|
|
562
|
+
return await handleWatchlist(rest);
|
|
563
|
+
case 'cache':
|
|
564
|
+
return handleCache(rest);
|
|
565
|
+
case 'help':
|
|
566
|
+
default:
|
|
567
|
+
return helpText();
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
catch (error) {
|
|
571
|
+
return `Error: ${error instanceof Error ? error.message : String(error)}`;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
function helpText() {
|
|
575
|
+
return `**X/Twitter Research** (via Composio)
|
|
576
|
+
|
|
577
|
+
**Commands:**
|
|
578
|
+
/x search <query> [options] Search recent tweets (last 7 days)
|
|
579
|
+
/x thread <tweet_id> Fetch full conversation thread
|
|
580
|
+
/x profile <username> Recent tweets from a user
|
|
581
|
+
/x tweet <tweet_id> Fetch a single tweet
|
|
582
|
+
/x watchlist Show watchlist
|
|
583
|
+
/x watchlist add <user> [note] Add user to watchlist
|
|
584
|
+
/x watchlist remove <user> Remove user from watchlist
|
|
585
|
+
/x watchlist check Check recent tweets from all watchlist accounts
|
|
586
|
+
/x cache clear Clear search cache
|
|
587
|
+
|
|
588
|
+
**Search options:**
|
|
589
|
+
--sort likes|impressions|retweets|recent (default: likes)
|
|
590
|
+
--since 1h|3h|12h|1d|7d Time filter
|
|
591
|
+
--min-likes N Filter minimum likes
|
|
592
|
+
--min-impressions N Filter minimum impressions
|
|
593
|
+
--pages N Pages to fetch, 1-5 (default: 1)
|
|
594
|
+
--limit N Results to display (default: 15)
|
|
595
|
+
--no-replies Exclude replies
|
|
596
|
+
--no-retweets Exclude retweets
|
|
597
|
+
--json Raw JSON output
|
|
598
|
+
--markdown Markdown research document output
|
|
599
|
+
|
|
600
|
+
**Examples:**
|
|
601
|
+
/x search "claude code"
|
|
602
|
+
/x search "polymarket" --sort recent --since 1d --markdown
|
|
603
|
+
/x profile elonmusk --count 5 --json
|
|
604
|
+
/x watchlist add vikiival "Polymarket whale"`;
|
|
605
|
+
}
|
|
606
|
+
// =============================================================================
|
|
607
|
+
// EXPORT
|
|
608
|
+
// =============================================================================
|
|
609
|
+
exports.default = {
|
|
610
|
+
name: 'x-research',
|
|
611
|
+
description: 'X/Twitter research via Composio — search, threads, profiles, watchlists',
|
|
612
|
+
commands: ['/x', '/x-research', '/twitter'],
|
|
613
|
+
handle: execute,
|
|
614
|
+
requires: {
|
|
615
|
+
env: ['COMPOSIO_API_KEY', 'COMPOSIO_CONNECTION_ID'],
|
|
616
|
+
},
|
|
617
|
+
};
|
|
618
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/skills/bundled/x-research/index.ts"],"names":[],"mappings":"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"}
|