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
@@ -15,6 +15,75 @@ export class MarketStateService {
15
15
  .get();
16
16
  return mapCollection(row);
17
17
  }
18
+ listWatchlists() {
19
+ this.getDefaultWatchlist();
20
+ const rows = this.db
21
+ .prepare("SELECT * FROM watchlists ORDER BY is_default DESC, name COLLATE NOCASE")
22
+ .all();
23
+ return rows.map(mapCollection);
24
+ }
25
+ createWatchlist(name) {
26
+ const normalized = normalizeCollectionName(name);
27
+ const now = new Date().toISOString();
28
+ this.db
29
+ .prepare(`INSERT OR IGNORE INTO watchlists (name, is_default, created_at, updated_at)
30
+ VALUES (?, 0, ?, ?)`)
31
+ .run(normalized, now, now);
32
+ const row = this.db
33
+ .prepare("SELECT * FROM watchlists WHERE name = ? LIMIT 1")
34
+ .get(normalized);
35
+ return mapCollection(row);
36
+ }
37
+ getWatchlistByName(name) {
38
+ const normalized = normalizeCollectionName(name);
39
+ const row = this.db
40
+ .prepare("SELECT * FROM watchlists WHERE name = ? LIMIT 1")
41
+ .get(normalized);
42
+ return row == null ? null : mapCollection(row);
43
+ }
44
+ renameWatchlist(currentName, nextName) {
45
+ const current = this.getWatchlistByName(currentName);
46
+ if (current == null)
47
+ throw new Error(`watchlist ${currentName.trim()} not found.`);
48
+ const normalizedNext = normalizeCollectionName(nextName);
49
+ const now = new Date().toISOString();
50
+ this.db
51
+ .prepare("UPDATE watchlists SET name = ?, updated_at = ? WHERE id = ?")
52
+ .run(normalizedNext, now, current.id);
53
+ const row = this.db.prepare("SELECT * FROM watchlists WHERE id = ? LIMIT 1").get(current.id);
54
+ if (row == null)
55
+ throw new Error("renamed watchlist could not be loaded.");
56
+ return mapCollection(row);
57
+ }
58
+ deleteWatchlist(name) {
59
+ const watchlists = this.listWatchlists();
60
+ const current = this.getWatchlistByName(name);
61
+ if (current == null)
62
+ throw new Error(`watchlist ${name.trim()} not found.`);
63
+ if (watchlists.length <= 1)
64
+ throw new Error("cannot delete the last remaining watchlist.");
65
+ const selected = watchlists.find((watchlist) => watchlist.id !== current.id);
66
+ if (selected == null)
67
+ throw new Error("replacement watchlist could not be selected.");
68
+ const selectAndDelete = this.db.transaction(() => {
69
+ if (current.isDefault) {
70
+ this.db.prepare("UPDATE watchlists SET is_default = 0 WHERE id = ?").run(current.id);
71
+ this.db.prepare("UPDATE watchlists SET is_default = 1 WHERE id = ?").run(selected.id);
72
+ }
73
+ this.db.prepare("DELETE FROM watchlists WHERE id = ?").run(current.id);
74
+ });
75
+ selectAndDelete();
76
+ const row = this.db.prepare("SELECT * FROM watchlists WHERE id = ? LIMIT 1").get(selected.id);
77
+ if (row == null)
78
+ throw new Error("replacement watchlist could not be loaded.");
79
+ return mapCollection(row);
80
+ }
81
+ getOrCreateWatchlist(name) {
82
+ const normalized = normalizeNullable(name);
83
+ if (normalized == null)
84
+ return this.getDefaultWatchlist();
85
+ return this.getWatchlistByName(normalized) ?? this.createWatchlist(normalized);
86
+ }
18
87
  getDefaultPortfolio() {
19
88
  const now = new Date().toISOString();
20
89
  this.db
@@ -30,6 +99,60 @@ export class MarketStateService {
30
99
  baseCurrency: row.base_currency,
31
100
  };
32
101
  }
