@hidden-leaf/x-skill 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 (53) hide show
  1. package/.env.example +50 -0
  2. package/CLAUDE.snippet.md +34 -0
  3. package/README.md +220 -0
  4. package/SKILL.md +265 -0
  5. package/dist/cache/store.d.ts +48 -0
  6. package/dist/cache/store.d.ts.map +1 -0
  7. package/dist/cache/store.js +381 -0
  8. package/dist/cache/store.js.map +1 -0
  9. package/dist/clients/types.d.ts +217 -0
  10. package/dist/clients/types.d.ts.map +1 -0
  11. package/dist/clients/types.js +77 -0
  12. package/dist/clients/types.js.map +1 -0
  13. package/dist/clients/x-client.d.ts +111 -0
  14. package/dist/clients/x-client.d.ts.map +1 -0
  15. package/dist/clients/x-client.js +421 -0
  16. package/dist/clients/x-client.js.map +1 -0
  17. package/dist/index.d.ts +20 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +52 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/skills/bookmarks/index.d.ts +79 -0
  22. package/dist/skills/bookmarks/index.d.ts.map +1 -0
  23. package/dist/skills/bookmarks/index.js +288 -0
  24. package/dist/skills/bookmarks/index.js.map +1 -0
  25. package/dist/skills/bookmarks/synthesize.d.ts +40 -0
  26. package/dist/skills/bookmarks/synthesize.d.ts.map +1 -0
  27. package/dist/skills/bookmarks/synthesize.js +164 -0
  28. package/dist/skills/bookmarks/synthesize.js.map +1 -0
  29. package/dist/skills/bookmarks/types.d.ts +71 -0
  30. package/dist/skills/bookmarks/types.d.ts.map +1 -0
  31. package/dist/skills/bookmarks/types.js +6 -0
  32. package/dist/skills/bookmarks/types.js.map +1 -0
  33. package/dist/utils/logger.d.ts +10 -0
  34. package/dist/utils/logger.d.ts.map +1 -0
  35. package/dist/utils/logger.js +43 -0
  36. package/dist/utils/logger.js.map +1 -0
  37. package/package.json +68 -0
  38. package/scripts/cache-report.ts +25 -0
  39. package/scripts/create-atlsk-ticket.ts +68 -0
  40. package/scripts/create-deep-dive-ticket.ts +66 -0
  41. package/scripts/create-jira-project.ts +31 -0
  42. package/scripts/create-launch-and-roadmap.ts +200 -0
  43. package/scripts/create-next-session.ts +71 -0
  44. package/scripts/create-roadmap.ts +150 -0
  45. package/scripts/debug-api.ts +45 -0
  46. package/scripts/debug-folder.ts +37 -0
  47. package/scripts/jira-close-v1-tickets.ts +83 -0
  48. package/scripts/jira-v1-close-and-post-v1.ts +272 -0
  49. package/scripts/oauth-flow.ts +216 -0
  50. package/scripts/postinstall.js +112 -0
  51. package/scripts/sync-test.ts +36 -0
  52. package/scripts/test-refresh-forced.ts +29 -0
  53. package/scripts/test-refresh.ts +25 -0
