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
@@ -3,184 +3,221 @@ import { getConfig } from "../../config.js";
3
3
  import { hasCredential } from "../../onboarding/providers.js";
4
4
  import { buildSoftDegradedTag } from "../../onboarding/tool-tags.js";
5
5
  import { finnhubDateRange, getCompanyNews } from "../../providers/finnhub.js";
6
- import { getPostComments, getSubredditPosts } from "../../providers/reddit.js";
7
- import { getTwitterSentiment } from "../../providers/twitter.js";
8
6
  import { searchWeb } from "../../providers/web-search.js";
9
- import { wrapProvider } from "../../providers/wrap-provider.js";
10
7
  import { getQuote } from "../../providers/yahoo-finance.js";
11
8
  import { extractTickersFromQuery, FinnhubAdapter } from "../../sentiment/adapters/finnhub.js";
12
9
  import { RedditAdapter } from "../../sentiment/adapters/reddit.js";
13
10
  import { TwitterAdapter } from "../../sentiment/adapters/twitter.js";
14
11
  import { WebAdapter } from "../../sentiment/adapters/web.js";
15
12
  import { getSentimentPipeline } from "../../sentiment/index.js";
13
+ import { formatInsightSection } from "./insight-format.js";
14
+ import { createRedditSentimentTool } from "./reddit-sentiment.js";
15
+ import { createTwitterSentimentTool } from "./twitter-sentiment.js";
16
16
  const params = Type.Object({
17
17
  query: Type.String({ description: "Ticker or topic for cross-source sentiment summary" }),
18
18
  hours: Type.Optional(Type.Number({ description: "Lookback window in hours for live fetching. Default: 24" })),
19
19
  });