102
+ listPortfolios() {
103
+ this.getDefaultPortfolio();
104
+ const rows = this.db
105
+ .prepare("SELECT * FROM portfolios ORDER BY is_default DESC, name COLLATE NOCASE")
106
+ .all();
107
+ return rows.map((row) => ({ ...mapCollection(row), baseCurrency: row.base_currency }));
108
+ }
109
+ createPortfolio(name, baseCurrency = "USD") {
110
+ const normalized = normalizeCollectionName(name);
111
+ const existing = this.getPortfolioByName(normalized);
112
+ if (existing != null)
113
+ return existing;
114
+ const normalizedCurrency = baseCurrency.trim().toUpperCase() || "USD";
115
+ const now = new Date().toISOString();
116
+ this.db
117
+ .prepare(`INSERT OR IGNORE INTO portfolios (name, base_currency, is_default, created_at, updated_at)
118
+ VALUES (?, ?, 0, ?, ?)`)
119
+ .run(normalized, normalizedCurrency, now, now);
120
+ const row = this.db
121
+ .prepare("SELECT * FROM portfolios WHERE name = ? LIMIT 1")
122
+ .get(normalized);
123
+ return { ...mapCollection(row), baseCurrency: row.base_currency };
124
+ }
125
+ getPortfolioByName(name) {
126
+ const normalized = normalizeCollectionName(name);
127
+ const row = this.db
128
+ .prepare("SELECT * FROM portfolios WHERE name = ? LIMIT 1")
129
+ .get(normalized);
130
+ return row == null ? null : { ...mapCollection(row), baseCurrency: row.base_currency };
131
+ }
132
+ renamePortfolio(currentName, nextName) {
133
+ const current = this.getPortfolioByName(currentName);
134
+ if (current == null)
135
+ throw new Error(`portfolio ${currentName.trim()} not found.`);
136
+ const normalizedNext = normalizeCollectionName(nextName);
137
+ const existing = this.getPortfolioByName(normalizedNext);
138
+ if (existing != null && existing.id !== current.id) {
139
+ throw new Error(`portfolio ${normalizedNext} already exists.`);
140
+ }
141
+ const now = new Date().toISOString();
142
+ this.db
143
+ .prepare("UPDATE portfolios SET name = ?, updated_at = ? WHERE id = ?")
144
+ .run(normalizedNext, now, current.id);
145
+ const row = this.db.prepare("SELECT * FROM portfolios WHERE id = ? LIMIT 1").get(current.id);
146
+ if (row == null)
147
+ throw new Error("renamed portfolio could not be loaded.");
148
+ return { ...mapCollection(row), baseCurrency: row.base_currency };
149
+ }
150
+ getOrCreatePortfolio(name) {
151
+ const normalized = normalizeNullable(name);
152
+ if (normalized == null)
153
+ return this.getDefaultPortfolio();
154
+ return this.getPortfolioByName(normalized) ?? this.createPortfolio(normalized);
155
+ }
33
156
  findInstrumentByAlias(lookup) {
34
157
  const source = normalizeSource(lookup.source);
35
158
  const sourceId = normalizeNullable(lookup.sourceId);
@@ -66,11 +189,9 @@ export class MarketStateService {
66
189
  if (existing) {
67
190
  this.db
68
191
  .prepare(`UPDATE watchlist_items
69
- SET target_price = ?, stop_price = ?, price_currency = ?, thesis = ?,
70
- notes = ?, tags_json = ?, source = ?, source_row_id = ?,
71
- source_metadata_json = ?, updated_at = ?
192
+ SET source = ?, source_row_id = ?, source_metadata_json = ?, updated_at = ?
72
193
  WHERE id = ?`)
73
- .run(params.targetPrice === undefined ? existing.target_price : params.targetPrice, params.stopPrice === undefined ? existing.stop_price : params.stopPrice, params.priceCurrency === undefined ? existing.price_currency : params.priceCurrency, params.thesis === undefined ? existing.thesis : params.thesis, params.notes === undefined ? existing.notes : params.notes, params.tags == null ? existing.tags_json : JSON.stringify(params.tags), params.source === undefined ? existing.source : normalizeNullable(params.source), params.sourceRowId === undefined
194
+ .run(params.source === undefined ? existing.source : normalizeNullable(params.source), params.sourceRowId === undefined
74
195
  ? existing.source_row_id
75
196
  : normalizeNullable(params.sourceRowId), params.sourceMetadata === undefined
76
197
  ? existing.source_metadata_json
@@ -81,12 +202,11 @@ export class MarketStateService {
81
202
  }
82
203
  const result = this.db
83
204
  .prepare(`INSERT INTO watchlist_items (
84
- watchlist_id, instrument_id, thesis, notes, tags_json,
85
- target_price, stop_price, price_currency, source, source_row_id,
86
- source_metadata_json, created_at, updated_at
205
+ watchlist_id, instrument_id, source, source_row_id, source_metadata_json,
206
+ created_at, updated_at
87
207
  )
88
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
89
- .run(watchlistId, instrument.id, params.thesis ?? null, params.notes ?? null, params.tags == null ? null : JSON.stringify(params.tags), params.targetPrice ?? null, params.stopPrice ?? null, params.priceCurrency ?? params.instrument.currency ?? null, normalizeNullable(params.source), normalizeNullable(params.sourceRowId), params.sourceMetadata == null ? null : JSON.stringify(params.sourceMetadata), now, now);
208
+ VALUES (?, ?, ?, ?, ?, ?, ?)`)
209
+ .run(watchlistId, instrument.id, normalizeNullable(params.source), normalizeNullable(params.sourceRowId), params.sourceMetadata == null ? null : JSON.stringify(params.sourceMetadata), now, now);
90
210
  return Number(result.lastInsertRowid);
91
211
  });
92
212
  return this.getWatchlistItem(tx());
@@ -109,26 +229,6 @@ export class MarketStateService {
109
229
  .run(watchlistId, symbol.trim().toUpperCase());
110
230
  return result.changes > 0;
111
231
  }
112
- updateWatchlistItemBySymbol(symbol, params) {
113
- const watchlistId = params.watchlistId ?? this.getDefaultWatchlist().id;
114
- const existing = this.db
115
- .prepare(`SELECT wi.*
116
- FROM watchlist_items wi
117
- JOIN instruments i ON i.id = wi.instrument_id
118
- WHERE wi.watchlist_id = ? AND i.symbol = ?
119
- LIMIT 1`)
120
- .get(watchlistId, symbol.trim().toUpperCase());
121
- if (existing == null)
122
- return null;
123
- const now = new Date().toISOString();
124
- this.db
125
- .prepare(`UPDATE watchlist_items
126
- SET target_price = ?, stop_price = ?, price_currency = ?, thesis = ?,
127
- notes = ?, tags_json = ?, updated_at = ?
128
- WHERE id = ?`)
129
- .run(params.targetPrice === undefined ? existing.target_price : params.targetPrice, params.stopPrice === undefined ? existing.stop_price : params.stopPrice, params.priceCurrency === undefined ? existing.price_currency : params.priceCurrency, params.thesis === undefined ? existing.thesis : params.thesis, params.notes === undefined ? existing.notes : params.notes, params.tags == null ? existing.tags_json : JSON.stringify(params.tags), now, existing.id);
130
- return this.getWatchlistItem(existing.id);
131
- }
132
232
  addPortfolioLot(params) {
133
233
  assertPositiveFinitePortfolioLotNumber(params.quantity, "quantity");
134
234
  assertPositiveFinitePortfolioLotNumber(params.avgCost, "average cost");
@@ -234,6 +334,46 @@ export class MarketStateService {
234
334
  return null;
235
335
  return this.getAlertRule(id);
236
336
  }
337
+ updateAlertRule(id, params) {
338
+ const existing = this.db.prepare("SELECT * FROM alert_rules WHERE id = ?").get(id);
339
+ if (existing == null)
340
+ return null;
341
+ const now = new Date().toISOString();
342
+ this.db
343
+ .prepare(`UPDATE alert_rules
344
+ SET scope_type = ?,
345
+ scope_id = ?,
346
+ instrument_id = ?,
347
+ condition_type = ?,
348
+ condition_version = ?,
349
+ condition_json = ?,
350
+ timeframe = ?,
351
+ enabled = ?,
352
+ check_interval_seconds = ?,
353
+ next_check_at = ?,
354
+ last_checked_at = NULL,
355
+ last_observed_json = NULL,
356
+ status = 'active',
357
+ retrigger_mode = ?,
358
+ last_condition_state = 'unknown',
359
+ rule_revision = rule_revision + 1,
360
+ arm_cycle_id = arm_cycle_id + 1,
361
+ cooldown_seconds = ?,
362
+ last_triggered_at = NULL,
363
+ updated_at = ?
364
+ WHERE id = ?`)
365
+ .run(params.scopeType ?? existing.scope_type, params.scopeId === undefined ? existing.scope_id : params.scopeId, params.instrumentId === undefined ? existing.instrument_id : params.instrumentId, params.conditionType ?? existing.condition_type, params.conditionVersion ?? existing.condition_version, JSON.stringify(params.condition === undefined ? JSON.parse(existing.condition_json) : params.condition), params.timeframe ?? existing.timeframe, params.enabled === undefined ? existing.enabled : params.enabled ? 1 : 0, params.checkIntervalSeconds === undefined
366
+ ? existing.check_interval_seconds
367
+ : params.checkIntervalSeconds, params.nextCheckAt === undefined ? existing.next_check_at : params.nextCheckAt, params.retriggerMode ?? existing.retrigger_mode, params.cooldownSeconds === undefined ? existing.cooldown_seconds : params.cooldownSeconds, now, id);
368
+ return this.getAlertRule(id);
369
+ }
370
+ deleteAlertRule(id) {
371
+ const existing = this.db.prepare("SELECT * FROM alert_rules WHERE id = ?").get(id);
372
+ if (existing == null)
373
+ return null;
374
+ this.db.prepare("DELETE FROM alert_rules WHERE id = ?").run(id);
375
+ return mapAlertRule(existing);
376
+ }
237
377
  getInstrument(id) {
238
378
  const row = this.db.prepare("SELECT * FROM instruments WHERE id = ?").get(id);
239
379
  return row == null ? null : mapInstrument(row);
@@ -811,12 +951,6 @@ function mapWatchlistItem(row) {
811
951
  assetType: row.asset_type,
812
952
  exchange: row.exchange,
813
953
  currency: row.currency,
814
- targetPrice: row.target_price,
815
- stopPrice: row.stop_price,
816
- priceCurrency: row.price_currency,
817
- thesis: row.thesis,
818
- notes: row.notes,
819
- tags: row.tags_json == null ? null : JSON.parse(row.tags_json),
820
954
  source: row.source,
821
955
  sourceRowId: row.source_row_id,
822
956
  sourceMetadata: row.source_metadata_json == null ? null : JSON.parse(row.source_metadata_json),
@@ -824,6 +958,12 @@ function mapWatchlistItem(row) {
824
958
  updatedAt: row.updated_at,
825
959
  };
826
960
  }
961
+ function normalizeCollectionName(name) {
962
+ const normalized = name.trim();
963
+ if (!normalized)
964
+ throw new Error("watchlist name is required.");
965
+ return normalized;
966
+ }
827
967
  function mapPortfolioLot(row) {
828
968
  return {
829
969
  id: row.id,
@@ -1033,4 +1173,3 @@ function normalizeExchange(value) {
1033
1173
  function normalizeAssetType(value) {
1034
1174
  return normalizeNullable(value)?.toLowerCase() ?? null;
1035
1175
  }
1036
- //# sourceMappingURL=service.js.map
@@ -0,0 +1,8 @@
1
+ import type { PortfolioLotRecord, ReportRunRecord, WatchlistItemRecord } from "./service.js";
2
+ export declare function formatPortfolioSummary(lots: PortfolioLotRecord[], limit?: number): string[];
3
+ export declare function formatWatchlistSummary(items: WatchlistItemRecord[], limit?: number): string[];
4
+ export declare function formatLatestReportSummary(report: ReportRunRecord | undefined, options?: {
5
+ includeSummary?: boolean;
6
+ }): string[];
7
+ export declare function formatMoney(value: number, currency: string): string;
8
+ export declare function formatJsonSummary(value: unknown): string;
@@ -0,0 +1,58 @@
1
+ export function formatPortfolioSummary(lots, limit = 8) {
2
+ if (lots.length === 0)
3
+ return [];
4
+ const lines = ["Portfolio lots:"];
5
+ for (const lot of lots.slice(0, limit)) {
6
+ const costBasis = formatMoney(lot.quantity * lot.avgCost, lot.currency);
7
+ const name = lot.name ? ` (${lot.name})` : "";
8
+ lines.push(`- ${lot.symbol}: ${lot.quantity} @ ${formatMoney(lot.avgCost, lot.currency)}, cost basis ${costBasis}${name}`);
9
+ }
10
+ return lines;
11
+ }
12
+ export function formatWatchlistSummary(items, limit = 8) {
13
+ if (items.length === 0)
14
+ return [];
15
+ const lines = ["Watchlist:"];
16
+ for (const item of items.slice(0, limit)) {
17
+ lines.push(`- ${item.symbol}${item.name ? ` (${item.name})` : ""}`);
18
+ }
19
+ return lines;
20
+ }
21
+ export function formatLatestReportSummary(report, options = {}) {
22
+ if (!report)
23
+ return [];
24
+ const completed = report.completedAt ?? report.startedAt;
25
+ const summary = options.includeSummary === false ? "" : formatJsonSummary(report.summaryJson);
26
+ const lines = [
27
+ `Latest report run: ${report.status} at ${completed}${summary ? ` — ${summary}` : ""}`,
28
+ ];
29
+ const reportText = options.includeSummary === false ? "" : extractReportText(report.summaryJson);
30
+ if (reportText)
31
+ lines.push("Report text:", truncateText(reportText, 8_000));
32
+ return lines;
33
+ }
34
+ export function formatMoney(value, currency) {
35
+ const normalized = currency.toUpperCase();
36
+ if (normalized === "USD")
37
+ return `$${value.toFixed(2)}`;
38
+ return `${normalized} ${value.toFixed(2)}`;
39
+ }
40
+ export function formatJsonSummary(value) {
41
+ if (value == null)
42
+ return "";
43
+ const json = JSON.stringify(value);
44
+ if (json.length <= 90)
45
+ return json;
46
+ return `${json.slice(0, 87)}...`;
47
+ }
48
+ function extractReportText(value) {
49
+ if (!value || typeof value !== "object" || !("text" in value))
50
+ return "";
51
+ const text = value.text;
52
+ return typeof text === "string" ? text.trim() : "";
53
+ }
54
+ function truncateText(value, maxLength) {
55
+ if (value.length <= maxLength)
56
+ return value;
57
+ return `${value.slice(0, maxLength - 3)}...`;
58
+ }
@@ -5,4 +5,3 @@ export { getSchemaVersion, getTableNames, initDatabase, initDefaultDatabase } fr
5
5
  export { MemoryStorage } from "./storage.js";
6
6
  export { clearDefault, getAllDefaults, getDefaults, setDefault } from "./tool-defaults.js";
7
7
  export { isStale, NEVER_TRUST_FROM_MEMORY, STALENESS_THRESHOLDS } from "./types.js";
8
- //# sourceMappingURL=index.js.map
@@ -146,4 +146,3 @@ function tryParseValue(json) {
146
146
  return json;
147
147
  }
148
148
  }
149
- //# sourceMappingURL=manager.js.map
@@ -85,4 +85,3 @@ export function extractPreferences(input) {
85
85
  }
86
86
  return preferences;
87
87
  }
88
- //# sourceMappingURL=preference-extractor.js.map
@@ -61,4 +61,3 @@ function tryParseJson(json) {
61
61
  return json;
62
62
  }
63
63
  }
64
- //# sourceMappingURL=retrieval.js.map
@@ -2,7 +2,7 @@ import { mkdirSync } from "node:fs";
2
2
  import { dirname } from "node:path";
3
3
  import Database from "better-sqlite3";
4
4
  import { ensureOpenCandleHomeDir, getStateDbPath } from "../infra/opencandle-paths.js";
5
- const CURRENT_SCHEMA_VERSION = 8;
5
+ const CURRENT_SCHEMA_VERSION = 9;
6
6
  const CURRENT_SCHEMA = `
7
7
  CREATE TABLE IF NOT EXISTS schema_version (
8
8
  version INTEGER NOT NULL
@@ -105,7 +105,8 @@ const CURRENT_SCHEMA = `
105
105
  name TEXT NOT NULL,
106
106
  is_default INTEGER NOT NULL DEFAULT 0,
107
107
  created_at TEXT NOT NULL,
108
- updated_at TEXT NOT NULL
108
+ updated_at TEXT NOT NULL,
109
+ UNIQUE(name)
109
110
  );
110
111
 
111
112
  CREATE UNIQUE INDEX IF NOT EXISTS idx_watchlists_one_default
@@ -116,12 +117,6 @@ const CURRENT_SCHEMA = `
116
117
  id INTEGER PRIMARY KEY AUTOINCREMENT,
117
118
  watchlist_id INTEGER NOT NULL,
118
119
  instrument_id INTEGER NOT NULL,
119
- thesis TEXT,
120
- notes TEXT,
121
- tags_json TEXT,
122
- target_price REAL,
123
- stop_price REAL,
124
- price_currency TEXT,
125
120
  source TEXT,
126
121
  source_row_id TEXT,
127
122
  source_metadata_json TEXT,
@@ -355,19 +350,26 @@ function ensureCurrentSchema(db) {
355
350
  db.exec(CURRENT_SCHEMA);
356
351
  return;
357
352
  }
353
+ if (currentVersion === 8) {
354
+ migrateV8ToV9(db);
355
+ return;
356
+ }
358
357
  if (currentVersion === 7) {
359
358
  migrateV7ToV8(db);
359
+ migrateV8ToV9(db);
360
360
  return;
361
361
  }
362
362
  if (currentVersion === 6) {
363
363
  migrateV6ToV7(db);
364
364
  migrateV7ToV8(db);
365
+ migrateV8ToV9(db);
365
366
  return;
366
367
  }
367
368
  if (currentVersion === 5) {
368
369
  migrateV5ToV6(db);
369
370
  migrateV6ToV7(db);
370
371
  migrateV7ToV8(db);
372
+ migrateV8ToV9(db);
371
373
  return;
372
374
  }
373
375
  if (currentVersion === 4) {
@@ -375,6 +377,7 @@ function ensureCurrentSchema(db) {
375
377
  migrateV5ToV6(db);
376
378
  migrateV6ToV7(db);
377
379
  migrateV7ToV8(db);
380
+ migrateV8ToV9(db);
378
381
  return;
379
382
  }
380
383
  if (currentVersion === 3) {
@@ -383,10 +386,12 @@ function ensureCurrentSchema(db) {
383
386
  migrateV5ToV6(db);
384
387
  migrateV6ToV7(db);
385
388
  migrateV7ToV8(db);
389
+ migrateV8ToV9(db);
386
390
  return;
387
391
  }
388
- // Additive v2 → v3 → ... → v7 migration without dropping data (v8 drops
389
- // prediction_records as the explicit removal of the predictions feature).
392
+ // Additive v2 → v3 → ... migration without dropping data (v8 drops
393
+ // prediction_records and v9 drops watchlist item annotation columns as
394
+ // explicit feature removals).
390
395
  if (currentVersion === 2) {
391
396
  migrateV2ToV3(db);
392
397
  migrateV3ToV4(db);
@@ -394,6 +399,7 @@ function ensureCurrentSchema(db) {
394
399
  migrateV5ToV6(db);
395
400
  migrateV6ToV7(db);
396
401
  migrateV7ToV8(db);
402
+ migrateV8ToV9(db);
397
403
  return;
398
404
  }
399
405
  // Any other mismatch (null first-run, or a foreign schema): reset.
@@ -456,6 +462,50 @@ function migrateV7ToV8(db) {
456
462
  // Predictions feature removal: dropping prediction_records is the explicit,
457
463
  // documented destructive step for this table; all other rows are preserved.
458
464
  db.exec("DROP TABLE IF EXISTS prediction_records");
465
+ db.exec(CURRENT_SCHEMA);
466
+ db.prepare("DELETE FROM schema_version").run();
467
+ db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(8);
468
+ }
469
+ function migrateV8ToV9(db) {
470
+ db.exec(`
471
+ CREATE TABLE IF NOT EXISTS watchlists_v9 (
472
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
473
+ name TEXT NOT NULL,
474
+ is_default INTEGER NOT NULL DEFAULT 0,
475
+ created_at TEXT NOT NULL,
476
+ updated_at TEXT NOT NULL,
477
+ UNIQUE(name)
478
+ );
479
+
480
+ INSERT OR IGNORE INTO watchlists_v9 (id, name, is_default, created_at, updated_at)
481
+ SELECT id, name, is_default, created_at, updated_at FROM watchlists;
482
+
483
+ DROP TABLE IF EXISTS watchlist_items_v9;
484
+ CREATE TABLE watchlist_items_v9 (
485
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
486
+ watchlist_id INTEGER NOT NULL,
487
+ instrument_id INTEGER NOT NULL,
488
+ source TEXT,
489
+ source_row_id TEXT,
490
+ source_metadata_json TEXT,
491
+ created_at TEXT NOT NULL,
492
+ updated_at TEXT NOT NULL,
493
+ UNIQUE(watchlist_id, instrument_id),
494
+ FOREIGN KEY (watchlist_id) REFERENCES watchlists_v9(id) ON DELETE CASCADE,
495
+ FOREIGN KEY (instrument_id) REFERENCES instruments(id) ON DELETE RESTRICT
496
+ );
497
+
498
+ INSERT OR IGNORE INTO watchlist_items_v9 (
499
+ id, watchlist_id, instrument_id, source, source_row_id, source_metadata_json, created_at, updated_at
500
+ )
501
+ SELECT id, watchlist_id, instrument_id, source, source_row_id, source_metadata_json, created_at, updated_at
502
+ FROM watchlist_items;
503
+
504
+ DROP TABLE watchlist_items;
505
+ DROP TABLE watchlists;
506
+ ALTER TABLE watchlists_v9 RENAME TO watchlists;
507
+ ALTER TABLE watchlist_items_v9 RENAME TO watchlist_items;
508
+ `);
459
509
  db.exec(CURRENT_SCHEMA);
460
510
  db.prepare("DELETE FROM schema_version").run();
461
511
  db.prepare("INSERT INTO schema_version (version) VALUES (?)").run(CURRENT_SCHEMA_VERSION);
@@ -524,4 +574,3 @@ export function getSchemaVersion(db) {
524
574
  const row = db.prepare("SELECT version FROM schema_version LIMIT 1").get();
525
575
  return row?.version ?? 0;
526
576
  }
527
- //# sourceMappingURL=sqlite.js.map
@@ -120,4 +120,3 @@ function safeParseJson(json) {
120
120
  return json;
121
121
  }
122
122
  }
123
- //# sourceMappingURL=storage.js.map
@@ -92,4 +92,3 @@ function setPath(target, path, value) {
92
92
  function isPlainObject(value) {
93
93
  return typeof value === "object" && value !== null && !Array.isArray(value);
94
94
  }
95
- //# sourceMappingURL=tool-defaults.js.map
@@ -48,4 +48,3 @@ export const NEVER_TRUST_FROM_MEMORY = new Set([
48
48
  "entry_price",
49
49
  "stop_loss",
50
50
  ]);
51
- //# sourceMappingURL=types.js.map
package/dist/monitor.js CHANGED
@@ -102,4 +102,3 @@ async function main() {
102
102
  process.once("SIGTERM", stop);
103
103
  }
104
104
  await main();
105
- //# sourceMappingURL=monitor.js.map
@@ -120,4 +120,3 @@ export async function runProviderConnect(ctx, providerId) {
120
120
  ctx.ui.notify(`${descriptor.displayName} connected. Your key has been saved.`, "info");
121
121
  return { status: "connected" };
122
122
  }
123
- //# sourceMappingURL=connect.js.map
@@ -69,4 +69,3 @@ export function resolveCredentialRequired(input) {
69
69
  // 7. Default: prompt.
70
70
  return { action: "prompt", provider, reason };
71
71
  }
72
- //# sourceMappingURL=credential-interceptor.js.map
@@ -50,4 +50,3 @@ export function createDegradationAccumulator() {
50
50
  },
51
51
  };
52
52
  }
53
- //# sourceMappingURL=degradation-accumulator.js.map
@@ -20,4 +20,4 @@ export interface PromptResult {
20
20
  *
21
21
  * When neither a handler nor a UI is available, returns `{answer: null, cancelled: true}`.
22
22
  */
23
- export declare function promptUser(ctx: ExtensionContext, opts: PromptOptions, handler?: AskUserHandler): Promise<PromptResult>;
23
+ export declare function promptUser(ctx: ExtensionContext | undefined, opts: PromptOptions, handler?: AskUserHandler): Promise<PromptResult>;
@@ -58,4 +58,3 @@ export async function promptUser(ctx, opts, handler) {
58
58
  }
59
59
  }
60
60
  }
61
- //# sourceMappingURL=prompt-user.js.map
@@ -253,4 +253,3 @@ export const runCommand = (command, args, options) => runExternalToolCommand(com
253
253
  timeoutMs: options?.timeoutMs ?? COMMAND_TIMEOUT_MS,
254
254
  maxOutputChars: MAX_OUTPUT_CHARS,
255
255
  });
256
- //# sourceMappingURL=provider-status.js.map
@@ -1,6 +1,6 @@
1
1
  export type ApiKeyProviderId = "alpha_vantage" | "fred" | "finnhub" | "brave" | "exa";
2
2
  export type ExternalToolProviderId = "twitter" | "reddit";
3
- export type PublicHttpProviderId = "yahoo";
3
+ export type PublicHttpProviderId = "polymarket" | "tradingview" | "yahoo";
4
4
  export type ProviderId = ApiKeyProviderId | ExternalToolProviderId | PublicHttpProviderId;
5
5
  export type ProviderCategory = "fundamentals" | "macro" | "news" | "web_search" | "sentiment" | "market";
6
6
  export type ProviderTier = "hard" | "soft";
@@ -139,6 +139,30 @@ export declare const PROVIDERS: readonly [{
139
139
  readonly fallbackDescription: null;
140
140
  readonly snoozeDurationDays: 7;
141
141
  readonly instructionsHint: "No account needed; OpenCandle checks public Yahoo Finance reachability";
142
+ }, {
143
+ readonly id: "polymarket";
144
+ readonly kind: "public-http";
145
+ readonly displayName: "Polymarket";
146
+ readonly category: "macro";
147
+ readonly tier: "hard";
148
+ readonly aliases: readonly ["polymarket", "prediction-markets", "event-probabilities"];
149
+ readonly probeUrl: "https://gamma-api.polymarket.com/public-search?q=fed%20rate%20cut&limit=1";
150
+ readonly unlocks: readonly ["market-implied event probabilities", "prediction-market resolution criteria"];
151
+ readonly fallbackDescription: null;
152
+ readonly snoozeDurationDays: 7;
153
+ readonly instructionsHint: "No account needed; OpenCandle checks public Polymarket Gamma reachability";
154
+ }, {
155
+ readonly id: "tradingview";
156
+ readonly kind: "public-http";
157
+ readonly displayName: "TradingView Scanner";
158
+ readonly category: "market";
159
+ readonly tier: "soft";
160
+ readonly aliases: readonly ["tradingview", "tradingview-scanner", "screener"];
161
+ readonly probeUrl: "https://scanner.tradingview.com/america/scan2?label-product=screener-stock";
162
+ readonly unlocks: readonly ["stock screens", "ticker search fallback", "watchlist quote fallback"];
163
+ readonly fallbackDescription: "Core market quote/history tools continue through Yahoo and Alpha Vantage when TradingView scanner is unavailable";
164
+ readonly snoozeDurationDays: 7;
165
+ readonly instructionsHint: "No account needed; OpenCandle checks the public TradingView scanner endpoint";
142
166
  }, {
143
167
  readonly id: "twitter";
144
168
  readonly kind: "external-tool";
@@ -125,6 +125,32 @@ export const PROVIDERS = [
125
125
  snoozeDurationDays: 7,
126
126
  instructionsHint: "No account needed; OpenCandle checks public Yahoo Finance reachability",
127
127
  },
128
+ {
129
+ id: "polymarket",
130
+ kind: "public-http",
131
+ displayName: "Polymarket",
132
+ category: "macro",
133
+ tier: "hard",
134
+ aliases: ["polymarket", "prediction-markets", "event-probabilities"],
135
+ probeUrl: "https://gamma-api.polymarket.com/public-search?q=fed%20rate%20cut&limit=1",
136
+ unlocks: ["market-implied event probabilities", "prediction-market resolution criteria"],
137
+ fallbackDescription: null,
138
+ snoozeDurationDays: 7,
139
+ instructionsHint: "No account needed; OpenCandle checks public Polymarket Gamma reachability",
140
+ },
141
+ {
142
+ id: "tradingview",
143
+ kind: "public-http",
144
+ displayName: "TradingView Scanner",
145
+ category: "market",
146
+ tier: "soft",
147
+ aliases: ["tradingview", "tradingview-scanner", "screener"],
148
+ probeUrl: "https://scanner.tradingview.com/america/scan2?label-product=screener-stock",
149
+ unlocks: ["stock screens", "ticker search fallback", "watchlist quote fallback"],
150
+ fallbackDescription: "Core market quote/history tools continue through Yahoo and Alpha Vantage when TradingView scanner is unavailable",
151
+ snoozeDurationDays: 7,
152
+ instructionsHint: "No account needed; OpenCandle checks the public TradingView scanner endpoint",
153
+ },
128
154
  {
129
155
  id: "twitter",
130
156
  kind: "external-tool",
@@ -301,4 +327,3 @@ export function resolveProviderFromArgument(arg) {
301
327
  }
302
328
  return undefined;
303
329
  }
304
- //# sourceMappingURL=providers.js.map
@@ -161,4 +161,3 @@ export function shouldShowWelcome(state, hasUI) {
161
161
  return false;
162
162
  return state.welcomeShownAt === undefined;
163
163
  }
164
- //# sourceMappingURL=state.js.map
@@ -77,4 +77,3 @@ export async function withCredentialCheck(providerId, fn) {
77
77
  throw error;
78
78
  }
79
79
  }
80
- //# sourceMappingURL=tool-helpers.js.map
@@ -178,4 +178,3 @@ export function parseToolTag(text) {
178
178
  return undefined;
179
179
  }
180
180
  }
181
- //# sourceMappingURL=tool-tags.js.map