opencandle 0.1.1 → 0.2.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 (179) hide show
  1. package/README.md +13 -4
  2. package/dist/analysts/contracts.d.ts +31 -0
  3. package/dist/analysts/contracts.js +158 -0
  4. package/dist/analysts/contracts.js.map +1 -0
  5. package/dist/analysts/orchestrator.d.ts +11 -2
  6. package/dist/analysts/orchestrator.js +155 -7
  7. package/dist/analysts/orchestrator.js.map +1 -1
  8. package/dist/cli.js +26 -10
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config.d.ts +4 -0
  11. package/dist/config.js +2 -0
  12. package/dist/config.js.map +1 -1
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/infra/cache.d.ts +30 -0
  17. package/dist/infra/cache.js +40 -3
  18. package/dist/infra/cache.js.map +1 -1
  19. package/dist/infra/index.d.ts +1 -1
  20. package/dist/infra/index.js +1 -1
  21. package/dist/infra/index.js.map +1 -1
  22. package/dist/infra/opencandle-paths.d.ts +1 -0
  23. package/dist/infra/opencandle-paths.js +3 -0
  24. package/dist/infra/opencandle-paths.js.map +1 -1
  25. package/dist/infra/rate-limiter.js +1 -0
  26. package/dist/infra/rate-limiter.js.map +1 -1
  27. package/dist/memory/index.d.ts +3 -0
  28. package/dist/memory/index.js +2 -0
  29. package/dist/memory/index.js.map +1 -1
  30. package/dist/memory/manager.d.ts +19 -0
  31. package/dist/memory/manager.js +132 -0
  32. package/dist/memory/manager.js.map +1 -0
  33. package/dist/memory/sqlite.js +12 -1
  34. package/dist/memory/sqlite.js.map +1 -1
  35. package/dist/memory/types.d.ts +21 -0
  36. package/dist/memory/types.js +47 -0
  37. package/dist/memory/types.js.map +1 -0
  38. package/dist/pi/opencandle-extension.d.ts +5 -1
  39. package/dist/pi/opencandle-extension.js +45 -142
  40. package/dist/pi/opencandle-extension.js.map +1 -1
  41. package/dist/pi/session.d.ts +2 -0
  42. package/dist/pi/session.js +1 -1
  43. package/dist/pi/session.js.map +1 -1
  44. package/dist/prompts/context-builder.d.ts +26 -0
  45. package/dist/prompts/context-builder.js +126 -0
  46. package/dist/prompts/context-builder.js.map +1 -0
  47. package/dist/prompts/sections.d.ts +13 -0
  48. package/dist/prompts/sections.js +35 -0
  49. package/dist/prompts/sections.js.map +1 -0
  50. package/dist/providers/alpha-vantage.d.ts +3 -0
  51. package/dist/providers/alpha-vantage.js +184 -76
  52. package/dist/providers/alpha-vantage.js.map +1 -1
  53. package/dist/providers/coingecko.js +53 -37
  54. package/dist/providers/coingecko.js.map +1 -1
  55. package/dist/providers/fear-greed.js +23 -15
  56. package/dist/providers/fear-greed.js.map +1 -1
  57. package/dist/providers/fred.js +35 -27
  58. package/dist/providers/fred.js.map +1 -1
  59. package/dist/providers/reddit.js +44 -36
  60. package/dist/providers/reddit.js.map +1 -1
  61. package/dist/providers/twitter.d.ts +20 -0
  62. package/dist/providers/twitter.js +143 -0
  63. package/dist/providers/twitter.js.map +1 -0
  64. package/dist/providers/with-fallback.d.ts +15 -0
  65. package/dist/providers/with-fallback.js +32 -0
  66. package/dist/providers/with-fallback.js.map +1 -0
  67. package/dist/providers/wrap-provider.d.ts +13 -0
  68. package/dist/providers/wrap-provider.js +43 -0
  69. package/dist/providers/wrap-provider.js.map +1 -0
  70. package/dist/providers/yahoo-finance.js +77 -57
  71. package/dist/providers/yahoo-finance.js.map +1 -1
  72. package/dist/runtime/evidence.d.ts +35 -0
  73. package/dist/runtime/evidence.js +29 -0
  74. package/dist/runtime/evidence.js.map +1 -0
  75. package/dist/runtime/index.d.ts +16 -0
  76. package/dist/runtime/index.js +10 -0
  77. package/dist/runtime/index.js.map +1 -0
  78. package/dist/runtime/prompt-step.d.ts +41 -0
  79. package/dist/runtime/prompt-step.js +42 -0
  80. package/dist/runtime/prompt-step.js.map +1 -0
  81. package/dist/runtime/provider-ids.d.ts +14 -0
  82. package/dist/runtime/provider-ids.js +14 -0
  83. package/dist/runtime/provider-ids.js.map +1 -0
  84. package/dist/runtime/provider-tracker.d.ts +20 -0
  85. package/dist/runtime/provider-tracker.js +36 -0
  86. package/dist/runtime/provider-tracker.js.map +1 -0
  87. package/dist/runtime/run-context.d.ts +11 -0
  88. package/dist/runtime/run-context.js +14 -0
  89. package/dist/runtime/run-context.js.map +1 -0
  90. package/dist/runtime/session-coordinator.d.ts +48 -0
  91. package/dist/runtime/session-coordinator.js +171 -0
  92. package/dist/runtime/session-coordinator.js.map +1 -0
  93. package/dist/runtime/validation.d.ts +44 -0
  94. package/dist/runtime/validation.js +157 -0
  95. package/dist/runtime/validation.js.map +1 -0
  96. package/dist/runtime/workflow-events.d.ts +21 -0
  97. package/dist/runtime/workflow-events.js +31 -0
  98. package/dist/runtime/workflow-events.js.map +1 -0
  99. package/dist/runtime/workflow-runner.d.ts +36 -0
  100. package/dist/runtime/workflow-runner.js +129 -0
  101. package/dist/runtime/workflow-runner.js.map +1 -0
  102. package/dist/runtime/workflow-types.d.ts +60 -0
  103. package/dist/runtime/workflow-types.js +32 -0
  104. package/dist/runtime/workflow-types.js.map +1 -0
  105. package/dist/system-prompt.js +52 -2
  106. package/dist/system-prompt.js.map +1 -1
  107. package/dist/tool-kit.d.ts +9 -5
  108. package/dist/tool-kit.js +29 -6
  109. package/dist/tool-kit.js.map +1 -1
  110. package/dist/tools/fundamentals/company-overview.js +13 -2
  111. package/dist/tools/fundamentals/company-overview.js.map +1 -1
  112. package/dist/tools/fundamentals/comps.js +15 -7
  113. package/dist/tools/fundamentals/comps.js.map +1 -1
  114. package/dist/tools/fundamentals/dcf.js +23 -5
  115. package/dist/tools/fundamentals/dcf.js.map +1 -1
  116. package/dist/tools/fundamentals/earnings.js +9 -1
  117. package/dist/tools/fundamentals/earnings.js.map +1 -1
  118. package/dist/tools/fundamentals/financials.js +9 -1
  119. package/dist/tools/fundamentals/financials.js.map +1 -1
  120. package/dist/tools/fundamentals/sec-filings.js +9 -1
  121. package/dist/tools/fundamentals/sec-filings.js.map +1 -1
  122. package/dist/tools/index.js +2 -0
  123. package/dist/tools/index.js.map +1 -1
  124. package/dist/tools/interaction/ask-user.d.ts +3 -0
  125. package/dist/tools/interaction/ask-user.js +87 -0
  126. package/dist/tools/interaction/ask-user.js.map +1 -0
  127. package/dist/tools/interaction/twitter-login.d.ts +8 -0
  128. package/dist/tools/interaction/twitter-login.js +77 -0
  129. package/dist/tools/interaction/twitter-login.js.map +1 -0
  130. package/dist/tools/macro/fear-greed.js +9 -1
  131. package/dist/tools/macro/fear-greed.js.map +1 -1
  132. package/dist/tools/macro/fred-data.js +13 -2
  133. package/dist/tools/macro/fred-data.js.map +1 -1
  134. package/dist/tools/market/crypto-history.js +9 -1
  135. package/dist/tools/market/crypto-history.js.map +1 -1
  136. package/dist/tools/market/crypto-price.js +9 -1
  137. package/dist/tools/market/crypto-price.js.map +1 -1
  138. package/dist/tools/market/stock-history.js +28 -1
  139. package/dist/tools/market/stock-history.js.map +1 -1
  140. package/dist/tools/market/stock-quote.js +29 -4
  141. package/dist/tools/market/stock-quote.js.map +1 -1
  142. package/dist/tools/options/option-chain.js +9 -1
  143. package/dist/tools/options/option-chain.js.map +1 -1
  144. package/dist/tools/portfolio/correlation.js +15 -3
  145. package/dist/tools/portfolio/correlation.js.map +1 -1
  146. package/dist/tools/portfolio/predictions.js +6 -5
  147. package/dist/tools/portfolio/predictions.js.map +1 -1
  148. package/dist/tools/portfolio/risk-analysis.js +9 -1
  149. package/dist/tools/portfolio/risk-analysis.js.map +1 -1
  150. package/dist/tools/portfolio/tracker.js +6 -3
  151. package/dist/tools/portfolio/tracker.js.map +1 -1
  152. package/dist/tools/portfolio/watchlist.js +6 -1
  153. package/dist/tools/portfolio/watchlist.js.map +1 -1
  154. package/dist/tools/sentiment/news-sentiment.js +8 -10
  155. package/dist/tools/sentiment/news-sentiment.js.map +1 -1
  156. package/dist/tools/sentiment/reddit-sentiment.js +9 -1
  157. package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
  158. package/dist/tools/sentiment/twitter-sentiment.d.ts +9 -0
  159. package/dist/tools/sentiment/twitter-sentiment.js +58 -0
  160. package/dist/tools/sentiment/twitter-sentiment.js.map +1 -0
  161. package/dist/tools/technical/backtest.js +9 -1
  162. package/dist/tools/technical/backtest.js.map +1 -1
  163. package/dist/tools/technical/indicators.js +9 -1
  164. package/dist/tools/technical/indicators.js.map +1 -1
  165. package/dist/types/index.d.ts +15 -0
  166. package/dist/types/sentiment.d.ts +20 -0
  167. package/dist/workflows/compare-assets.d.ts +3 -0
  168. package/dist/workflows/compare-assets.js +21 -5
  169. package/dist/workflows/compare-assets.js.map +1 -1
  170. package/dist/workflows/index.d.ts +3 -3
  171. package/dist/workflows/index.js +3 -3
  172. package/dist/workflows/index.js.map +1 -1
  173. package/dist/workflows/options-screener.d.ts +3 -0
  174. package/dist/workflows/options-screener.js +24 -7
  175. package/dist/workflows/options-screener.js.map +1 -1
  176. package/dist/workflows/portfolio-builder.d.ts +3 -0
  177. package/dist/workflows/portfolio-builder.js +30 -9
  178. package/dist/workflows/portfolio-builder.js.map +1 -1
  179. package/package.json +9 -5
