opencandle 0.2.0 → 0.4.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 (401) hide show
  1. package/README.md +110 -87
  2. package/assets/logo.svg +187 -0
  3. package/dist/analysts/orchestrator.js +1 -2
  4. package/dist/analysts/orchestrator.js.map +1 -1
  5. package/dist/cli.d.ts +1 -1
  6. package/dist/cli.js +38 -2
  7. package/dist/cli.js.map +1 -1
  8. package/dist/config.d.ts +34 -5
  9. package/dist/config.js +29 -8
  10. package/dist/config.js.map +1 -1
  11. package/dist/infra/browser.d.ts +10 -0
  12. package/dist/infra/browser.js +1 -0
  13. package/dist/infra/browser.js.map +1 -1
  14. package/dist/infra/cache.d.ts +4 -0
  15. package/dist/infra/cache.js +4 -0
  16. package/dist/infra/cache.js.map +1 -1
  17. package/dist/infra/native-dependencies.d.ts +1 -0
  18. package/dist/infra/native-dependencies.js +10 -0
  19. package/dist/infra/native-dependencies.js.map +1 -0
  20. package/dist/infra/node-version.d.ts +2 -0
  21. package/dist/infra/node-version.js +23 -0
  22. package/dist/infra/node-version.js.map +1 -0
  23. package/dist/infra/rate-limiter.js +6 -0
  24. package/dist/infra/rate-limiter.js.map +1 -1
  25. package/dist/memory/index.d.ts +2 -0
  26. package/dist/memory/index.js +1 -0
  27. package/dist/memory/index.js.map +1 -1
  28. package/dist/memory/sqlite.js +42 -4
  29. package/dist/memory/sqlite.js.map +1 -1
  30. package/dist/memory/storage.d.ts +6 -0
  31. package/dist/memory/storage.js +3 -3
  32. package/dist/memory/storage.js.map +1 -1
  33. package/dist/memory/tool-defaults.d.ts +8 -0
  34. package/dist/memory/tool-defaults.js +59 -0
  35. package/dist/memory/tool-defaults.js.map +1 -0
  36. package/dist/onboarding/connect.d.ts +35 -0
  37. package/dist/onboarding/connect.js +118 -0
  38. package/dist/onboarding/connect.js.map +1 -0
  39. package/dist/onboarding/credential-interceptor.d.ts +44 -0
  40. package/dist/onboarding/credential-interceptor.js +72 -0
  41. package/dist/onboarding/credential-interceptor.js.map +1 -0
  42. package/dist/onboarding/degradation-accumulator.d.ts +21 -0
  43. package/dist/onboarding/degradation-accumulator.js +55 -0
  44. package/dist/onboarding/degradation-accumulator.js.map +1 -0
  45. package/dist/onboarding/prompt-user.d.ts +23 -0
  46. package/dist/onboarding/prompt-user.js +61 -0
  47. package/dist/onboarding/prompt-user.js.map +1 -0
  48. package/dist/onboarding/providers.d.ts +116 -0
  49. package/dist/onboarding/providers.js +239 -0
  50. package/dist/onboarding/providers.js.map +1 -0
  51. package/dist/onboarding/state.d.ts +31 -2
  52. package/dist/onboarding/state.js +141 -13
  53. package/dist/onboarding/state.js.map +1 -1
  54. package/dist/onboarding/tool-helpers.d.ts +34 -0
  55. package/dist/onboarding/tool-helpers.js +80 -0
  56. package/dist/onboarding/tool-helpers.js.map +1 -0
  57. package/dist/onboarding/tool-tags.d.ts +37 -0
  58. package/dist/onboarding/tool-tags.js +149 -0
  59. package/dist/onboarding/tool-tags.js.map +1 -0
  60. package/dist/onboarding/validation.d.ts +19 -0
  61. package/dist/onboarding/validation.js +117 -0
  62. package/dist/onboarding/validation.js.map +1 -0
  63. package/dist/pi/opencandle-extension.d.ts +7 -1
  64. package/dist/pi/opencandle-extension.js +488 -13
  65. package/dist/pi/opencandle-extension.js.map +1 -1
  66. package/dist/pi/session-storage.d.ts +2 -0
  67. package/dist/pi/session-storage.js +5 -0
  68. package/dist/pi/session-storage.js.map +1 -0
  69. package/dist/pi/session.d.ts +4 -1
  70. package/dist/pi/session.js +25 -3
  71. package/dist/pi/session.js.map +1 -1
  72. package/dist/pi/setup.d.ts +1 -2
  73. package/dist/pi/setup.js +67 -120
  74. package/dist/pi/setup.js.map +1 -1
  75. package/dist/pi/tool-adapter.d.ts +2 -2
  76. package/dist/pi/tool-adapter.js +14 -1
  77. package/dist/pi/tool-adapter.js.map +1 -1
  78. package/dist/prompts/context-builder.d.ts +22 -0
  79. package/dist/prompts/context-builder.js +47 -11
  80. package/dist/prompts/context-builder.js.map +1 -1
  81. package/dist/prompts/disclaimer.d.ts +6 -0
  82. package/dist/prompts/disclaimer.js +9 -0
  83. package/dist/prompts/disclaimer.js.map +1 -0
  84. package/dist/prompts/workflow-prompts.d.ts +8 -0
  85. package/dist/prompts/workflow-prompts.js +39 -5
  86. package/dist/prompts/workflow-prompts.js.map +1 -1
  87. package/dist/providers/alpha-vantage.js +20 -1
  88. package/dist/providers/alpha-vantage.js.map +1 -1
  89. package/dist/providers/exa-search.d.ts +39 -0
  90. package/dist/providers/exa-search.js +276 -0
  91. package/dist/providers/exa-search.js.map +1 -0
  92. package/dist/providers/finnhub.d.ts +17 -0
  93. package/dist/providers/finnhub.js +94 -0
  94. package/dist/providers/finnhub.js.map +1 -0
  95. package/dist/providers/fred.js +13 -1
  96. package/dist/providers/fred.js.map +1 -1
  97. package/dist/providers/index.d.ts +2 -0
  98. package/dist/providers/index.js +1 -0
  99. package/dist/providers/index.js.map +1 -1
  100. package/dist/providers/provider-credential-error.d.ts +8 -0
  101. package/dist/providers/provider-credential-error.js +22 -0
  102. package/dist/providers/provider-credential-error.js.map +1 -0
  103. package/dist/providers/reddit.d.ts +8 -0
  104. package/dist/providers/reddit.js +36 -9
  105. package/dist/providers/reddit.js.map +1 -1
  106. package/dist/providers/twitter.js +2 -8
  107. package/dist/providers/twitter.js.map +1 -1
  108. package/dist/providers/web-search.d.ts +17 -0
  109. package/dist/providers/web-search.js +224 -0
  110. package/dist/providers/web-search.js.map +1 -0
  111. package/dist/providers/wrap-provider.d.ts +7 -0
  112. package/dist/providers/wrap-provider.js +15 -0
  113. package/dist/providers/wrap-provider.js.map +1 -1
  114. package/dist/providers/yahoo-finance.js +70 -33
  115. package/dist/providers/yahoo-finance.js.map +1 -1
  116. package/dist/routing/classify-intent.js +22 -0
  117. package/dist/routing/classify-intent.js.map +1 -1
  118. package/dist/routing/defaults.js +1 -1
  119. package/dist/routing/defaults.js.map +1 -1
  120. package/dist/routing/index.d.ts +4 -0
  121. package/dist/routing/index.js +3 -0
  122. package/dist/routing/index.js.map +1 -1
  123. package/dist/routing/router-llm-client.d.ts +11 -0
  124. package/dist/routing/router-llm-client.js +42 -0
  125. package/dist/routing/router-llm-client.js.map +1 -0
  126. package/dist/routing/router-prompt.d.ts +2 -0
  127. package/dist/routing/router-prompt.js +138 -0
  128. package/dist/routing/router-prompt.js.map +1 -0
  129. package/dist/routing/router-types.d.ts +62 -0
  130. package/dist/routing/router-types.js +2 -0
  131. package/dist/routing/router-types.js.map +1 -0
  132. package/dist/routing/router.d.ts +10 -0
  133. package/dist/routing/router.js +194 -0
  134. package/dist/routing/router.js.map +1 -0
  135. package/dist/runtime/session-coordinator.d.ts +63 -4
  136. package/dist/runtime/session-coordinator.js +155 -4
  137. package/dist/runtime/session-coordinator.js.map +1 -1
  138. package/dist/runtime/tool-defaults-wrapper.d.ts +3 -0
  139. package/dist/runtime/tool-defaults-wrapper.js +25 -0
  140. package/dist/runtime/tool-defaults-wrapper.js.map +1 -0
  141. package/dist/sentiment/adapters/finnhub.d.ts +7 -0
  142. package/dist/sentiment/adapters/finnhub.js +39 -0
  143. package/dist/sentiment/adapters/finnhub.js.map +1 -0
  144. package/dist/sentiment/adapters/reddit.d.ts +11 -0
  145. package/dist/sentiment/adapters/reddit.js +54 -0
  146. package/dist/sentiment/adapters/reddit.js.map +1 -0
  147. package/dist/sentiment/adapters/twitter.d.ts +9 -0
  148. package/dist/sentiment/adapters/twitter.js +32 -0
  149. package/dist/sentiment/adapters/twitter.js.map +1 -0
  150. package/dist/sentiment/adapters/web.d.ts +9 -0
  151. package/dist/sentiment/adapters/web.js +40 -0
  152. package/dist/sentiment/adapters/web.js.map +1 -0
  153. package/dist/sentiment/index.d.ts +16 -0
  154. package/dist/sentiment/index.js +44 -0
  155. package/dist/sentiment/index.js.map +1 -0
  156. package/dist/sentiment/keywords.d.ts +2 -0
  157. package/dist/sentiment/keywords.js +9 -0
  158. package/dist/sentiment/keywords.js.map +1 -0
  159. package/dist/sentiment/pipeline.d.ts +9 -0
  160. package/dist/sentiment/pipeline.js +57 -0
  161. package/dist/sentiment/pipeline.js.map +1 -0
  162. package/dist/sentiment/scorer.d.ts +9 -0
  163. package/dist/sentiment/scorer.js +64 -0
  164. package/dist/sentiment/scorer.js.map +1 -0
  165. package/dist/sentiment/store.d.ts +24 -0
  166. package/dist/sentiment/store.js +182 -0
  167. package/dist/sentiment/store.js.map +1 -0
  168. package/dist/sentiment/trends.d.ts +13 -0
  169. package/dist/sentiment/trends.js +73 -0
  170. package/dist/sentiment/trends.js.map +1 -0
  171. package/dist/sentiment/types.d.ts +66 -0
  172. package/dist/sentiment/types.js +54 -0
  173. package/dist/sentiment/types.js.map +1 -0
  174. package/dist/system-prompt.js +29 -13
  175. package/dist/system-prompt.js.map +1 -1
  176. package/dist/tool-kit.d.ts +4 -4
  177. package/dist/tools/fundamentals/company-overview.d.ts +4 -2
  178. package/dist/tools/fundamentals/company-overview.js +27 -27
  179. package/dist/tools/fundamentals/company-overview.js.map +1 -1
  180. package/dist/tools/fundamentals/comps.d.ts +1 -1
  181. package/dist/tools/fundamentals/comps.js +45 -45
  182. package/dist/tools/fundamentals/comps.js.map +1 -1
  183. package/dist/tools/fundamentals/dcf.d.ts +1 -1
  184. package/dist/tools/fundamentals/dcf.js +82 -82
  185. package/dist/tools/fundamentals/dcf.js.map +1 -1
  186. package/dist/tools/fundamentals/earnings.d.ts +4 -2
  187. package/dist/tools/fundamentals/earnings.js +25 -25
  188. package/dist/tools/fundamentals/earnings.js.map +1 -1
  189. package/dist/tools/fundamentals/financials.d.ts +4 -2
  190. package/dist/tools/fundamentals/financials.js +23 -23
  191. package/dist/tools/fundamentals/financials.js.map +1 -1
  192. package/dist/tools/fundamentals/sec-filings.d.ts +1 -1
  193. package/dist/tools/index.d.ts +28 -1
  194. package/dist/tools/index.js +35 -2
  195. package/dist/tools/index.js.map +1 -1
  196. package/dist/tools/interaction/ask-user.d.ts +1 -1
  197. package/dist/tools/interaction/ask-user.js +28 -64
  198. package/dist/tools/interaction/ask-user.js.map +1 -1
  199. package/dist/tools/interaction/twitter-login.d.ts +1 -1
  200. package/dist/tools/macro/fear-greed.d.ts +1 -1
  201. package/dist/tools/macro/fred-data.d.ts +4 -2
  202. package/dist/tools/macro/fred-data.js +26 -26
  203. package/dist/tools/macro/fred-data.js.map +1 -1
  204. package/dist/tools/market/crypto-history.d.ts +1 -1
  205. package/dist/tools/market/crypto-price.d.ts +1 -1
  206. package/dist/tools/market/search-ticker.d.ts +1 -1
  207. package/dist/tools/market/stock-history.d.ts +1 -1
  208. package/dist/tools/market/stock-quote.d.ts +1 -1
  209. package/dist/tools/options/option-chain.d.ts +1 -1
  210. package/dist/tools/options/option-chain.js +4 -1
  211. package/dist/tools/options/option-chain.js.map +1 -1
  212. package/dist/tools/portfolio/correlation.d.ts +1 -1
  213. package/dist/tools/portfolio/predictions.d.ts +1 -1
  214. package/dist/tools/portfolio/risk-analysis.d.ts +1 -1
  215. package/dist/tools/portfolio/tracker.d.ts +1 -1
  216. package/dist/tools/portfolio/watchlist.d.ts +1 -1
  217. package/dist/tools/sentiment/reddit-sentiment.d.ts +4 -2
  218. package/dist/tools/sentiment/reddit-sentiment.js +107 -22
  219. package/dist/tools/sentiment/reddit-sentiment.js.map +1 -1
  220. package/dist/tools/sentiment/sentiment-summary.d.ts +7 -0
  221. package/dist/tools/sentiment/sentiment-summary.js +230 -0
  222. package/dist/tools/sentiment/sentiment-summary.js.map +1 -0
  223. package/dist/tools/sentiment/sentiment-trend.d.ts +22 -0
  224. package/dist/tools/sentiment/sentiment-trend.js +39 -0
  225. package/dist/tools/sentiment/sentiment-trend.js.map +1 -0
  226. package/dist/tools/sentiment/twitter-sentiment.d.ts +1 -1
  227. package/dist/tools/sentiment/twitter-sentiment.js +17 -0
  228. package/dist/tools/sentiment/twitter-sentiment.js.map +1 -1
  229. package/dist/tools/sentiment/web-search.d.ts +11 -0
  230. package/dist/tools/sentiment/web-search.js +115 -0
  231. package/dist/tools/sentiment/web-search.js.map +1 -0
  232. package/dist/tools/sentiment/web-sentiment.d.ts +8 -0
  233. package/dist/tools/sentiment/web-sentiment.js +66 -0
  234. package/dist/tools/sentiment/web-sentiment.js.map +1 -0
  235. package/dist/tools/technical/backtest.d.ts +1 -1
  236. package/dist/tools/technical/indicators.d.ts +1 -1
  237. package/dist/tools/technical/indicators.js +7 -1
  238. package/dist/tools/technical/indicators.js.map +1 -1
  239. package/dist/types/index.d.ts +1 -1
  240. package/dist/types/sentiment.d.ts +21 -0
  241. package/dist/workflows/options-screener.js +7 -2
  242. package/dist/workflows/options-screener.js.map +1 -1
  243. package/dist/workflows/portfolio-builder.js +3 -3
  244. package/dist/workflows/portfolio-builder.js.map +1 -1
  245. package/gui/server/background-quotes.ts +31 -0
  246. package/gui/server/chat-event-adapter.ts +142 -0
  247. package/gui/server/invoke-tool.ts +89 -0
  248. package/gui/server/live-chat-event-adapter.ts +181 -0
  249. package/gui/server/model-setup.ts +100 -0
  250. package/gui/server/package.json +5 -0
  251. package/gui/server/projector.ts +212 -0
  252. package/gui/server/server.ts +592 -0
  253. package/gui/server/session-actions.ts +31 -0
  254. package/gui/server/tool-metadata.ts +88 -0
  255. package/gui/server/websocket.ts +128 -0
  256. package/gui/server/writer-lock.ts +118 -0
  257. package/gui/shared/chat-events.ts +118 -0
  258. package/gui/shared/event-reducer.ts +186 -0
  259. package/gui/web/dist/assets/CatalogOverlay-D1ImSJTe.js +1 -0
  260. package/gui/web/dist/assets/index-DBrWq43L.css +1 -0
  261. package/gui/web/dist/assets/index-RflHaj0y.js +67 -0
  262. package/gui/web/dist/assets/logo-CWpt6Y2a.svg +187 -0
  263. package/gui/web/dist/index.html +17 -0
  264. package/package.json +62 -20
  265. package/src/analysts/contracts.ts +189 -0
  266. package/src/analysts/orchestrator.ts +300 -0
  267. package/src/cli.ts +205 -0
  268. package/src/config.ts +161 -0
  269. package/src/index.ts +5 -0
  270. package/src/infra/browser.ts +111 -0
  271. package/src/infra/cache.ts +103 -0
  272. package/src/infra/http-client.ts +68 -0
  273. package/src/infra/index.ts +18 -0
  274. package/src/infra/native-dependencies.ts +12 -0
  275. package/src/infra/node-version.ts +24 -0
  276. package/src/infra/open-url.ts +28 -0
  277. package/src/infra/opencandle-paths.ts +64 -0
  278. package/src/infra/rate-limiter.ts +64 -0
  279. package/src/memory/index.ts +10 -0
  280. package/src/memory/manager.ts +159 -0
  281. package/src/memory/preference-extractor.ts +106 -0
  282. package/src/memory/retrieval.ts +70 -0
  283. package/src/memory/sqlite.ts +172 -0
  284. package/src/memory/storage.ts +204 -0
  285. package/src/memory/tool-defaults.ts +87 -0
  286. package/src/memory/types.ts +67 -0
  287. package/src/onboarding/connect.ts +184 -0
  288. package/src/onboarding/credential-interceptor.ts +134 -0
  289. package/src/onboarding/degradation-accumulator.ts +79 -0
  290. package/src/onboarding/prompt-user.ts +85 -0
  291. package/src/onboarding/providers.ts +315 -0
  292. package/src/onboarding/state.ts +218 -0
  293. package/src/onboarding/tool-helpers.ts +111 -0
  294. package/src/onboarding/tool-tags.ts +201 -0
  295. package/src/onboarding/validation.ts +158 -0
  296. package/src/pi/opencandle-extension.ts +724 -0
  297. package/src/pi/session-storage.ts +5 -0
  298. package/src/pi/session.ts +81 -0
  299. package/src/pi/setup.ts +371 -0
  300. package/src/pi/tool-adapter.ts +36 -0
  301. package/src/prompts/context-builder.ts +204 -0
  302. package/src/prompts/disclaimer.ts +9 -0
  303. package/src/prompts/sections.ts +46 -0
  304. package/src/prompts/workflow-prompts.ts +279 -0
  305. package/src/providers/alpha-vantage.ts +292 -0
  306. package/src/providers/coingecko.ts +96 -0
  307. package/src/providers/exa-search.ts +373 -0
  308. package/src/providers/fear-greed.ts +45 -0
  309. package/src/providers/finnhub.ts +124 -0
  310. package/src/providers/fred.ts +83 -0
  311. package/src/providers/index.ts +9 -0
  312. package/src/providers/provider-credential-error.ts +23 -0
  313. package/src/providers/reddit.ts +151 -0
  314. package/src/providers/sec-edgar.ts +96 -0
  315. package/src/providers/twitter.ts +173 -0
  316. package/src/providers/web-search.ts +293 -0
  317. package/src/providers/with-fallback.ts +41 -0
  318. package/src/providers/wrap-provider.ts +64 -0
  319. package/src/providers/yahoo-finance.ts +367 -0
  320. package/src/routing/classify-intent.ts +194 -0
  321. package/src/routing/defaults.ts +29 -0
  322. package/src/routing/entity-extractor.ts +140 -0
  323. package/src/routing/index.ts +26 -0
  324. package/src/routing/router-llm-client.ts +51 -0
  325. package/src/routing/router-prompt.ts +159 -0
  326. package/src/routing/router-types.ts +66 -0
  327. package/src/routing/router.ts +213 -0
  328. package/src/routing/slot-resolver.ts +152 -0
  329. package/src/routing/types.ts +63 -0
  330. package/src/runtime/evidence.ts +77 -0
  331. package/src/runtime/index.ts +55 -0
  332. package/src/runtime/prompt-step.ts +75 -0
  333. package/src/runtime/provider-ids.ts +15 -0
  334. package/src/runtime/provider-tracker.ts +40 -0
  335. package/src/runtime/run-context.ts +22 -0
  336. package/src/runtime/session-coordinator.ts +406 -0
  337. package/src/runtime/tool-defaults-wrapper.ts +35 -0
  338. package/src/runtime/validation.ts +214 -0
  339. package/src/runtime/workflow-events.ts +75 -0
  340. package/src/runtime/workflow-runner.ts +188 -0
  341. package/src/runtime/workflow-types.ts +102 -0
  342. package/src/sentiment/adapters/finnhub.ts +44 -0
  343. package/src/sentiment/adapters/reddit.ts +65 -0
  344. package/src/sentiment/adapters/twitter.ts +36 -0
  345. package/src/sentiment/adapters/web.ts +44 -0
  346. package/src/sentiment/index.ts +58 -0
  347. package/src/sentiment/keywords.ts +9 -0
  348. package/src/sentiment/pipeline.ts +68 -0
  349. package/src/sentiment/scorer.ts +78 -0
  350. package/src/sentiment/store.ts +260 -0
  351. package/src/sentiment/trends.ts +90 -0
  352. package/src/sentiment/types.ts +108 -0
  353. package/src/system-prompt.ts +115 -0
  354. package/src/tool-kit.ts +68 -0
  355. package/src/tools/AGENTS.md +36 -0
  356. package/src/tools/fundamentals/company-overview.ts +54 -0
  357. package/src/tools/fundamentals/comps.ts +156 -0
  358. package/src/tools/fundamentals/dcf.ts +267 -0
  359. package/src/tools/fundamentals/earnings.ts +47 -0
  360. package/src/tools/fundamentals/financials.ts +54 -0
  361. package/src/tools/fundamentals/sec-filings.ts +61 -0
  362. package/src/tools/index.ts +88 -0
  363. package/src/tools/interaction/ask-user.ts +81 -0
  364. package/src/tools/interaction/twitter-login.ts +93 -0
  365. package/src/tools/macro/fear-greed.ts +41 -0
  366. package/src/tools/macro/fred-data.ts +54 -0
  367. package/src/tools/market/crypto-history.ts +51 -0
  368. package/src/tools/market/crypto-price.ts +53 -0
  369. package/src/tools/market/search-ticker.ts +53 -0
  370. package/src/tools/market/stock-history.ts +79 -0
  371. package/src/tools/market/stock-quote.ts +64 -0
  372. package/src/tools/options/greeks.ts +82 -0
  373. package/src/tools/options/option-chain.ts +91 -0
  374. package/src/tools/portfolio/correlation.ts +162 -0
  375. package/src/tools/portfolio/predictions.ts +253 -0
  376. package/src/tools/portfolio/risk-analysis.ts +134 -0
  377. package/src/tools/portfolio/tracker.ts +147 -0
  378. package/src/tools/portfolio/watchlist.ts +153 -0
  379. package/src/tools/sentiment/reddit-sentiment.ts +164 -0
  380. package/src/tools/sentiment/sentiment-summary.ts +256 -0
  381. package/src/tools/sentiment/sentiment-trend.ts +58 -0
  382. package/src/tools/sentiment/twitter-sentiment.ts +96 -0
  383. package/src/tools/sentiment/web-search.ts +150 -0
  384. package/src/tools/sentiment/web-sentiment.ts +76 -0
  385. package/src/tools/technical/backtest.ts +246 -0
  386. package/src/tools/technical/indicators.ts +258 -0
  387. package/src/types/fundamentals.ts +46 -0
  388. package/src/types/index.ts +20 -0
  389. package/src/types/macro.ts +27 -0
  390. package/src/types/market.ts +43 -0
  391. package/src/types/options.ts +35 -0
  392. package/src/types/portfolio.ts +41 -0
  393. package/src/types/sentiment.ts +70 -0
  394. package/src/workflows/compare-assets.ts +39 -0
  395. package/src/workflows/index.ts +4 -0
  396. package/src/workflows/options-screener.ts +49 -0
  397. package/src/workflows/portfolio-builder.ts +52 -0
  398. package/src/workflows/types.ts +4 -0
  399. package/dist/tools/sentiment/news-sentiment.d.ts +0 -7
  400. package/dist/tools/sentiment/news-sentiment.js +0 -55
  401. package/dist/tools/sentiment/news-sentiment.js.map +0 -1
