opencandle 0.6.0 → 0.7.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 (154) hide show
  1. package/README.md +10 -3
  2. package/dist/cli.js +36 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config.d.ts +10 -0
  5. package/dist/config.js +13 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/infra/index.d.ts +0 -1
  8. package/dist/infra/index.js +0 -1
  9. package/dist/infra/index.js.map +1 -1
  10. package/dist/onboarding/connect.d.ts +2 -2
  11. package/dist/onboarding/connect.js +10 -3
  12. package/dist/onboarding/connect.js.map +1 -1
  13. package/dist/onboarding/provider-status.d.ts +48 -0
  14. package/dist/onboarding/provider-status.js +285 -0
  15. package/dist/onboarding/provider-status.js.map +1 -0
  16. package/dist/onboarding/providers.d.ts +85 -8
  17. package/dist/onboarding/providers.js +87 -9
  18. package/dist/onboarding/providers.js.map +1 -1
  19. package/dist/onboarding/state.d.ts +1 -0
  20. package/dist/onboarding/state.js +5 -0
  21. package/dist/onboarding/state.js.map +1 -1
  22. package/dist/onboarding/tool-tags.d.ts +12 -1
  23. package/dist/onboarding/tool-tags.js +31 -1
  24. package/dist/onboarding/tool-tags.js.map +1 -1
  25. package/dist/onboarding/validation.d.ts +2 -2
  26. package/dist/onboarding/validation.js.map +1 -1
  27. package/dist/pi/opencandle-extension.js +91 -15
  28. package/dist/pi/opencandle-extension.js.map +1 -1
  29. package/dist/pi/tool-adapter.d.ts +4 -1
  30. package/dist/pi/tool-adapter.js +5 -4
  31. package/dist/pi/tool-adapter.js.map +1 -1
  32. package/dist/prompts/context-builder.js +1 -1
  33. package/dist/prompts/policy-cards.js +1 -1
  34. package/dist/prompts/policy-cards.js.map +1 -1
  35. package/dist/providers/external-tool-error.d.ts +10 -0
  36. package/dist/providers/external-tool-error.js +21 -0
  37. package/dist/providers/external-tool-error.js.map +1 -0
  38. package/dist/providers/reddit-cli.d.ts +36 -0
  39. package/dist/providers/reddit-cli.js +201 -0
  40. package/dist/providers/reddit-cli.js.map +1 -0
  41. package/dist/providers/reddit.d.ts +1 -1
  42. package/dist/providers/reddit.js +7 -35
  43. package/dist/providers/reddit.js.map +1 -1
  44. package/dist/providers/twitter-cli.d.ts +40 -0
  45. package/dist/providers/twitter-cli.js +153 -0
  46. package/dist/providers/twitter-cli.js.map +1 -0
  47. package/dist/providers/twitter.d.ts +0 -8
  48. package/dist/providers/twitter.js +4 -54
  49. package/dist/providers/twitter.js.map +1 -1
  50. package/dist/providers/wrap-provider.js +30 -0
  51. package/dist/providers/wrap-provider.js.map +1 -1
  52. package/dist/providers/yahoo-finance.js +53 -32
  53. package/dist/providers/yahoo-finance.js.map +1 -1
  54. package/dist/routing/planning.d.ts +1 -1
  55. package/dist/routing/planning.js.map +1 -1
  56. package/dist/runtime/answer-contracts.d.ts +1 -1
  57. package/dist/runtime/answer-contracts.js +12 -1
  58. package/dist/runtime/answer-contracts.js.map +1 -1
  59. package/dist/runtime/tool-defaults-wrapper.js +6 -2
  60. package/dist/runtime/tool-defaults-wrapper.js.map +1 -1
  61. package/dist/sentiment/index.d.ts +1 -0
  62. package/dist/sentiment/index.js +1 -0
  63. package/dist/sentiment/index.js.map +1 -1
  64. package/dist/sentiment/insights.d.ts +17 -0
  65. package/dist/sentiment/insights.js +206 -0
  66. package/dist/sentiment/insights.js.map +1 -0
  67. package/dist/sentiment/pipeline.js +13 -1
  68. package/dist/sentiment/pipeline.js.map +1 -1
  69. package/dist/sentiment/scorer.d.ts +2 -0
  70. package/dist/sentiment/scorer.js +10 -1
  71. package/dist/sentiment/scorer.js.map +1 -1
  72. package/dist/sentiment/types.d.ts +2 -0
  73. package/dist/sentiment/types.js.map +1 -1
  74. package/dist/system-prompt.js +3 -7
  75. package/dist/system-prompt.js.map +1 -1
  76. package/dist/tools/index.d.ts +5 -2
  77. package/dist/tools/index.js +8 -8
  78. package/dist/tools/index.js.map +1 -1
  79. package/dist/tools/sentiment/insight-format.d.ts +2 -0
  80. package/dist/tools/sentiment/insight-format.js +36 -0
  81. package/dist/tools/sentiment/insight-format.js.map +1 -0
  82. package/dist/tools/sentiment/query-match.d.ts +3 -0
  83. package/dist/tools/sentiment/query-match.js +113 -0
  84. package/dist/tools/sentiment/query-match.js.map +1 -0
  85. package/dist/tools/sentiment/reddit-sentiment.d.ts +12 -1
  86. package/dist/tools/sentiment/reddit-sentiment.js +263 -117
  87. package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
  88. package/dist/tools/sentiment/sentiment-summary.d.ts +9 -1
  89. package/dist/tools/sentiment/sentiment-summary.js +217 -201
  90. package/dist/tools/sentiment/sentiment-summary.js.map +1 -1
  91. package/dist/tools/sentiment/twitter-sentiment.d.ts +11 -1
  92. package/dist/tools/sentiment/twitter-sentiment.js +187 -64
  93. package/dist/tools/sentiment/twitter-sentiment.js.map +1 -1
  94. package/dist/tools/sentiment/web-sentiment.js +4 -0
  95. package/dist/tools/sentiment/web-sentiment.js.map +1 -1
  96. package/dist/types/sentiment.d.ts +52 -0
  97. package/gui/server/invoke-tool.ts +17 -3
  98. package/gui/server/model-setup.ts +10 -3
  99. package/gui/server/projector.ts +6 -2
  100. package/gui/server/server.ts +18 -0
  101. package/gui/server/tool-metadata.ts +80 -16
  102. package/gui/server/ws-hub.ts +19 -0
  103. package/gui/web/dist/assets/CatalogOverlay-CgeY5Pkp.js +1 -0
  104. package/gui/web/dist/assets/index-C6W_2eAn.js +69 -0
  105. package/gui/web/dist/assets/{index-2KZtKBmu.css → index-hwbx24a5.css} +1 -1
  106. package/gui/web/dist/index.html +2 -2
  107. package/package.json +5 -6
  108. package/src/cli.ts +41 -0
  109. package/src/config.ts +27 -0
  110. package/src/infra/index.ts +0 -1
  111. package/src/onboarding/connect.ts +20 -4
  112. package/src/onboarding/provider-status.ts +410 -0
  113. package/src/onboarding/providers.ts +148 -18
  114. package/src/onboarding/state.ts +9 -0
  115. package/src/onboarding/tool-tags.ts +45 -2
  116. package/src/onboarding/validation.ts +2 -2
  117. package/src/pi/opencandle-extension.ts +115 -17
  118. package/src/pi/tool-adapter.ts +14 -4
  119. package/src/prompts/context-builder.ts +1 -1
  120. package/src/prompts/policy-cards.ts +1 -1
  121. package/src/providers/external-tool-error.ts +20 -0
  122. package/src/providers/reddit-cli.ts +317 -0
  123. package/src/providers/reddit.ts +7 -63
  124. package/src/providers/twitter-cli.ts +233 -0
  125. package/src/providers/twitter.ts +4 -73
  126. package/src/providers/wrap-provider.ts +34 -0
  127. package/src/providers/yahoo-finance.ts +65 -32
  128. package/src/routing/planning.ts +1 -0
  129. package/src/runtime/answer-contracts.ts +23 -2
  130. package/src/runtime/tool-defaults-wrapper.ts +12 -2
  131. package/src/sentiment/index.ts +1 -0
  132. package/src/sentiment/insights.ts +269 -0
  133. package/src/sentiment/pipeline.ts +13 -1
  134. package/src/sentiment/scorer.ts +12 -1
  135. package/src/sentiment/types.ts +3 -0
  136. package/src/system-prompt.ts +3 -7
  137. package/src/tools/index.ts +9 -8
  138. package/src/tools/sentiment/insight-format.ts +50 -0
  139. package/src/tools/sentiment/query-match.ts +117 -0
  140. package/src/tools/sentiment/reddit-sentiment.ts +354 -141
  141. package/src/tools/sentiment/sentiment-summary.ts +283 -237
  142. package/src/tools/sentiment/twitter-sentiment.ts +262 -78
  143. package/src/tools/sentiment/web-sentiment.ts +4 -0
  144. package/src/types/sentiment.ts +59 -0
  145. package/dist/infra/browser.d.ts +0 -35
  146. package/dist/infra/browser.js +0 -105
  147. package/dist/infra/browser.js.map +0 -1
  148. package/dist/tools/interaction/twitter-login.d.ts +0 -8
  149. package/dist/tools/interaction/twitter-login.js +0 -87
  150. package/dist/tools/interaction/twitter-login.js.map +0 -1
  151. package/gui/web/dist/assets/CatalogOverlay-eJ2cBk33.js +0 -1
  152. package/gui/web/dist/assets/index-CveNgtDg.js +0 -69
  153. package/src/infra/browser.ts +0 -113
  154. package/src/tools/interaction/twitter-login.ts +0 -105