20
- export const sentimentSummaryTool = {
21
- name: "get_sentiment_summary",
22
- label: "Sentiment Summary",
23
- description: "Cross-source sentiment summary combining Twitter, Reddit, and web/news. Returns per-source scores, aggregate sentiment, and divergence detection.",
24
- parameters: params,
25
- async execute(_toolCallId, args) {
26
- const hours = args.hours ?? 24;
27
- const config = getConfig();
28
- const warnings = [];
29
- const allRecords = [];
30
- const twitterAdapter = new TwitterAdapter();
31
- const webAdapter = new WebAdapter();
32
- const finnhubAdapter = new FinnhubAdapter();
33
- // Determine if Finnhub should be included (key configured + ticker in
34
- // query). `candidateTickers` is extracted unconditionally so we can tell
35
- // a "no finnhub-mappable ticker in the query" case apart from a "query
36
- // has tickers but user has no Finnhub key" case the latter warrants a
37
- // soft-degraded tag so the LLM surfaces it in the Data gaps section.
38
- const candidateTickers = extractTickersFromQuery(args.query);
39
- const finnhubTickers = config.finnhubApiKey ? candidateTickers : [];
40
- const includeFinnhub = finnhubTickers.length > 0 && Boolean(config.finnhubApiKey);
41
- const finnhubSoftDegraded = candidateTickers.length > 0 && !hasCredential("finnhub");
42
- // Finnhub fetch (built separately to avoid mixing promise types in allSettled)
43
- const finnhubFetch = includeFinnhub
44
- ? (async () => {
20
+ export function createSentimentSummaryTool(options = {}) {
21
+ return {
22
+ name: "get_sentiment_summary",
23
+ label: "Sentiment Summary",
24
+ description: "Cross-source sentiment summary combining Twitter, Reddit, and web/news. Returns per-source scores, aggregate sentiment, and divergence detection.",
25
+ parameters: params,
26
+ async execute(_toolCallId, args, _signal, _onUpdate, ctx) {
27
+ const hours = args.hours ?? 24;
28
+ const config = getConfig();
29
+ const warnings = [];
30
+ const allRecords = [];
31
+ const twitterAdapter = new TwitterAdapter();
32
+ const webAdapter = new WebAdapter();
33
+ const finnhubAdapter = new FinnhubAdapter();
34
+ // Determine if Finnhub should be included (key configured + ticker in
35
+ // query). `candidateTickers` is extracted unconditionally so we can tell
36
+ // a "no finnhub-mappable ticker in the query" case apart from a "query
37
+ // has tickers but user has no Finnhub key" case — the latter warrants a
38
+ // soft-degraded tag so the LLM surfaces it in the Data gaps section.
39
+ const candidateTickers = extractTickersFromQuery(args.query);
40
+ const finnhubTickers = config.finnhubApiKey ? candidateTickers : [];
41
+ const includeFinnhub = finnhubTickers.length > 0 && Boolean(config.finnhubApiKey);
42
+ const finnhubSoftDegraded = candidateTickers.length > 0 && !hasCredential("finnhub");
43
+ const fetchFinnhub = async () => {
44
+ if (!includeFinnhub)
45
+ return [];
45
46
  const { from, to } = finnhubDateRange("day");
46
47
  const arrays = await Promise.all(finnhubTickers.map((sym) => getCompanyNews(sym, from, to, config.finnhubApiKey)));
47
48
  return arrays.flat();
48
- })()
49
- : Promise.resolve([]);
50
- // Fetch all sources in parallel
51
- const [twitterResult, redditResults, webResult, finnhubResult] = await Promise.allSettled([
52
- // Twitter
53
- wrapProvider("twitter", () => getTwitterSentiment(args.query, 50, hours)),
54
- // Reddit — cross-subreddit
55
- fetchRedditCrossSubreddit(args.query, config.sentiment?.defaultSubreddits ?? ["wallstreetbets", "stocks", "investing", "options"]),
56
- // Web
57
- searchWeb(args.query, { freshness: "day", limit: 10, category: "news" }),
58
- // Finnhub — only when includeFinnhub; otherwise resolves to []
59
- finnhubFetch,
60
- ]);
61
- // Process Twitter
62
- if (twitterResult.status === "fulfilled" && twitterResult.value.status === "ok") {
63
- const records = twitterAdapter.mapToRecords(twitterResult.value.data, args.query);
64
- allRecords.push(...records);
65
- }
66
- else {
67
- const reason = twitterResult.status === "rejected"
68
- ? (twitterResult.reason?.message ?? "unknown error")
69
- : (twitterResult.value.reason ?? "unavailable");
70
- warnings.push(`Twitter: ${reason}`);
71
- }
72
- // Process Reddit
73
- if (redditResults.status === "fulfilled") {
74
- const { records: redditRecords, warnings: redditWarnings } = redditResults.value;
75
- allRecords.push(...redditRecords);
76
- warnings.push(...redditWarnings);
77
- }
78
- else {
79
- warnings.push(`Reddit: ${redditResults.reason?.message ?? "unknown error"}`);
80
- }
81
- // Process Web
82
- if (webResult.status === "fulfilled" && webResult.value.status === "ok") {
83
- const records = webAdapter.mapToRecords(webResult.value.data, args.query);
84
- allRecords.push(...records);
85
- }
86
- else {
87
- const reason = webResult.status === "rejected"
88
- ? (webResult.reason?.message ?? "unknown error")
89
- : (webResult.value.reason ?? "unavailable");
90
- warnings.push(`Web: ${reason}`);
91
- }
92
- // Process Finnhub (only when included — otherwise resolves to empty array anyway)
93
- if (includeFinnhub) {
94
- if (finnhubResult.status === "fulfilled") {
95
- const articles = finnhubResult.value;
96
- if (articles.length > 0) {
97
- const records = finnhubAdapter.mapToRecords(articles, args.query);
98
- allRecords.push(...records);
49
+ };
50
+ // External-tool sources may need ask_user setup. Run them through the
51
+ // source-specific tools so install/login/skip preferences behave the same
52
+ // in cross-source summaries as they do in direct source requests.
53
+ try {
54
+ const twitterTool = createTwitterSentimentTool({
55
+ askUserHandler: options.askUserHandler,
56
+ });
57
+ const executeTwitter = twitterTool.execute;
58
+ const twitterResult = await executeTwitter("summary-twitter", { query: args.query, limit: 50, hours }, undefined, undefined, ctx);
59
+ if (twitterResult.details) {
60
+ allRecords.push(...twitterAdapter.mapToRecords(twitterResult.details, args.query));
61
+ }
62
+ else {
63
+ warnings.push(sourceToolWarning("Twitter", toolText(twitterResult.content)));
64
+ }
65
+ }
66
+ catch (err) {
67
+ warnings.push(`Twitter: ${err instanceof Error ? err.message : String(err)}`);
68
+ }
69
+ try {
70
+ const redditTool = createRedditSentimentTool({
71
+ askUserHandler: options.askUserHandler,
72
+ });
73
+ const executeReddit = redditTool.execute;
74
+ const redditResult = await executeReddit("summary-reddit", {
75
+ query: args.query,
76
+ subreddits: config.sentiment?.defaultSubreddits ?? [
77
+ "wallstreetbets",
78
+ "stocks",
79
+ "investing",
80
+ "options",
81
+ ],
82
+ }, undefined, undefined, ctx);
83
+ if (redditResult.details) {
84
+ allRecords.push(...(redditResult.details.records ??
85
+ new RedditAdapter().mapPostsToRecords(redditResult.details, args.query)));
86
+ }
87
+ else {
88
+ warnings.push(sourceToolWarning("Reddit", toolText(redditResult.content)));
99
89
  }
100
90
  }
91
+ catch (err) {
92
+ warnings.push(`Reddit: ${err instanceof Error ? err.message : String(err)}`);
93
+ }
94
+ const [webResult, finnhubResult] = await Promise.allSettled([
95
+ searchWeb(args.query, { freshness: "day", limit: 10, category: "news" }),
96
+ // Finnhub — only when includeFinnhub; otherwise resolves to []
97
+ fetchFinnhub(),
98
+ ]);
99
+ // Process Web
100
+ if (webResult.status === "fulfilled" && webResult.value.status === "ok") {
101
+ const records = webAdapter.mapToRecords(webResult.value.data, args.query);
102
+ allRecords.push(...records);
103
+ }
101
104
  else {
102
- warnings.push(`Finnhub: ${finnhubResult.reason?.message ?? "unknown error"}`);
105
+ const reason = webResult.status === "rejected"
106
+ ? (webResult.reason?.message ?? "unknown error")
107
+ : (webResult.value.reason ?? "unavailable");
108
+ warnings.push(`Web: ${reason}`);
103
109
  }
104
- }
105
- const softDegradedPrefix = finnhubSoftDegraded
106
- ? `${buildSoftDegradedTag({
107
- provider: "finnhub",
108
- fallback: "other-sentiment-sources",
109
- remediation: "run /connect news to enable Finnhub company news",
110
- })}\n\n`
111
- : "";
112
- if (allRecords.length === 0) {
113
- return {
114
- content: [
115
- {
116
- type: "text",
117
- text: `${softDegradedPrefix}⚠ Sentiment summary unavailable for "${args.query}" — no sources returned data.\n${warnings.join("\n")}`,
118
- },
119
- ],
120
- details: null,
121
- };
122
- }
123
- // Score and index through pipeline
124
- const pipeline = getSentimentPipeline();
125
- const result = await pipeline.processRecords(allRecords, args.query);
126
- // Group by source (exclude comments from per-source averages)
127
- const bySource = {};
128
- for (const rec of result.fresh) {
129
- if (rec.metadata.isComment)
130
- continue;
131
- if (!bySource[rec.source])
132
- bySource[rec.source] = { total: 0, count: 0 };
133
- bySource[rec.source].total += rec.sentiment.score;
134
- bySource[rec.source].count++;
135
- }
136
- const lines = [];
137
- lines.push(`**Sentiment summary for "${args.query}"** (last ${hours}h):`);
138
- lines.push("");
139
- lines.push("| Source | Score | Count | Signal |");
140
- lines.push("|--------|-------|-------|--------|");
141
- let totalScore = 0;
142
- let totalCount = 0;
143
- for (const [source, stats] of Object.entries(bySource)) {
144
- const avg = stats.count > 0 ? stats.total / stats.count : 0;
145
- const label = sentimentLabel(avg);
146
- const sourceName = source === "web" ? "Web/News" : source.charAt(0).toUpperCase() + source.slice(1);
147
- lines.push(`| ${sourceName} | ${avg >= 0 ? "+" : ""}${avg.toFixed(2)} | ${stats.count} | ${label} |`);
148
- totalScore += stats.total;
149
- totalCount += stats.count;
150
- }
151
- const aggregate = totalCount > 0 ? totalScore / totalCount : 0;
152
- lines.push("");
153
- lines.push(`**Aggregate:** ${aggregate >= 0 ? "+" : ""}${aggregate.toFixed(2)} (${sentimentLabel(aggregate)})`);
154
- const priceContext = await buildPriceContext(candidateTickers[0], aggregate);
155
- if (priceContext) {
156
- lines.push("");
157
- lines.push(priceContext);
158
- }
159
- lines.push("");
160
- lines.push("Source-coverage risk: sentiment can be noisy and missing sources can skew the signal; treat this as supporting evidence, not a standalone buy/sell input.");
161
- // Divergence
162
- if (result.divergence && result.divergence.detected) {
163
- lines.push("");
164
- lines.push(result.divergence.message);
165
- }
166
- else if (result.divergence && !result.divergence.detected) {
110
+ // Process Finnhub (only when included — otherwise resolves to empty array anyway)
111
+ if (includeFinnhub) {
112
+ if (finnhubResult.status === "fulfilled") {
113
+ const articles = finnhubResult.value;
114
+ if (articles.length > 0) {
115
+ const records = finnhubAdapter.mapToRecords(articles, args.query);
116
+ allRecords.push(...records);
117
+ }
118
+ }
119
+ else {
120
+ warnings.push(`Finnhub: ${finnhubResult.reason?.message ?? "unknown error"}`);
121
+ }
122
+ }
123
+ const softDegradedPrefix = finnhubSoftDegraded
124
+ ? `${buildSoftDegradedTag({
125
+ provider: "finnhub",
126
+ fallback: "other-sentiment-sources",
127
+ remediation: "run /connect news to enable Finnhub company news",
128
+ })}\n\n`
129
+ : "";
130
+ if (allRecords.length === 0) {
131
+ return {
132
+ content: [
133
+ {
134
+ type: "text",
135
+ text: `${softDegradedPrefix}⚠ Sentiment summary unavailable for "${args.query}" — no sources returned data.\n${warnings.join("\n")}`,
136
+ },
137
+ ],
138
+ details: null,
139
+ };
140
+ }
141
+ const summaryWarnings = warnings.map(stripOpenCandleControlLines);
142
+ // Score and index through pipeline
143
+ const pipeline = getSentimentPipeline();
144
+ const result = await pipeline.processRecords(allRecords, args.query);
145
+ const insight = result.insight && summaryWarnings.length > 0
146
+ ? {
147
+ ...result.insight,
148
+ caveats: [
149
+ ...result.insight.caveats,
150
+ ...summaryWarnings.map((warning) => `Source warning: ${warning}`),
151
+ ],
152
+ }
153
+ : result.insight;
154
+ // Group by source (exclude comments from per-source averages)
155
+ const bySource = {};
156
+ for (const rec of result.fresh) {
157
+ if (rec.metadata.isComment)
158
+ continue;
159
+ if (!bySource[rec.source])
160
+ bySource[rec.source] = { total: 0, count: 0 };
161
+ bySource[rec.source].total += rec.sentiment.score;
162
+ bySource[rec.source].count++;
163
+ }
164
+ const lines = [];
165
+ lines.push(`**Sentiment summary for "${args.query}"** (last ${hours}h):`);
167
166
  lines.push("");
168
- lines.push(result.divergence.message);
169
- }
170
- // Trend
171
- if (result.trend && result.trend.length > 0) {
172
- const t = result.trend[0];
167
+ lines.push("| Source | Score | Count | Signal |");
168
+ lines.push("|--------|-------|-------|--------|");
169
+ let totalScore = 0;
170
+ let totalCount = 0;
171
+ for (const [source, stats] of Object.entries(bySource)) {
172
+ const avg = stats.count > 0 ? stats.total / stats.count : 0;
173
+ const label = sentimentLabel(avg);
174
+ const sourceName = source === "web" ? "Web/News" : source.charAt(0).toUpperCase() + source.slice(1);
175
+ lines.push(`| ${sourceName} | ${avg >= 0 ? "+" : ""}${avg.toFixed(2)} | ${stats.count} | ${label} |`);
176
+ totalScore += stats.total;
177
+ totalCount += stats.count;
178
+ }
179
+ const aggregate = totalCount > 0 ? totalScore / totalCount : 0;
173
180
  lines.push("");
174
- lines.push(`Trend: ${t.sparkline} ${t.direction} (${t.count} records)`);
175
- }
176
- if (warnings.length > 0) {
181
+ lines.push(`**Aggregate:** ${aggregate >= 0 ? "+" : ""}${aggregate.toFixed(2)} (${sentimentLabel(aggregate)})`);
182
+ if (insight) {
183
+ lines.push(...formatInsightSection(insight));
184
+ }
185
+ const priceContext = await buildPriceContext(candidateTickers[0], aggregate);
186
+ if (priceContext) {
187
+ lines.push("");
188
+ lines.push(priceContext);
189
+ }
190
+ else if (candidateTickers[0]) {
191
+ lines.push("");
192
+ lines.push(`Price context: unavailable for ${candidateTickers[0]}; sentiment/price divergence could not be evaluated.`);
193
+ }
177
194
  lines.push("");
178
- lines.push(warnings.map((w) => `⚠ ${w}`).join("\n"));
179
- }
180
- const output = softDegradedPrefix + lines.join("\n");
181
- return { content: [{ type: "text", text: output }], details: result };
182
- },
183
- };
195
+ lines.push("Source-coverage risk: sentiment can be noisy and missing sources can skew the signal; treat this as supporting evidence, not a standalone buy/sell input.");
196
+ // Divergence
197
+ if (result.divergence && result.divergence.detected) {
198
+ lines.push("");
199
+ lines.push(result.divergence.message);
200
+ }
201
+ else if (result.divergence && !result.divergence.detected) {
202
+ lines.push("");
203
+ lines.push(result.divergence.message);
204
+ }
205
+ // Trend
206
+ if (result.trend && result.trend.length > 0) {
207
+ const t = result.trend[0];
208
+ lines.push("");
209
+ lines.push(`Trend: ${t.sparkline} ${t.direction} (${t.count} records)`);
210
+ }
211
+ if (summaryWarnings.length > 0) {
212
+ lines.push("");
213
+ lines.push(summaryWarnings.map((w) => `⚠ ${w}`).join("\n"));
214
+ }
215
+ const output = softDegradedPrefix + lines.join("\n");
216
+ return { content: [{ type: "text", text: output }], details: { ...result, insight } };
217
+ },
218
+ };
219
+ }
220
+ export const sentimentSummaryTool = createSentimentSummaryTool();
184
221
  async function buildPriceContext(symbol, aggregateSentiment) {
185
222
  if (!symbol)
186
223
  return null;
@@ -229,50 +266,6 @@ function formatQuoteFreshnessNote(timestamp) {
229
266
  : "";
230
267
  return ` Last available quote timestamp: ${quoteStamp} ET.${marketClosedNote}`;
231
268
  }
232
- async function fetchRedditCrossSubreddit(query, subreddits) {
233
- const adapter = new RedditAdapter();
234
- const records = [];
235
- const warnings = [];
236
- const config = getConfig();
237
- const commentsPerPost = config.sentiment?.commentsPerPost ?? 5;
238
- for (const sub of subreddits) {
239
- const result = await wrapProvider("reddit", () => getSubredditPosts(sub, 25));
240
- if (result.status === "unavailable") {
241
- warnings.push(`Reddit r/${sub}: ${result.reason}`);
242
- continue;
243
- }
244
- const postRecords = adapter.mapPostsToRecords(result.data, query);
245
- // Topic filter
246
- const queryLower = query.toLowerCase();
247
- const filtered = postRecords.filter((r) => r.text.toLowerCase().includes(queryLower) ||
248
- (r.title?.toLowerCase().includes(queryLower) ?? false));
249
- records.push(...filtered);
250
- // Fetch comments for top posts
251
- const topPosts = [...filtered]
252
- .sort((a, b) => b.engagement.score - a.engagement.score)
253
- .slice(0, 3); // fewer per sub since we're searching multiple
254
- for (const post of topPosts) {
255
- if ((post.engagement.replies ?? 0) === 0)
256
- continue;
257
- try {
258
- const comments = await getPostComments(sub, post.sourceId, commentsPerPost);
259
- records.push(...adapter.mapCommentsToRecords(comments, post.sourceId, sub, query));
260
- }
261
- catch {
262
- /* non-fatal */
263
- }
264
- }
265
- }
266
- // Deduplicate
267
- const seen = new Set();
268
- const deduped = records.filter((r) => {
269
- if (seen.has(r.sourceId))
270
- return false;
271
- seen.add(r.sourceId);
272
- return true;
273
- });
274
- return { records: deduped, warnings };
275
- }
276
269
  function sentimentLabel(score) {
277
270
  if (score > 0.3)
278
271
  return "Bullish";
@@ -284,4 +277,27 @@ function sentimentLabel(score) {
284
277
  return "Leaning Bearish";
285
278
  return "Neutral";
286
279
  }
280
+ function toolText(content) {
281
+ return content
282
+ .map((part) => (part.type === "text" ? (part.text ?? "") : ""))
283
+ .filter(Boolean)
284
+ .join("\n");
285
+ }
286
+ function sourceToolWarning(source, text) {
287
+ const lines = text
288
+ .split("\n")
289
+ .map((line) => line.trim())
290
+ .filter(Boolean);
291
+ const tag = lines.find((line) => line.includes("[OPENCANDLE_"));
292
+ const summary = lines.find((line) => !line.includes("[OPENCANDLE_")) ?? "unavailable";
293
+ return tag ? `${source}: ${summary}\n${tag}` : `${source}: ${summary}`;
294
+ }
295
+ function stripOpenCandleControlLines(text) {
296
+ const stripped = text
297
+ .split("\n")
298
+ .map((line) => line.trim())
299
+ .filter((line) => line.length > 0 && !line.startsWith("[OPENCANDLE_"))
300
+ .join("\n");
301
+ return stripped || "unavailable";
302
+ }
287
303
  //# sourceMappingURL=sentiment-summary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sentiment-summary.js","sourceRoot":"","sources":["../../../src/tools/sentiment/sentiment-summary.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGhE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACzB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC;IACzF,KAAK,EAAE,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yDAAyD,EAAE,CAAC,CACxF;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAA6B;IAC5D,IAAI,EAAE,uBAAuB;IAC7B,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EACT,mJAAmJ;IACrJ,UAAU,EAAE,MAAM;IAClB,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;QACpC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;QAE5C,sEAAsE;QACtE,yEAAyE;QACzE,uEAAuE;QACvE,wEAAwE;QACxE,qEAAqE;QACrE,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAClF,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAErF,+EAA+E;QAC/E,MAAM,YAAY,GAChB,cAAc;YACZ,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;gBACV,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,aAAc,CAAC,CAAC,CAClF,CAAC;gBACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;YACvB,CAAC,CAAC,EAAE;YACN,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAE1B,gCAAgC;QAChC,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;YACxF,UAAU;YACV,YAAY,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;YACzE,2BAA2B;YAC3B,yBAAyB,CACvB,IAAI,CAAC,KAAK,EACV,MAAM,CAAC,SAAS,EAAE,iBAAiB,IAAI,CAAC,gBAAgB,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAC5F;YACD,MAAM;YACN,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YACxE,+DAA+D;YAC/D,YAAY;SACb,CAAC,CAAC;QAEH,kBAAkB;QAClB,IAAI,aAAa,CAAC,MAAM,KAAK,WAAW,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAChF,MAAM,OAAO,GAAG,cAAc,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAClF,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GACV,aAAa,CAAC,MAAM,KAAK,UAAU;gBACjC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,IAAI,eAAe,CAAC;gBACpD,CAAC,CAAC,CAAE,aAAa,CAAC,KAAa,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;YAC7D,QAAQ,CAAC,IAAI,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,iBAAiB;QACjB,IAAI,aAAa,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACzC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC;YACjF,UAAU,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,WAAW,aAAa,CAAC,MAAM,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,cAAc;QACd,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACxE,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1E,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GACV,SAAS,CAAC,MAAM,KAAK,UAAU;gBAC7B,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,IAAI,eAAe,CAAC;gBAChD,CAAC,CAAC,CAAE,SAAS,CAAC,KAAa,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC;YACzD,QAAQ,CAAC,IAAI,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,kFAAkF;QAClF,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,aAAa,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACzC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC;gBACrC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxB,MAAM,OAAO,GAAG,cAAc,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBAClE,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,YAAY,aAAa,CAAC,MAAM,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QAED,MAAM,kBAAkB,GAAG,mBAAmB;YAC5C,CAAC,CAAC,GAAG,oBAAoB,CAAC;gBACtB,QAAQ,EAAE,SAAS;gBACnB,QAAQ,EAAE,yBAAyB;gBACnC,WAAW,EAAE,kDAAkD;aAChE,CAAC,MAAM;YACV,CAAC,CAAC,EAAE,CAAC;QAEP,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,GAAG,kBAAkB,wCAAwC,IAAI,CAAC,KAAK,kCAAkC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACrI;iBACF;gBACD,OAAO,EAAE,IAAW;aACrB,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAErE,8DAA8D;QAC9D,MAAM,QAAQ,GAAqD,EAAE,CAAC;QACtE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS;gBAAE,SAAS;YACrC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACzE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC;YAClD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,4BAA4B,IAAI,CAAC,KAAK,aAAa,KAAK,KAAK,CAAC,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAElD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,UAAU,GACd,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnF,KAAK,CAAC,IAAI,CACR,KAAK,UAAU,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,MAAM,KAAK,IAAI,CAC1F,CAAC;YACF,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC;YAC1B,UAAU,IAAI,KAAK,CAAC,KAAK,CAAC;QAC5B,CAAC;QAED,MAAM,SAAS,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,kBAAkB,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,SAAS,CAAC,GAAG,CACpG,CAAC;QAEF,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC7E,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CACR,2JAA2J,CAC5J,CAAC;QAEF,aAAa;QACb,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QAED,QAAQ;QACR,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,MAAM,GAAG,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACxE,CAAC;CACF,CAAC;AAEF,KAAK,UAAU,iBAAiB,CAC9B,MAA0B,EAC1B,kBAA0B;IAE1B,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,SAAS,GACb,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;QACvF,MAAM,kBAAkB,GACtB,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,YAAY,GAChB,kBAAkB,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM,IAAI,kBAAkB,KAAK,SAAS;YAC1F,CAAC,CAAC,kCAAkC;YACpC,CAAC,CAAC,4BAA4B,CAAC;QACnC,MAAM,aAAa,GAAG,wBAAwB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChE,OAAO,kBAAkB,KAAK,CAAC,MAAM,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,aAAa,QAAQ,kBAAkB,qBAAqB,YAAY,GAAG,CAAC;IAC/L,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,SAA6B;IAC7D,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACzF,MAAM,UAAU,GAAG,GAAG,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE;QACnD,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,OAAO;QAClB,QAAQ,EAAE,kBAAkB;KAC7B,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAC/C,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,kBAAkB;KAC7B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACf,MAAM,SAAS,GAAG,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,QAAQ,CAAC;IAEjE,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,MAAM,gBAAgB,GAAG,SAAS;YAChC,CAAC,CAAC,wHAAwH;YAC1H,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,qBAAqB,UAAU,OAAO,gBAAgB,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,gBAAgB,GAAG,SAAS;QAChC,CAAC,CAAC,qFAAqF;QACvF,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,oCAAoC,UAAU,OAAO,gBAAgB,EAAE,CAAC;AACjF,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,KAAa,EACb,UAAoB;IAEpB,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IACpC,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,EAAE,eAAe,IAAI,CAAC,CAAC;IAE/D,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9E,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACpC,QAAQ,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACnD,SAAS;QACX,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAElE,eAAe;QACf,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YACzC,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,CACzD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAE1B,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC;aAC3B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC;aACvD,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,+CAA+C;QAC/D,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC;gBAAE,SAAS;YACnD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBAC5E,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YACrF,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,cAAc;IACd,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACnC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,KAAK,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACxC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACxC,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"sentiment-summary.js","sourceRoot":"","sources":["../../../src/tools/sentiment/sentiment-summary.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,19 @@
1
1
  import type { AgentTool } from "@earendil-works/pi-agent-core";
2
+ import type { AskUserHandler } from "../../types/index.js";
2
3
  import type { TwitterSentimentResult } from "../../types/sentiment.js";
3
4
  declare const params: import("@sinclair/typebox").TObject<{
4
5
  query: import("@sinclair/typebox").TString;
5
6
  limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
6
7
  hours: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
7
8
  }>;
8
- export declare const twitterSentimentTool: AgentTool<typeof params, TwitterSentimentResult>;
9
+ interface TwitterSentimentToolOptions {
10
+ askUserHandler?: AskUserHandler;
11
+ }
12
+ type TwitterToolDetails = TwitterSentimentResult | null;
13
+ export declare function createTwitterSentimentTool(options?: TwitterSentimentToolOptions): AgentTool<typeof params, TwitterToolDetails>;
14
+ export declare const twitterSentimentTool: AgentTool<import("@sinclair/typebox").TObject<{
15
+ query: import("@sinclair/typebox").TString;
16
+ limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
17
+ hours: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
18
+ }>, TwitterToolDetails>;
9
19
  export {};