@@ -0,0 +1,194 @@
1
+ import { extractEntities } from "./entity-extractor.js";
2
+ import { buildRouterPrompt } from "./router-prompt.js";
3
+ const VALID_ROUTES = ["workflow", "fallback"];
4
+ const VALID_WORKFLOWS = [
5
+ "portfolio_builder",
6
+ "options_screener",
7
+ "compare_assets",
8
+ "single_asset_analysis",
9
+ "watchlist_or_tracking",
10
+ "general_finance_qa",
11
+ ];
12
+ const VALID_SOURCES = new Set(["user", "preference", "default"]);
13
+ const VALID_CONFIDENCE = new Set(["high", "medium", "low"]);
14
+ /**
15
+ * Run the LLM router against the given input context. Retries once on
16
+ * validation failure with a corrective message. Falls back to a minimal
17
+ * `route: "fallback"` output on persistent failure.
18
+ *
19
+ * The LLM client is injected so unit tests can supply deterministic responses.
20
+ */
21
+ export async function route(input, client) {
22
+ const prompt = buildRouterPrompt(input);
23
+ let firstError;
24
+ try {
25
+ const raw = await client.complete(prompt);
26
+ return validateRouterOutput(raw);
27
+ }
28
+ catch (err) {
29
+ firstError = err instanceof Error ? err.message : String(err);
30
+ }
31
+ // Retry once with error feedback.
32
+ try {
33
+ const retryPrompt = `${prompt}\n\n(Your previous response failed validation: ${firstError}. Return a valid JSON object conforming to RouterOutput. Nothing else.)`;
34
+ const raw = await client.complete(retryPrompt);
35
+ return validateRouterOutput(raw);
36
+ }
37
+ catch {
38
+ // Persistent failure — return a minimal fallback with regex-extracted symbols.
39
+ return minimalFallback(input.text);
40
+ }
41
+ }
42
+ export function validateRouterOutput(raw) {
43
+ const parsed = parseJsonPayload(raw);
44
+ if (!parsed || typeof parsed !== "object") {
45
+ throw new Error("router output was not a JSON object");
46
+ }
47
+ const obj = parsed;
48
+ const route = obj.route;
49
+ if (typeof route !== "string" || !VALID_ROUTES.includes(route)) {
50
+ throw new Error(`invalid route: ${JSON.stringify(route)}`);
51
+ }
52
+ let workflow;
53
+ if (route === "workflow") {
54
+ if (typeof obj.workflow !== "string" || !VALID_WORKFLOWS.includes(obj.workflow)) {
55
+ throw new Error(`workflow route requires a valid workflow; got ${JSON.stringify(obj.workflow)}`);
56
+ }
57
+ workflow = obj.workflow;
58
+ }
59
+ const entities = validateEntities(obj.entities);
60
+ const slots = validateSlots(obj.slots);
61
+ const preference_updates = validatePreferenceUpdates(obj.preference_updates);
62
+ const missing_required = validateStringArray(obj.missing_required, "missing_required");
63
+ const reasoning = typeof obj.reasoning === "string" ? obj.reasoning : "";
64
+ return {
65
+ route: route,
66
+ workflow,
67
+ entities,
68
+ slots,
69
+ preference_updates,
70
+ missing_required,
71
+ reasoning,
72
+ };
73
+ }
74
+ function parseJsonPayload(raw) {
75
+ const trimmed = raw.trim();
76
+ // Tolerate ```json ... ``` fences even though the prompt forbids them.
77
+ const stripped = trimmed
78
+ .replace(/^```(?:json)?\s*/i, "")
79
+ .replace(/\s*```$/i, "")
80
+ .trim();
81
+ try {
82
+ return JSON.parse(stripped);
83
+ }
84
+ catch (err) {
85
+ const msg = err instanceof Error ? err.message : String(err);
86
+ throw new Error(`router output was not valid JSON: ${msg}`);
87
+ }
88
+ }
89
+ function validateEntities(raw) {
90
+ if (!raw || typeof raw !== "object") {
91
+ throw new Error("entities must be an object");
92
+ }
93
+ const e = raw;
94
+ const symbols = validateStringArray(e.symbols, "entities.symbols").map((s) => s.toUpperCase());
95
+ const out = { symbols };
96
+ if (typeof e.budget === "number")
97
+ out.budget = e.budget;
98
+ if (typeof e.maxPremium === "number")
99
+ out.maxPremium = e.maxPremium;
100
+ if (typeof e.timeHorizon === "string")
101
+ out.timeHorizon = e.timeHorizon;
102
+ if (typeof e.riskProfile === "string")
103
+ out.riskProfile = e.riskProfile;
104
+ if (e.direction === "bullish" || e.direction === "bearish")
105
+ out.direction = e.direction;
106
+ if (typeof e.dteHint === "string")
107
+ out.dteHint = e.dteHint;
108
+ return out;
109
+ }
110
+ function validateSlots(raw) {
111
+ if (raw === undefined || raw === null)
112
+ return {};
113
+ if (typeof raw !== "object") {
114
+ throw new Error("slots must be an object");
115
+ }
116
+ const out = {};
117
+ for (const [key, val] of Object.entries(raw)) {
118
+ if (!val || typeof val !== "object") {
119
+ throw new Error(`slot ${key} must be an object`);
120
+ }
121
+ const s = val;
122
+ if (!VALID_SOURCES.has(s.source)) {
123
+ throw new Error(`slot ${key} has invalid source: ${JSON.stringify(s.source)}`);
124
+ }
125
+ if (!VALID_CONFIDENCE.has(s.confidence)) {
126
+ throw new Error(`slot ${key} has invalid confidence: ${JSON.stringify(s.confidence)}`);
127
+ }
128
+ out[key] = {
129
+ value: s.value,
130
+ source: s.source,
131
+ confidence: s.confidence,
132
+ };
133
+ }
134
+ return out;
135
+ }
136
+ function validatePreferenceUpdates(raw) {
137
+ if (raw === undefined || raw === null)
138
+ return [];
139
+ if (!Array.isArray(raw)) {
140
+ throw new Error("preference_updates must be an array");
141
+ }
142
+ return raw.map((item, idx) => {
143
+ if (!item || typeof item !== "object") {
144
+ throw new Error(`preference_updates[${idx}] must be an object`);
145
+ }
146
+ const p = item;
147
+ if (typeof p.key !== "string" || p.key.length === 0) {
148
+ throw new Error(`preference_updates[${idx}].key must be a non-empty string`);
149
+ }
150
+ if (typeof p.value !== "string") {
151
+ throw new Error(`preference_updates[${idx}].value must be a string`);
152
+ }
153
+ if (!VALID_CONFIDENCE.has(p.confidence)) {
154
+ throw new Error(`preference_updates[${idx}].confidence is invalid`);
155
+ }
156
+ // Router-emitted preferences are always inferred — absent is accepted
157
+ // (normalized), but any explicit non-"inferred" value is an invariant
158
+ // violation the caller should see rather than silently lose.
159
+ if (p.source !== undefined && p.source !== "inferred") {
160
+ throw new Error(`preference_updates[${idx}].source must be "inferred" (got ${JSON.stringify(p.source)})`);
161
+ }
162
+ return {
163
+ key: p.key,
164
+ value: p.value,
165
+ confidence: p.confidence,
166
+ source: "inferred",
167
+ };
168
+ });
169
+ }
170
+ function validateStringArray(raw, field) {
171
+ if (raw === undefined || raw === null)
172
+ return [];
173
+ if (!Array.isArray(raw)) {
174
+ throw new Error(`${field} must be an array`);
175
+ }
176
+ return raw.map((item, idx) => {
177
+ if (typeof item !== "string") {
178
+ throw new Error(`${field}[${idx}] must be a string`);
179
+ }
180
+ return item;
181
+ });
182
+ }
183
+ function minimalFallback(text) {
184
+ const entities = extractEntities(text);
185
+ return {
186
+ route: "fallback",
187
+ entities: { symbols: entities.symbols },
188
+ slots: {},
189
+ preference_updates: [],
190
+ missing_required: [],
191
+ reasoning: "router validation failed; emitted minimal fallback",
192
+ };
193
+ }
194
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/routing/router.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,14 @@
1
- import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@mariozechner/pi-coding-agent";
1
+ import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@earendil-works/pi-coding-agent";
2
2
  import { MemoryStorage } from "../memory/index.js";
