opencandle 0.1.0 → 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,6 +1,28 @@
1
+ export interface StaleResult<T> {
2
+ value: T;
3
+ stale: true;
4
+ cachedAt: number;
5
+ }
1
6
  export declare class Cache {
2
7
  private store;
8
+ private lastStaleHit;
9
+ private lastStaleCachedAt;
3
10
  get<T>(key: string): T | undefined;
11
+ /**
12
+ * Return an expired entry if it exists and is within the stale limit.
13
+ * Unlike get(), this does not require the entry to be within its TTL.
14
+ * Entries beyond the stale limit are deleted.
15
+ */
16
+ getStale<T>(key: string, staleLimitMs: number): StaleResult<T> | undefined;
17
+ /**
18
+ * Consume the stale flag set by the last getStale() hit.
19
+ * Returns { stale: true, cachedAt } if the last getStale() found data,
20
+ * then resets the flag. Used by wrapProvider to propagate stale metadata.
21
+ */
22
+ consumeStaleFlag(): {
23
+ stale: boolean;
24
+ cachedAt: number;
25
+ };
4
26
  set<T>(key: string, value: T, ttlMs: number): void;
5
27
  invalidate(pattern: string): void;
6
28
  clear(): void;
@@ -16,3 +38,11 @@ export declare const TTL: {
16
38
  readonly OPTIONS_CHAIN: 120000;
17
39
  readonly CRUMB: 900000;
18
40
  };
41
+ export declare const STALE_LIMIT: {
42
+ readonly QUOTE: number;
43
+ readonly HISTORY: number;
44
+ readonly FUNDAMENTALS: number;
45
+ readonly MACRO: number;
46
+ readonly SENTIMENT: 3600000;
47
+ readonly OPTIONS_CHAIN: number;
48
+ };
@@ -1,17 +1,45 @@
1
1
  export class Cache {
2
2
  store = new Map();
3
+ lastStaleHit = false;
4
+ lastStaleCachedAt = 0;
3
5
  get(key) {
4
6
  const entry = this.store.get(key);
5
7
  if (!entry)
6
8
  return undefined;
7
- if (Date.now() > entry.expiresAt) {
9
+ if (Date.now() > entry.expiresAt)
10
+ return undefined;
11
+ return entry.value;
12
+ }
13
+ /**
14
+ * Return an expired entry if it exists and is within the stale limit.
15
+ * Unlike get(), this does not require the entry to be within its TTL.
16
+ * Entries beyond the stale limit are deleted.
17
+ */
18
+ getStale(key, staleLimitMs) {
19
+ const entry = this.store.get(key);
20
+ if (!entry)
21
+ return undefined;
22
+ if (Date.now() > entry.cachedAt + staleLimitMs) {
8
23
  this.store.delete(key);
9
24
  return undefined;
10
25
  }
11
- return entry.value;
26
+ this.lastStaleHit = true;
27
+ this.lastStaleCachedAt = entry.cachedAt;
28
+ return { value: entry.value, stale: true, cachedAt: entry.cachedAt };
29
+ }
30
+ /**
31
+ * Consume the stale flag set by the last getStale() hit.
32
+ * Returns { stale: true, cachedAt } if the last getStale() found data,
33
+ * then resets the flag. Used by wrapProvider to propagate stale metadata.
34
+ */
35
+ consumeStaleFlag() {
36
+ const result = { stale: this.lastStaleHit, cachedAt: this.lastStaleCachedAt };
37
+ this.lastStaleHit = false;
38
+ this.lastStaleCachedAt = 0;
39
+ return result;
12
40
  }
13
41
  set(key, value, ttlMs) {
14
- this.store.set(key, { value, expiresAt: Date.now() + ttlMs });
42
+ this.store.set(key, { value, expiresAt: Date.now() + ttlMs, cachedAt: Date.now() });
15
43
  }
16
44
  invalidate(pattern) {
17
45
  for (const key of this.store.keys()) {
@@ -39,4 +67,13 @@ export const TTL = {
39
67
  OPTIONS_CHAIN: 120_000, // 2 minutes
40
68
  CRUMB: 900_000, // 15 minutes
41
69
  };
70
+ // Stale limits — how long past TTL expiry a cached value is still useful as fallback
71
+ export const STALE_LIMIT = {
72
+ QUOTE: 15 * 60_000, // 15 minutes
73
+ HISTORY: 24 * 3_600_000, // 24 hours
74
+ FUNDAMENTALS: 7 * 86_400_000, // 7 days
75
+ MACRO: 24 * 3_600_000, // 24 hours
76
+ SENTIMENT: 3_600_000, // 1 hour
77
+ OPTIONS_CHAIN: 30 * 60_000, // 30 minutes
78
+ };
42
79
  //# sourceMappingURL=cache.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/infra/cache.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,KAAK;IACR,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IAEvD,GAAG,CAAI,GAAW;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC,KAAU,CAAC;IAC1B,CAAC;IAED,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,KAAa;QACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF;AAED,wBAAwB;AACxB,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;AAEjC,eAAe;AACf,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,KAAK,EAAE,MAAM,EAAU,WAAW;IAClC,OAAO,EAAE,SAAS,EAAK,SAAS;IAChC,YAAY,EAAE,UAAU,EAAE,WAAW;IACrC,KAAK,EAAE,SAAS,EAAO,SAAS;IAChC,SAAS,EAAE,OAAO,EAAK,YAAY;IACnC,aAAa,EAAE,OAAO,EAAE,YAAY;IACpC,KAAK,EAAE,OAAO,EAAS,aAAa;CAC5B,CAAC"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/infra/cache.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,4 @@ export { Cache, cache, TTL } from "./cache.js";
2
2
  export { RateLimiter, rateLimiter } from "./rate-limiter.js";
3
3
  export { httpGet, HttpError, type HttpClientOptions } from "./http-client.js";
4
4
  export { StealthBrowser } from "./browser.js";
5
- export { getOpenCandleHomeDir, ensureOpenCandleHomeDir, resolveOpenCandlePath, ensureParentDir, getWatchlistPath, getPortfolioPath, getPredictionsPath, getConfigPath, getOnboardingPath, getStateDbPath, getLogsDir, } from "./opencandle-paths.js";
5
+ export { getOpenCandleHomeDir, ensureOpenCandleHomeDir, resolveOpenCandlePath, ensureParentDir, getWatchlistPath, getPortfolioPath, getPredictionsPath, getConfigPath, getOnboardingPath, getStateDbPath, getLogsDir, getBrowserProfileDir, } from "./opencandle-paths.js";
@@ -2,5 +2,5 @@ export { Cache, cache, TTL } from "./cache.js";
2
2
  export { RateLimiter, rateLimiter } from "./rate-limiter.js";
3
3
  export { httpGet, HttpError } from "./http-client.js";
4
4
  export { StealthBrowser } from "./browser.js";
5
- export { getOpenCandleHomeDir, ensureOpenCandleHomeDir, resolveOpenCandlePath, ensureParentDir, getWatchlistPath, getPortfolioPath, getPredictionsPath, getConfigPath, getOnboardingPath, getStateDbPath, getLogsDir, } from "./opencandle-paths.js";
5
+ export { getOpenCandleHomeDir, ensureOpenCandleHomeDir, resolveOpenCandlePath, ensureParentDir, getWatchlistPath, getPortfolioPath, getPredictionsPath, getConfigPath, getOnboardingPath, getStateDbPath, getLogsDir, getBrowserProfileDir, } from "./opencandle-paths.js";
6
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/infra/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,SAAS,EAA0B,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,UAAU,GACX,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/infra/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,SAAS,EAA0B,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,oBAAoB,GACrB,MAAM,uBAAuB,CAAC"}
@@ -9,3 +9,4 @@ export declare function getConfigPath(): string;
9
9
  export declare function getOnboardingPath(): string;
10
10
  export declare function getStateDbPath(): string;
11
11
  export declare function getLogsDir(): string;
12
+ export declare function getBrowserProfileDir(): string;
@@ -45,4 +45,7 @@ export function getStateDbPath() {
45
45
  export function getLogsDir() {
46
46
  return resolveOpenCandlePath("logs");
47
47
  }
48
+ export function getBrowserProfileDir() {
49
+ return resolveOpenCandlePath("browser-profile");
50
+ }
48
51
  //# sourceMappingURL=opencandle-paths.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencandle-paths.js","sourceRoot":"","sources":["../../src/infra/opencandle-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAE9C,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAClD,OAAO,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAG,QAAkB;IACzD,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,SAAS,CAAC,MAAM,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,qBAAqB,CAAC,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"opencandle-paths.js","sourceRoot":"","sources":["../../src/infra/opencandle-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAE9C,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAClD,OAAO,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAG,QAAkB;IACzD,OAAO,IAAI,CAAC,oBAAoB,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,SAAS,CAAC,MAAM,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,qBAAqB,CAAC,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;AAClD,CAAC"}
@@ -35,4 +35,5 @@ rateLimiter.configure("yahoo", 5, 5); // 5 req/s
35
35
  rateLimiter.configure("coingecko", 10, 0.167); // 10 req/min
36
36
  rateLimiter.configure("alphavantage", 5, 0.083); // 5 req/min (free tier)
37
37
  rateLimiter.configure("fred", 120, 2); // 120 req/min
38
+ rateLimiter.configure("twitter", 5, 0.167); // 5 req, ~10 req/min
38
39
  //# sourceMappingURL=rate-limiter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/infra/rate-limiter.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,WAAW;IACd,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,SAAS,CAAC,QAAgB,EAAE,SAAiB,EAAE,UAAkB;QAC/D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;YACzB,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,MAAM,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SAClC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,sBAAsB;QAE3C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEpB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,kCAAkC;QAClC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QACvE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,MAAc;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QACjD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACtB,MAAM,CAAC,MAAM,CAAC,SAAS,EACvB,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CACnD,CAAC;QACF,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;IAC1B,CAAC;CACF;AAED,+CAA+C;AAC/C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAC7C,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,UAAU;AAC1D,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAE,aAAa;AAC7D,WAAW,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,wBAAwB;AACzE,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAW,cAAc"}
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/infra/rate-limiter.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,WAAW;IACd,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,SAAS,CAAC,QAAgB,EAAE,SAAiB,EAAE,UAAkB;QAC/D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE;YACzB,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,MAAM,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;SAClC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,sBAAsB;QAE3C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEpB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,kCAAkC;QAClC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QACvE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IACrB,CAAC;IAEO,MAAM,CAAC,MAAc;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QACjD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACtB,MAAM,CAAC,MAAM,CAAC,SAAS,EACvB,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CACnD,CAAC;QACF,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC;IAC1B,CAAC;CACF;AAED,+CAA+C;AAC/C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAC7C,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAW,UAAU;AAC1D,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAE,aAAa;AAC7D,WAAW,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,wBAAwB;AACzE,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAW,cAAc;AAC/D,WAAW,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAM,qBAAqB"}
@@ -3,3 +3,6 @@ export { MemoryStorage } from "./storage.js";
3
3
  export type { WorkflowPreferences } from "./storage.js";
4
4
  export { buildMemoryContext } from "./retrieval.js";
5
5
  export { extractPreferences } from "./preference-extractor.js";
6
+ export { MemoryManager } from "./manager.js";
7
+ export type { MemoryCategory, MemoryEntry } from "./types.js";
8
+ export { isStale, STALENESS_THRESHOLDS, NEVER_TRUST_FROM_MEMORY } from "./types.js";
@@ -2,4 +2,6 @@ export { initDatabase, initDefaultDatabase, getTableNames, getSchemaVersion } fr
2
2
  export { MemoryStorage } from "./storage.js";
3
3
  export { buildMemoryContext } from "./retrieval.js";
4
4
  export { extractPreferences } from "./preference-extractor.js";
5
+ export { MemoryManager } from "./manager.js";
6
+ export { isStale, STALENESS_THRESHOLDS, NEVER_TRUST_FROM_MEMORY } from "./types.js";
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { MemoryStorage } from "./storage.js";
2
+ import type { MemoryEntry } from "./types.js";
3
+ /**
4
+ * Selective, typed memory retrieval with staleness rules
5
+ * and override suppression.
6
+ */
7
+ export declare class MemoryManager {
8
+ private readonly storage;
9
+ constructor(storage: MemoryStorage);
10
+ /**
11
+ * Retrieve memory entries relevant to the given workflow type,
12
+ * filtering by category, staleness, and overrides.
13
+ */
14
+ retrieve(workflowType: string, overriddenSlots?: string[], now?: Date): MemoryEntry[];
15
+ /**
16
+ * Build compact text context from retrieved memory entries.
17
+ */
18
+ buildContext(workflowType: string, overriddenSlots?: string[], now?: Date): string;
19
+ }
@@ -0,0 +1,132 @@
1
+ import { KEY_TO_CATEGORY, WORKFLOW_RELEVANT_CATEGORIES, NEVER_TRUST_FROM_MEMORY, isStale, } from "./types.js";
2
+ /** Slot name → preference key(s) mapping for suppression. */
3
+ const SLOT_TO_PREF_KEYS = {
4
+ riskProfile: ["risk_profile"],
5
+ assetScope: ["asset_scope"],
6
+ timeHorizon: ["time_horizon"],
7
+ dteTarget: ["dte_target"],
8
+ moneynessPreference: ["moneyness_preference"],
9
+ liquidityMinimum: ["liquidity_minimum", "options_liquidity"],
10
+ };
11
+ const MAX_WORKFLOW_HISTORY_PER_TYPE = 3;
12
+ const MAX_PREFERENCE_LINES = 15;
13
+ /**
14
+ * Selective, typed memory retrieval with staleness rules
15
+ * and override suppression.
16
+ */
17
+ export class MemoryManager {
18
+ storage;
19
+ constructor(storage) {
20
+ this.storage = storage;
21
+ }
22
+ /**
23
+ * Retrieve memory entries relevant to the given workflow type,
24
+ * filtering by category, staleness, and overrides.
25
+ */
26
+ retrieve(workflowType, overriddenSlots, now = new Date()) {
27
+ const relevantCategories = WORKFLOW_RELEVANT_CATEGORIES[workflowType] ??
28
+ WORKFLOW_RELEVANT_CATEGORIES["unclassified"];
29
+ // Build set of preference keys to suppress
30
+ const suppressedKeys = new Set();
31
+ if (overriddenSlots) {
32
+ for (const slot of overriddenSlots) {
33
+ const keys = SLOT_TO_PREF_KEYS[slot];
34
+ if (keys)
35
+ keys.forEach((k) => suppressedKeys.add(k));
36
+ }
37
+ }
38
+ const entries = [];
39
+ // Preferences as investor_profile entries
40
+ if (relevantCategories.includes("investor_profile")) {
41
+ const prefs = this.storage.getPreferencesByNamespace("global");
42
+ for (const pref of prefs) {
43
+ const key = String(pref.key);
44
+ if (suppressedKeys.has(key))
45
+ continue;
46
+ if (NEVER_TRUST_FROM_MEMORY.has(key))
47
+ continue;
48
+ const category = KEY_TO_CATEGORY[key] ?? "investor_profile";
49
+ if (!relevantCategories.includes(category))
50
+ continue;
51
+ const entry = {
52
+ key,
53
+ value: tryParseValue(String(pref.value_json ?? "")),
54
+ category,
55
+ recordedAt: String(pref.updated_at ?? pref.created_at ?? now.toISOString()),
56
+ confidence: pref.confidence != null ? String(pref.confidence) : undefined,
57
+ source: pref.source != null ? String(pref.source) : undefined,
58
+ };
59
+ if (!isStale(entry, now)) {
60
+ entries.push(entry);
61
+ }
62
+ }
63
+ }
64
+ // Workflow history
65
+ if (relevantCategories.includes("workflow_history")) {
66
+ const runs = this.storage.getRecentWorkflowRuns(MAX_WORKFLOW_HISTORY_PER_TYPE * 4);
67
+ const countsByType = new Map();
68
+ for (const run of runs) {
69
+ const wfType = String(run.workflow_type);
70
+ const count = countsByType.get(wfType) ?? 0;
71
+ if (count >= MAX_WORKFLOW_HISTORY_PER_TYPE)
72
+ continue;
73
+ countsByType.set(wfType, count + 1);
74
+ const recordedAt = String(run.created_at ?? now.toISOString());
75
+ const entry = {
76
+ key: `workflow_run_${run.id}`,
77
+ value: run.output_summary
78
+ ? `${wfType}: ${run.output_summary}`
79
+ : wfType,
80
+ category: "workflow_history",
81
+ recordedAt,
82
+ };
83
+ if (!isStale(entry, now)) {
84
+ entries.push(entry);
85
+ }
86
+ }
87
+ }
88
+ return entries.slice(0, MAX_PREFERENCE_LINES + MAX_WORKFLOW_HISTORY_PER_TYPE * 4);
89
+ }
90
+ /**
91
+ * Build compact text context from retrieved memory entries.
92
+ */
93
+ buildContext(workflowType, overriddenSlots, now = new Date()) {
94
+ const entries = this.retrieve(workflowType, overriddenSlots, now);
95
+ if (entries.length === 0)
96
+ return "";
97
+ const sections = [];
98
+ // Group by category
99
+ const byCategory = new Map();
100
+ for (const entry of entries) {
101
+ const list = byCategory.get(entry.category) ?? [];
102
+ list.push(entry);
103
+ byCategory.set(entry.category, list);
104
+ }
105
+ const profileEntries = byCategory.get("investor_profile");
106
+ if (profileEntries && profileEntries.length > 0) {
107
+ const lines = profileEntries.map((e) => `- ${e.key}: ${e.value}`);
108
+ sections.push("User Preferences:\n" + lines.join("\n"));
109
+ }
110
+ const historyEntries = byCategory.get("workflow_history");
111
+ if (historyEntries && historyEntries.length > 0) {
112
+ const lines = historyEntries.map((e) => `- ${e.value} (${e.recordedAt})`);
113
+ sections.push("Recent Workflows:\n" + lines.join("\n"));
114
+ }
115
+ const feedbackEntries = byCategory.get("interaction_feedback");
116
+ if (feedbackEntries && feedbackEntries.length > 0) {
117
+ const lines = feedbackEntries.map((e) => `- ${e.key}: ${e.value}`);
118
+ sections.push("Feedback:\n" + lines.join("\n"));
119
+ }
120
+ return sections.join("\n\n");
121
+ }
122
+ }
123
+ function tryParseValue(json) {
124
+ try {
125
+ const parsed = JSON.parse(json);
126
+ return typeof parsed === "string" ? parsed : JSON.stringify(parsed);
127
+ }
128
+ catch {
129
+ return json;
130
+ }
131
+ }
132
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/memory/manager.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { mkdirSync } from "node:fs";
2
2
  import { dirname } from "node:path";
3
3
  import Database from "better-sqlite3";
4
4
  import { getStateDbPath } from "../infra/opencandle-paths.js";
5
- const CURRENT_SCHEMA_VERSION = 1;
5
+ const CURRENT_SCHEMA_VERSION = 2;
6
6
  const CURRENT_SCHEMA = `
7
7
  CREATE TABLE IF NOT EXISTS schema_version (
8
8
  version INTEGER NOT NULL
@@ -40,6 +40,17 @@ const CURRENT_SCHEMA = `
40
40
  created_at TEXT NOT NULL,
41
41
  FOREIGN KEY (workflow_run_id) REFERENCES workflow_runs(id)
42
42
  );
43
+
44
+ CREATE TABLE IF NOT EXISTS workflow_events (
45
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
46
+ run_id TEXT NOT NULL,
47
+ step_index INTEGER NOT NULL,
48
+ event_type TEXT NOT NULL,
49
+ payload_json TEXT,
50
+ timestamp TEXT NOT NULL
51
+ );
52
+
53
+ CREATE INDEX IF NOT EXISTS idx_workflow_events_run_id ON workflow_events(run_id);
43
54
  `;
44
55
  export function initDatabase(path) {
45
56
  if (path !== ":memory:") {
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/memory/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCtB,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAExB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAqB;IAChD,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,cAAc,KAAK,sBAAsB,EAAE,CAAC;QAC9C,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAqB;IAC9C,MAAM,KAAK,GAAG,EAAE;SACb,OAAO,CAAC,iFAAiF,CAAC;SAC1F,GAAG,EAAkC,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAE3D,CAAC;IACd,OAAO,GAAG,EAAE,OAAO,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,SAAS,WAAW,CAAC,EAAqB;IACxC,EAAE,CAAC,IAAI,CAAC;;;;;GAKP,CAAC,CAAC;IACH,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxB,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,iEAAiE,CAAC;SAC1E,GAAG,EAA6B,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAqB;IACpD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAE3D,CAAC;IACd,OAAO,GAAG,EAAE,OAAO,IAAI,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/memory/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDtB,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAExB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAqB;IAChD,MAAM,cAAc,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,cAAc,KAAK,sBAAsB,EAAE,CAAC;QAC9C,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,iBAAiB,CAAC,EAAqB;IAC9C,MAAM,KAAK,GAAG,EAAE;SACb,OAAO,CAAC,iFAAiF,CAAC;SAC1F,GAAG,EAAkC,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAE3D,CAAC;IACd,OAAO,GAAG,EAAE,OAAO,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,SAAS,WAAW,CAAC,EAAqB;IACxC,EAAE,CAAC,IAAI,CAAC;;;;;GAKP,CAAC,CAAC;IACH,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxB,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,iEAAiE,CAAC;SAC1E,GAAG,EAA6B,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAqB;IACpD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,EAE3D,CAAC;IACd,OAAO,GAAG,EAAE,OAAO,IAAI,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,21 @@
1
+ /** Memory categories for typed, selective retrieval. */
2
+ export type MemoryCategory = "investor_profile" | "interaction_feedback" | "workflow_history" | "references";
3
+ /** A memory entry with category and freshness metadata. */
4
+ export interface MemoryEntry {
5
+ key: string;
6
+ value: string;
7
+ category: MemoryCategory;
8
+ recordedAt: string;
9
+ confidence?: string;
10
+ source?: string;
11
+ }
12
+ /** Staleness thresholds in milliseconds per category. */
13
+ export declare const STALENESS_THRESHOLDS: Record<MemoryCategory, number>;
14
+ /** Map preference keys to memory categories. */
15
+ export declare const KEY_TO_CATEGORY: Record<string, MemoryCategory>;
16
+ /** Categories relevant to each workflow type. */
17
+ export declare const WORKFLOW_RELEVANT_CATEGORIES: Record<string, MemoryCategory[]>;
18
+ /** Check whether a memory entry is stale. */
19
+ export declare function isStale(entry: MemoryEntry, now?: Date): boolean;
20
+ /** Keys whose values are market-sensitive and must never be trusted from memory. */
21
+ export declare const NEVER_TRUST_FROM_MEMORY: Set<string>;
@@ -0,0 +1,47 @@
1
+ /** Staleness thresholds in milliseconds per category. */
2
+ export const STALENESS_THRESHOLDS = {
3
+ investor_profile: 90 * 24 * 60 * 60 * 1000, // 90 days
4
+ interaction_feedback: 14 * 24 * 60 * 60 * 1000, // 14 days
5
+ workflow_history: 7 * 24 * 60 * 60 * 1000, // 7 days
6
+ references: 30 * 24 * 60 * 60 * 1000, // 30 days
7
+ };
8
+ /** Map preference keys to memory categories. */
9
+ export const KEY_TO_CATEGORY = {
10
+ risk_profile: "investor_profile",
11
+ time_horizon: "investor_profile",
12
+ asset_scope: "investor_profile",
13
+ position_count: "investor_profile",
14
+ max_single_position_pct: "investor_profile",
15
+ account_type: "investor_profile",
16
+ income_vs_growth: "investor_profile",
17
+ dte_target: "investor_profile",
18
+ objective: "investor_profile",
19
+ moneyness_preference: "investor_profile",
20
+ liquidity_minimum: "investor_profile",
21
+ };
22
+ /** Categories relevant to each workflow type. */
23
+ export const WORKFLOW_RELEVANT_CATEGORIES = {
24
+ portfolio_builder: ["investor_profile", "interaction_feedback", "workflow_history"],
25
+ options_screener: ["investor_profile", "interaction_feedback", "workflow_history"],
26
+ compare_assets: ["investor_profile", "workflow_history"],
27
+ comprehensive_analysis: ["investor_profile", "workflow_history"],
28
+ single_asset_analysis: ["investor_profile"],
29
+ general_finance_qa: ["investor_profile"],
30
+ unclassified: ["investor_profile"],
31
+ };
32
+ /** Check whether a memory entry is stale. */
33
+ export function isStale(entry, now = new Date()) {
34
+ const threshold = STALENESS_THRESHOLDS[entry.category];
35
+ const age = now.getTime() - new Date(entry.recordedAt).getTime();
36
+ return age > threshold;
37
+ }
38
+ /** Keys whose values are market-sensitive and must never be trusted from memory. */
39
+ export const NEVER_TRUST_FROM_MEMORY = new Set([
40
+ "stock_price",
41
+ "crypto_price",
42
+ "market_thesis",
43
+ "target_price",
44
+ "entry_price",
45
+ "stop_loss",
46
+ ]);
47
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAiBA,yDAAyD;AACzD,MAAM,CAAC,MAAM,oBAAoB,GAAmC;IAClE,gBAAgB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAK,UAAU;IACzD,oBAAoB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU;IAC1D,gBAAgB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAO,SAAS;IACzD,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAY,UAAU;CAC3D,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,eAAe,GAAmC;IAC7D,YAAY,EAAE,kBAAkB;IAChC,YAAY,EAAE,kBAAkB;IAChC,WAAW,EAAE,kBAAkB;IAC/B,cAAc,EAAE,kBAAkB;IAClC,uBAAuB,EAAE,kBAAkB;IAC3C,YAAY,EAAE,kBAAkB;IAChC,gBAAgB,EAAE,kBAAkB;IACpC,UAAU,EAAE,kBAAkB;IAC9B,SAAS,EAAE,kBAAkB;IAC7B,oBAAoB,EAAE,kBAAkB;IACxC,iBAAiB,EAAE,kBAAkB;CACtC,CAAC;AAEF,iDAAiD;AACjD,MAAM,CAAC,MAAM,4BAA4B,GAAqC;IAC5E,iBAAiB,EAAE,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,kBAAkB,CAAC;IACnF,gBAAgB,EAAE,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,kBAAkB,CAAC;IAClF,cAAc,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IACxD,sBAAsB,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAChE,qBAAqB,EAAE,CAAC,kBAAkB,CAAC;IAC3C,kBAAkB,EAAE,CAAC,kBAAkB,CAAC;IACxC,YAAY,EAAE,CAAC,kBAAkB,CAAC;CACnC,CAAC;AAEF,6CAA6C;AAC7C,MAAM,UAAU,OAAO,CAAC,KAAkB,EAAE,MAAY,IAAI,IAAI,EAAE;IAChE,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;IACjE,OAAO,GAAG,GAAG,SAAS,CAAC;AACzB,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IAC7C,aAAa;IACb,cAAc;IACd,eAAe;IACf,cAAc;IACd,aAAa;IACb,WAAW;CACZ,CAAC,CAAC"}
@@ -1,2 +1,6 @@
1
1
  import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
2
- export default function openCandleExtension(pi: ExtensionAPI): void;
2
+ import type { AskUserHandler } from "../types/index.js";
3
+ export interface OpenCandleExtensionOptions {
4
+ askUserHandler?: AskUserHandler;
5
+ }
6
+ export default function openCandleExtension(pi: ExtensionAPI, options?: OpenCandleExtensionOptions): void;