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,113 @@
1
+ import { extractEntities } from "../../routing/entity-extractor.js";
2
+ const STOP_TERMS = new Set([
3
+ "about",
4
+ "around",
5
+ "are",
6
+ "from",
7
+ "how",
8
+ "is",
9
+ "latest",
10
+ "mood",
11
+ "now",
12
+ "on",
13
+ "or",
14
+ "people",
15
+ "reddit",
16
+ "retail",
17
+ "right",
18
+ "say",
19
+ "saying",
20
+ "says",
21
+ "sentiment",
22
+ "social",
23
+ "stock",
24
+ "stocks",
25
+ "talking",
26
+ "the",
27
+ "think",
28
+ "thinking",
29
+ "to",
30
+ "tweet",
31
+ "tweets",
32
+ "twitter",
33
+ "what",
34
+ "with",
35
+ ]);
36
+ export function sentimentQueryTerms(query) {
37
+ const hasSp500 = /\bs\s*&\s*p\s*500\b/i.test(query) || /\bspx\b/i.test(query);
38
+ const symbols = hasSp500
39
+ ? ["sp500"]
40
+ : extractEntities(query).symbols.map((symbol) => symbol.toLowerCase());
41
+ const punctuationTerms = [...query.toLowerCase().matchAll(/\b([a-z])\s*[&/]\s*([a-z])\b/g)].map((match) => `${match[1]}${match[2]}`);
42
+ const terms = query.toLowerCase().match(/[a-z0-9]{2,}/g);
43
+ if (!terms) {
44
+ if (punctuationTerms.length > 0)
45
+ return [...new Set(punctuationTerms)];
46
+ const compact = query.toLowerCase().replace(/[^a-z0-9]/g, "");
47
+ if (compact.length >= 2)
48
+ return [compact];
49
+ return query.trim().length > 0 ? [query.trim().toLowerCase()] : [];
50
+ }
51
+ const stopTerms = hasSp500 ? new Set([...STOP_TERMS, "sp", "spx", "500"]) : STOP_TERMS;
52
+ const filtered = [
53
+ ...new Set([...punctuationTerms, ...terms.filter((term) => !stopTerms.has(term))]),
54
+ ].slice(0, 6);
55
+ if (symbols.length > 0) {
56
+ return [
57
+ ...new Set([
58
+ ...symbols,
59
+ ...filtered.filter((term) => !symbols.some((symbol) => symbol.startsWith(term))),
60
+ ]),
61
+ ].slice(0, 6);
62
+ }
63
+ if (filtered.length > 0)
64
+ return filtered;
65
+ return query.trim().length > 0 ? [query.trim().toLowerCase()] : [];
66
+ }
67
+ export function recordMatchesSentimentQuery(record, terms) {
68
+ if (terms.length === 0)
69
+ return true;
70
+ const text = `${record.title ?? ""}\n${record.text}`.toLowerCase();
71
+ const textTokens = new Set(text.match(/[a-z0-9]+/g) ?? []);
72
+ const metadataTokens = new Set();
73
+ const subreddit = record.metadata.subreddit;
74
+ if (typeof subreddit === "string") {
75
+ metadataTokens.add(subreddit.toLowerCase());
76
+ metadataTokens.add(subreddit.toLowerCase().replace(/^r\//, ""));
77
+ }
78
+ if (/\bs\s*&\s*p\s*500\b/i.test(text) || /\bspx\b/i.test(text))
79
+ textTokens.add("sp500");
80
+ for (const match of text.matchAll(/\b([a-z])\s*[&/]\s*([a-z])\b/g)) {
81
+ textTokens.add(`${match[1]}${match[2]}`);
82
+ }
83
+ for (const match of text.matchAll(/\b([a-z]{1,5})[.-]([a-z])\b/g)) {
84
+ textTokens.add(`${match[1]}${match[2]}`);
85
+ }
86
+ const tickerTokens = new Set();
87
+ for (const ticker of record.sentiment.tickers) {
88
+ const normalized = ticker.toLowerCase();
89
+ tickerTokens.add(normalized);
90
+ tickerTokens.add(normalized.replace(/[^a-z0-9]/g, ""));
91
+ }
92
+ const matchedTerms = terms.filter((term) => tickerTokens.has(term) || textTokens.has(term) || metadataTokens.has(term));
93
+ for (const term of terms) {
94
+ if (matchedTerms.includes(term) || !term.includes(" "))
95
+ continue;
96
+ if (text.includes(term))
97
+ matchedTerms.push(term);
98
+ }
99
+ for (const term of terms) {
100
+ if (matchedTerms.includes(term) || term.length < 4)
101
+ continue;
102
+ if (textTokens.has(`${term}s`)) {
103
+ matchedTerms.push(term);
104
+ continue;
105
+ }
106
+ if (term.endsWith("s") && textTokens.has(term.slice(0, -1))) {
107
+ matchedTerms.push(term);
108
+ }
109
+ }
110
+ const requiredMatches = terms.length > 1 ? 2 : 1;
111
+ return matchedTerms.length >= requiredMatches;
112
+ }
113
+ //# sourceMappingURL=query-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-match.js","sourceRoot":"","sources":["../../../src/tools/sentiment/query-match.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { AgentTool } from "@earendil-works/pi-agent-core";
2
+ import type { AskUserHandler } from "../../types/index.js";
2
3
  import type { RedditSentimentResult } from "../../types/sentiment.js";
3
4
  declare const params: import("@sinclair/typebox").TObject<{
4
5
  subreddit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
@@ -6,5 +7,15 @@ declare const params: import("@sinclair/typebox").TObject<{
6
7
  subreddits: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
7
8
  limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
8
9
  }>;
9
- export declare const redditSentimentTool: AgentTool<typeof params, RedditSentimentResult>;
10
+ interface RedditSentimentToolOptions {
11
+ askUserHandler?: AskUserHandler;
12
+ }
13
+ type RedditToolDetails = RedditSentimentResult | null;
14
+ export declare function createRedditSentimentTool(options?: RedditSentimentToolOptions): AgentTool<typeof params, RedditToolDetails>;
15
+ export declare const redditSentimentTool: AgentTool<import("@sinclair/typebox").TObject<{
16
+ subreddit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
17
+ query: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
18
+ subreddits: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>>;
19
+ limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
20
+ }>, RedditToolDetails>;
10
21
  export {};
@@ -1,9 +1,15 @@
1
1
  import { Type } from "@sinclair/typebox";
2
2
  import { getConfig } from "../../config.js";
3
+ import { promptUser } from "../../onboarding/prompt-user.js";
4
+ import { getProvider } from "../../onboarding/providers.js";
5
+ import { loadOnboardingState, markProviderNeverAsk, saveOnboardingState, } from "../../onboarding/state.js";
6
+ import { buildExternalToolRequiredTag, buildSkippedTag } from "../../onboarding/tool-tags.js";
3
7
  import { getPostComments, getSubredditPosts } from "../../providers/reddit.js";
4
8
  import { wrapProvider } from "../../providers/wrap-provider.js";
5
9
  import { RedditAdapter } from "../../sentiment/adapters/reddit.js";
6
10
  import { getSentimentPipeline } from "../../sentiment/index.js";
11
+ import { formatInsightSection } from "./insight-format.js";
12
+ import { recordMatchesSentimentQuery, sentimentQueryTerms } from "./query-match.js";
7
13
  import { renderUntrustedText, untrustedContentHeader } from "./untrusted-text.js";
8
14
  const params = Type.Object({
9
15
  subreddit: Type.Optional(Type.String({
@@ -17,127 +23,267 @@ const params = Type.Object({
17
23
  })),
18
24
  limit: Type.Optional(Type.Number({ description: "Number of posts per subreddit. Default: 25, max: 100" })),
19
25
  });
20
- export const redditSentimentTool = {
21
- name: "get_reddit_sentiment",
22
- label: "Reddit Sentiment",
23
- description: "Analyze sentiment from financial Reddit communities. Supports single subreddit, multi-subreddit, and topic filtering. Returns scored posts with comment analysis and trend context.",
24
- parameters: params,
25
- async execute(_toolCallId, args) {
26
- const limit = Math.min(args.limit ?? 25, 100);
27
- const config = getConfig();
28
- // Determine subreddits to search
29
- let subreddits;
30
- if (args.subreddits && args.subreddits.length > 0) {
31
- subreddits = args.subreddits;
32
- }
33
- else if (args.subreddit) {
34
- subreddits = [args.subreddit];
35
- }
36
- else {
37
- subreddits = config.sentiment?.defaultSubreddits ?? [
38
- "wallstreetbets",
39
- "stocks",
40
- "investing",
41
- "options",
42
- ];
43
- }
44
- // Fetch from all subreddits
45
- const allResults = [];
46
- const warnings = [];
47
- for (const sub of subreddits) {
48
- const providerResult = await wrapProvider("reddit", () => getSubredditPosts(sub, limit));
49
- if (providerResult.status === "unavailable") {
50
- warnings.push(`r/${sub}: ${providerResult.reason}`);
51
- continue;
26
+ const INSTALL_CONTINUE_LABEL = "Continue after installing Reddit";
27
+ const SESSION_CONTINUE_LABEL = "Continue after logging in to Reddit";
28
+ const SKIP_ONCE_LABEL = "Skip Reddit once";
29
+ const ALWAYS_SKIP_LABEL = "Always skip Reddit";
30
+ export function createRedditSentimentTool(options = {}) {
31
+ return {
32
+ name: "get_reddit_sentiment",
33
+ label: "Reddit Sentiment",
34
+ description: "Analyze sentiment from financial Reddit communities. Supports single subreddit, multi-subreddit, and topic filtering. Returns scored posts with comment analysis and trend context.",
35
+ parameters: params,
36
+ async execute(_toolCallId, args, _signal, _onUpdate, ctx) {
37
+ const limit = Math.min(args.limit ?? 25, 100);
38
+ const config = getConfig();
39
+ const state = loadOnboardingState();
40
+ const descriptor = getProvider("reddit");
41
+ if (state.providers.reddit?.status === "never_ask") {
42
+ return skippedRedditResult("You previously asked not to be reminded about Reddit.", "run opencandle doctor --enable reddit to re-enable Reddit sentiment (silenced)", true);
52
43
  }
53
- allResults.push(providerResult.data);
54
- }
55
- if (allResults.length === 0) {
56
- return {
57
- content: [
58
- { type: "text", text: `⚠ Reddit sentiment unavailable (${warnings.join("; ")}).` },
59
- ],
60
- details: null,
44
+ // Determine subreddits to search
45
+ let subreddits;
46
+ if (args.subreddits && args.subreddits.length > 0) {
47
+ subreddits = args.subreddits;
48
+ }
49
+ else if (args.subreddit) {
50
+ subreddits = [args.subreddit];
51
+ }
52
+ else {
53
+ subreddits = config.sentiment?.defaultSubreddits ?? [
54
+ "wallstreetbets",
55
+ "stocks",
56
+ "investing",
57
+ "options",
58
+ ];
59
+ }
60
+ let { allResults, warnings } = await fetchRedditSubreddits(subreddits, limit, args.query);
61
+ let retriedAfterContinue = false;
62
+ let promptedSetupIssue = null;
63
+ if (allResults.length === 0) {
64
+ const setupIssue = classifyRedditSetupIssue(warnings);
65
+ if (setupIssue) {
66
+ promptedSetupIssue = setupIssue;
67
+ const askUserHandler = options.askUserHandler ??
68
+ ctx?.askUserHandler;
69
+ const canAsk = askUserHandler != null || ctx?.hasUI === true;
70
+ if (canAsk) {
71
+ const promptResult = await promptUser((ctx ?? { hasUI: false }), {
72
+ question: setupIssue === "not_installed"
73
+ ? "Reddit sentiment needs the local rdt-cli command before it can fetch discussions. Install command: uv tool install rdt-cli. How would you like to proceed?"
74
+ : "Reddit sentiment needs an active Reddit browser session for rdt-cli. Login command: rdt login. How would you like to proceed?",
75
+ questionType: "select",
76
+ options: [
77
+ setupIssue === "not_installed" ? INSTALL_CONTINUE_LABEL : SESSION_CONTINUE_LABEL,
78
+ SKIP_ONCE_LABEL,
79
+ ALWAYS_SKIP_LABEL,
80
+ ],
81
+ reason: "Reddit sentiment needs rdt-cli and a Reddit browser session.",
82
+ }, askUserHandler);
83
+ if (!promptResult.cancelled && promptResult.answer?.startsWith("Continue")) {
84
+ retriedAfterContinue = true;
85
+ ({ allResults, warnings } = await fetchRedditSubreddits(subreddits, limit, args.query));
86
+ }
87
+ else if (!promptResult.cancelled && promptResult.answer === ALWAYS_SKIP_LABEL) {
88
+ saveOnboardingState(markProviderNeverAsk(state, "reddit"));
89
+ return skippedRedditResult(`User chose to always skip ${descriptor.displayName} data. Do not ask about Reddit setup again unless the user explicitly re-enables it.`, "run opencandle doctor --enable reddit to re-enable Reddit sentiment (silenced)", true);
90
+ }
91
+ else {
92
+ return skippedRedditResult(`User chose to skip ${descriptor.displayName} data for this request. Do not ask about Reddit setup again in this turn.`, "user chose to skip Reddit for this request", false);
93
+ }
94
+ }
95
+ }
96
+ }
97
+ if (allResults.length === 0) {
98
+ const setupIssue = classifyRedditSetupIssue(warnings);
99
+ if (retriedAfterContinue && (!setupIssue || setupIssue === promptedSetupIssue)) {
100
+ return unavailableRedditResult(warnings);
101
+ }
102
+ if (setupIssue) {
103
+ const tag = buildExternalToolRequiredTag({
104
+ provider: "reddit",
105
+ reason: setupIssue,
106
+ installCmd: "uv tool install rdt-cli",
107
+ loginCmd: "rdt login",
108
+ fallback: "twitter-web-news",
109
+ });
110
+ const guidance = setupIssue === "not_installed"
111
+ ? "Reddit sentiment requires the local rdt-cli tool. Install it with `uv tool install rdt-cli`, then run `rdt login` if needed."
112
+ : "Reddit sentiment requires an active Reddit browser session for rdt-cli. Run `rdt login` or refresh your Reddit browser login.";
113
+ return {
114
+ content: [{ type: "text", text: `${tag}\n\n${guidance}` }],
115
+ details: null,
116
+ };
117
+ }
118
+ return unavailableRedditResult(warnings);
119
+ }
120
+ // Merge records returned by the provider. rdt-cli handles query-bearing
121
+ // requests server-side; the local filter remains a defensive post-filter.
122
+ const adapter = new RedditAdapter();
123
+ let allRecords = allResults.flatMap((r) => adapter.mapPostsToRecords(r, args.query ?? subreddits.join("+")));
124
+ const queryTerms = args.query ? sentimentQueryTerms(args.query) : null;
125
+ // Topic filtering
126
+ if (queryTerms) {
127
+ allRecords = allRecords.filter((record) => recordMatchesSentimentQuery(record, queryTerms));
128
+ }
129
+ // Deduplicate by sourceId (crossposts)
130
+ const seen = new Set();
131
+ allRecords = allRecords.filter((r) => {
132
+ if (seen.has(r.sourceId))
133
+ return false;
134
+ seen.add(r.sourceId);
135
+ return true;
136
+ });
137
+ // Fetch comments for top 10 posts by engagement
138
+ const commentsPerPost = config.sentiment?.commentsPerPost ?? 5;
139
+ const topPosts = [...allRecords]
140
+ .sort((a, b) => b.engagement.score - a.engagement.score)
141
+ .slice(0, 10);
142
+ for (const post of topPosts) {
143
+ const sub = post.metadata.subreddit ?? subreddits[0];
144
+ if ((post.engagement.replies ?? 0) === 0)
145
+ continue;
146
+ try {
147
+ const comments = await getPostComments(sub, post.sourceId, commentsPerPost);
148
+ const commentRecords = adapter.mapCommentsToRecords(comments, post.sourceId, sub, args.query ?? subreddits.join("+"));
149
+ allRecords.push(...(queryTerms
150
+ ? commentRecords.filter((record) => recordMatchesSentimentQuery(record, queryTerms))
151
+ : commentRecords));
152
+ }
153
+ catch {
154
+ // Comment fetch failures are non-fatal
155
+ }
156
+ }
157
+ // Process through pipeline
158
+ const pipeline = getSentimentPipeline();
159
+ const pipelineResult = await pipeline.processRecords(allRecords, args.query ?? subreddits.join("+"));
160
+ // Build output using first result as base for backward compatibility
161
+ const firstResult = allResults[0];
162
+ const postRecords = pipelineResult.fresh.filter((r) => !r.metadata.isComment);
163
+ const commentRecords = pipelineResult.fresh.filter((r) => r.metadata.isComment);
164
+ const sentimentRecords = pipelineResult.fresh;
165
+ const rawPostsById = new Map(allResults.flatMap((result) => result.posts.map((post) => [post.id, post])));
166
+ const aggregatePosts = postRecords.map((record) => {
167
+ const rawPost = rawPostsById.get(record.sourceId);
168
+ return {
169
+ id: record.sourceId,
170
+ title: rawPost?.title ?? record.title ?? "",
171
+ selftext: rawPost?.selftext ?? "",
172
+ author: rawPost?.author ?? record.author ?? "unknown",
173
+ score: rawPost?.score ?? record.engagement.score,
174
+ comments: rawPost?.comments ?? record.engagement.replies ?? 0,
175
+ url: rawPost?.url ?? record.url,
176
+ created: rawPost?.created ?? record.publishedAt ?? record.fetchedAt,
177
+ };
178
+ });
179
+ const aggregateTopMentions = [
180
+ ...new Set(postRecords.flatMap((record) => record.sentiment.tickers)),
181
+ ];
182
+ const avgScore = sentimentRecords.length > 0
183
+ ? sentimentRecords.reduce((s, r) => s + r.sentiment.score, 0) / sentimentRecords.length
184
+ : 0;
185
+ const sentimentLabel = avgScore > 0.3
186
+ ? "Bullish"
187
+ : avgScore < -0.3
188
+ ? "Bearish"
189
+ : avgScore > 0
190
+ ? "Leaning Bullish"
191
+ : avgScore < 0
192
+ ? "Leaning Bearish"
193
+ : "Neutral";
194
+ const subLabel = subreddits.length === 1 ? `r/${subreddits[0]}` : `${subreddits.length} subreddits`;
195
+ const lines = [
196
+ `**Reddit: ${args.query ?? subLabel}** — ${postRecords.length} posts, ${commentRecords.length} comments`,
197
+ `Sentiment: ${avgScore.toFixed(2)} (${sentimentLabel})`,
198
+ ];
199
+ const details = {
200
+ ...firstResult,
201
+ subreddit: subreddits.length === 1 ? firstResult.subreddit : subreddits.join(","),
202
+ postCount: postRecords.length,
203
+ posts: aggregatePosts,
204
+ topMentions: aggregateTopMentions,
205
+ sentimentScore: avgScore,
206
+ bullishCount: sentimentRecords.filter((record) => record.sentiment.score > 0).length,
207
+ bearishCount: sentimentRecords.filter((record) => record.sentiment.score < 0).length,
208
+ insight: pipelineResult.insight,
209
+ records: pipelineResult.fresh,
61
210
  };
62
- }
63
- // Merge and filter by query if provided
64
- const adapter = new RedditAdapter();
65
- let allRecords = allResults.flatMap((r) => adapter.mapPostsToRecords(r, args.query ?? subreddits.join("+")));
66
- // Topic filtering
67
- if (args.query) {
68
- const queryLower = args.query.toLowerCase();
69
- allRecords = allRecords.filter((r) => r.text.toLowerCase().includes(queryLower) ||
70
- (r.title?.toLowerCase().includes(queryLower) ?? false));
71
- }
72
- // Deduplicate by sourceId (crossposts)
73
- const seen = new Set();
74
- allRecords = allRecords.filter((r) => {
75
- if (seen.has(r.sourceId))
76
- return false;
77
- seen.add(r.sourceId);
78
- return true;
79
- });
80
- // Fetch comments for top 10 posts by engagement
81
- const commentsPerPost = config.sentiment?.commentsPerPost ?? 5;
82
- const topPosts = [...allRecords]
83
- .sort((a, b) => b.engagement.score - a.engagement.score)
84
- .slice(0, 10);
85
- for (const post of topPosts) {
86
- const sub = post.metadata.subreddit ?? subreddits[0];
87
- if ((post.engagement.replies ?? 0) === 0)
88
- continue;
89
- try {
90
- const comments = await getPostComments(sub, post.sourceId, commentsPerPost);
91
- const commentRecords = adapter.mapCommentsToRecords(comments, post.sourceId, sub, args.query ?? subreddits.join("+"));
92
- allRecords.push(...commentRecords);
211
+ if (pipelineResult.insight) {
212
+ lines.push(...formatInsightSection(pipelineResult.insight));
93
213
  }
94
- catch {
95
- // Comment fetch failures are non-fatal
214
+ if (aggregateTopMentions.length > 0) {
215
+ lines.push(`Tickers: ${aggregateTopMentions.map((t) => `$${t}`).join(", ")}`);
96
216
  }
97
- }
98
- // Process through pipeline
99
- const pipeline = getSentimentPipeline();
100
- const pipelineResult = await pipeline.processRecords(allRecords, args.query ?? subreddits.join("+"));
101
- // Build output using first result as base for backward compatibility
102
- const firstResult = allResults[0];
103
- const postRecords = pipelineResult.fresh.filter((r) => !r.metadata.isComment);
104
- const commentRecords = pipelineResult.fresh.filter((r) => r.metadata.isComment);
105
- const avgScore = postRecords.length > 0
106
- ? postRecords.reduce((s, r) => s + r.sentiment.score, 0) / postRecords.length
107
- : 0;
108
- const sentimentLabel = avgScore > 0.3
109
- ? "Bullish"
110
- : avgScore < -0.3
111
- ? "Bearish"
112
- : avgScore > 0
113
- ? "Leaning Bullish"
114
- : avgScore < 0
115
- ? "Leaning Bearish"
116
- : "Neutral";
117
- const subLabel = subreddits.length === 1 ? `r/${subreddits[0]}` : `${subreddits.length} subreddits`;
118
- const lines = [
119
- `**Reddit: ${args.query ?? subLabel}** — ${postRecords.length} posts, ${commentRecords.length} comments`,
120
- `Sentiment: ${avgScore.toFixed(2)} (${sentimentLabel})`,
121
- ];
122
- if (firstResult.topMentions.length > 0) {
123
- lines.push(`Tickers: ${firstResult.topMentions.map((t) => `$${t}`).join(", ")}`);
124
- }
125
- lines.push("");
126
- lines.push(untrustedContentHeader("Reddit posts"));
127
- for (const post of postRecords.slice(0, 10)) {
128
- const scoreIndicator = post.sentiment.score > 0 ? "🟢" : post.sentiment.score < 0 ? "🔴" : "⚪";
129
- lines.push(` ${scoreIndicator} ⬆${post.engagement.score} 💬${post.engagement.replies ?? 0} — ${renderUntrustedText(post.title ?? post.text, 100)}`);
130
- }
131
- if (pipelineResult.trend && pipelineResult.trend.length > 0) {
132
- const t = pipelineResult.trend[0];
133
- lines.push("");
134
- lines.push(`Trend: ${t.sparkline} ${t.direction} (${t.delta >= 0 ? "+" : ""}${t.delta.toFixed(2)}, ${t.count} records)`);
135
- }
136
- if (warnings.length > 0) {
137
217
  lines.push("");
138
- lines.push(`⚠ ${warnings.join("; ")}`);
218
+ lines.push(untrustedContentHeader("Reddit posts"));
219
+ for (const post of postRecords.slice(0, 10)) {
220
+ const scoreIndicator = post.sentiment.score > 0 ? "🟢" : post.sentiment.score < 0 ? "🔴" : "⚪";
221
+ lines.push(` ${scoreIndicator} ⬆${post.engagement.score} 💬${post.engagement.replies ?? 0} — ${renderUntrustedText(post.title ?? post.text, 100)}`);
222
+ }
223
+ if (pipelineResult.trend && pipelineResult.trend.length > 0) {
224
+ const t = pipelineResult.trend[0];
225
+ lines.push("");
226
+ lines.push(`Trend: ${t.sparkline} ${t.direction} (${t.delta >= 0 ? "+" : ""}${t.delta.toFixed(2)}, ${t.count} records)`);
227
+ }
228
+ if (warnings.length > 0) {
229
+ lines.push("");
230
+ lines.push(`⚠ ${warnings.join("; ")}`);
231
+ }
232
+ return { content: [{ type: "text", text: lines.join("\n") }], details };
233
+ },
234
+ };
235
+ }
236
+ export const redditSentimentTool = createRedditSentimentTool();
237
+ function unavailableRedditResult(warnings) {
238
+ return {
239
+ content: [{ type: "text", text: `⚠ Reddit sentiment unavailable (${warnings.join("; ")}).` }],
240
+ details: null,
241
+ };
242
+ }
243
+ async function fetchRedditSubreddits(subreddits, limit, query) {
244
+ const allResults = [];
245
+ const warnings = [];
246
+ for (const sub of subreddits) {
247
+ const providerResult = await wrapProvider("reddit", () => getSubredditPosts(sub, limit, query));
248
+ if (providerResult.status === "unavailable") {
249
+ warnings.push(`r/${sub}: ${providerResult.reason}`);
250
+ continue;
139
251
  }
140
- return { content: [{ type: "text", text: lines.join("\n") }], details: firstResult };
141
- },
142
- };
252
+ allResults.push(providerResult.data);
253
+ }
254
+ return { allResults, warnings };
255
+ }
256
+ function skippedRedditResult(message, remediation, silenced) {
257
+ return {
258
+ content: [
259
+ {
260
+ type: "text",
261
+ text: `${buildSkippedTag({
262
+ provider: "reddit",
263
+ reason: "credential_not_provided",
264
+ remediation,
265
+ silenced,
266
+ })}\n\n${message}`,
267
+ },
268
+ ],
269
+ details: null,
270
+ };
271
+ }
272
+ function classifyRedditSetupIssue(warnings) {
273
+ const combined = warnings.join("\n").toLowerCase();
274
+ if (combined.includes("not installed") || combined.includes("enoent")) {
275
+ return "not_installed";
276
+ }
277
+ if (combined.includes("no reddit cookies") ||
278
+ combined.includes("not authenticated") ||
279
+ combined.includes("rdt login")) {
280
+ return "session_missing";
281
+ }
282
+ if (combined.includes("401") ||
283
+ combined.includes("unauthorized") ||
284
+ combined.includes("expired")) {
285
+ return "session_stale";
286
+ }
287
+ return null;
288
+ }
143
289
  //# sourceMappingURL=reddit-sentiment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reddit-sentiment.js","sourceRoot":"","sources":["../../../src/tools/sentiment/reddit-sentiment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reddit-sentiment.js","sourceRoot":"","sources":["../../../src/tools/sentiment/reddit-sentiment.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,15 @@
1
1
  import type { AgentTool } from "@earendil-works/pi-agent-core";
2
+ import type { AskUserHandler } from "../../types/index.js";
2
3
  declare const params: import("@sinclair/typebox").TObject<{
3
4
  query: import("@sinclair/typebox").TString;
4
5
  hours: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
5
6
  }>;
6
- export declare const sentimentSummaryTool: AgentTool<typeof params>;
7
+ interface SentimentSummaryToolOptions {
8
+ askUserHandler?: AskUserHandler;
9
+ }
10
+ export declare function createSentimentSummaryTool(options?: SentimentSummaryToolOptions): AgentTool<typeof params>;
11
+ export declare const sentimentSummaryTool: AgentTool<import("@sinclair/typebox").TObject<{
12
+ query: import("@sinclair/typebox").TString;
13
+ hours: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
14
+ }>, any>;
7
15
  export {};