3
+ /**
4
+ * Alias for the session-manager handle extensions receive via
5
+ * `ExtensionContext`. `ReadonlySessionManager` is defined inside pi-coding-
6
+ * agent but is not re-exported from the package's `.` entry, so we derive
7
+ * the shape we need from the public `ExtensionContext` type.
8
+ */
9
+ type ReadonlySessionManager = ExtensionContext["sessionManager"];
3
10
  import { WorkflowRunner } from "./workflow-runner.js";
11
+ import { type FallbackContext } from "../prompts/context-builder.js";
4
12
  import type { WorkflowDefinition } from "./prompt-step.js";
5
13
  type QueueContext = ExtensionCommandContext | {
6
14
  isIdle(): boolean;
@@ -29,14 +37,65 @@ export declare class SessionCoordinator {
29
37
  /** Run setup flow. */
30
38
  runSetup(pi: ExtensionAPI, ctx: ExtensionContext | ExtensionCommandContext, options: {
31
39
  mode: "startup" | "manual";
32
- forceFinancePrompt?: boolean;
33
40
  }): Promise<"ready" | "shutdown" | "cancelled">;
34
41
  /** Extract and persist user preferences from natural language. */
35
42
  extractAndStorePreferences(text: string): void;
36
43
  /** Record a workflow run in storage. */
37
- recordWorkflowRun(workflowType: string, entities: object, resolved: object, defaultsUsed: unknown[]): void;
44
+ recordWorkflowRun(workflowType: string, entities: object, resolved: object, defaultsUsed: unknown[], turnType?: "workflow" | "fallback"): void;
45
+ /**
46
+ * Extract the last `max` user/assistant turns from the session branch as
47
+ * `{role, text}` pairs, oldest→newest. Walks `sessionManager.getBranch()`
48
+ * (root→leaf order) and filters per the intent-routing spec:
49
+ *
50
+ * - Keep only `type === "message"` entries whose `message.role` is
51
+ * `"user"` or `"assistant"`. Compaction, branch_summary, custom, label,
52
+ * thinking_level_change, model_change, and session_info entries are
53
+ * skipped. Tool-result messages (`role === "toolResult"`) are skipped.
54
+ * - Extract concatenated text-block content. User `content` may be a
55
+ * plain string; assistant `content` is always an array of blocks, from
56
+ * which only `type === "text"` blocks contribute.
57
+ * - Drop entries whose resulting text is empty or whitespace-only
58
+ * (handles aborted assistant turns and tool-only assistant turns).
59
+ * - Slice to the last `max` qualifying entries.
60
+ *
61
+ * Privacy note: conversational text in priorTurns is NOT filtered by
62
+ * `NEVER_TRUST_FROM_MEMORY` (which governs structured memory keys). A
63
+ * future `/forget` command is the designated scrubbing primitive — see
64
+ * `openspec/changes/router-context-and-observability/` for the follow-up.
65
+ */
66
+ buildPriorTurns(sessionManager: ReadonlySessionManager, max?: number): Array<{
67
+ role: "user" | "assistant";
68
+ text: string;
69
+ }>;
70
+ /**
71
+ * Expose prior turns + recent runs + profile snapshot for the router
72
+ * input context. Fixed-window per design.md §7 (last 5 turns, 3 runs).
73
+ * `priorTurns` is derived from the session branch at call time; see
74
+ * `buildPriorTurns` for the filter rules.
75
+ */
76
+ buildRouterContextBase(sessionManager: ReadonlySessionManager): {
77
+ profileSnapshot: Record<string, unknown>;
78
+ recentWorkflowRuns: Array<{
79
+ workflowType: string;
80
+ turnType: string;
81
+ resolvedSlots?: Record<string, unknown>;
82
+ createdAt: string;
83
+ }>;
84
+ priorTurns: Array<{
85
+ role: "user" | "assistant";
86
+ text: string;
87
+ }>;
88
+ };
38
89
  /** Build system prompt using composable sections. */
39
- buildSystemPrompt(basePrompt: string, workflowType?: string): string;
90
+ buildSystemPrompt(basePrompt: string, workflowType?: string, fallbackContext?: FallbackContext): string;
91
+ /**
92
+ * Stash a pending fallback context so the very next `before_agent_start`
93
+ * hook can slot it into the system prompt. Cleared after consumption so
94
+ * subsequent turns do not inherit stale fallback directives.
95
+ */
96
+ private pendingFallbackContext;
97
+ setPendingFallbackContext(ctx: FallbackContext | null): void;
98
+ consumePendingFallbackContext(): FallbackContext | null;
40
99
  /**
41
100
  * Execute a workflow definition through the WorkflowRunner,
42
101
  * sending prompts via Pi with settlement-based sequencing.
@@ -1,4 +1,4 @@
1
- import { initDefaultDatabase, MemoryStorage } from "../memory/index.js";
1
+ import { getAllDefaults, initDefaultDatabase, MemoryStorage } from "../memory/index.js";
2
2
  import { MemoryManager } from "../memory/manager.js";
3
3
  import { extractPreferences } from "../memory/preference-extractor.js";
4
4
  import { runOpenCandleSetup } from "../pi/setup.js";
@@ -11,6 +11,19 @@ import { getAddonToolDescriptions } from "../tool-kit.js";
11
11
  import { toStepDefinitions, promptStepOutput } from "./prompt-step.js";
12
12
  const PROMPT_SETTLE_POLL_MS = 25;
13
13
  const IMMEDIATE_IDLE_GRACE_MS = 100;
14
+ function parseMaybeJson(raw) {
15
+ if (typeof raw !== "string" || raw.length === 0)
16
+ return undefined;
17
+ try {
18
+ const parsed = JSON.parse(raw);
19
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed)
20
+ ? parsed
21
+ : undefined;
22
+ }
23
+ catch {
24
+ return undefined;
25
+ }
26
+ }
14
27
  function hasPendingMessages(ctx) {
15
28
  return ctx.hasPendingMessages?.() ?? false;
16
29
  }
@@ -92,17 +105,105 @@ export class SessionCoordinator {
92
105
  }
93
106
  }
94
107
  /** Record a workflow run in storage. */
95
- recordWorkflowRun(workflowType, entities, resolved, defaultsUsed) {
108
+ recordWorkflowRun(workflowType, entities, resolved, defaultsUsed, turnType = "workflow") {
96
109
  this.storage?.insertWorkflowRun({
97
110
  sessionId: this.sessionId,
98
111
  workflowType,
99
112
  inputSlotsJson: JSON.stringify(entities),
100
113
  resolvedSlotsJson: JSON.stringify(resolved),
101
114
  defaultsUsedJson: JSON.stringify(defaultsUsed),
115
+ turnType,
102
116
  });
103
117
  }
118
+ /**
119
+ * Extract the last `max` user/assistant turns from the session branch as
120
+ * `{role, text}` pairs, oldest→newest. Walks `sessionManager.getBranch()`
121
+ * (root→leaf order) and filters per the intent-routing spec:
122
+ *
123
+ * - Keep only `type === "message"` entries whose `message.role` is
124
+ * `"user"` or `"assistant"`. Compaction, branch_summary, custom, label,
125
+ * thinking_level_change, model_change, and session_info entries are
126
+ * skipped. Tool-result messages (`role === "toolResult"`) are skipped.
127
+ * - Extract concatenated text-block content. User `content` may be a
128
+ * plain string; assistant `content` is always an array of blocks, from
129
+ * which only `type === "text"` blocks contribute.
130
+ * - Drop entries whose resulting text is empty or whitespace-only
131
+ * (handles aborted assistant turns and tool-only assistant turns).
132
+ * - Slice to the last `max` qualifying entries.
133
+ *
134
+ * Privacy note: conversational text in priorTurns is NOT filtered by
135
+ * `NEVER_TRUST_FROM_MEMORY` (which governs structured memory keys). A
136
+ * future `/forget` command is the designated scrubbing primitive — see
137
+ * `openspec/changes/router-context-and-observability/` for the follow-up.
138
+ */
139
+ buildPriorTurns(sessionManager, max = 5) {
140
+ const branch = sessionManager.getBranch();
141
+ const turns = [];
142
+ for (const entry of branch) {
143
+ if (entry.type !== "message")
144
+ continue;
145
+ const msg = entry.message;
146
+ if (!msg || typeof msg !== "object")
147
+ continue;
148
+ const role = msg.role;
149
+ if (role !== "user" && role !== "assistant")
150
+ continue;
151
+ const rawContent = msg.content;
152
+ let text = "";
153
+ if (typeof rawContent === "string") {
154
+ text = rawContent;
155
+ }
156
+ else if (Array.isArray(rawContent)) {
157
+ for (const block of rawContent) {
158
+ if (block &&
159
+ typeof block === "object" &&
160
+ block.type === "text" &&
161
+ typeof block.text === "string") {
162
+ text += block.text;
163
+ }
164
+ }
165
+ }
166
+ if (text.trim().length === 0)
167
+ continue;
168
+ turns.push({ role, text });
169
+ }
170
+ return turns.slice(-max);
171
+ }
172
+ /**
173
+ * Expose prior turns + recent runs + profile snapshot for the router
174
+ * input context. Fixed-window per design.md §7 (last 5 turns, 3 runs).
175
+ * `priorTurns` is derived from the session branch at call time; see
176
+ * `buildPriorTurns` for the filter rules.
177
+ */
178
+ buildRouterContextBase(sessionManager) {
179
+ const priorTurns = this.buildPriorTurns(sessionManager);
180
+ if (!this.storage) {
181
+ return { profileSnapshot: {}, recentWorkflowRuns: [], priorTurns };
182
+ }
183
+ const prefs = this.storage.getPreferencesByNamespace("global");
184
+ const profileSnapshot = {};
185
+ for (const p of prefs) {
186
+ const key = String(p.key);
187
+ const rawValue = p.value_json;
188
+ if (typeof rawValue === "string") {
189
+ try {
190
+ profileSnapshot[key] = JSON.parse(rawValue);
191
+ }
192
+ catch {
193
+ profileSnapshot[key] = rawValue;
194
+ }
195
+ }
196
+ }
197
+ const runs = this.storage.getRecentWorkflowRuns(3).map((r) => ({
198
+ workflowType: String(r.workflow_type ?? ""),
199
+ turnType: String(r.turn_type ?? "workflow"),
200
+ resolvedSlots: parseMaybeJson(r.resolved_slots_json),
201
+ createdAt: String(r.created_at ?? ""),
202
+ }));
203
+ return { profileSnapshot, recentWorkflowRuns: runs, priorTurns };
204
+ }
104
205
  /** Build system prompt using composable sections. */
105
- buildSystemPrompt(basePrompt, workflowType) {
206
+ buildSystemPrompt(basePrompt, workflowType, fallbackContext) {
106
207
  const builder = new PromptContextBuilder();
107
208
  const addonTools = getAddonToolDescriptions();
108
209
  const addonDescriptions = addonTools.length > 0
@@ -115,8 +216,27 @@ export class SessionCoordinator {
115
216
  workflowType,
116
217
  memoryContext: memoryContext || undefined,
117
218
  addonToolDescriptions: addonDescriptions,
219
+ fallbackContext,
118
220
  });
119
- return `${basePrompt}\n\n${builder.build()}`;
221
+ const toolDefaults = formatToolDefaultsForPrompt();
222
+ const defaultsSection = toolDefaults.length > 0
223
+ ? `\n\n## User Tool Defaults\n${toolDefaults.join("\n")}`
224
+ : "";
225
+ return `${basePrompt}\n\n${builder.build()}${defaultsSection}`;
226
+ }
227
+ /**
228
+ * Stash a pending fallback context so the very next `before_agent_start`
229
+ * hook can slot it into the system prompt. Cleared after consumption so
230
+ * subsequent turns do not inherit stale fallback directives.
231
+ */
232
+ pendingFallbackContext = null;
233
+ setPendingFallbackContext(ctx) {
234
+ this.pendingFallbackContext = ctx;
235
+ }
236
+ consumePendingFallbackContext() {
237
+ const ctx = this.pendingFallbackContext;
238
+ this.pendingFallbackContext = null;
239
+ return ctx;
120
240
  }
121
241
  /**
122
242
  * Execute a workflow definition through the WorkflowRunner,
@@ -168,4 +288,35 @@ export class SessionCoordinator {
168
288
  this.runner?.cancel();
169
289
  }
170
290
  }
291
+ function formatToolDefaultsForPrompt() {
292
+ try {
293
+ return [...getAllDefaults()]
294
+ .filter(([, defaults]) => Object.keys(defaults).some((key) => key !== "__enabled"))
295
+ .map(([toolName, defaults]) => {
296
+ const pairs = flattenDefaults(defaults)
297
+ .filter(([key]) => key !== "__enabled")
298
+ .map(([key, value]) => `${key}: ${String(value)}`);
299
+ return `- User has set defaults for \`${toolName}\` (${pairs.join(", ")}). You may override when the user's request requires it.`;
300
+ });
301
+ }
302
+ catch {
303
+ return [];
304
+ }
305
+ }
306
+ function flattenDefaults(defaults, prefix = "") {
307
+ const out = [];
308
+ for (const [key, value] of Object.entries(defaults)) {
309
+ const path = prefix ? `${prefix}.${key}` : key;
310
+ if (isPlainObject(value)) {
311
+ out.push(...flattenDefaults(value, path));
312
+ }
313
+ else {
314
+ out.push([path, value]);
315
+ }
316
+ }
317
+ return out;
318
+ }
319
+ function isPlainObject(value) {
320
+ return typeof value === "object" && value !== null && !Array.isArray(value);
321
+ }
171
322
  //# sourceMappingURL=session-coordinator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-coordinator.js","sourceRoot":"","sources":["../../src/runtime/session-coordinator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-coordinator.js","sourceRoot":"","sources":["../../src/runtime/session-coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AgentTool } from "@earendil-works/pi-agent-core";
2
+ import type { TSchema } from "@sinclair/typebox";
3
+ export declare function wrapWithDefaults<TParams extends TSchema, TDetails>(tool: AgentTool<TParams, TDetails>, defaults: Record<string, unknown>): AgentTool<TParams, TDetails>;
@@ -0,0 +1,25 @@
1
+ export function wrapWithDefaults(tool, defaults) {
2
+ return {
3
+ ...tool,
4
+ execute: async (toolCallId, params, signal, onUpdate) => {
5
+ const merged = mergeDefaults(defaults, params);
6
+ return tool.execute(toolCallId, merged, signal, onUpdate);
7
+ },
8
+ };
9
+ }
10
+ function mergeDefaults(defaults, args) {
11
+ if (Object.keys(defaults).length === 0)
12
+ return args;
13
+ const out = { ...defaults };
14
+ for (const [key, value] of Object.entries(args)) {
15
+ const base = out[key];
16
+ out[key] = isPlainObject(base) && isPlainObject(value)
17
+ ? mergeDefaults(base, value)
18
+ : value;
19
+ }
20
+ return out;
21
+ }
22
+ function isPlainObject(value) {
23
+ return typeof value === "object" && value !== null && !Array.isArray(value);
24
+ }
25
+ //# sourceMappingURL=tool-defaults-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-defaults-wrapper.js","sourceRoot":"","sources":["../../src/runtime/tool-defaults-wrapper.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,gBAAgB,CAC9B,IAAkC,EAClC,QAAiC;IAEjC,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;YACtD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAiC,CAAC,CAAC;YAC1E,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAuB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7E,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,QAAiC,EACjC,IAA6B;IAE7B,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpD,MAAM,GAAG,GAA4B,EAAE,GAAG,QAAQ,EAAE,CAAC;IACrD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,GAAG,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC;YACpD,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC;YAC5B,CAAC,CAAC,KAAK,CAAC;IACZ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { SentinelRecord } from "../types.js";
2
+ import type { FinnhubArticle } from "../../providers/finnhub.js";
3
+ export declare class FinnhubAdapter {
4
+ readonly source: "finnhub";
5
+ mapToRecords(articles: FinnhubArticle[], query: string): SentinelRecord[];
6
+ }
7
+ export declare function extractTickersFromQuery(query: string): string[];
@@ -0,0 +1,39 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { extractEntities } from "../../routing/entity-extractor.js";
3
+ const MAX_TICKERS = 3;
4
+ export class FinnhubAdapter {
5
+ source = "finnhub";
6
+ mapToRecords(articles, query) {
7
+ const fetchedAt = new Date().toISOString();
8
+ return articles.map((article) => ({
9
+ id: randomUUID(),
10
+ source: this.source,
11
+ sourceId: String(article.id),
12
+ query,
13
+ title: article.headline,
14
+ text: article.summary,
15
+ author: article.source,
16
+ url: article.url,
17
+ publishedAt: new Date(article.datetime * 1000).toISOString(),
18
+ fetchedAt,
19
+ engagement: {
20
+ score: 0,
21
+ replies: null,
22
+ shares: null,
23
+ views: null,
24
+ },
25
+ sentiment: {
26
+ score: 0,
27
+ confidence: 0,
28
+ method: "keyword",
29
+ tickers: article.related ? article.related.split(",").map((t) => t.trim()).filter(Boolean) : [],
30
+ },
31
+ metadata: { category: article.category },
32
+ }));
33
+ }
34
+ }
35
+ export function extractTickersFromQuery(query) {
36
+ const entities = extractEntities(query);
37
+ return entities.symbols.slice(0, MAX_TICKERS);
38
+ }
39
+ //# sourceMappingURL=finnhub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finnhub.js","sourceRoot":"","sources":["../../../src/sentiment/adapters/finnhub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,MAAM,OAAO,cAAc;IAChB,MAAM,GAAG,SAAkB,CAAC;IAErC,YAAY,CAAC,QAA0B,EAAE,KAAa;QACpD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAChC,EAAE,EAAE,UAAU,EAAE;YAChB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,KAAK;YACL,KAAK,EAAE,OAAO,CAAC,QAAQ;YACvB,IAAI,EAAE,OAAO,CAAC,OAAO;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,WAAW,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;YAC5D,SAAS;YACT,UAAU,EAAE;gBACV,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,IAAI;aACZ;YACD,SAAS,EAAE;gBACT,KAAK,EAAE,CAAC;gBACR,UAAU,EAAE,CAAC;gBACb,MAAM,EAAE,SAAkB;gBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;aAChG;YACD,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE;SACzC,CAAC,CAAC,CAAC;IACN,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { SentinelRecord, SentimentAdapter } from "../types.js";
2
+ import type { RedditSentimentResult } from "../../types/sentiment.js";
3
+ import type { RedditComment } from "../../providers/reddit.js";
4
+ export declare class RedditAdapter implements SentimentAdapter {
5
+ readonly source: "reddit";
6
+ mapPostsToRecords(result: RedditSentimentResult, query: string): SentinelRecord[];
7
+ mapCommentsToRecords(comments: RedditComment[], parentId: string, subreddit: string, query: string): SentinelRecord[];
8
+ fetch(_query: string, _options?: {
9
+ hours?: number;
10
+ }): Promise<SentinelRecord[]>;
11
+ }