opencandle 0.11.0 → 0.12.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 (663) hide show
  1. package/README.md +25 -28
  2. package/dist/analysts/contracts.js +0 -1
  3. package/dist/analysts/orchestrator.d.ts +2 -0
  4. package/dist/analysts/orchestrator.js +19 -1
  5. package/dist/cli-main.js +13 -7
  6. package/dist/cli-options.d.ts +4 -0
  7. package/dist/cli-options.js +33 -0
  8. package/dist/cli.js +8 -3
  9. package/dist/config.js +0 -1
  10. package/dist/doctor/cli-command.js +2 -1
  11. package/dist/doctor/render.js +0 -1
  12. package/dist/doctor/report.js +41 -12
  13. package/dist/gui/server/ask-user-bridge.d.ts +19 -0
  14. package/dist/gui/server/ask-user-bridge.js +55 -0
  15. package/dist/gui/server/automation-heartbeat.d.ts +25 -0
  16. package/dist/gui/server/automation-heartbeat.js +61 -0
  17. package/dist/gui/server/background-quotes.d.ts +39 -0
  18. package/dist/gui/server/background-quotes.js +71 -0
  19. package/dist/gui/server/chat-event-adapter.d.ts +16 -0
  20. package/dist/gui/server/chat-event-adapter.js +263 -0
  21. package/dist/gui/server/gui-session-manager.d.ts +2 -0
  22. package/dist/gui/server/gui-session-manager.js +4 -0
  23. package/dist/gui/server/http-routes.d.ts +69 -0
  24. package/dist/gui/server/http-routes.js +1008 -0
  25. package/dist/gui/server/invoke-tool.d.ts +47 -0
  26. package/dist/gui/server/invoke-tool.js +373 -0
  27. package/dist/gui/server/live-chat-event-adapter.d.ts +19 -0
  28. package/dist/gui/server/live-chat-event-adapter.js +206 -0
  29. package/dist/gui/server/local-session-coordinator.d.ts +26 -0
  30. package/dist/gui/server/local-session-coordinator.js +53 -0
  31. package/dist/gui/server/market-state-api.d.ts +138 -0
  32. package/dist/gui/server/market-state-api.js +355 -0
  33. package/dist/gui/server/model-setup.d.ts +64 -0
  34. package/dist/gui/server/model-setup.js +150 -0
  35. package/dist/gui/server/private-api-access.d.ts +6 -0
  36. package/dist/gui/server/private-api-access.js +53 -0
  37. package/dist/gui/server/projector.d.ts +49 -0
  38. package/dist/gui/server/projector.js +296 -0
  39. package/dist/gui/server/prompt-observation.d.ts +8 -0
  40. package/dist/gui/server/prompt-observation.js +43 -0
  41. package/dist/gui/server/quote-snapshot-store.d.ts +14 -0
  42. package/dist/gui/server/quote-snapshot-store.js +49 -0
  43. package/dist/gui/server/server.d.ts +1 -0
  44. package/dist/gui/server/server.js +259 -0
  45. package/dist/gui/server/session-actions.d.ts +60 -0
  46. package/dist/gui/server/session-actions.js +218 -0
  47. package/dist/gui/server/session-entry-wait.d.ts +27 -0
  48. package/dist/gui/server/session-entry-wait.js +129 -0
  49. package/dist/gui/server/session-list.d.ts +2 -0
  50. package/dist/gui/server/session-list.js +11 -0
  51. package/dist/gui/server/shutdown.d.ts +10 -0
  52. package/dist/gui/server/shutdown.js +29 -0
  53. package/dist/gui/server/tool-invoke-ack.d.ts +17 -0
  54. package/dist/gui/server/tool-invoke-ack.js +26 -0
  55. package/dist/gui/server/tool-metadata.d.ts +93 -0
  56. package/dist/gui/server/tool-metadata.js +148 -0
  57. package/dist/gui/server/websocket.d.ts +9 -0
  58. package/dist/gui/server/websocket.js +124 -0
  59. package/dist/gui/server/writer-lock.d.ts +1 -0
  60. package/dist/gui/server/writer-lock.js +1 -0
  61. package/dist/gui/server/ws-hub.d.ts +50 -0
  62. package/dist/gui/server/ws-hub.js +284 -0
  63. package/dist/gui/shared/chat-events.d.ts +174 -0
  64. package/dist/gui/shared/chat-events.js +13 -0
  65. package/dist/gui/shared/event-reducer.d.ts +3 -0
  66. package/dist/gui/shared/event-reducer.js +187 -0
  67. package/dist/index.js +0 -1
  68. package/dist/infra/cache.d.ts +6 -0
  69. package/dist/infra/cache.js +16 -7
  70. package/dist/infra/freshness.d.ts +21 -0
  71. package/dist/infra/freshness.js +118 -0
  72. package/dist/infra/http-client.js +1 -2
  73. package/dist/infra/index.js +0 -1
  74. package/dist/infra/market-calendar.d.ts +14 -0
  75. package/dist/infra/market-calendar.js +136 -0
  76. package/dist/infra/native-dependencies.js +0 -1
  77. package/dist/infra/node-version.js +0 -1
  78. package/dist/infra/open-url.js +0 -1
  79. package/dist/infra/opencandle-paths.js +0 -1
  80. package/dist/infra/rate-limiter.js +1 -1
  81. package/dist/market-state/alert-conditions.js +0 -1
  82. package/dist/market-state/alert-runner.d.ts +1 -0
  83. package/dist/market-state/alert-runner.js +5 -4
  84. package/dist/market-state/daily-report.js +0 -1
  85. package/dist/market-state/local-automation-service.js +0 -1
  86. package/dist/market-state/notification-delivery.js +0 -1
  87. package/dist/market-state/resolve-for-mutation.js +0 -1
  88. package/dist/market-state/resolve.js +0 -1
  89. package/dist/market-state/service.d.ts +26 -21
  90. package/dist/market-state/service.js +175 -36
  91. package/dist/market-state/summaries.d.ts +8 -0
  92. package/dist/market-state/summaries.js +58 -0
  93. package/dist/memory/index.js +0 -1
  94. package/dist/memory/manager.js +0 -1
  95. package/dist/memory/preference-extractor.js +0 -1
  96. package/dist/memory/retrieval.js +0 -1
  97. package/dist/memory/sqlite.js +60 -11
  98. package/dist/memory/storage.js +0 -1
  99. package/dist/memory/tool-defaults.js +0 -1
  100. package/dist/memory/types.js +0 -1
  101. package/dist/monitor.js +0 -1
  102. package/dist/onboarding/connect.js +0 -1
  103. package/dist/onboarding/credential-interceptor.js +0 -1
  104. package/dist/onboarding/degradation-accumulator.js +0 -1
  105. package/dist/onboarding/prompt-user.d.ts +1 -1
  106. package/dist/onboarding/prompt-user.js +0 -1
  107. package/dist/onboarding/provider-status.js +0 -1
  108. package/dist/onboarding/providers.d.ts +25 -1
  109. package/dist/onboarding/providers.js +26 -1
  110. package/dist/onboarding/state.js +0 -1
  111. package/dist/onboarding/tool-helpers.js +0 -1
  112. package/dist/onboarding/tool-tags.js +0 -1
  113. package/dist/onboarding/validate-model-key.d.ts +17 -0
  114. package/dist/onboarding/validate-model-key.js +54 -0
  115. package/dist/onboarding/validation.js +0 -1
  116. package/dist/pi/opencandle-extension.js +46 -7
  117. package/dist/pi/session-action-dedupe.js +0 -1
  118. package/dist/pi/session-storage.js +0 -1
  119. package/dist/pi/session-writer-lock.js +0 -1
  120. package/dist/pi/session.js +0 -1
  121. package/dist/pi/setup.d.ts +2 -0
  122. package/dist/pi/setup.js +10 -3
  123. package/dist/pi/tool-adapter.js +0 -1
  124. package/dist/pi/tui-session-coordinator.js +0 -1
  125. package/dist/prompts/context-builder.js +1 -2
  126. package/dist/prompts/disclaimer.js +0 -1
  127. package/dist/prompts/policy-cards.js +0 -1
  128. package/dist/prompts/sections.js +0 -1
  129. package/dist/prompts/symbol-preflight.js +0 -1
  130. package/dist/prompts/workflow-prompts.js +0 -1
  131. package/dist/providers/alpha-vantage.js +8 -3
  132. package/dist/providers/coingecko.js +1 -1
  133. package/dist/providers/errors.js +0 -1
  134. package/dist/providers/exa-search.js +11 -10
  135. package/dist/providers/external-tool-command.js +0 -1
  136. package/dist/providers/external-tool-error.js +0 -1
  137. package/dist/providers/fear-greed.js +0 -1
  138. package/dist/providers/finnhub.js +0 -1
  139. package/dist/providers/fred.js +0 -1
  140. package/dist/providers/index.js +0 -1
  141. package/dist/providers/polymarket.d.ts +2 -0
  142. package/dist/providers/polymarket.js +162 -0
  143. package/dist/providers/provider-credential-error.js +0 -1
  144. package/dist/providers/reddit-cli.js +0 -1
  145. package/dist/providers/reddit.js +0 -1
  146. package/dist/providers/sec-edgar.js +0 -1
  147. package/dist/providers/tradingview.js +1 -2
  148. package/dist/providers/twitter-cli.js +0 -1
  149. package/dist/providers/twitter.js +0 -1
  150. package/dist/providers/web-search.js +15 -12
  151. package/dist/providers/with-fallback.js +0 -1
  152. package/dist/providers/wrap-provider.js +5 -4
  153. package/dist/providers/yahoo-finance.d.ts +3 -0
  154. package/dist/providers/yahoo-finance.js +272 -13
  155. package/dist/routing/classify-intent.js +0 -1
  156. package/dist/routing/defaults.js +0 -1
  157. package/dist/routing/entity-extractor.js +18 -3
  158. package/dist/routing/fund-symbols.js +0 -1
  159. package/dist/routing/horizon.js +0 -1
  160. package/dist/routing/index.js +0 -1
  161. package/dist/routing/legacy-rule-router.js +0 -1
  162. package/dist/routing/planning.js +0 -1
  163. package/dist/routing/route-manifest.js +1 -2
  164. package/dist/routing/router-llm-client.d.ts +2 -2
  165. package/dist/routing/router-llm-client.js +18 -4
  166. package/dist/routing/router-prompt.js +0 -1
  167. package/dist/routing/router-types.js +0 -1
  168. package/dist/routing/router.d.ts +1 -1
  169. package/dist/routing/router.js +274 -6
  170. package/dist/routing/slot-resolver.d.ts +1 -0
  171. package/dist/routing/slot-resolver.js +1 -2
  172. package/dist/routing/symbol-disambiguator.js +0 -1
  173. package/dist/routing/turn-context.js +0 -1
  174. package/dist/routing/types.js +0 -1
  175. package/dist/runtime/answer-contracts.js +0 -1
  176. package/dist/runtime/artifact-contracts.js +0 -1
  177. package/dist/runtime/evidence.d.ts +1 -0
  178. package/dist/runtime/evidence.js +0 -1
  179. package/dist/runtime/numeric-claims.d.ts +23 -0
  180. package/dist/runtime/numeric-claims.js +99 -0
  181. package/dist/runtime/planning-evidence.js +1 -77
  182. package/dist/runtime/prompt-step.d.ts +10 -1
  183. package/dist/runtime/prompt-step.js +116 -3
  184. package/dist/runtime/provider-tracker.js +0 -1
  185. package/dist/runtime/run-context.js +0 -1
  186. package/dist/runtime/session-coordinator.d.ts +11 -1
  187. package/dist/runtime/session-coordinator.js +352 -50
  188. package/dist/runtime/session-title.js +0 -1
  189. package/dist/runtime/tool-defaults-wrapper.js +0 -1
  190. package/dist/runtime/validation.d.ts +3 -1
  191. package/dist/runtime/validation.js +0 -1
  192. package/dist/runtime/workflow-events.d.ts +1 -1
  193. package/dist/runtime/workflow-events.js +0 -1
  194. package/dist/runtime/workflow-runner.d.ts +1 -0
  195. package/dist/runtime/workflow-runner.js +8 -3
  196. package/dist/runtime/workflow-types.d.ts +3 -0
  197. package/dist/runtime/workflow-types.js +0 -1
  198. package/dist/sentiment/adapters/finnhub.js +0 -1
  199. package/dist/sentiment/adapters/reddit.js +0 -1
  200. package/dist/sentiment/adapters/twitter.js +0 -1
  201. package/dist/sentiment/adapters/web.js +0 -1
  202. package/dist/sentiment/index.js +4 -2
  203. package/dist/sentiment/insights.js +0 -1
  204. package/dist/sentiment/keywords.js +0 -1
  205. package/dist/sentiment/pipeline.js +0 -1
  206. package/dist/sentiment/scorer.js +0 -1
  207. package/dist/sentiment/store.js +0 -1
  208. package/dist/sentiment/trends.js +0 -1
  209. package/dist/sentiment/types.js +0 -1
  210. package/dist/system-prompt.js +0 -1
  211. package/dist/tool-kit.js +0 -1
  212. package/dist/tools/fundamentals/company-overview.d.ts +1 -1
  213. package/dist/tools/fundamentals/company-overview.js +2 -1
  214. package/dist/tools/fundamentals/comps.d.ts +1 -0
  215. package/dist/tools/fundamentals/comps.js +25 -12
  216. package/dist/tools/fundamentals/dcf.js +183 -113
  217. package/dist/tools/fundamentals/earnings.d.ts +1 -1
  218. package/dist/tools/fundamentals/earnings.js +2 -1
  219. package/dist/tools/fundamentals/financials.js +2 -1
  220. package/dist/tools/fundamentals/sec-filings.js +0 -1
  221. package/dist/tools/index.d.ts +117 -2
  222. package/dist/tools/index.js +3 -1
  223. package/dist/tools/interaction/ask-user.js +11 -1
  224. package/dist/tools/macro/event-probabilities.d.ts +8 -0
  225. package/dist/tools/macro/event-probabilities.js +120 -0
  226. package/dist/tools/macro/fear-greed.d.ts +1 -1
  227. package/dist/tools/macro/fear-greed.js +0 -1
  228. package/dist/tools/macro/fred-data.d.ts +1 -1
  229. package/dist/tools/macro/fred-data.js +2 -1
  230. package/dist/tools/market/crypto-history.js +0 -1
  231. package/dist/tools/market/crypto-price.d.ts +4 -1
  232. package/dist/tools/market/crypto-price.js +10 -2
  233. package/dist/tools/market/screen-stocks.js +14 -4
  234. package/dist/tools/market/search-ticker.js +1 -2
  235. package/dist/tools/market/stock-history.js +0 -1
  236. package/dist/tools/market/stock-quote.d.ts +4 -1
  237. package/dist/tools/market/stock-quote.js +9 -5
  238. package/dist/tools/options/greeks.js +0 -1
  239. package/dist/tools/options/option-chain.d.ts +4 -1
  240. package/dist/tools/options/option-chain.js +12 -2
  241. package/dist/tools/portfolio/alerts.d.ts +2 -1
  242. package/dist/tools/portfolio/alerts.js +228 -2
  243. package/dist/tools/portfolio/correlation.js +23 -5
  244. package/dist/tools/portfolio/daily-report.js +0 -1
  245. package/dist/tools/portfolio/holdings-overlap.js +0 -1
  246. package/dist/tools/portfolio/notifications.js +0 -1
  247. package/dist/tools/portfolio/risk-analysis.d.ts +1 -1
  248. package/dist/tools/portfolio/risk-analysis.js +1 -2
  249. package/dist/tools/portfolio/tracker.d.ts +3 -1
  250. package/dist/tools/portfolio/tracker.js +57 -10
  251. package/dist/tools/portfolio/watchlist.d.ts +3 -6
  252. package/dist/tools/portfolio/watchlist.js +101 -110
  253. package/dist/tools/sentiment/insight-format.js +0 -1
  254. package/dist/tools/sentiment/query-match.js +0 -1
  255. package/dist/tools/sentiment/reddit-sentiment.js +0 -1
  256. package/dist/tools/sentiment/sentiment-summary.js +8 -4
  257. package/dist/tools/sentiment/sentiment-trend.d.ts +5 -1
  258. package/dist/tools/sentiment/sentiment-trend.js +6 -2
  259. package/dist/tools/sentiment/twitter-sentiment.js +0 -1
  260. package/dist/tools/sentiment/untrusted-text.js +0 -1
  261. package/dist/tools/sentiment/web-search.d.ts +1 -1
  262. package/dist/tools/sentiment/web-search.js +0 -1
  263. package/dist/tools/sentiment/web-sentiment.js +0 -1
  264. package/dist/tools/technical/backtest.js +0 -1
  265. package/dist/tools/technical/indicators.js +1 -2
  266. package/dist/types/fundamentals.d.ts +1 -0
  267. package/dist/types/fundamentals.js +0 -1
  268. package/dist/types/index.d.ts +1 -0
  269. package/dist/types/index.js +0 -1
  270. package/dist/types/macro.js +0 -1
  271. package/dist/types/market.d.ts +8 -0
  272. package/dist/types/market.js +0 -1
  273. package/dist/types/options.d.ts +1 -0
  274. package/dist/types/options.js +0 -1
  275. package/dist/types/portfolio.js +0 -1
  276. package/dist/types/prediction-markets.d.ts +13 -0
  277. package/dist/types/prediction-markets.js +1 -0
  278. package/dist/types/sentiment.js +0 -1
  279. package/dist/workflows/compare-assets.js +0 -1
  280. package/dist/workflows/index.js +0 -1
  281. package/dist/workflows/options-screener.js +0 -1
  282. package/dist/workflows/portfolio-builder.js +0 -1
  283. package/gui/web/dist/assets/CatalogOverlay-CAc7e3Pf.js +1 -0
  284. package/gui/web/dist/assets/index-BOEKd9wT.css +2 -0
  285. package/gui/web/dist/assets/index-C-H05cQ2.js +65 -0
  286. package/gui/web/dist/index.html +2 -2
  287. package/package.json +16 -22
  288. package/dist/analysts/contracts.js.map +0 -1
  289. package/dist/analysts/orchestrator.js.map +0 -1
  290. package/dist/cli-main.js.map +0 -1
  291. package/dist/cli.js.map +0 -1
  292. package/dist/config.js.map +0 -1
  293. package/dist/doctor/cli-command.js.map +0 -1
  294. package/dist/doctor/render.js.map +0 -1
  295. package/dist/doctor/report.js.map +0 -1
  296. package/dist/index.js.map +0 -1
  297. package/dist/infra/cache.js.map +0 -1
  298. package/dist/infra/http-client.js.map +0 -1
  299. package/dist/infra/index.js.map +0 -1
  300. package/dist/infra/native-dependencies.js.map +0 -1
  301. package/dist/infra/node-version.js.map +0 -1
  302. package/dist/infra/open-url.js.map +0 -1
  303. package/dist/infra/opencandle-paths.js.map +0 -1
  304. package/dist/infra/rate-limiter.js.map +0 -1
  305. package/dist/market-state/alert-conditions.js.map +0 -1
  306. package/dist/market-state/alert-runner.js.map +0 -1
  307. package/dist/market-state/daily-report.js.map +0 -1
  308. package/dist/market-state/local-automation-service.js.map +0 -1
  309. package/dist/market-state/notification-delivery.js.map +0 -1
  310. package/dist/market-state/resolve-for-mutation.js.map +0 -1
  311. package/dist/market-state/resolve.js.map +0 -1
  312. package/dist/market-state/service.js.map +0 -1
  313. package/dist/memory/index.js.map +0 -1
  314. package/dist/memory/manager.js.map +0 -1
  315. package/dist/memory/preference-extractor.js.map +0 -1
  316. package/dist/memory/retrieval.js.map +0 -1
  317. package/dist/memory/sqlite.js.map +0 -1
  318. package/dist/memory/storage.js.map +0 -1
  319. package/dist/memory/tool-defaults.js.map +0 -1
  320. package/dist/memory/types.js.map +0 -1
  321. package/dist/monitor.js.map +0 -1
  322. package/dist/onboarding/connect.js.map +0 -1
  323. package/dist/onboarding/credential-interceptor.js.map +0 -1
  324. package/dist/onboarding/degradation-accumulator.js.map +0 -1
  325. package/dist/onboarding/prompt-user.js.map +0 -1
  326. package/dist/onboarding/provider-status.js.map +0 -1
  327. package/dist/onboarding/providers.js.map +0 -1
  328. package/dist/onboarding/state.js.map +0 -1
  329. package/dist/onboarding/tool-helpers.js.map +0 -1
  330. package/dist/onboarding/tool-tags.js.map +0 -1
  331. package/dist/onboarding/validation.js.map +0 -1
  332. package/dist/pi/opencandle-extension.js.map +0 -1
  333. package/dist/pi/session-action-dedupe.js.map +0 -1
  334. package/dist/pi/session-storage.js.map +0 -1
  335. package/dist/pi/session-writer-lock.js.map +0 -1
  336. package/dist/pi/session.js.map +0 -1
  337. package/dist/pi/setup.js.map +0 -1
  338. package/dist/pi/tool-adapter.js.map +0 -1
  339. package/dist/pi/tui-session-coordinator.js.map +0 -1
  340. package/dist/prompts/context-builder.js.map +0 -1
  341. package/dist/prompts/disclaimer.js.map +0 -1
  342. package/dist/prompts/policy-cards.js.map +0 -1
  343. package/dist/prompts/sections.js.map +0 -1
  344. package/dist/prompts/symbol-preflight.js.map +0 -1
  345. package/dist/prompts/workflow-prompts.js.map +0 -1
  346. package/dist/providers/alpha-vantage.js.map +0 -1
  347. package/dist/providers/coingecko.js.map +0 -1
  348. package/dist/providers/errors.js.map +0 -1
  349. package/dist/providers/exa-search.js.map +0 -1
  350. package/dist/providers/external-tool-command.js.map +0 -1
  351. package/dist/providers/external-tool-error.js.map +0 -1
  352. package/dist/providers/fear-greed.js.map +0 -1
  353. package/dist/providers/finnhub.js.map +0 -1
  354. package/dist/providers/fred.js.map +0 -1
  355. package/dist/providers/index.js.map +0 -1
  356. package/dist/providers/provider-credential-error.js.map +0 -1
  357. package/dist/providers/reddit-cli.js.map +0 -1
  358. package/dist/providers/reddit.js.map +0 -1
  359. package/dist/providers/sec-edgar.js.map +0 -1
  360. package/dist/providers/tradingview.js.map +0 -1
  361. package/dist/providers/twitter-cli.js.map +0 -1
  362. package/dist/providers/twitter.js.map +0 -1
  363. package/dist/providers/web-search.js.map +0 -1
  364. package/dist/providers/with-fallback.js.map +0 -1
  365. package/dist/providers/wrap-provider.js.map +0 -1
  366. package/dist/providers/yahoo-finance.js.map +0 -1
  367. package/dist/routing/classify-intent.js.map +0 -1
  368. package/dist/routing/defaults.js.map +0 -1
  369. package/dist/routing/entity-extractor.js.map +0 -1
  370. package/dist/routing/fund-symbols.js.map +0 -1
  371. package/dist/routing/horizon.js.map +0 -1
  372. package/dist/routing/index.js.map +0 -1
  373. package/dist/routing/legacy-rule-router.js.map +0 -1
  374. package/dist/routing/planning.js.map +0 -1
  375. package/dist/routing/route-manifest.js.map +0 -1
  376. package/dist/routing/router-llm-client.js.map +0 -1
  377. package/dist/routing/router-prompt.js.map +0 -1
  378. package/dist/routing/router-types.js.map +0 -1
  379. package/dist/routing/router.js.map +0 -1
  380. package/dist/routing/slot-resolver.js.map +0 -1
  381. package/dist/routing/symbol-disambiguator.js.map +0 -1
  382. package/dist/routing/turn-context.js.map +0 -1
  383. package/dist/routing/types.js.map +0 -1
  384. package/dist/runtime/answer-contracts.js.map +0 -1
  385. package/dist/runtime/artifact-contracts.js.map +0 -1
  386. package/dist/runtime/evidence.js.map +0 -1
  387. package/dist/runtime/planning-evidence.js.map +0 -1
  388. package/dist/runtime/prompt-step.js.map +0 -1
  389. package/dist/runtime/provider-tracker.js.map +0 -1
  390. package/dist/runtime/run-context.js.map +0 -1
  391. package/dist/runtime/session-coordinator.js.map +0 -1
  392. package/dist/runtime/session-title.js.map +0 -1
  393. package/dist/runtime/tool-defaults-wrapper.js.map +0 -1
  394. package/dist/runtime/validation.js.map +0 -1
  395. package/dist/runtime/workflow-events.js.map +0 -1
  396. package/dist/runtime/workflow-runner.js.map +0 -1
  397. package/dist/runtime/workflow-types.js.map +0 -1
  398. package/dist/sentiment/adapters/finnhub.js.map +0 -1
  399. package/dist/sentiment/adapters/reddit.js.map +0 -1
  400. package/dist/sentiment/adapters/twitter.js.map +0 -1
  401. package/dist/sentiment/adapters/web.js.map +0 -1
  402. package/dist/sentiment/index.js.map +0 -1
  403. package/dist/sentiment/insights.js.map +0 -1
  404. package/dist/sentiment/keywords.js.map +0 -1
  405. package/dist/sentiment/pipeline.js.map +0 -1
  406. package/dist/sentiment/scorer.js.map +0 -1
  407. package/dist/sentiment/store.js.map +0 -1
  408. package/dist/sentiment/trends.js.map +0 -1
  409. package/dist/sentiment/types.js.map +0 -1
  410. package/dist/system-prompt.js.map +0 -1
  411. package/dist/tool-kit.js.map +0 -1
  412. package/dist/tools/fundamentals/company-overview.js.map +0 -1
  413. package/dist/tools/fundamentals/comps.js.map +0 -1
  414. package/dist/tools/fundamentals/dcf.js.map +0 -1
  415. package/dist/tools/fundamentals/earnings.js.map +0 -1
  416. package/dist/tools/fundamentals/financials.js.map +0 -1
  417. package/dist/tools/fundamentals/sec-filings.js.map +0 -1
  418. package/dist/tools/index.js.map +0 -1
  419. package/dist/tools/interaction/ask-user.js.map +0 -1
  420. package/dist/tools/macro/fear-greed.js.map +0 -1
  421. package/dist/tools/macro/fred-data.js.map +0 -1
  422. package/dist/tools/market/crypto-history.js.map +0 -1
  423. package/dist/tools/market/crypto-price.js.map +0 -1
  424. package/dist/tools/market/screen-stocks.js.map +0 -1
  425. package/dist/tools/market/search-ticker.js.map +0 -1
  426. package/dist/tools/market/stock-history.js.map +0 -1
  427. package/dist/tools/market/stock-quote.js.map +0 -1
  428. package/dist/tools/options/greeks.js.map +0 -1
  429. package/dist/tools/options/option-chain.js.map +0 -1
  430. package/dist/tools/portfolio/alerts.js.map +0 -1
  431. package/dist/tools/portfolio/correlation.js.map +0 -1
  432. package/dist/tools/portfolio/daily-report.js.map +0 -1
  433. package/dist/tools/portfolio/holdings-overlap.js.map +0 -1
  434. package/dist/tools/portfolio/notifications.js.map +0 -1
  435. package/dist/tools/portfolio/risk-analysis.js.map +0 -1
  436. package/dist/tools/portfolio/tracker.js.map +0 -1
  437. package/dist/tools/portfolio/watchlist.js.map +0 -1
  438. package/dist/tools/sentiment/insight-format.js.map +0 -1
  439. package/dist/tools/sentiment/query-match.js.map +0 -1
  440. package/dist/tools/sentiment/reddit-sentiment.js.map +0 -1
  441. package/dist/tools/sentiment/sentiment-summary.js.map +0 -1
  442. package/dist/tools/sentiment/sentiment-trend.js.map +0 -1
  443. package/dist/tools/sentiment/twitter-sentiment.js.map +0 -1
  444. package/dist/tools/sentiment/untrusted-text.js.map +0 -1
  445. package/dist/tools/sentiment/web-search.js.map +0 -1
  446. package/dist/tools/sentiment/web-sentiment.js.map +0 -1
  447. package/dist/tools/technical/backtest.js.map +0 -1
  448. package/dist/tools/technical/indicators.js.map +0 -1
  449. package/dist/types/fundamentals.js.map +0 -1
  450. package/dist/types/index.js.map +0 -1
  451. package/dist/types/macro.js.map +0 -1
  452. package/dist/types/market.js.map +0 -1
  453. package/dist/types/options.js.map +0 -1
  454. package/dist/types/portfolio.js.map +0 -1
  455. package/dist/types/sentiment.js.map +0 -1
  456. package/dist/workflows/compare-assets.js.map +0 -1
  457. package/dist/workflows/index.js.map +0 -1
  458. package/dist/workflows/options-screener.js.map +0 -1
  459. package/dist/workflows/portfolio-builder.js.map +0 -1
  460. package/gui/server/ask-user-bridge.ts +0 -89
  461. package/gui/server/automation-heartbeat.ts +0 -97
  462. package/gui/server/background-quotes.ts +0 -127
  463. package/gui/server/chat-event-adapter.ts +0 -210
  464. package/gui/server/chat-run-session.ts +0 -16
  465. package/gui/server/gui-session-manager.ts +0 -5
  466. package/gui/server/http-routes.ts +0 -953
  467. package/gui/server/invoke-tool.ts +0 -489
  468. package/gui/server/live-chat-event-adapter.ts +0 -208
  469. package/gui/server/local-session-coordinator.ts +0 -97
  470. package/gui/server/market-state-api.ts +0 -273
  471. package/gui/server/model-setup.ts +0 -254
  472. package/gui/server/package.json +0 -5
  473. package/gui/server/private-api-access.ts +0 -62
  474. package/gui/server/projector.ts +0 -263
  475. package/gui/server/prompt-observation.ts +0 -58
  476. package/gui/server/quote-snapshot-store.ts +0 -50
  477. package/gui/server/server.ts +0 -289
  478. package/gui/server/session-actions.ts +0 -331
  479. package/gui/server/session-entry-wait.ts +0 -160
  480. package/gui/server/shutdown.ts +0 -47
  481. package/gui/server/tool-invoke-ack.ts +0 -49
  482. package/gui/server/tool-metadata.ts +0 -167
  483. package/gui/server/websocket.ts +0 -138
  484. package/gui/server/writer-lock.ts +0 -1
  485. package/gui/server/ws-hub.ts +0 -391
  486. package/gui/shared/chat-events.ts +0 -156
  487. package/gui/shared/event-reducer.ts +0 -219
  488. package/gui/web/dist/assets/CatalogOverlay-ChRTKNlf.js +0 -1
  489. package/gui/web/dist/assets/index-BzyqyVnd.css +0 -2
  490. package/gui/web/dist/assets/index-DvMjkOP9.js +0 -65
  491. package/src/analysts/contracts.ts +0 -176
  492. package/src/analysts/orchestrator.ts +0 -224
  493. package/src/cli-main.ts +0 -510
  494. package/src/cli.ts +0 -17
  495. package/src/config.ts +0 -272
  496. package/src/doctor/cli-command.ts +0 -83
  497. package/src/doctor/render.ts +0 -37
  498. package/src/doctor/report.ts +0 -638
  499. package/src/index.ts +0 -5
  500. package/src/infra/cache.ts +0 -114
  501. package/src/infra/http-client.ts +0 -134
  502. package/src/infra/index.ts +0 -14
  503. package/src/infra/native-dependencies.ts +0 -84
  504. package/src/infra/node-version.ts +0 -23
  505. package/src/infra/open-url.ts +0 -28
  506. package/src/infra/opencandle-paths.ts +0 -53
  507. package/src/infra/rate-limiter.ts +0 -76
  508. package/src/market-state/alert-conditions.ts +0 -82
  509. package/src/market-state/alert-runner.ts +0 -863
  510. package/src/market-state/daily-report.ts +0 -237
  511. package/src/market-state/local-automation-service.ts +0 -162
  512. package/src/market-state/notification-delivery.ts +0 -158
  513. package/src/market-state/resolve-for-mutation.ts +0 -24
  514. package/src/market-state/resolve.ts +0 -112
  515. package/src/market-state/service.ts +0 -2208
  516. package/src/memory/index.ts +0 -10
  517. package/src/memory/manager.ts +0 -190
  518. package/src/memory/preference-extractor.ts +0 -106
  519. package/src/memory/retrieval.ts +0 -71
  520. package/src/memory/sqlite.ts +0 -577
  521. package/src/memory/storage.ts +0 -195
  522. package/src/memory/tool-defaults.ts +0 -108
  523. package/src/memory/types.ts +0 -71
  524. package/src/monitor.ts +0 -123
  525. package/src/onboarding/connect.ts +0 -177
  526. package/src/onboarding/credential-interceptor.ts +0 -122
  527. package/src/onboarding/degradation-accumulator.ts +0 -77
  528. package/src/onboarding/prompt-user.ts +0 -85
  529. package/src/onboarding/provider-status.ts +0 -382
  530. package/src/onboarding/providers.ts +0 -414
  531. package/src/onboarding/state.ts +0 -216
  532. package/src/onboarding/tool-helpers.ts +0 -104
  533. package/src/onboarding/tool-tags.ts +0 -244
  534. package/src/onboarding/validation.ts +0 -152
  535. package/src/pi/opencandle-extension.ts +0 -1244
  536. package/src/pi/session-action-dedupe.ts +0 -155
  537. package/src/pi/session-storage.ts +0 -5
  538. package/src/pi/session-writer-lock.ts +0 -426
  539. package/src/pi/session.ts +0 -84
  540. package/src/pi/setup.ts +0 -399
  541. package/src/pi/tool-adapter.ts +0 -49
  542. package/src/pi/tui-session-coordinator.ts +0 -351
  543. package/src/prompts/context-builder.ts +0 -326
  544. package/src/prompts/disclaimer.ts +0 -9
  545. package/src/prompts/policy-cards.ts +0 -228
  546. package/src/prompts/sections.ts +0 -46
  547. package/src/prompts/symbol-preflight.ts +0 -80
  548. package/src/prompts/workflow-prompts.ts +0 -504
  549. package/src/providers/alpha-vantage.ts +0 -334
  550. package/src/providers/coingecko.ts +0 -93
  551. package/src/providers/errors.ts +0 -9
  552. package/src/providers/exa-search.ts +0 -375
  553. package/src/providers/external-tool-command.ts +0 -164
  554. package/src/providers/external-tool-error.ts +0 -20
  555. package/src/providers/fear-greed.ts +0 -45
  556. package/src/providers/finnhub.ts +0 -125
  557. package/src/providers/fred.ts +0 -83
  558. package/src/providers/index.ts +0 -17
  559. package/src/providers/provider-credential-error.ts +0 -23
  560. package/src/providers/reddit-cli.ts +0 -286
  561. package/src/providers/reddit.ts +0 -106
  562. package/src/providers/sec-edgar.ts +0 -326
  563. package/src/providers/tradingview.ts +0 -399
  564. package/src/providers/twitter-cli.ts +0 -202
  565. package/src/providers/twitter.ts +0 -102
  566. package/src/providers/web-search.ts +0 -303
  567. package/src/providers/with-fallback.ts +0 -42
  568. package/src/providers/wrap-provider.ts +0 -103
  569. package/src/providers/yahoo-finance.ts +0 -672
  570. package/src/routing/classify-intent.ts +0 -380
  571. package/src/routing/defaults.ts +0 -29
  572. package/src/routing/entity-extractor.ts +0 -540
  573. package/src/routing/fund-symbols.ts +0 -58
  574. package/src/routing/horizon.ts +0 -7
  575. package/src/routing/index.ts +0 -70
  576. package/src/routing/legacy-rule-router.ts +0 -13
  577. package/src/routing/planning.ts +0 -829
  578. package/src/routing/route-manifest.ts +0 -308
  579. package/src/routing/router-llm-client.ts +0 -52
  580. package/src/routing/router-prompt.ts +0 -159
  581. package/src/routing/router-types.ts +0 -84
  582. package/src/routing/router.ts +0 -997
  583. package/src/routing/slot-resolver.ts +0 -213
  584. package/src/routing/symbol-disambiguator.ts +0 -72
  585. package/src/routing/turn-context.ts +0 -108
  586. package/src/routing/types.ts +0 -77
  587. package/src/runtime/answer-contracts.ts +0 -693
  588. package/src/runtime/artifact-contracts.ts +0 -77
  589. package/src/runtime/evidence.ts +0 -77
  590. package/src/runtime/planning-evidence.ts +0 -682
  591. package/src/runtime/prompt-step.ts +0 -60
  592. package/src/runtime/provider-tracker.ts +0 -40
  593. package/src/runtime/run-context.ts +0 -32
  594. package/src/runtime/session-coordinator.ts +0 -632
  595. package/src/runtime/session-title.ts +0 -60
  596. package/src/runtime/tool-defaults-wrapper.ts +0 -43
  597. package/src/runtime/validation.ts +0 -211
  598. package/src/runtime/workflow-events.ts +0 -75
  599. package/src/runtime/workflow-runner.ts +0 -182
  600. package/src/runtime/workflow-types.ts +0 -102
  601. package/src/sentiment/adapters/finnhub.ts +0 -49
  602. package/src/sentiment/adapters/reddit.ts +0 -65
  603. package/src/sentiment/adapters/twitter.ts +0 -36
  604. package/src/sentiment/adapters/web.ts +0 -44
  605. package/src/sentiment/index.ts +0 -49
  606. package/src/sentiment/insights.ts +0 -269
  607. package/src/sentiment/keywords.ts +0 -31
  608. package/src/sentiment/pipeline.ts +0 -91
  609. package/src/sentiment/scorer.ts +0 -89
  610. package/src/sentiment/store.ts +0 -260
  611. package/src/sentiment/trends.ts +0 -96
  612. package/src/sentiment/types.ts +0 -112
  613. package/src/system-prompt.ts +0 -115
  614. package/src/tool-kit.ts +0 -69
  615. package/src/tools/AGENTS.md +0 -36
  616. package/src/tools/fundamentals/company-overview.ts +0 -64
  617. package/src/tools/fundamentals/comps.ts +0 -169
  618. package/src/tools/fundamentals/dcf.ts +0 -367
  619. package/src/tools/fundamentals/earnings.ts +0 -57
  620. package/src/tools/fundamentals/financials.ts +0 -63
  621. package/src/tools/fundamentals/sec-filings.ts +0 -105
  622. package/src/tools/index.ts +0 -101
  623. package/src/tools/interaction/ask-user.ts +0 -93
  624. package/src/tools/macro/fear-greed.ts +0 -41
  625. package/src/tools/macro/fred-data.ts +0 -92
  626. package/src/tools/market/crypto-history.ts +0 -72
  627. package/src/tools/market/crypto-price.ts +0 -53
  628. package/src/tools/market/screen-stocks.ts +0 -279
  629. package/src/tools/market/search-ticker.ts +0 -254
  630. package/src/tools/market/stock-history.ts +0 -104
  631. package/src/tools/market/stock-quote.ts +0 -67
  632. package/src/tools/options/greeks.ts +0 -81
  633. package/src/tools/options/option-chain.ts +0 -120
  634. package/src/tools/portfolio/alerts.ts +0 -457
  635. package/src/tools/portfolio/correlation.ts +0 -189
  636. package/src/tools/portfolio/daily-report.ts +0 -107
  637. package/src/tools/portfolio/holdings-overlap.ts +0 -139
  638. package/src/tools/portfolio/notifications.ts +0 -45
  639. package/src/tools/portfolio/risk-analysis.ts +0 -173
  640. package/src/tools/portfolio/tracker.ts +0 -308
  641. package/src/tools/portfolio/watchlist.ts +0 -288
  642. package/src/tools/sentiment/insight-format.ts +0 -50
  643. package/src/tools/sentiment/query-match.ts +0 -117
  644. package/src/tools/sentiment/reddit-sentiment.ts +0 -403
  645. package/src/tools/sentiment/sentiment-summary.ts +0 -383
  646. package/src/tools/sentiment/sentiment-trend.ts +0 -75
  647. package/src/tools/sentiment/twitter-sentiment.ts +0 -287
  648. package/src/tools/sentiment/untrusted-text.ts +0 -21
  649. package/src/tools/sentiment/web-search.ts +0 -186
  650. package/src/tools/sentiment/web-sentiment.ts +0 -96
  651. package/src/tools/technical/backtest.ts +0 -336
  652. package/src/tools/technical/indicators.ts +0 -281
  653. package/src/types/fundamentals.ts +0 -46
  654. package/src/types/index.ts +0 -25
  655. package/src/types/macro.ts +0 -27
  656. package/src/types/market.ts +0 -44
  657. package/src/types/options.ts +0 -52
  658. package/src/types/portfolio.ts +0 -83
  659. package/src/types/sentiment.ts +0 -129
  660. package/src/workflows/compare-assets.ts +0 -89
  661. package/src/workflows/index.ts +0 -3
  662. package/src/workflows/options-screener.ts +0 -125
  663. package/src/workflows/portfolio-builder.ts +0 -63