@@ -1,47 +1,55 @@
1
1
  import { httpGet } from "../infra/http-client.js";
2
- import { cache, TTL } from "../infra/cache.js";
2
+ import { cache, TTL, STALE_LIMIT } from "../infra/cache.js";
3
3
  export async function getSubredditPosts(subreddit, limit = 25) {
4
4
  const cacheKey = `reddit:${subreddit}:${limit}`;
5
5
  const cached = cache.get(cacheKey);
6
6
  if (cached)
7
7
  return cached;
8
- const url = `https://www.reddit.com/r/${encodeURIComponent(subreddit)}/hot.json?limit=${limit}`;
9
- const data = await httpGet(url, {
10
- headers: { "User-Agent": "OpenCandle/1.0 (financial analysis agent)" },
11
- });
12
- const posts = data.data.children.map((child) => ({
13
- title: child.data.title,
14
- score: child.data.score,
15
- comments: child.data.num_comments,
16
- url: `https://reddit.com${child.data.permalink}`,
17
- created: new Date(child.data.created_utc * 1000).toISOString(),
18
- }));
19
- // Extract ticker-like mentions ($AAPL, $TSLA, etc.)
20
- const tickerRegex = /\$([A-Z]{1,5})\b/g;
21
- const mentionCounts = new Map();
22
- for (const post of posts) {
23
- for (const match of post.title.matchAll(tickerRegex)) {
24
- const ticker = match[1];
25
- mentionCounts.set(ticker, (mentionCounts.get(ticker) ?? 0) + 1);
8
+ try {
9
+ const url = `https://www.reddit.com/r/${encodeURIComponent(subreddit)}/hot.json?limit=${limit}`;
10
+ const data = await httpGet(url, {
11
+ headers: { "User-Agent": "OpenCandle/1.0 (financial analysis agent)" },
12
+ });
13
+ const posts = data.data.children.map((child) => ({
14
+ title: child.data.title,
15
+ score: child.data.score,
16
+ comments: child.data.num_comments,
17
+ url: `https://reddit.com${child.data.permalink}`,
18
+ created: new Date(child.data.created_utc * 1000).toISOString(),
19
+ }));
20
+ // Extract ticker-like mentions ($AAPL, $TSLA, etc.)
21
+ const tickerRegex = /\$([A-Z]{1,5})\b/g;
22
+ const mentionCounts = new Map();
23
+ for (const post of posts) {
24
+ for (const match of post.title.matchAll(tickerRegex)) {
25
+ const ticker = match[1];
26
+ mentionCounts.set(ticker, (mentionCounts.get(ticker) ?? 0) + 1);
27
+ }
26
28
  }
29
+ const topMentions = [...mentionCounts.entries()]
30
+ .sort((a, b) => b[1] - a[1])
31
+ .slice(0, 10)
32
+ .map(([ticker]) => ticker);
33
+ const sentiment = scoreSentiment(posts);
34
+ const result = {
35
+ subreddit,
36
+ postCount: posts.length,
37
+ posts,
38
+ topMentions,
39
+ sentimentScore: sentiment.score,
40
+ bullishCount: sentiment.bullish,
41
+ bearishCount: sentiment.bearish,
42
+ fetchedAt: new Date().toISOString(),
43
+ };
44
+ cache.set(cacheKey, result, TTL.SENTIMENT);
45
+ return result;
46
+ }
47
+ catch (error) {
48
+ const stale = cache.getStale(cacheKey, STALE_LIMIT.SENTIMENT);
49
+ if (stale)
50
+ return stale.value;
51
+ throw error;
27
52
  }
28
- const topMentions = [...mentionCounts.entries()]
29
- .sort((a, b) => b[1] - a[1])
30
- .slice(0, 10)
31
- .map(([ticker]) => ticker);
32
- const sentiment = scoreSentiment(posts);
33
- const result = {
34
- subreddit,
35
- postCount: posts.length,
36
- posts,
37
- topMentions,
38
- sentimentScore: sentiment.score,
39
- bullishCount: sentiment.bullish,
40
- bearishCount: sentiment.bearish,
41
- fetchedAt: new Date().toISOString(),
42
- };
43
- cache.set(cacheKey, result, TTL.SENTIMENT);
44
- return result;
45
53
  }
46
54
  const BULLISH_TERMS = [
47
55
  "moon", "buy", "undervalued", "breakout", "calls", "bullish",
@@ -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,20 @@
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
+ export declare function scoreTwitterSentiment(tweets: Array<{
10
+ text: string;
11
+ likes: number;
12
+ retweets: number;
13
+ }>): {
14
+ score: number;
15
+ bullish: number;
16
+ bearish: number;
17
+ };
18
+ export declare function normalizeQuery(query: string): string;
19
+ export declare function getTwitterSentiment(query: string, limit?: number, hours?: number): Promise<TwitterSentimentResult>;
20
+ export {};
@@ -0,0 +1,143 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import Database from "better-sqlite3";
4
+ import { Scraper, SearchMode } from "@the-convocation/twitter-scraper";
5
+ import { cache, TTL, STALE_LIMIT } from "../infra/cache.js";
6
+ import { rateLimiter } from "../infra/rate-limiter.js";
7
+ import { getBrowserProfileDir } from "../infra/opencandle-paths.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
+ }
23
+ // ── Sentiment scoring ────────────────────────────────────
24
+ const BULLISH_TERMS = [
25
+ "moon", "buy", "undervalued", "breakout", "calls", "bullish",
26
+ "rocket", "diamond hands", "accumulate", "dip buy", "long", "rip", "squeeze",
27
+ ];
28
+ const BEARISH_TERMS = [
29
+ "crash", "overvalued", "sell", "puts", "bearish", "bubble",
30
+ "dump", "short", "bagholding", "exit", "drill", "tank", "rug",
31
+ ];
32
+ export function scoreTwitterSentiment(tweets) {
33
+ let bullishWeight = 0;
34
+ let bearishWeight = 0;
35
+ let bullishCount = 0;
36
+ let bearishCount = 0;
37
+ for (const tweet of tweets) {
38
+ const lower = tweet.text.toLowerCase();
39
+ const engagement = 1 + (tweet.likes ?? 0) + (tweet.retweets ?? 0);
40
+ const tweetBullish = BULLISH_TERMS.filter((t) => lower.includes(t)).length;
41
+ const tweetBearish = BEARISH_TERMS.filter((t) => lower.includes(t)).length;
42
+ bullishCount += tweetBullish;
43
+ bearishCount += tweetBearish;
44
+ bullishWeight += tweetBullish * engagement;
45
+ bearishWeight += tweetBearish * engagement;
46
+ }
47
+ const totalWeight = bullishWeight + bearishWeight;
48
+ return {
49
+ score: totalWeight === 0 ? 0 : (bullishWeight - bearishWeight) / totalWeight,
50
+ bullish: bullishCount,
51
+ bearish: bearishCount,
52
+ };
53
+ }
54
+ // ── Query normalization ──────────────────────────────────
55
+ export function normalizeQuery(query) {
56
+ if (/^[A-Z]{1,5}$/.test(query))
57
+ return "$" + query;
58
+ return query;
59
+ }
60
+ // ── Main provider function ───────────────────────────────
61
+ export async function getTwitterSentiment(query, limit = 50, hours = 24) {
62
+ const normalizedQuery = normalizeQuery(query);
63
+ const cacheKey = `twitter:${normalizedQuery}:${limit}:${hours}`;
64
+ const cached = cache.get(cacheKey);
65
+ if (cached)
66
+ return cached;
67
+ await rateLimiter.acquire("twitter");
68
+ try {
69
+ const profileDir = getBrowserProfileDir();
70
+ const cookies = readTwitterCookies(profileDir);
71
+ const authToken = cookies.find((c) => c.name === "auth_token");
72
+ const ct0 = cookies.find((c) => c.name === "ct0");
73
+ if (!authToken || !ct0) {
74
+ throw new Error("No Twitter session found.");
75
+ }
76
+ const scraper = new Scraper();
77
+ const cookieStrings = cookies.map((c) => `${c.name}=${c.value}; Domain=${c.domain}; Path=${c.path}`);
78
+ await scraper.setCookies(cookieStrings);
79
+ const loggedIn = await scraper.isLoggedIn();
80
+ if (!loggedIn) {
81
+ throw new Error("Twitter session expired.");
82
+ }
83
+ const cutoff = new Date(Date.now() - hours * 3_600_000);
84
+ const tweets = [];
85
+ const results = scraper.searchTweets(normalizedQuery, limit, SearchMode.Latest);
86
+ for await (const tweet of results) {
87
+ const created = tweet.timeParsed ?? new Date(0);
88
+ if (created < cutoff)
89
+ continue;
90
+ tweets.push({
91
+ text: tweet.text?.slice(0, 280) ?? "",
92
+ author: tweet.username ?? "unknown",
93
+ likes: tweet.likes ?? 0,
94
+ retweets: tweet.retweets ?? 0,
95
+ replies: tweet.replies ?? 0,
96
+ views: tweet.views ?? null,
97
+ url: tweet.permanentUrl ?? "",
98
+ created: created.toISOString(),
99
+ });
100
+ if (tweets.length >= limit)
101
+ break;
102
+ }
103
+ // Extract co-mentioned cashtags
104
+ const tickerRegex = /\$([A-Z]{1,5})\b/g;
105
+ const mentionCounts = new Map();
106
+ // Exclude the searched ticker itself from co-mentions
107
+ const searchedTicker = normalizedQuery.startsWith("$")
108
+ ? normalizedQuery.slice(1)
109
+ : null;
110
+ for (const t of tweets) {
111
+ for (const match of t.text.matchAll(tickerRegex)) {
112
+ const ticker = match[1];
113
+ if (ticker === searchedTicker)
114
+ continue;
115
+ mentionCounts.set(ticker, (mentionCounts.get(ticker) ?? 0) + 1);
116
+ }
117
+ }
118
+ const topMentions = [...mentionCounts.entries()]
119
+ .sort((a, b) => b[1] - a[1])
120
+ .slice(0, 10)
121
+ .map(([ticker]) => ticker);
122
+ const sentiment = scoreTwitterSentiment(tweets);
123
+ const result = {
124
+ query: normalizedQuery,
125
+ tweetCount: tweets.length,
126
+ tweets,
127
+ sentimentScore: sentiment.score,
128
+ bullishCount: sentiment.bullish,
129
+ bearishCount: sentiment.bearish,
130
+ topMentions,
131
+ fetchedAt: new Date().toISOString(),
132
+ };
133
+ cache.set(cacheKey, result, TTL.SENTIMENT);
134
+ return result;
135
+ }
136
+ catch (error) {
137
+ const stale = cache.getStale(cacheKey, STALE_LIMIT.SENTIMENT);
138
+ if (stale)
139
+ return stale.value;
140
+ throw error;
141
+ }
142
+ }
143
+ //# sourceMappingURL=twitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twitter.js","sourceRoot":"","sources":["../../src/providers/twitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ProviderResult } from "../runtime/evidence.js";
2
+ export interface FallbackEntry<T> {
3
+ provider: string;
4
+ fn: () => Promise<T>;
5
+ }
6
+ /**
7
+ * Try providers in order, stopping at the first success.
8
+ * Skips circuit-open providers. Each provider call goes through wrapProvider
9
+ * (circuit check + failure recording + stale flag propagation).
10
+ *
11
+ * Stale cache fallback is NOT managed here — it happens inside each
12
+ * provider function (Level B). By the time a provider throws to wrapProvider,
13
+ * it already tried its own stale cache.
14
+ */
15
+ export declare function withFallback<T>(entries: FallbackEntry<T>[]): Promise<ProviderResult<T>>;
@@ -0,0 +1,32 @@
1
+ import { wrapProvider } from "./wrap-provider.js";
2
+ import { getProviderTracker } from "../runtime/run-context.js";
3
+ /**
4
+ * Try providers in order, stopping at the first success.
5
+ * Skips circuit-open providers. Each provider call goes through wrapProvider
6
+ * (circuit check + failure recording + stale flag propagation).
7
+ *
8
+ * Stale cache fallback is NOT managed here — it happens inside each
9
+ * provider function (Level B). By the time a provider throws to wrapProvider,
10
+ * it already tried its own stale cache.
11
+ */
12
+ export async function withFallback(entries) {
13
+ const tracker = getProviderTracker();
14
+ const attempted = [];
15
+ for (const entry of entries) {
16
+ if (tracker?.isCircuitOpen(entry.provider))
17
+ continue;
18
+ attempted.push(entry.provider);
19
+ const result = await wrapProvider(entry.provider, entry.fn);
20
+ if (result.status === "ok")
21
+ return result;
22
+ // wrapProvider already called recordFailure on the tracker
23
+ }
24
+ return {
25
+ status: "unavailable",
26
+ reason: attempted.length > 0
27
+ ? `all providers failed: ${attempted.join(", ")}`
28
+ : `all providers circuit-open: ${entries.map((e) => e.provider).join(", ")}`,
29
+ provider: entries[0]?.provider ?? "unknown",
30
+ };
31
+ }
32
+ //# sourceMappingURL=with-fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-fallback.js","sourceRoot":"","sources":["../../src/providers/with-fallback.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAO/D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA2B;IAE3B,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC;YAAE,SAAS;QACrD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE/B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC;QAC1C,2DAA2D;IAC7D,CAAC;IAED,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC;YAC1B,CAAC,CAAC,yBAAyB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACjD,CAAC,CAAC,+BAA+B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC9E,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,SAAS;KAC5C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ProviderResult } from "../runtime/evidence.js";
2
+ /**
3
+ * Wrap a provider function call so that thrown exceptions are caught
4
+ * and returned as a structured `ProviderResultUnavailable`.
5
+ *
6
+ * When a run context is active, checks circuit breaker state before
7
+ * calling and records failures after.
8
+ *
9
+ * After a successful provider call, checks if the cache's stale flag
10
+ * was set (meaning the provider fell back to stale cached data internally)
11
+ * and propagates that metadata on the result.
12
+ */
13
+ export declare function wrapProvider<T>(providerId: string, fn: () => Promise<T>): Promise<ProviderResult<T>>;
@@ -0,0 +1,43 @@
1
+ import { getProviderTracker } from "../runtime/run-context.js";
2
+ import { cache } from "../infra/cache.js";
3
+ /**
4
+ * Wrap a provider function call so that thrown exceptions are caught
5
+ * and returned as a structured `ProviderResultUnavailable`.
6
+ *
7
+ * When a run context is active, checks circuit breaker state before
8
+ * calling and records failures after.
9
+ *
10
+ * After a successful provider call, checks if the cache's stale flag
11
+ * was set (meaning the provider fell back to stale cached data internally)
12
+ * and propagates that metadata on the result.
13
+ */
14
+ export async function wrapProvider(providerId, fn) {
15
+ const tracker = getProviderTracker();
16
+ if (tracker?.isCircuitOpen(providerId)) {
17
+ return {
18
+ status: "unavailable",
19
+ reason: "provider_circuit_open",
20
+ provider: providerId,
21
+ };
22
+ }
23
+ try {
24
+ const data = await fn();
25
+ const { stale, cachedAt } = cache.consumeStaleFlag();
26
+ return {
27
+ status: "ok",
28
+ data,
29
+ timestamp: stale ? new Date(cachedAt).toISOString() : new Date().toISOString(),
30
+ stale: stale || undefined,
31
+ };
32
+ }
33
+ catch (error) {
34
+ tracker?.recordFailure(providerId);
35
+ const reason = error instanceof Error ? error.message : "unknown_error";
36
+ return {
37
+ status: "unavailable",
38
+ reason,
39
+ provider: providerId,
40
+ };
41
+ }
42
+ }
43
+ //# sourceMappingURL=wrap-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrap-provider.js","sourceRoot":"","sources":["../../src/providers/wrap-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,EAAoB;IAEpB,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IAErC,IAAI,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,uBAAuB;YAC/B,QAAQ,EAAE,UAAU;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,EAAE,CAAC;QACxB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACrD,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,IAAI;YACJ,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC9E,KAAK,EAAE,KAAK,IAAI,SAAS;SAC1B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,MAAM,GACV,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC3D,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,MAAM;YACN,QAAQ,EAAE,UAAU;SACrB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { httpGet } from "../infra/http-client.js";
2
- import { cache, TTL } from "../infra/cache.js";
2
+ import { cache, TTL, STALE_LIMIT } from "../infra/cache.js";
3
3
  import { rateLimiter } from "../infra/rate-limiter.js";
4
4
  import { StealthBrowser } from "../infra/browser.js";
5
5
  import { computeGreeks } from "../tools/options/greeks.js";
@@ -9,70 +9,86 @@ export async function getQuote(symbol) {
9
9
  const cached = cache.get(cacheKey);
10
10
  if (cached)
11
11
  return cached;
12
- await rateLimiter.acquire("yahoo");
13
- const url = `${BASE_URL}/${encodeURIComponent(symbol)}?interval=1d&range=1d`;
14
- const data = await httpGet(url, {
15
- headers: { "User-Agent": "OpenCandle/1.0" },
16
- });
17
- if (data.chart.error) {
18
- throw new Error(`Yahoo Finance: ${data.chart.error.description}`);
12
+ try {
13
+ await rateLimiter.acquire("yahoo");
14
+ const url = `${BASE_URL}/${encodeURIComponent(symbol)}?interval=1d&range=1d`;
15
+ const data = await httpGet(url, {
16
+ headers: { "User-Agent": "OpenCandle/1.0" },
17
+ });
18
+ if (data.chart.error) {
19
+ throw new Error(`Yahoo Finance: ${data.chart.error.description}`);
20
+ }
21
+ const result = data.chart.result[0];
22
+ const meta = result.meta;
23
+ const indicators = result.indicators.quote[0];
24
+ const price = meta.regularMarketPrice ?? 0;
25
+ const prevClose = meta.chartPreviousClose ?? meta.previousClose ?? price;
26
+ const change = price - prevClose;
27
+ const changePercent = prevClose !== 0 ? (change / prevClose) * 100 : 0;
28
+ // Open price: try meta first, fall back to indicators
29
+ const open = meta.regularMarketOpen ?? indicators?.open?.[0] ?? price;
30
+ const quote = {
31
+ symbol: meta.symbol,
32
+ price,
33
+ change,
34
+ changePercent,
35
+ open,
36
+ high: meta.regularMarketDayHigh ?? indicators?.high?.[0] ?? price,
37
+ low: meta.regularMarketDayLow ?? indicators?.low?.[0] ?? price,
38
+ previousClose: prevClose,
39
+ volume: meta.regularMarketVolume ?? 0,
40
+ marketCap: meta.marketCap ?? 0,
41
+ pe: null, // Not in chart endpoint
42
+ week52High: meta.fiftyTwoWeekHigh ?? 0,
43
+ week52Low: meta.fiftyTwoWeekLow ?? 0,
44
+ timestamp: Date.now(),
45
+ };
46
+ cache.set(cacheKey, quote, TTL.QUOTE);
47
+ return quote;
48
+ }
49
+ catch (error) {
50
+ const stale = cache.getStale(cacheKey, STALE_LIMIT.QUOTE);
51
+ if (stale)
52
+ return stale.value;
53
+ throw error;
19
54
  }
20
- const result = data.chart.result[0];
21
- const meta = result.meta;
22
- const indicators = result.indicators.quote[0];
23
- const price = meta.regularMarketPrice ?? 0;
24
- const prevClose = meta.chartPreviousClose ?? meta.previousClose ?? price;
25
- const change = price - prevClose;
26
- const changePercent = prevClose !== 0 ? (change / prevClose) * 100 : 0;
27
- // Open price: try meta first, fall back to indicators
28
- const open = meta.regularMarketOpen ?? indicators?.open?.[0] ?? price;
29
- const quote = {
30
- symbol: meta.symbol,
31
- price,
32
- change,
33
- changePercent,
34
- open,
35
- high: meta.regularMarketDayHigh ?? indicators?.high?.[0] ?? price,
36
- low: meta.regularMarketDayLow ?? indicators?.low?.[0] ?? price,
37
- previousClose: prevClose,
38
- volume: meta.regularMarketVolume ?? 0,
39
- marketCap: meta.marketCap ?? 0,
40
- pe: null, // Not in chart endpoint
41
- week52High: meta.fiftyTwoWeekHigh ?? 0,
42
- week52Low: meta.fiftyTwoWeekLow ?? 0,
43
- timestamp: Date.now(),
44
- };
45
- cache.set(cacheKey, quote, TTL.QUOTE);
46
- return quote;
47
55
  }
48
56
  export async function getHistory(symbol, range = "6mo", interval = "1d") {
49
57
  const cacheKey = `yahoo:history:${symbol}:${range}:${interval}`;
50
58
  const cached = cache.get(cacheKey);
51
59
  if (cached)
52
60
  return cached;
53
- await rateLimiter.acquire("yahoo");
54
- const url = `${BASE_URL}/${encodeURIComponent(symbol)}?interval=${interval}&range=${range}`;
55
- const data = await httpGet(url, {
56
- headers: { "User-Agent": "OpenCandle/1.0" },
57
- });
58
- if (data.chart.error) {
59
- throw new Error(`Yahoo Finance: ${data.chart.error.description}`);
61
+ try {
62
+ await rateLimiter.acquire("yahoo");
63
+ const url = `${BASE_URL}/${encodeURIComponent(symbol)}?interval=${interval}&range=${range}`;
64
+ const data = await httpGet(url, {
65
+ headers: { "User-Agent": "OpenCandle/1.0" },
66
+ });
67
+ if (data.chart.error) {
68
+ throw new Error(`Yahoo Finance: ${data.chart.error.description}`);
69
+ }
70
+ const result = data.chart.result[0];
71
+ const timestamps = result.timestamp;
72
+ const quotes = result.indicators.quote[0];
73
+ const ohlcv = timestamps
74
+ .map((ts, i) => ({
75
+ date: new Date(ts * 1000).toISOString().split("T")[0],
76
+ open: quotes.open[i],
77
+ high: quotes.high[i],
78
+ low: quotes.low[i],
79
+ close: quotes.close[i],
80
+ volume: quotes.volume[i],
81
+ }))
82
+ .filter((bar) => bar.open != null && bar.close != null);
83
+ cache.set(cacheKey, ohlcv, TTL.HISTORY);
84
+ return ohlcv;
85
+ }
86
+ catch (error) {
87
+ const stale = cache.getStale(cacheKey, STALE_LIMIT.HISTORY);
88
+ if (stale)
89
+ return stale.value;
90
+ throw error;
60
91
  }
61
- const result = data.chart.result[0];
62
- const timestamps = result.timestamp;
63
- const quotes = result.indicators.quote[0];
64
- const ohlcv = timestamps
65
- .map((ts, i) => ({
66
- date: new Date(ts * 1000).toISOString().split("T")[0],
67
- open: quotes.open[i],
68
- high: quotes.high[i],
69
- low: quotes.low[i],
70
- close: quotes.close[i],
71
- volume: quotes.volume[i],
72
- }))
73
- .filter((bar) => bar.open != null && bar.close != null);
74
- cache.set(cacheKey, ohlcv, TTL.HISTORY);
75
- return ohlcv;
76
92
  }
77
93
  // --- Options Chain (v7 API with crumb+cookie auth) ---
78
94
  const BROWSER_UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36";
@@ -130,6 +146,10 @@ export async function getOptionsChain(symbol, expiration) {
130
146
  cache.set(cacheKey, chain, TTL.OPTIONS_CHAIN);
131
147
  return chain;
132
148
  }
149
+ // All fetches failed — try stale cache before giving up
150
+ const stale = cache.getStale(cacheKey, STALE_LIMIT.OPTIONS_CHAIN);
151
+ if (stale)
152
+ return stale.value;
133
153
  throw new Error(`Yahoo Finance options: HTTP ${res.status}`);
134
154
  }
135
155
  const data = await res.json();
@@ -1 +1 @@
1
- {"version":3,"file":"yahoo-finance.js","sourceRoot":"","sources":["../../src/providers/yahoo-finance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yahoo-finance.js","sourceRoot":"","sources":["../../src/providers/yahoo-finance.ts"],"names":[],"mappings":"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"}