@@ -0,0 +1,381 @@
1
+ "use strict";
2
+ /**
3
+ * SQLite-backed local cache for X bookmark data.
4
+ *
5
+ * Pattern: sync pulls from X API → upserts into local DB.
6
+ * All reads (list, fetch, brief) hit the cache, not the API.
7
+ * You only pay when you sync.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ var __importDefault = (this && this.__importDefault) || function (mod) {
43
+ return (mod && mod.__esModule) ? mod : { "default": mod };
44
+ };
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.BookmarkStore = void 0;
47
+ exports.createStoreFromEnv = createStoreFromEnv;
48
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
49
+ const path = __importStar(require("path"));
50
+ const os = __importStar(require("os"));
51
+ const fs = __importStar(require("fs"));
52
+ const DEFAULT_DB_DIR = path.join(os.homedir(), '.x-skill');
53
+ const DEFAULT_DB_PATH = path.join(DEFAULT_DB_DIR, 'bookmarks.db');
54
+ class BookmarkStore {
55
+ db;
56
+ constructor(dbPath) {
57
+ const resolvedPath = dbPath ?? process.env.X_CACHE_DB_PATH ?? DEFAULT_DB_PATH;
58
+ // Ensure directory exists
59
+ const dir = path.dirname(resolvedPath);
60
+ if (!fs.existsSync(dir)) {
61
+ fs.mkdirSync(dir, { recursive: true });
62
+ }
63
+ this.db = new better_sqlite3_1.default(resolvedPath);
64
+ this.db.pragma('journal_mode = WAL');
65
+ this.db.pragma('foreign_keys = ON');
66
+ this.migrate();
67
+ }
68
+ // ==========================================================================
69
+ // Schema
70
+ // ==========================================================================
71
+ migrate() {
72
+ this.db.exec(`
73
+ CREATE TABLE IF NOT EXISTS folders (
74
+ id TEXT PRIMARY KEY,
75
+ name TEXT NOT NULL,
76
+ description TEXT,
77
+ icon TEXT,
78
+ tweet_count INTEGER,
79
+ synced_at TEXT NOT NULL
80
+ );
81
+
82
+ CREATE TABLE IF NOT EXISTS users (
83
+ id TEXT PRIMARY KEY,
84
+ name TEXT NOT NULL,
85
+ username TEXT NOT NULL,
86
+ description TEXT,
87
+ profile_image_url TEXT,
88
+ verified INTEGER DEFAULT 0,
89
+ followers_count INTEGER,
90
+ following_count INTEGER,
91
+ tweet_count INTEGER,
92
+ listed_count INTEGER,
93
+ created_at TEXT,
94
+ synced_at TEXT NOT NULL
95
+ );
96
+
97
+ CREATE TABLE IF NOT EXISTS tweets (
98
+ id TEXT PRIMARY KEY,
99
+ text TEXT NOT NULL,
100
+ author_id TEXT,
101
+ created_at TEXT,
102
+ conversation_id TEXT,
103
+ lang TEXT,
104
+ like_count INTEGER DEFAULT 0,
105
+ retweet_count INTEGER DEFAULT 0,
106
+ reply_count INTEGER DEFAULT 0,
107
+ quote_count INTEGER DEFAULT 0,
108
+ bookmark_count INTEGER DEFAULT 0,
109
+ impression_count INTEGER DEFAULT 0,
110
+ entities_json TEXT,
111
+ context_annotations_json TEXT,
112
+ referenced_tweets_json TEXT,
113
+ note_tweet_text TEXT,
114
+ synced_at TEXT NOT NULL,
115
+ FOREIGN KEY (author_id) REFERENCES users(id)
116
+ );
117
+
118
+ CREATE TABLE IF NOT EXISTS folder_tweets (
119
+ folder_id TEXT NOT NULL,
120
+ tweet_id TEXT NOT NULL,
121
+ position INTEGER,
122
+ synced_at TEXT NOT NULL,
123
+ PRIMARY KEY (folder_id, tweet_id),
124
+ FOREIGN KEY (folder_id) REFERENCES folders(id),
125
+ FOREIGN KEY (tweet_id) REFERENCES tweets(id)
126
+ );
127
+
128
+ CREATE TABLE IF NOT EXISTS sync_log (
129
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
130
+ scope TEXT NOT NULL,
131
+ folder_id TEXT,
132
+ tweet_count INTEGER,
133
+ started_at TEXT NOT NULL,
134
+ completed_at TEXT,
135
+ status TEXT DEFAULT 'running'
136
+ );
137
+
138
+ CREATE INDEX IF NOT EXISTS idx_tweets_author ON tweets(author_id);
139
+ CREATE INDEX IF NOT EXISTS idx_tweets_created ON tweets(created_at);
140
+ CREATE INDEX IF NOT EXISTS idx_folder_tweets_folder ON folder_tweets(folder_id);
141
+ `);
142
+ }
143
+ // ==========================================================================
144
+ // Upsert Operations (called during sync)
145
+ // ==========================================================================
146
+ upsertFolder(folder) {
147
+ const stmt = this.db.prepare(`
148
+ INSERT INTO folders (id, name, description, icon, tweet_count, synced_at)
149
+ VALUES (?, ?, ?, ?, ?, ?)
150
+ ON CONFLICT(id) DO UPDATE SET
151
+ name = excluded.name,
152
+ description = excluded.description,
153
+ icon = excluded.icon,
154
+ tweet_count = excluded.tweet_count,
155
+ synced_at = excluded.synced_at
156
+ `);
157
+ stmt.run(folder.id, folder.name, folder.description ?? null, folder.icon ?? null, folder.tweet_count ?? null, new Date().toISOString());
158
+ }
159
+ upsertUser(user) {
160
+ const stmt = this.db.prepare(`
161
+ INSERT INTO users (id, name, username, description, profile_image_url, verified,
162
+ followers_count, following_count, tweet_count, listed_count, created_at, synced_at)
163
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
164
+ ON CONFLICT(id) DO UPDATE SET
165
+ name = excluded.name,
166
+ username = excluded.username,
167
+ description = excluded.description,
168
+ profile_image_url = excluded.profile_image_url,
169
+ verified = excluded.verified,
170
+ followers_count = excluded.followers_count,
171
+ following_count = excluded.following_count,
172
+ tweet_count = excluded.tweet_count,
173
+ listed_count = excluded.listed_count,
174
+ synced_at = excluded.synced_at
175
+ `);
176
+ stmt.run(user.id, user.name, user.username, user.description ?? null, user.profile_image_url ?? null, user.verified ? 1 : 0, user.public_metrics?.followers_count ?? null, user.public_metrics?.following_count ?? null, user.public_metrics?.tweet_count ?? null, user.public_metrics?.listed_count ?? null, user.created_at ?? null, new Date().toISOString());
177
+ }
178
+ upsertTweet(tweet) {
179
+ const stmt = this.db.prepare(`
180
+ INSERT INTO tweets (id, text, author_id, created_at, conversation_id, lang,
181
+ like_count, retweet_count, reply_count, quote_count, bookmark_count, impression_count,
182
+ entities_json, context_annotations_json, referenced_tweets_json, note_tweet_text, synced_at)
183
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
184
+ ON CONFLICT(id) DO UPDATE SET
185
+ text = excluded.text,
186
+ like_count = excluded.like_count,
187
+ retweet_count = excluded.retweet_count,
188
+ reply_count = excluded.reply_count,
189
+ quote_count = excluded.quote_count,
190
+ bookmark_count = excluded.bookmark_count,
191
+ impression_count = excluded.impression_count,
192
+ entities_json = excluded.entities_json,
193
+ context_annotations_json = excluded.context_annotations_json,
194
+ note_tweet_text = excluded.note_tweet_text,
195
+ synced_at = excluded.synced_at
196
+ `);
197
+ stmt.run(tweet.id, tweet.text, tweet.author_id ?? null, tweet.created_at ?? null, tweet.conversation_id ?? null, tweet.lang ?? null, tweet.public_metrics?.like_count ?? 0, tweet.public_metrics?.retweet_count ?? 0, tweet.public_metrics?.reply_count ?? 0, tweet.public_metrics?.quote_count ?? 0, tweet.public_metrics?.bookmark_count ?? 0, tweet.public_metrics?.impression_count ?? 0, tweet.entities ? JSON.stringify(tweet.entities) : null, tweet.context_annotations ? JSON.stringify(tweet.context_annotations) : null, tweet.referenced_tweets ? JSON.stringify(tweet.referenced_tweets) : null, tweet.note_tweet?.text ?? null, new Date().toISOString());
198
+ }
199
+ linkTweetToFolder(folderId, tweetId, position) {
200
+ const stmt = this.db.prepare(`
201
+ INSERT INTO folder_tweets (folder_id, tweet_id, position, synced_at)
202
+ VALUES (?, ?, ?, ?)
203
+ ON CONFLICT(folder_id, tweet_id) DO UPDATE SET
204
+ position = excluded.position,
205
+ synced_at = excluded.synced_at
206
+ `);
207
+ stmt.run(folderId, tweetId, position, new Date().toISOString());
208
+ }
209
+ // ==========================================================================
210
+ // Batch Sync Helper
211
+ // ==========================================================================
212
+ /**
213
+ * Upsert a full folder sync result in a single transaction.
214
+ */
215
+ syncFolderData(folder, tweets, users) {
216
+ const transaction = this.db.transaction(() => {
217
+ this.upsertFolder(folder);
218
+ for (const user of users.values()) {
219
+ this.upsertUser(user);
220
+ }
221
+ for (let i = 0; i < tweets.length; i++) {
222
+ this.upsertTweet(tweets[i]);
223
+ this.linkTweetToFolder(folder.id, tweets[i].id, i);
224
+ }
225
+ });
226
+ transaction();
227
+ }
228
+ // ==========================================================================
229
+ // Read Operations (called by skill)
230
+ // ==========================================================================
231
+ getFolders() {
232
+ const rows = this.db.prepare('SELECT * FROM folders ORDER BY name').all();
233
+ return rows.map((r) => ({
234
+ id: r.id,
235
+ name: r.name,
236
+ description: r.description ?? undefined,
237
+ icon: r.icon ?? undefined,
238
+ tweet_count: r.tweet_count ?? undefined,
239
+ }));
240
+ }
241
+ getFolderByName(name) {
242
+ const row = this.db.prepare('SELECT * FROM folders WHERE LOWER(name) = LOWER(?)').get(name);
243
+ if (!row)
244
+ return undefined;
245
+ return {
246
+ id: row.id,
247
+ name: row.name,
248
+ description: row.description ?? undefined,
249
+ icon: row.icon ?? undefined,
250
+ tweet_count: row.tweet_count ?? undefined,
251
+ };
252
+ }
253
+ getTweetsByFolder(folderId) {
254
+ const rows = this.db.prepare(`
255
+ SELECT t.*, ft.position,
256
+ u.name as u_name, u.username as u_username, u.description as u_description,
257
+ u.profile_image_url as u_profile_image_url, u.verified as u_verified,
258
+ u.followers_count as u_followers, u.following_count as u_following,
259
+ u.tweet_count as u_tweets, u.listed_count as u_listed, u.created_at as u_created
260
+ FROM tweets t
261
+ JOIN folder_tweets ft ON ft.tweet_id = t.id
262
+ LEFT JOIN users u ON u.id = t.author_id
263
+ WHERE ft.folder_id = ?
264
+ ORDER BY ft.position ASC
265
+ `).all(folderId);
266
+ return rows.map((r) => ({
267
+ tweet: this.rowToTweet(r),
268
+ author: r.u_username ? this.rowToUser(r) : undefined,
269
+ }));
270
+ }
271
+ getAllTweets() {
272
+ const rows = this.db.prepare(`
273
+ SELECT t.*,
274
+ u.name as u_name, u.username as u_username, u.description as u_description,
275
+ u.profile_image_url as u_profile_image_url, u.verified as u_verified,
276
+ u.followers_count as u_followers, u.following_count as u_following,
277
+ u.tweet_count as u_tweets, u.listed_count as u_listed, u.created_at as u_created
278
+ FROM tweets t
279
+ LEFT JOIN users u ON u.id = t.author_id
280
+ ORDER BY t.created_at DESC
281
+ `).all();
282
+ return rows.map((r) => ({
283
+ tweet: this.rowToTweet(r),
284
+ author: r.u_username ? this.rowToUser(r) : undefined,
285
+ }));
286
+ }
287
+ getStats() {
288
+ const folders = this.db.prepare('SELECT COUNT(*) as c FROM folders').get().c;
289
+ const tweets = this.db.prepare('SELECT COUNT(*) as c FROM tweets').get().c;
290
+ const users = this.db.prepare('SELECT COUNT(*) as c FROM users').get().c;
291
+ const lastSync = this.db.prepare("SELECT MAX(synced_at) as s FROM folders").get().s;
292
+ return { folders, tweets, users, lastSync };
293
+ }
294
+ // ==========================================================================
295
+ // Sync Log
296
+ // ==========================================================================
297
+ logSyncStart(scope, folderId) {
298
+ const result = this.db.prepare(`
299
+ INSERT INTO sync_log (scope, folder_id, started_at, status)
300
+ VALUES (?, ?, ?, 'running')
301
+ `).run(scope, folderId ?? null, new Date().toISOString());
302
+ return Number(result.lastInsertRowid);
303
+ }
304
+ logSyncComplete(logId, tweetCount) {
305
+ this.db.prepare(`
306
+ UPDATE sync_log SET completed_at = ?, tweet_count = ?, status = 'completed'
307
+ WHERE id = ?
308
+ `).run(new Date().toISOString(), tweetCount, logId);
309
+ }
310
+ logSyncError(logId, _error) {
311
+ this.db.prepare(`
312
+ UPDATE sync_log SET completed_at = ?, status = 'error'
313
+ WHERE id = ?
314
+ `).run(new Date().toISOString(), logId);
315
+ }
316
+ // ==========================================================================
317
+ // Row Mapping
318
+ // ==========================================================================
319
+ rowToTweet(r) {
320
+ const tweet = {
321
+ id: r.id,
322
+ text: r.text,
323
+ author_id: r.author_id,
324
+ created_at: r.created_at,
325
+ conversation_id: r.conversation_id,
326
+ lang: r.lang,
327
+ public_metrics: {
328
+ like_count: r.like_count,
329
+ retweet_count: r.retweet_count,
330
+ reply_count: r.reply_count,
331
+ quote_count: r.quote_count,
332
+ bookmark_count: r.bookmark_count,
333
+ impression_count: r.impression_count,
334
+ },
335
+ };
336
+ if (r.entities_json) {
337
+ tweet.entities = JSON.parse(r.entities_json);
338
+ }
339
+ if (r.context_annotations_json) {
340
+ tweet.context_annotations = JSON.parse(r.context_annotations_json);
341
+ }
342
+ if (r.referenced_tweets_json) {
343
+ tweet.referenced_tweets = JSON.parse(r.referenced_tweets_json);
344
+ }
345
+ if (r.note_tweet_text) {
346
+ tweet.note_tweet = { text: r.note_tweet_text };
347
+ }
348
+ return tweet;
349
+ }
350
+ rowToUser(r) {
351
+ return {
352
+ id: r.author_id,
353
+ name: r.u_name,
354
+ username: r.u_username,
355
+ description: r.u_description,
356
+ profile_image_url: r.u_profile_image_url,
357
+ verified: r.u_verified === 1,
358
+ public_metrics: {
359
+ followers_count: r.u_followers,
360
+ following_count: r.u_following,
361
+ tweet_count: r.u_tweets,
362
+ listed_count: r.u_listed,
363
+ },
364
+ created_at: r.u_created,
365
+ };
366
+ }
367
+ // ==========================================================================
368
+ // Lifecycle
369
+ // ==========================================================================
370
+ close() {
371
+ this.db.close();
372
+ }
373
+ }
374
+ exports.BookmarkStore = BookmarkStore;
375
+ /**
376
+ * Create a BookmarkStore with default or env-configured path.
377
+ */
378
+ function createStoreFromEnv() {
379
+ return new BookmarkStore(process.env.X_CACHE_DB_PATH);
380
+ }
381
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * X API v2 types for @hidden-leaf/x-skill
3
+ */
4
+ export interface XAuthConfig {
5
+ /** OAuth 2.0 User Access Token (from OAuth flow, NOT the App Bearer token) */
6
+ userAccessToken: string;
7
+ /** Authenticated user ID (required for bookmark endpoints) */
8
+ userId: string;
9
+ /** OAuth 2.0 refresh token for auto-refreshing expired access tokens */
10
+ refreshToken?: string;
11
+ /** Consumer key (client ID) for token refresh */
12
+ consumerKey?: string;
13
+ /** Consumer secret for token refresh */
14
+ consumerSecret?: string;
15
+ }
16
+ export interface XApiResponse<T> {
17
+ data: T;
18
+ includes?: XIncludes;
19
+ meta?: XPaginationMeta;
20
+ errors?: XApiError[];
21
+ }
22
+ export interface XPaginationMeta {
23
+ result_count: number;
24
+ next_token?: string;
25
+ previous_token?: string;
26
+ }
27
+ export interface XApiError {
28
+ value?: string;
29
+ detail: string;
30
+ title: string;
31
+ resource_type?: string;
32
+ parameter?: string;
33
+ type: string;
34
+ }
35
+ export interface Tweet {
36
+ id: string;
37
+ text: string;
38
+ author_id?: string;
39
+ created_at?: string;
40
+ conversation_id?: string;
41
+ in_reply_to_user_id?: string;
42
+ lang?: string;
43
+ edit_history_tweet_ids?: string[];
44
+ public_metrics?: TweetPublicMetrics;
45
+ entities?: TweetEntities;
46
+ referenced_tweets?: ReferencedTweet[];
47
+ attachments?: TweetAttachments;
48
+ context_annotations?: ContextAnnotation[];
49
+ note_tweet?: NoteTweet;
50
+ }
51
+ export interface TweetPublicMetrics {
52
+ retweet_count: number;
53
+ reply_count: number;
54
+ like_count: number;
55
+ quote_count: number;
56
+ bookmark_count: number;
57
+ impression_count: number;
58
+ }
59
+ export interface TweetEntities {
60
+ urls?: TweetUrl[];
61
+ mentions?: TweetMention[];
62
+ hashtags?: TweetHashtag[];
63
+ annotations?: TweetAnnotation[];
64
+ }
65
+ export interface TweetUrl {
66
+ start: number;
67
+ end: number;
68
+ url: string;
69
+ expanded_url: string;
70
+ display_url: string;
71
+ title?: string;
72
+ description?: string;
73
+ }
74
+ export interface TweetMention {
75
+ start: number;
76
+ end: number;
77
+ username: string;
78
+ id: string;
79
+ }
80
+ export interface TweetHashtag {
81
+ start: number;
82
+ end: number;
83
+ tag: string;
84
+ }
85
+ export interface TweetAnnotation {
86
+ start: number;
87
+ end: number;
88
+ probability: number;
89
+ type: string;
90
+ normalized_text: string;
91
+ }
92
+ export interface ReferencedTweet {
93
+ type: 'retweeted' | 'quoted' | 'replied_to';
94
+ id: string;
95
+ }
96
+ export interface TweetAttachments {
97
+ media_keys?: string[];
98
+ poll_ids?: string[];
99
+ }
100
+ export interface ContextAnnotation {
101
+ domain: {
102
+ id: string;
103
+ name: string;
104
+ description?: string;
105
+ };
106
+ entity: {
107
+ id: string;
108
+ name: string;
109
+ description?: string;
110
+ };
111
+ }
112
+ export interface NoteTweet {
113
+ text: string;
114
+ entities?: TweetEntities;
115
+ }
116
+ export interface User {
117
+ id: string;
118
+ name: string;
119
+ username: string;
120
+ description?: string;
121
+ profile_image_url?: string;
122
+ verified?: boolean;
123
+ public_metrics?: UserPublicMetrics;
124
+ created_at?: string;
125
+ }
126
+ export interface UserPublicMetrics {
127
+ followers_count: number;
128
+ following_count: number;
129
+ tweet_count: number;
130
+ listed_count: number;
131
+ }
132
+ export interface Media {
133
+ media_key: string;
134
+ type: 'photo' | 'video' | 'animated_gif';
135
+ url?: string;
136
+ preview_image_url?: string;
137
+ alt_text?: string;
138
+ width?: number;
139
+ height?: number;
140
+ }
141
+ export interface XIncludes {
142
+ users?: User[];
143
+ tweets?: Tweet[];
144
+ media?: Media[];
145
+ }
146
+ export interface BookmarkFolder {
147
+ id: string;
148
+ name: string;
149
+ description?: string;
150
+ icon?: string;
151
+ tweet_count?: number;
152
+ }
153
+ export interface XClientOptions {
154
+ /** Max retries on 5xx/network errors (default: 3) */
155
+ maxRetries?: number;
156
+ /** Base delay between retries in ms (default: 1000) */
157
+ retryDelay?: number;
158
+ /** Request timeout in ms (default: 30000) */
159
+ timeout?: number;
160
+ }
161
+ /** Standard tweet fields to request */
162
+ export declare const DEFAULT_TWEET_FIELDS: readonly ["author_id", "created_at", "conversation_id", "entities", "public_metrics", "referenced_tweets", "context_annotations", "lang", "note_tweet"];
163
+ /** Standard user fields to request */
164
+ export declare const DEFAULT_USER_FIELDS: readonly ["name", "username", "description", "profile_image_url", "verified", "public_metrics", "created_at"];
165
+ /** Standard expansions for bookmark/tweet endpoints */
166
+ export declare const DEFAULT_EXPANSIONS: readonly ["author_id", "referenced_tweets.id", "attachments.media_keys"];
167
+ export interface BookmarkListParams {
168
+ /** Max results per page (1-100, default 100) */
169
+ max_results?: number;
170
+ /** Pagination token */
171
+ pagination_token?: string;
172
+ /** Tweet fields to include */
173
+ tweet_fields?: string[];
174
+ /** User fields to include */
175
+ user_fields?: string[];
176
+ /** Expansions */
177
+ expansions?: string[];
178
+ }
179
+ export interface BookmarkFolderListParams {
180
+ /** Max results per page */
181
+ max_results?: number;
182
+ /** Pagination token */
183
+ pagination_token?: string;
184
+ }
185
+ export interface BookmarkFolderTweetsParams extends BookmarkListParams {
186
+ /** Folder ID */
187
+ folder_id: string;
188
+ }
189
+ export declare class XApiRequestError extends Error {
190
+ readonly status: number;
191
+ readonly code?: string | undefined;
192
+ readonly rateLimit?: {
193
+ limit: number;
194
+ remaining: number;
195
+ reset: Date;
196
+ } | undefined;
197
+ constructor(message: string, status: number, code?: string | undefined, rateLimit?: {
198
+ limit: number;
199
+ remaining: number;
200
+ reset: Date;
201
+ } | undefined);
202
+ }
203
+ export declare class XAuthenticationError extends XApiRequestError {
204
+ constructor(message?: string);
205
+ }
206
+ export declare class XRateLimitError extends XApiRequestError {
207
+ readonly retryAfter: number;
208
+ constructor(retryAfter: number, rateLimit?: {
209
+ limit: number;
210
+ remaining: number;
211
+ reset: Date;
212
+ });
213
+ }
214
+ export declare class XNotFoundError extends XApiRequestError {
215
+ constructor(message?: string);
216
+ }
217
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/clients/types.ts"],"names":[],"mappings":"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"}