@@ -0,0 +1,201 @@
1
+ import { spawn } from "node:child_process";
2
+ import { ExternalToolError, ExternalToolNotInstalled } from "./external-tool-error.js";
3
+ const RDT_BINARY = "rdt";
4
+ const RDT_INSTALL_CMD = "uv tool install rdt-cli";
5
+ const COMMAND_TIMEOUT_MS = 20_000;
6
+ const MAX_OUTPUT_CHARS = 2_000_000;
7
+ let commandRunner = runCommand;
8
+ export function setRdtCommandRunnerForTests(runner) {
9
+ commandRunner = runner;
10
+ }
11
+ export function resetRdtCommandRunnerForTests() {
12
+ commandRunner = runCommand;
13
+ }
14
+ export async function searchRedditPosts(query, opts) {
15
+ const args = ["search", query];
16
+ if (opts.subreddit) {
17
+ args.push("--subreddit", opts.subreddit);
18
+ }
19
+ args.push("--json", "--compact", "-n", String(opts.limit));
20
+ const data = await runRdt(args);
21
+ if (!Array.isArray(data)) {
22
+ throw new ExternalToolError(RDT_BINARY, "rdt-cli returned invalid search data");
23
+ }
24
+ return data.map(adaptPost).filter((post) => post.id.length > 0);
25
+ }
26
+ export async function listSubredditPosts(subreddit, opts) {
27
+ const data = await runRdt([
28
+ "sub",
29
+ subreddit,
30
+ "--json",
31
+ "--compact",
32
+ "-n",
33
+ String(opts.limit),
34
+ ]);
35
+ if (!Array.isArray(data)) {
36
+ throw new ExternalToolError(RDT_BINARY, "rdt-cli returned invalid subreddit data");
37
+ }
38
+ return data.map((raw) => adaptPost({ ...raw, subreddit })).filter((post) => post.id.length > 0);
39
+ }
40
+ export async function readRedditPost(postId, opts) {
41
+ const data = await runRdt([
42
+ "read",
43
+ postId,
44
+ "--json",
45
+ "-n",
46
+ String(opts.limit),
47
+ ]);
48
+ if (!Array.isArray(data)) {
49
+ throw new ExternalToolError(RDT_BINARY, "rdt-cli returned invalid read data");
50
+ }
51
+ const rawPost = data[0]?.data?.children?.find((child) => child.kind === "t3")?.data;
52
+ if (!rawPost) {
53
+ throw new ExternalToolError(RDT_BINARY, "rdt-cli read output did not include a post");
54
+ }
55
+ const post = adaptPost(rawPost);
56
+ const commentListing = data[1]?.data?.children ?? [];
57
+ const comments = commentListing
58
+ .filter((child) => child.kind === "t1")
59
+ .map((child) => adaptComment(child.data, post.permalink))
60
+ .filter((comment) => comment !== null)
61
+ .sort((a, b) => b.score - a.score)
62
+ .slice(0, opts.limit);
63
+ return { post, comments };
64
+ }
65
+ async function runRdt(args) {
66
+ let result;
67
+ try {
68
+ result = await commandRunner(RDT_BINARY, args);
69
+ }
70
+ catch (err) {
71
+ const nodeError = err;
72
+ if (nodeError.code === "ENOENT") {
73
+ throw new ExternalToolNotInstalled(RDT_BINARY, RDT_INSTALL_CMD);
74
+ }
75
+ throw new ExternalToolError(RDT_BINARY, redactSensitiveOutput(err instanceof Error ? err.message : String(err)));
76
+ }
77
+ if (result.code !== 0) {
78
+ const envelopeError = parseCliErrorEnvelope(result.stdout);
79
+ if (envelopeError) {
80
+ throw new ExternalToolError(RDT_BINARY, redactSensitiveOutput(envelopeError.message), envelopeError.code);
81
+ }
82
+ throw new ExternalToolError(RDT_BINARY, redactSensitiveOutput(result.stderr.trim() || `rdt-cli exited with code ${result.code}`));
83
+ }
84
+ let envelope;
85
+ try {
86
+ envelope = JSON.parse(result.stdout);
87
+ }
88
+ catch {
89
+ throw new ExternalToolError(RDT_BINARY, `rdt-cli returned non-JSON output: ${redactSensitiveOutput(result.stdout.slice(0, 200))}`);
90
+ }
91
+ if (!envelope.ok) {
92
+ throw new ExternalToolError(RDT_BINARY, redactSensitiveOutput(envelope.error?.message ?? "rdt-cli returned an error"), envelope.error?.code);
93
+ }
94
+ if (envelope.data === undefined) {
95
+ throw new ExternalToolError(RDT_BINARY, "rdt-cli returned no data");
96
+ }
97
+ return envelope.data;
98
+ }
99
+ function parseCliErrorEnvelope(stdout) {
100
+ try {
101
+ const parsed = JSON.parse(stdout);
102
+ if (parsed.ok !== false || typeof parsed.error?.message !== "string")
103
+ return null;
104
+ return {
105
+ code: typeof parsed.error.code === "string" ? parsed.error.code : undefined,
106
+ message: parsed.error.message,
107
+ };
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ function adaptPost(raw) {
114
+ const permalink = stringValue(raw.permalink);
115
+ const url = stringValue(raw.url) || (permalink ? `https://reddit.com${permalink}` : "");
116
+ return {
117
+ id: stringValue(raw.id),
118
+ title: stringValue(raw.title),
119
+ selftext: stringValue(raw.selftext),
120
+ author: stringValue(raw.author) || "unknown",
121
+ score: numberValue(raw.score),
122
+ comments: numberValue(raw.num_comments),
123
+ subreddit: stringValue(raw.subreddit) || undefined,
124
+ url,
125
+ permalink: permalink || undefined,
126
+ created: normalizeCreatedAt(raw.created_utc),
127
+ };
128
+ }
129
+ function adaptComment(raw, postPermalink) {
130
+ if (!raw || typeof raw.body !== "string" || raw.body.length === 0)
131
+ return null;
132
+ const permalink = stringValue(raw.permalink) || postPermalink || "";
133
+ return {
134
+ id: stringValue(raw.id),
135
+ body: raw.body,
136
+ author: stringValue(raw.author) || "unknown",
137
+ score: numberValue(raw.score),
138
+ permalink: permalink ? `https://reddit.com${permalink}` : "",
139
+ };
140
+ }
141
+ function normalizeCreatedAt(value) {
142
+ if (typeof value === "number" && Number.isFinite(value)) {
143
+ const millis = value > 1_000_000_000_000 ? value : value * 1000;
144
+ return new Date(millis).toISOString();
145
+ }
146
+ if (typeof value === "string" && value.length > 0) {
147
+ const millis = Date.parse(value);
148
+ if (!Number.isNaN(millis))
149
+ return new Date(millis).toISOString();
150
+ }
151
+ return new Date(0).toISOString();
152
+ }
153
+ function stringValue(value) {
154
+ return typeof value === "string" ? value : "";
155
+ }
156
+ function numberValue(value) {
157
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
158
+ }
159
+ export function redactSensitiveOutput(input) {
160
+ return input
161
+ .slice(0, MAX_OUTPUT_CHARS)
162
+ .replace(/\b([a-z0-9_]*(?:cookie|session|token)[a-z0-9_]*)\b\s*[:=]\s*[^;\s,)]+/gi, "$1=[redacted]")
163
+ .replace(/\b([a-z0-9_]*(?:cookie|session|token)[a-z0-9_]*)=([^;\s,)]+)/gi, "$1=[redacted]")
164
+ .replace(/(?:~|\/Users\/[^/\s]+|\/home\/[^/\s]+)?\/\.config\/rdt-cli\/credential\.json/g, "[redacted-credential-path]");
165
+ }
166
+ function runCommand(command, args) {
167
+ return new Promise((resolve, reject) => {
168
+ const child = spawn(command, [...args], { stdio: ["ignore", "pipe", "pipe"] });
169
+ let stdout = "";
170
+ let stderr = "";
171
+ let settled = false;
172
+ const timeout = setTimeout(() => {
173
+ if (settled)
174
+ return;
175
+ settled = true;
176
+ child.kill("SIGTERM");
177
+ reject(new Error(`${command} timed out after ${COMMAND_TIMEOUT_MS}ms`));
178
+ }, COMMAND_TIMEOUT_MS);
179
+ child.stdout.on("data", (chunk) => {
180
+ stdout = (stdout + chunk.toString("utf8")).slice(0, MAX_OUTPUT_CHARS);
181
+ });
182
+ child.stderr.on("data", (chunk) => {
183
+ stderr = (stderr + chunk.toString("utf8")).slice(0, MAX_OUTPUT_CHARS);
184
+ });
185
+ child.on("error", (err) => {
186
+ if (settled)
187
+ return;
188
+ settled = true;
189
+ clearTimeout(timeout);
190
+ reject(err);
191
+ });
192
+ child.on("close", (code) => {
193
+ if (settled)
194
+ return;
195
+ settled = true;
196
+ clearTimeout(timeout);
197
+ resolve({ code, stdout, stderr });
198
+ });
199
+ });
200
+ }
201
+ //# sourceMappingURL=reddit-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reddit-cli.js","sourceRoot":"","sources":["../../src/providers/reddit-cli.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { RedditSentimentResult } from "../types/sentiment.js";
2
- export declare function getSubredditPosts(subreddit: string, limit?: number): Promise<RedditSentimentResult>;
2
+ export declare function getSubredditPosts(subreddit: string, limit?: number, query?: string): Promise<RedditSentimentResult>;
3
3
  export interface RedditComment {
4
4
  id: string;
5
5
  body: string;
@@ -1,29 +1,17 @@
1
1
  import { cache, STALE_LIMIT, TTL } from "../infra/cache.js";
2
- import { httpGet } from "../infra/http-client.js";
3
2
  import { rateLimiter } from "../infra/rate-limiter.js";
4
3
  import { BEARISH_TERMS, BULLISH_TERMS } from "../sentiment/keywords.js";
5
- const REDDIT_HEADERS = { "User-Agent": "OpenCandle/1.0 (financial analysis agent)" };
6
- export async function getSubredditPosts(subreddit, limit = 25) {
7
- const cacheKey = `reddit:${subreddit}:${limit}`;
4
+ import { listSubredditPosts, readRedditPost, searchRedditPosts } from "./reddit-cli.js";
5
+ export async function getSubredditPosts(subreddit, limit = 25, query) {
6
+ const cacheKey = `reddit:${subreddit}:${query ?? "hot"}:${limit}`;
8
7
  const cached = cache.get(cacheKey);
9
8
  if (cached)
10
9
  return cached;
11
10
  try {
12
11
  await rateLimiter.acquire("reddit");
13
- const url = `https://www.reddit.com/r/${encodeURIComponent(subreddit)}/hot.json?limit=${limit}`;
14
- const data = await httpGet(url, {
15
- headers: REDDIT_HEADERS,
16
- });
17
- const posts = data.data.children.map((child) => ({
18
- id: child.data.id,
19
- title: child.data.title,
20
- selftext: child.data.selftext ?? "",
21
- author: child.data.author ?? "unknown",
22
- score: child.data.score,
23
- comments: child.data.num_comments,
24
- url: `https://reddit.com${child.data.permalink}`,
25
- created: new Date(child.data.created_utc * 1000).toISOString(),
26
- }));
12
+ const posts = query
13
+ ? await searchRedditPosts(query, { subreddit, limit })
14
+ : await listSubredditPosts(subreddit, { limit });
27
15
  // Extract ticker-like mentions ($AAPL, $TSLA, etc.)
28
16
  const tickerRegex = /\$([A-Z]{1,5})\b/g;
29
17
  const mentionCounts = new Map();
@@ -65,23 +53,7 @@ export async function getPostComments(subreddit, postId, limit = 5) {
65
53
  if (cached)
66
54
  return cached;
67
55
  await rateLimiter.acquire("reddit_comments");
68
- const url = `https://www.reddit.com/r/${encodeURIComponent(subreddit)}/comments/${postId}.json`;
69
- const data = await httpGet(url, {
70
- headers: REDDIT_HEADERS,
71
- });
72
- // Comments are in the second listing element
73
- const commentListing = data[1]?.data?.children ?? [];
74
- const comments = commentListing
75
- .filter((c) => c.kind === "t1" && c.data.body)
76
- .sort((a, b) => (b.data.score ?? 0) - (a.data.score ?? 0))
77
- .slice(0, limit)
78
- .map((c) => ({
79
- id: c.data.id,
80
- body: c.data.body,
81
- author: c.data.author ?? "unknown",
82
- score: c.data.score ?? 0,
83
- permalink: `https://reddit.com${c.data.permalink ?? ""}`,
84
- }));
56
+ const { comments } = await readRedditPost(postId, { limit });
85
57
  cache.set(cacheKey, comments, COMMENT_TTL);
86
58
  return comments;
87
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reddit.js","sourceRoot":"","sources":["../../src/providers/reddit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reddit.js","sourceRoot":"","sources":["../../src/providers/reddit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { TwitterTweet } from "../types/sentiment.js";
2
+ export interface RawTweet {
3
+ readonly id?: string;
4
+ readonly text?: string;
5
+ readonly author?: {
6
+ readonly username?: string;
7
+ readonly screenName?: string;
8
+ readonly name?: string;
9
+ };
10
+ readonly username?: string;
11
+ readonly url?: string;
12
+ readonly permanentUrl?: string;
13
+ readonly createdAt?: string | number;
14
+ readonly created_at?: string | number;
15
+ readonly likeCount?: number;
16
+ readonly likes?: number;
17
+ readonly retweetCount?: number;
18
+ readonly retweets?: number;
19
+ readonly replyCount?: number;
20
+ readonly replies?: number;
21
+ readonly viewCount?: number | null;
22
+ readonly views?: number | null;
23
+ readonly metrics?: {
24
+ readonly likes?: number;
25
+ readonly retweets?: number;
26
+ readonly replies?: number;
27
+ readonly views?: number | null;
28
+ };
29
+ }
30
+ interface CommandResult {
31
+ readonly code: number | null;
32
+ readonly stdout: string;
33
+ readonly stderr: string;
34
+ }
35
+ type TwitterCliCommandRunner = (command: string, args: readonly string[]) => Promise<CommandResult>;
36
+ export declare function setTwitterCliCommandRunnerForTests(runner: TwitterCliCommandRunner): void;
37
+ export declare function resetTwitterCliCommandRunnerForTests(): void;
38
+ export declare function searchTweets(query: string, max?: number): Promise<TwitterTweet[]>;
39
+ export declare function redactSensitiveOutput(input: string): string;
40
+ export {};
@@ -0,0 +1,153 @@
1
+ import { spawn } from "node:child_process";
2
+ import { ExternalToolError, ExternalToolNotInstalled } from "./external-tool-error.js";
3
+ const TWITTER_CLI_BINARY = "twitter";
4
+ const TWITTER_CLI_TOOL_NAME = "twitter-cli";
5
+ const TWITTER_CLI_INSTALL_CMD = "uv tool install twitter-cli";
6
+ const COMMAND_TIMEOUT_MS = 20_000;
7
+ const MAX_OUTPUT_CHARS = 2_000_000;
8
+ let commandRunner = runCommand;
9
+ export function setTwitterCliCommandRunnerForTests(runner) {
10
+ commandRunner = runner;
11
+ }
12
+ export function resetTwitterCliCommandRunnerForTests() {
13
+ commandRunner = runCommand;
14
+ }
15
+ export async function searchTweets(query, max = 20) {
16
+ const envelope = await runTwitterCli([
17
+ "search",
18
+ query,
19
+ "--max",
20
+ String(max),
21
+ "-t",
22
+ "Latest",
23
+ "--json",
24
+ ]);
25
+ if (!envelope.ok) {
26
+ throw new ExternalToolError(TWITTER_CLI_TOOL_NAME, redactSensitiveOutput(envelope.error?.message ?? "twitter-cli returned an error"), envelope.error?.code);
27
+ }
28
+ if (!Array.isArray(envelope.data)) {
29
+ throw new ExternalToolError(TWITTER_CLI_TOOL_NAME, "twitter-cli returned invalid tweet data");
30
+ }
31
+ return envelope.data.map(adaptRawTweet);
32
+ }
33
+ async function runTwitterCli(args) {
34
+ let result;
35
+ try {
36
+ result = await commandRunner(TWITTER_CLI_BINARY, args);
37
+ }
38
+ catch (err) {
39
+ const nodeError = err;
40
+ if (nodeError.code === "ENOENT") {
41
+ throw new ExternalToolNotInstalled(TWITTER_CLI_TOOL_NAME, TWITTER_CLI_INSTALL_CMD);
42
+ }
43
+ throw new ExternalToolError(TWITTER_CLI_TOOL_NAME, redactSensitiveOutput(err instanceof Error ? err.message : String(err)));
44
+ }
45
+ if (result.code !== 0) {
46
+ const envelopeError = parseCliErrorEnvelope(result.stdout);
47
+ if (envelopeError) {
48
+ throw new ExternalToolError(TWITTER_CLI_TOOL_NAME, redactSensitiveOutput(envelopeError.message), envelopeError.code);
49
+ }
50
+ throw new ExternalToolError(TWITTER_CLI_TOOL_NAME, redactSensitiveOutput(result.stderr.trim() || `twitter-cli exited with code ${result.code}`));
51
+ }
52
+ try {
53
+ return JSON.parse(result.stdout);
54
+ }
55
+ catch {
56
+ throw new ExternalToolError(TWITTER_CLI_TOOL_NAME, `twitter-cli returned non-JSON output: ${redactSensitiveOutput(result.stdout.slice(0, 200))}`);
57
+ }
58
+ }
59
+ function parseCliErrorEnvelope(stdout) {
60
+ try {
61
+ const parsed = JSON.parse(stdout);
62
+ if (parsed.ok !== false || typeof parsed.error?.message !== "string")
63
+ return null;
64
+ return {
65
+ code: typeof parsed.error.code === "string" ? parsed.error.code : undefined,
66
+ message: parsed.error.message,
67
+ };
68
+ }
69
+ catch {
70
+ return null;
71
+ }
72
+ }
73
+ function adaptRawTweet(raw) {
74
+ return {
75
+ id: stringValue(raw.id),
76
+ text: stringValue(raw.text).slice(0, 280),
77
+ author: stringValue(raw.author?.username) ||
78
+ stringValue(raw.author?.screenName) ||
79
+ stringValue(raw.username) ||
80
+ "unknown",
81
+ likes: numberValue(raw.metrics?.likes ?? raw.likeCount ?? raw.likes),
82
+ retweets: numberValue(raw.metrics?.retweets ?? raw.retweetCount ?? raw.retweets),
83
+ replies: numberValue(raw.metrics?.replies ?? raw.replyCount ?? raw.replies),
84
+ views: nullableNumberValue(raw.metrics?.views ?? raw.viewCount ?? raw.views),
85
+ url: stringValue(raw.url ?? raw.permanentUrl),
86
+ created: normalizeCreatedAt(raw.createdAt ?? raw.created_at),
87
+ };
88
+ }
89
+ function normalizeCreatedAt(value) {
90
+ if (typeof value === "number") {
91
+ const millis = value > 1_000_000_000_000 ? value : value * 1000;
92
+ return new Date(millis).toISOString();
93
+ }
94
+ if (typeof value === "string" && value.length > 0) {
95
+ const millis = Date.parse(value);
96
+ if (!Number.isNaN(millis))
97
+ return new Date(millis).toISOString();
98
+ }
99
+ return new Date(0).toISOString();
100
+ }
101
+ function stringValue(value) {
102
+ return typeof value === "string" ? value : "";
103
+ }
104
+ function numberValue(value) {
105
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
106
+ }
107
+ function nullableNumberValue(value) {
108
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
109
+ }
110
+ export function redactSensitiveOutput(input) {
111
+ const xCookieNames = "auth_token|ct0|twid|kdt|guest_id|guest_id_ads|guest_id_marketing|personalization_id";
112
+ return input
113
+ .slice(0, MAX_OUTPUT_CHARS)
114
+ .replace(/\b(cookie|set-cookie)\s*:\s*[^\r\n]+/gi, "$1: [redacted]")
115
+ .replace(new RegExp(`\\b(${xCookieNames})\\b\\s*[:=]\\s*[^;\\s,)]+`, "gi"), "$1=[redacted]")
116
+ .replace(new RegExp(`\\b(${xCookieNames})=([^;\\s,)]+)`, "gi"), "$1=[redacted]");
117
+ }
118
+ function runCommand(command, args) {
119
+ return new Promise((resolve, reject) => {
120
+ const child = spawn(command, [...args], { stdio: ["ignore", "pipe", "pipe"] });
121
+ let stdout = "";
122
+ let stderr = "";
123
+ let settled = false;
124
+ const timeout = setTimeout(() => {
125
+ if (settled)
126
+ return;
127
+ settled = true;
128
+ child.kill("SIGTERM");
129
+ reject(new Error(`${command} timed out after ${COMMAND_TIMEOUT_MS}ms`));
130
+ }, COMMAND_TIMEOUT_MS);
131
+ child.stdout.on("data", (chunk) => {
132
+ stdout = (stdout + chunk.toString("utf8")).slice(0, MAX_OUTPUT_CHARS);
133
+ });
134
+ child.stderr.on("data", (chunk) => {
135
+ stderr = (stderr + chunk.toString("utf8")).slice(0, MAX_OUTPUT_CHARS);
136
+ });
137
+ child.on("error", (err) => {
138
+ if (settled)
139
+ return;
140
+ settled = true;
141
+ clearTimeout(timeout);
142
+ reject(err);
143
+ });
144
+ child.on("close", (code) => {
145
+ if (settled)
146
+ return;
147
+ settled = true;
148
+ clearTimeout(timeout);
149
+ resolve({ code, stdout, stderr });
150
+ });
151
+ });
152
+ }
153
+ //# sourceMappingURL=twitter-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twitter-cli.js","sourceRoot":"","sources":["../../src/providers/twitter-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEvF,MAAM,kBAAkB,GAAG,SAAS,CAAC;AACrC,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAC5C,MAAM,uBAAuB,GAAG,6BAA6B,CAAC;AAC9D,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAiDnC,IAAI,aAAa,GAA4B,UAAU,CAAC;AAExD,MAAM,UAAU,kCAAkC,CAAC,MAA+B;IAChF,aAAa,GAAG,MAAM,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,oCAAoC;IAClD,aAAa,GAAG,UAAU,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa,EAAE,GAAG,GAAG,EAAE;IACxD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAiC;QACnE,QAAQ;QACR,KAAK;QACL,OAAO;QACP,MAAM,CAAC,GAAG,CAAC;QACX,IAAI;QACJ,QAAQ;QACR,QAAQ;KACT,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,iBAAiB,CACzB,qBAAqB,EACrB,qBAAqB,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,IAAI,+BAA+B,CAAC,EACjF,QAAQ,CAAC,KAAK,EAAE,IAAI,CACrB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,iBAAiB,CAAC,qBAAqB,EAAE,yCAAyC,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,aAAa,CAAI,IAAuB;IACrD,IAAI,MAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,aAAa,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,GAA4B,CAAC;QAC/C,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,wBAAwB,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,IAAI,iBAAiB,CACzB,qBAAqB,EACrB,qBAAqB,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CACxE,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,IAAI,iBAAiB,CACzB,qBAAqB,EACrB,qBAAqB,CAAC,aAAa,CAAC,OAAO,CAAC,EAC5C,aAAa,CAAC,IAAI,CACnB,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,iBAAiB,CACzB,qBAAqB,EACrB,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,gCAAgC,MAAM,CAAC,IAAI,EAAE,CAAC,CAC7F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAM,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,iBAAiB,CACzB,qBAAqB,EACrB,yCAAyC,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAC9F,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAc;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAG/B,CAAC;QACF,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,EAAE,OAAO,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClF,OAAO;YACL,IAAI,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YAC3E,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;SAC9B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,GAAa;IAClC,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QACzC,MAAM,EACJ,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;YACjC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;YACnC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzB,SAAS;QACX,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC;QACpE,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,QAAQ,CAAC;QAChF,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,OAAO,CAAC;QAC3E,KAAK,EAAE,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,KAAK,CAAC;QAC5E,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC;QAC7C,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAkC;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;QAChE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,YAAY,GAChB,qFAAqF,CAAC;IACxF,OAAO,KAAK;SACT,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC;SAC1B,OAAO,CAAC,wCAAwC,EAAE,gBAAgB,CAAC;SACnE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,YAAY,4BAA4B,EAAE,IAAI,CAAC,EAAE,eAAe,CAAC;SAC3F,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,YAAY,gBAAgB,EAAE,IAAI,CAAC,EAAE,eAAe,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,IAAuB;IAC1D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/E,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,oBAAoB,kBAAkB,IAAI,CAAC,CAAC,CAAC;QAC1E,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAEvB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,11 +1,4 @@
1
1
  import type { TwitterSentimentResult } from "../types/sentiment.js";
2
- interface FirefoxCookie {
3
- name: string;
4
- value: string;
5
- domain: string;
6
- path: string;
7
- }
8
- export declare function readTwitterCookies(profileDir: string): FirefoxCookie[];
9
2
  export declare function scoreTwitterSentiment(tweets: Array<{
10
3
  text: string;
11
4
  likes: number;
@@ -17,4 +10,3 @@ export declare function scoreTwitterSentiment(tweets: Array<{
17
10
  };
18
11
  export declare function normalizeQuery(query: string): string;
19
12
  export declare function getTwitterSentiment(query: string, limit?: number, hours?: number): Promise<TwitterSentimentResult>;
20
- export {};
@@ -1,25 +1,6 @@
1
- import { existsSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { Scraper, SearchMode } from "@the-convocation/twitter-scraper";
4
- import Database from "better-sqlite3";
5
1
  import { cache, STALE_LIMIT, TTL } from "../infra/cache.js";
6
- import { getBrowserProfileDir } from "../infra/opencandle-paths.js";
7
2
  import { rateLimiter } from "../infra/rate-limiter.js";
8
- export function readTwitterCookies(profileDir) {
9
- const dbPath = join(profileDir, "cookies.sqlite");
10
- if (!existsSync(dbPath))
11
- return [];
12
- const db = new Database(dbPath, { readonly: true });
13
- try {
14
- const rows = db
15
- .prepare(`SELECT name, value, host AS domain, path FROM moz_cookies WHERE host LIKE ? OR host LIKE ?`)
16
- .all("%x.com%", "%twitter.com%");
17
- return rows;
18
- }
19
- finally {
20
- db.close();
21
- }
22
- }
3
+ import { searchTweets } from "./twitter-cli.js";
23
4
  // ── Sentiment scoring ────────────────────────────────────
24
5
  import { BEARISH_TERMS, BULLISH_TERMS } from "../sentiment/keywords.js";
25
6
  export function scoreTwitterSentiment(tweets) {
@@ -59,41 +40,10 @@ export async function getTwitterSentiment(query, limit = 50, hours = 24) {
59
40
  return cached;
60
41
  await rateLimiter.acquire("twitter");
61
42
  try {
62
- const profileDir = getBrowserProfileDir();
63
- const cookies = readTwitterCookies(profileDir);
64
- const authToken = cookies.find((c) => c.name === "auth_token");
65
- const ct0 = cookies.find((c) => c.name === "ct0");
66
- if (!authToken || !ct0) {
67
- throw new Error("No Twitter session found.");
68
- }
69
- const scraper = new Scraper();
70
- const cookieStrings = cookies.map((c) => `${c.name}=${c.value}; Domain=${c.domain}; Path=${c.path}`);
71
- await scraper.setCookies(cookieStrings);
72
- const loggedIn = await scraper.isLoggedIn();
73
- if (!loggedIn) {
74
- throw new Error("Twitter session expired.");
75
- }
76
43
  const cutoff = new Date(Date.now() - hours * 3_600_000);
77
- const tweets = [];
78
- const results = scraper.searchTweets(normalizedQuery, limit, SearchMode.Latest);
79
- for await (const tweet of results) {
80
- const created = tweet.timeParsed ?? new Date(0);
81
- if (created < cutoff)
82
- continue;
83
- tweets.push({
84
- id: tweet.id ?? "",
85
- text: tweet.text?.slice(0, 280) ?? "",
86
- author: tweet.username ?? "unknown",
87
- likes: tweet.likes ?? 0,
88
- retweets: tweet.retweets ?? 0,
89
- replies: tweet.replies ?? 0,
90
- views: tweet.views ?? null,
91
- url: tweet.permanentUrl ?? "",
92
- created: created.toISOString(),
93
- });
94
- if (tweets.length >= limit)
95
- break;
96
- }
44
+ const tweets = (await searchTweets(normalizedQuery, limit))
45
+ .filter((tweet) => new Date(tweet.created) >= cutoff)
46
+ .slice(0, limit);
97
47
  // Extract co-mentioned cashtags
98
48
  const tickerRegex = /\$([A-Z]{1,5})\b/g;
99
49
  const mentionCounts = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"twitter.js","sourceRoot":"","sources":["../../src/providers/twitter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"twitter.js","sourceRoot":"","sources":["../../src/providers/twitter.ts"],"names":[],"mappings":"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"}