@@ -1,176 +0,0 @@
1
- import type { EvidenceRecord } from "../runtime/evidence.js";
2
- import type {
3
- AnalystOutput,
4
- AnalystSignal,
5
- DebateOutput,
6
- DebateSide,
7
- } from "../runtime/workflow-types.js";
8
-
9
- /** All analyst roles. */
10
- export type AnalystRole = "valuation" | "momentum" | "options" | "contrarian" | "risk";
11
-
12
- /**
13
- * Parse an LLM response into a structured AnalystOutput.
14
- * Falls back to raw text if parsing fails.
15
- */
16
- export function parseAnalystOutput(role: string, responseText: string): AnalystOutput {
17
- const signal = extractSignal(responseText);
18
- const conviction = extractConviction(responseText);
19
- const thesis = extractThesis(responseText);
20
-
21
- return {
22
- role,
23
- signal: signal ?? "HOLD",
24
- conviction: conviction ?? 5,
25
- thesis: thesis ?? "",
26
- evidence: [],
27
- rawText: responseText,
28
- };
29
- }
30
-
31
- function extractSignal(text: string): AnalystSignal | null {
32
- const match = text.match(/SIGNAL:\s*(BUY|HOLD|SELL)/i);
33
- if (match) return match[1].toUpperCase() as AnalystSignal;
34
- return null;
35
- }
36
-
37
- function extractConviction(text: string): number | null {
38
- const match = text.match(/CONVICTION:\s*(\d+)/i);
39
- if (match) {
40
- const value = parseInt(match[1], 10);
41
- if (value >= 1 && value <= 10) return value;
42
- }
43
- return null;
44
- }
45
-
46
- function extractThesis(text: string): string | null {
47
- const match = text.match(/THESIS:\s*(.+)/i);
48
- return match ? match[1].trim() : null;
49
- }
50
-
51
- /** Build a structured vote tally from analyst outputs. */
52
- export function tallyVotes(outputs: AnalystOutput[]): {
53
- buy: number;
54
- hold: number;
55
- sell: number;
56
- weightedConviction: number;
57
- verdict: AnalystSignal;
58
- } {
59
- let buy = 0;
60
- let hold = 0;
61
- let sell = 0;
62
- let totalWeight = 0;
63
- let weightedSum = 0;
64
-
65
- for (const output of outputs) {
66
- switch (output.signal) {
67
- case "BUY":
68
- buy++;
69
- break;
70
- case "HOLD":
71
- hold++;
72
- break;
73
- case "SELL":
74
- sell++;
75
- break;
76
- }
77
- totalWeight += output.conviction;
78
- const signalValue = output.signal === "BUY" ? 1 : output.signal === "SELL" ? -1 : 0;
79
- weightedSum += signalValue * output.conviction;
80
- }
81
-
82
- const weightedConviction =
83
- totalWeight > 0 ? Math.round((totalWeight / outputs.length) * 10) / 10 : 0;
84
-
85
- let verdict: AnalystSignal;
86
- if (weightedSum > 0) verdict = "BUY";
87
- else if (weightedSum < 0) verdict = "SELL";
88
- else verdict = "HOLD";
89
-
90
- return { buy, hold, sell, weightedConviction, verdict };
91
- }
92
-
93
- /**
94
- * Parse an LLM debate response into a structured DebateOutput.
95
- * Eval/test helper only — not used in the live workflow path.
96
- */
97
- export function parseDebateOutput(side: DebateSide, responseText: string): DebateOutput {
98
- // Detect skipped rebuttal
99
- if (/^rebuttal skipped/i.test(responseText.trim())) {
100
- return {
101
- side,
102
- thesis: "",
103
- keyRisk: "",
104
- concessions: [],
105
- remainingConviction: 0,
106
- evidence: [],
107
- rawText: responseText,
108
- };
109
- }
110
-
111
- const thesis = extractDebateThesis(side, responseText);
112
- const keyRisk = extractKeyRisk(side, responseText);
113
- const concessions = extractConcessions(responseText);
114
- const remainingConviction = extractRemainingConviction(responseText);
115
-
116
- return {
117
- side,
118
- thesis,
119
- keyRisk,
120
- concessions,
121
- remainingConviction,
122
- evidence: [],
123
- rawText: responseText,
124
- };
125
- }
126
-
127
- function extractDebateThesis(side: DebateSide, text: string): string {
128
- const label = side === "bull" ? "BULL THESIS" : "BEAR THESIS";
129
- const match = text.match(new RegExp(`${label}:\\s*(.+)`, "i"));
130
- return match ? match[1].trim() : "";
131
- }
132
-
133
- function extractKeyRisk(side: DebateSide, text: string): string {
134
- if (side === "bear") {
135
- const match = text.match(/WHAT WOULD CHANGE MY MIND:\s*(.+)/i);
136
- return match ? match[1].trim() : "";
137
- }
138
- const match = text.match(/KEY RISK(?:\s+TO THIS THESIS)?:\s*(.+)/i);
139
- return match ? match[1].trim() : "";
140
- }
141
-
142
- function extractConcessions(text: string): string[] {
143
- const match = text.match(/CONCESSIONS:\s*([\s\S]*?)(?=REMAINING CONVICTION:|$)/i);
144
- if (!match) return [];
145
- return match[1]
146
- .split("\n")
147
- .map((line) => line.replace(/^[-*•]\s*/, "").trim())
148
- .filter(Boolean);
149
- }
150
-
151
- function extractRemainingConviction(text: string): number {
152
- const match = text.match(/REMAINING CONVICTION:\s*(\d+)/i);
153
- if (match) {
154
- const value = parseInt(match[1], 10);
155
- if (value >= 1 && value <= 10) return value;
156
- }
157
- return 0;
158
- }
159
-
160
- /**
161
- * Check whether analysts produced a BUY+SELL split.
162
- * Eval/test helper only — not used in the live workflow path.
163
- */
164
- export function isAnalystSplit(outputs: AnalystOutput[]): boolean {
165
- const votes = tallyVotes(outputs);
166
- return votes.buy > 0 && votes.sell > 0;
167
- }
168
-
169
- /** Collect all evidence from analyst outputs. */
170
- export function collectEvidence(outputs: AnalystOutput[]): EvidenceRecord[] {
171
- const evidence: EvidenceRecord[] = [];
172
- for (const output of outputs) {
173
- evidence.push(...output.evidence);
174
- }
175
- return evidence;
176
- }
@@ -1,224 +0,0 @@
1
- import type { WorkflowDefinition } from "../runtime/prompt-step.js";
2
- import { promptStep } from "../runtime/prompt-step.js";
3
-
4
- export type AnalystRole = "valuation" | "momentum" | "options" | "contrarian" | "risk";
5
-
6
- const SYMBOL_CAPTURE = "(\\$?[A-Za-z]{1,5}(?:[./-][A-Za-z]{1,2})?)";
7
- const NORMALIZED_SYMBOL_PATTERN = /^[A-Z]{1,5}(?:[./-][A-Z]{1,2})?$/;
8
-
9
- const VOTING_INSTRUCTION = `
10
-
11
- End your analysis with this exact format:
12
- SIGNAL: BUY | HOLD | SELL
13
- CONVICTION: [1-10]
14
- THESIS: [one sentence summary of your position]`;
15
-
16
- const EXECUTION_GUARDRAILS = `
17
- Execution rules:
18
- - Reuse tool outputs that were already fetched earlier in the session. Do not call the same tool again for the same symbol unless you need a missing field.
19
- - If a required provider returns unavailable or missing data, stop that leg quickly, label the missing metrics as unavailable, and continue with the remaining evidence.
20
- - Do not retry the same failing fundamentals call multiple times.`;
21
-
22
- const ANALYST_PROMPTS: Record<AnalystRole, (symbol: string) => string> = {
23
- valuation: (symbol) =>
24
- `**[Valuation Analyst]** You are a Damodaran-style valuation analyst. Your approach: connect the company's narrative to numbers, then compute intrinsic value. Analyze ${symbol}:
25
- 1. Start with get_company_overview for P/E, forward P/E, EPS, profit margin, and market cap.
26
- 2. If overview data is available, use get_financials for revenue, income, and free cash flow trends across years.
27
- 3. If financial statements are available, use get_earnings for EPS surprise patterns and growth trajectory.
28
- 4. Only use compute_dcf once you have the inputs needed to estimate intrinsic value.
29
- Assess: What growth rate is the market implicitly pricing in? Is the current price above or below your intrinsic value range? Cite specific numbers with their source tool. Keep reasoning data-driven — every claim must reference a fetched number.${EXECUTION_GUARDRAILS}${VOTING_INSTRUCTION}`,
30
-
31
- momentum: (symbol) =>
32
- `**[Momentum Analyst]** You are a CAN SLIM-style momentum analyst. Price action and volume are your primary evidence. Analyze ${symbol}:
33
- 1. Use get_stock_history with 1y range, then get_technical_indicators.
34
- 2. Focus on: Is price making new highs or breaking down from a base? Is OBV rising (volume confirming) or diverging? Where is price relative to VWAP?
35
- 3. Check RSI (overbought >70 / oversold <30) and MACD histogram direction.
36
- 4. Identify key support/resistance from Bollinger Bands and SMA(20)/SMA(50).
37
- 5. Use get_earnings to check if earnings are accelerating quarter over quarter.
38
- State specific price levels. A breakout on rising volume is bullish; a breakdown on high volume is bearish. No vague language — cite the numbers.${EXECUTION_GUARDRAILS}${VOTING_INSTRUCTION}`,
39
-
40
- options: (symbol) =>
41
- `**[Options Analyst]** You analyze what the derivatives market is pricing in. Analyze ${symbol}:
42
- 1. Use get_option_chain to review the full chain with strikes, volume, open interest, IV, and Greeks.
43
- 2. Compute the put/call ratio from volume data — above 1.0 is bearish bias, below 0.7 is bullish.
44
- 3. Look for unusually high volume contracts (>3x average OI) that signal institutional positioning.
45
- 4. Note the overall IV level — is it elevated (expecting a move) or compressed (quiet period)?
46
- 5. Check if smart money is positioning via deep ITM or OTM options with high volume.
47
- What is the options market pricing in that the stock price alone doesn't show?${EXECUTION_GUARDRAILS}${VOTING_INSTRUCTION}`,
48
-
49
- contrarian: (symbol) =>
50
- `**[Contrarian Analyst]** You are a Burry-style contrarian. Your job is to find what the crowd is missing. Be terse and data-driven — cite concrete numbers like "FCF yield 14.7%" or "P/E 8.3x vs sector 22x." Analyze ${symbol}:
51
- 1. Use get_fear_greed for overall market mood — extreme readings signal opportunity.
52
- 2. Use get_reddit_sentiment on wallstreetbets and stocks — check the sentiment score. Extreme bullishness from retail is a warning; extreme bearishness may be opportunity.
53
- 3. Cross-reference: Is sentiment overly bullish while fundamentals (revenue, margins, FCF) are deteriorating? Is everyone bearish while the numbers quietly improve?
54
- 5. Reuse get_company_overview or other fundamentals already fetched earlier in the session if available. If fundamentals are unavailable, say so and base the contrarian view on sentiment and price only.
55
- Where is the consensus wrong? What is the market over-pricing or under-pricing?${EXECUTION_GUARDRAILS}${VOTING_INSTRUCTION}`,
56
-
57
- risk: (symbol) =>
58
- `**[Risk Manager]** You are the final check before capital is deployed. Your job is to quantify downside, not to have an opinion on direction. Analyze ${symbol}:
59
- 1. Use analyze_risk to compute annualized volatility, Sharpe ratio, max drawdown, and VaR(95%).
60
- 2. Position sizing: Using the 2% portfolio risk rule, compute max position size. Formula: position_size = (0.02 * portfolio_value) / (entry_price * stop_loss_pct). Assume $100K portfolio.
61
- 3. Risk/reward: Is potential upside at least 2x the max drawdown? If not, the trade is unfavorable regardless of thesis.
62
- 4. Correlation: If this is in a portfolio, would it add diversification or concentration risk?
63
- 5. Scenario analysis: What is the max realistic downside in a 1-sigma and 2-sigma move?
64
- Be quantitative. Every assessment must include a number.${EXECUTION_GUARDRAILS}${VOTING_INSTRUCTION}`,
65
- };
66
-
67
- export function buildBullPrompt(symbol: string): string {
68
- return `**[Bull Researcher]** You have received five analyst perspectives above for ${symbol}.
69
- Build the strongest possible case FOR this position.
70
-
71
- Rules:
72
- - Cite analyst outputs and underlying tool evidence where available.
73
- - Address any bearish signals (SELL votes, high VaR, negative sentiment) and explain why they are less concerning than they appear.
74
- - You may call up to 2 tools if you identify a specific gap in the existing evidence. State the gap before calling the tool.
75
- - Reuse data already fetched in the session.
76
- ${EXECUTION_GUARDRAILS}
77
-
78
- End with this exact format:
79
- BULL THESIS: [2-3 sentences building the case for the position]
80
- KEY RISK TO THIS THESIS: [one sentence — the single thing that would invalidate your case]`;
81
- }
82
-
83
- export function buildBearPrompt(symbol: string): string {
84
- return `**[Bear Researcher]** You have received five analyst perspectives and a bull case above for ${symbol}. Your job is to dismantle the bull thesis.
85
-
86
- Rules:
87
- - Attack the weakest assumptions in the bull case above.
88
- - Cite analyst outputs and underlying tool evidence where available.
89
- - If the bull case ignored negative data points, surface them.
90
- - You may call up to 2 tools if you identify a specific gap in the existing evidence. State the gap before calling the tool.
91
- - Reuse data already fetched in the session.
92
- ${EXECUTION_GUARDRAILS}
93
-
94
- End with this exact format:
95
- BEAR THESIS: [2-3 sentences arguing against the position]
96
- WHAT WOULD CHANGE MY MIND: [one sentence — what data would make you concede to the bull]`;
97
- }
98
-
99
- export function buildRebuttalPrompt(symbol: string): string {
100
- return `**[Bull Rebuttal]** First, check the five analyst SIGNAL: lines above for ${symbol} (each analyst ended with "SIGNAL: BUY", "SIGNAL: HOLD", or "SIGNAL: SELL").
101
- If there is NO case where at least one analyst said SIGNAL: BUY and at least one said SIGNAL: SELL, respond with ONLY:
102
- REBUTTAL SKIPPED — consensus reached.
103
-
104
- Otherwise, the bear raised specific concerns above. Address each one directly.
105
-
106
- Rules:
107
- - Concede any point where the bear is factually correct.
108
- - For points you rebut, cite specific data from the analysts above.
109
- - Do not repeat your original thesis — respond to the bear's NEW arguments.
110
- - No tool calls in the rebuttal. Work with existing evidence only.
111
- ${EXECUTION_GUARDRAILS}
112
-
113
- End with this exact format:
114
- CONCESSIONS: [bullet list of points you concede]
115
- REMAINING CONVICTION: [1-10, where 10 = fully confident despite bear case]`;
116
- }
117
-
118
- export function buildSynthesisPrompt(symbol: string): string {
119
- return `**[Synthesis]** You have received five analyst signals with conviction scores for ${symbol}, a bull case arguing FOR the position, and a bear case arguing AGAINST.
120
- If a bull rebuttal with concessions appears above (not a line starting with "REBUTTAL SKIPPED"), treat the concessions as validated risks that must be addressed.
121
-
122
- Your job is NOT to average opinions. Your job is to RESOLVE THE DEBATE.
123
-
124
- 1. **Vote Tally**: X BUY, Y HOLD, Z SELL — weighted average conviction
125
- 2. **Verdict**: BUY, HOLD, or SELL
126
- 3. **Debate winner**: Which side had the stronger argument, and why
127
- 4. **Strongest counterpoint**: Address the losing side's best argument directly — explain why it's outweighed, or acknowledge it as a real risk
128
- 5. **Reversal condition**: State the SPECIFIC, TESTABLE condition under which your verdict would reverse (the bear's "what would change my mind" or the bull's "key risk")
129
- 6. **Key levels**: Entry, stop-loss, and target prices
130
- 7. **Position sizing**: Based on risk manager's analysis
131
-
132
- Be direct and actionable. This is your final word on ${symbol}.
133
-
134
- End with this exact format:
135
- VERDICT: [BUY|HOLD|SELL]
136
- CONFIDENCE: [1-10]
137
- DEBATE WINNER: [BULL|BEAR]
138
- REVERSAL CONDITION: [specific, testable condition]`;
139
- }
140
-
141
- const VALIDATION_PROMPT_DEBATE = (symbol: string) =>
142
- `**[Validation Check]** Review the complete analysis of ${symbol} above, including the debate. For each specific number cited by any analyst, bull, or bear researcher, verify it matches tool output data received in the session. Flag any inconsistencies. If a number was stated without being fetched first, call it out as UNVERIFIED.
143
-
144
- Additionally check:
145
- 1. Did the bull/bear cite real numbers from analyst outputs (not hallucinated)?
146
- 2. If a rebuttal occurred (not a line starting with "REBUTTAL SKIPPED"), are the concessions genuine (did the bull actually give ground on the bear's specific points)?
147
- 3. Is the reversal condition specific and testable (not vague like "if macro deteriorates")?
148
-
149
- Output: VALIDATED if all checks pass, or list specific corrections needed.`;
150
-
151
- export function getInitialAnalysisPrompt(symbol: string): string {
152
- return `Begin comprehensive analysis of ${symbol}. Start by getting the current stock quote.`;
153
- }
154
-
155
- export function buildComprehensiveAnalysisDefinition(symbol: string): WorkflowDefinition {
156
- const roles: AnalystRole[] = ["valuation", "momentum", "options", "contrarian", "risk"];
157
-
158
- const analystOutputs = roles.map((r) => `${r}_signal`);
159
-
160
- const analystSteps = [
161
- promptStep("initial_fetch", "Fetch initial quote data", getInitialAnalysisPrompt(symbol), {
162
- expectedOutputs: ["quote"],
163
- }),
164
- ...roles.map((role) =>
165
- promptStep(`analyst_${role}`, `${role} analysis`, ANALYST_PROMPTS[role](symbol), {
166
- skippable: true,
167
- requiredInputs: ["quote"],
168
- expectedOutputs: [`${role}_signal`],
169
- }),
170
- ),
171
- ];
172
-
173
- return {
174
- workflowType: "comprehensive_analysis",
175
- steps: [
176
- ...analystSteps,
177
- promptStep("debate_bull", "Bull researcher case", buildBullPrompt(symbol), {
178
- requiredInputs: analystOutputs,
179
- expectedOutputs: ["bull_thesis"],
180
- }),
181
- promptStep("debate_bear", "Bear researcher case", buildBearPrompt(symbol), {
182
- requiredInputs: [...analystOutputs, "bull_thesis"],
183
- expectedOutputs: ["bear_thesis"],
184
- }),
185
- promptStep("debate_rebuttal", "Bull rebuttal (self-gating)", buildRebuttalPrompt(symbol), {
186
- requiredInputs: [...analystOutputs, "bull_thesis", "bear_thesis"],
187
- expectedOutputs: ["rebuttal"],
188
- }),
189
- promptStep("synthesis", "Resolve the debate", buildSynthesisPrompt(symbol), {
190
- requiredInputs: [...analystOutputs, "bull_thesis", "bear_thesis", "rebuttal"],
191
- expectedOutputs: ["verdict"],
192
- }),
193
- promptStep("validation", "Validate cited numbers", VALIDATION_PROMPT_DEBATE(symbol), {
194
- skippable: true,
195
- requiredInputs: ["verdict"],
196
- expectedOutputs: ["validation_result"],
197
- }),
198
- ],
199
- };
200
- }
201
-
202
- export function isAnalysisRequest(input: string): { match: boolean; symbol?: string } {
203
- const patterns = [
204
- new RegExp(`^analyze\\s+${SYMBOL_CAPTURE}\\s*$`, "i"),
205
- new RegExp(`^full\\s+analysis\\s+(?:of\\s+)?${SYMBOL_CAPTURE}\\s*$`, "i"),
206
- new RegExp(`^deep\\s+dive\\s+(?:on\\s+)?${SYMBOL_CAPTURE}\\s*$`, "i"),
207
- ];
208
-
209
- for (const pattern of patterns) {
210
- const match = input.match(pattern);
211
- if (match) {
212
- return { match: true, symbol: match[1].replace(/\$/g, "").toUpperCase() };
213
- }
214
- }
215
-
216
- return { match: false };
217
- }
218
-
219
- export function normalizeSymbol(input: string): string | undefined {
220
- const trimmed = input.trim();
221
- if (!trimmed) return undefined;
222
- const candidate = trimmed.replace(/\$/g, "").toUpperCase();
223
- return NORMALIZED_SYMBOL_PATTERN.test(candidate) ? candidate : undefined;
224
- }